From a297235862097d1db601c961fb634e34588e1056 Mon Sep 17 00:00:00 2001 From: Nick Pirocanac Date: Wed, 31 Dec 2025 23:22:51 -0600 Subject: [PATCH 01/19] fix: *code-review is picking up non-application files (#1232) Co-authored-by: Nick Pirocanac --- .../bmgd/workflows/4-production/code-review/instructions.xml | 1 + .../bmm/workflows/4-implementation/code-review/instructions.xml | 2 ++ 2 files changed, 3 insertions(+) diff --git a/src/modules/bmgd/workflows/4-production/code-review/instructions.xml b/src/modules/bmgd/workflows/4-production/code-review/instructions.xml index e57a940d..d639df2b 100644 --- a/src/modules/bmgd/workflows/4-production/code-review/instructions.xml +++ b/src/modules/bmgd/workflows/4-production/code-review/instructions.xml @@ -12,6 +12,7 @@ Read EVERY file in the File List - verify implementation against story requirements Tasks marked complete but not done = CRITICAL finding Acceptance Criteria not implemented = HIGH severity finding + Do not review files that are not part of the application's source code. Always exclude the _bmad/ and _bmad-output/ folders from the review. Always exclude IDE and CLI configuration folders like .cursor/ and .windsurf/ and .claude/ Use provided {{story_path}} or ask user which story file to review diff --git a/src/modules/bmm/workflows/4-implementation/code-review/instructions.xml b/src/modules/bmm/workflows/4-implementation/code-review/instructions.xml index e57a940d..e5649559 100644 --- a/src/modules/bmm/workflows/4-implementation/code-review/instructions.xml +++ b/src/modules/bmm/workflows/4-implementation/code-review/instructions.xml @@ -12,6 +12,8 @@ Read EVERY file in the File List - verify implementation against story requirements Tasks marked complete but not done = CRITICAL finding Acceptance Criteria not implemented = HIGH severity finding + Do not review files that are not part of the application's source code. Always exclude the _bmad/ and _bmad-output/ folders from the review. Always exclude IDE and CLI configuration folders like .cursor/ and .windsurf/ and .claude/ + Use provided {{story_path}} or ask user which story file to review From cd45d22eb68d200cd1895991e1a52fef1310aae7 Mon Sep 17 00:00:00 2001 From: Murat K Ozcan <34237651+muratkeremozcan@users.noreply.github.com> Date: Thu, 1 Jan 2026 05:06:55 -0600 Subject: [PATCH 02/19] docs: chose your tea engagement (#1228) * docs: chose your tea engagement * docs: addressed PR comments * docs: made refiements to the mermaid diagram * docs: wired in test architect discoverability nudges --------- Co-authored-by: Brian --- docs/modules/bmm-bmad-method/index.md | 2 + docs/modules/bmm-bmad-method/quick-start.md | 22 +++++++++- .../bmm-bmad-method/test-architecture.md | 43 +++++++++++++++++-- .../workflows-implementation.md | 5 ++- .../bmm-bmad-method/workflows-solutioning.md | 2 +- .../create-story/instructions.xml | 3 +- .../dev-story/instructions.xml | 3 +- 7 files changed, 69 insertions(+), 11 deletions(-) diff --git a/docs/modules/bmm-bmad-method/index.md b/docs/modules/bmm-bmad-method/index.md index 6541317d..c01f8978 100644 --- a/docs/modules/bmm-bmad-method/index.md +++ b/docs/modules/bmm-bmad-method/index.md @@ -40,6 +40,8 @@ First know there is the full BMad Method Process and then there is a Quick Flow - Implementation in minutes, not days - Has a specialized single agent that does all of this: **[Quick Flow Solo Dev Agent](./quick-flow-solo-dev.md)** +- **TEA engagement (optional)** - Choose TEA engagement: none, TEA-only (standalone), or integrated by track. See **[Test Architect Guide](./test-architecture.md)**. + ## 🤖 Agents and Collaboration Complete guide to BMM's AI agent team: diff --git a/docs/modules/bmm-bmad-method/quick-start.md b/docs/modules/bmm-bmad-method/quick-start.md index f5f73785..9358ba15 100644 --- a/docs/modules/bmm-bmad-method/quick-start.md +++ b/docs/modules/bmm-bmad-method/quick-start.md @@ -179,6 +179,16 @@ Once epics and stories are created: **Why run this?** It ensures all your planning assets align properly before you start building. +#### Optional: TEA Engagement + +Testing is not mandated by BMad. Decide how you want to engage TEA: + +- **No TEA** - Use your existing team testing approach +- **TEA-only (Standalone)** - Use TEA workflows with your own requirements and environment +- **TEA-integrated** - Use TEA as part of the BMad Method or Enterprise flow + +See the [Test Architect Guide](./test-architecture.md) for the five TEA engagement models and recommended sequences. + #### Context Management Tips - **Use 200k+ context models** for best results (Claude Sonnet 4.5, GPT-4, etc.) @@ -211,7 +221,14 @@ Once planning and architecture are complete, you'll move to Phase 4. **Important 3. Tell the agent: "Run dev-story" 4. The DEV agent will implement the story and update the sprint status -#### 3.4 Review the Code (Optional but Recommended) +#### 3.4 Generate Guardrail Tests (Optional) + +1. **Start a new chat** with the **TEA agent** +2. Wait for the menu +3. Tell the agent: "Run automate" +4. The TEA agent generates or expands tests to act as guardrails + +#### 3.5 Review the Code (Optional but Recommended) 1. **Start a new chat** with the **DEV agent** 2. Wait for the menu @@ -224,7 +241,8 @@ For each subsequent story, repeat the cycle using **fresh chats** for each workf 1. **New chat** → SM agent → "Run create-story" 2. **New chat** → DEV agent → "Run dev-story" -3. **New chat** → DEV agent → "Run code-review" (optional but recommended) +3. **New chat** → TEA agent → "Run automate" (optional) +4. **New chat** → DEV agent → "Run code-review" (optional but recommended) After completing all stories in an epic: diff --git a/docs/modules/bmm-bmad-method/test-architecture.md b/docs/modules/bmm-bmad-method/test-architecture.md index e64282d3..9d417a7a 100644 --- a/docs/modules/bmm-bmad-method/test-architecture.md +++ b/docs/modules/bmm-bmad-method/test-architecture.md @@ -6,6 +6,38 @@ - **Mission:** Deliver actionable quality strategies, automation coverage, and gate decisions that scale with project complexity and compliance demands. - **Use When:** BMad Method or Enterprise track projects, integration risk is non-trivial, brownfield regression risk exists, or compliance/NFR evidence is required. (Quick Flow projects typically don't require TEA) +## Choose Your TEA Engagement Model + +BMad does not mandate TEA. There are five valid ways to use it (or skip it). Pick one intentionally. + +1. **No TEA** + - Skip all TEA workflows. Use your existing team testing approach. + +2. **TEA-only (Standalone)** + - Use TEA on a non-BMad project. Bring your own requirements, acceptance criteria, and environments. + - Typical sequence: `*test-design` (system or epic) -> `*atdd` and/or `*automate` -> optional `*test-review` -> `*trace` for coverage and gate decisions. + - Run `*framework` or `*ci` only if you want TEA to scaffold the harness or pipeline. + +3. **Integrated: Greenfield - BMad Method (Simple/Standard Work)** + - Phase 3: system-level `*test-design`, then `*framework` and `*ci`. + - Phase 4: per-epic `*test-design`, optional `*atdd`, then `*automate` and optional `*test-review`. + - Gate (Phase 2): `*trace`. + +4. **Integrated: Brownfield - BMad Method or Enterprise (Simple or Complex)** + - Phase 2: baseline `*trace`. + - Phase 3: system-level `*test-design`, then `*framework` and `*ci`. + - Phase 4: per-epic `*test-design` focused on regression and integration risks. + - Gate (Phase 2): `*trace`; `*nfr-assess` (if not done earlier). + - For brownfield BMad Method, follow the same flow with `*nfr-assess` optional. + +5. **Integrated: Greenfield - Enterprise Method (Enterprise/Compliance Work)** + - Phase 2: `*nfr-assess`. + - Phase 3: system-level `*test-design`, then `*framework` and `*ci`. + - Phase 4: per-epic `*test-design`, plus `*atdd`/`*automate`/`*test-review`. + - Gate (Phase 2): `*trace`; archive artifacts as needed. + +If you are unsure, default to the integrated path for your track and adjust later. + ## TEA Workflow Lifecycle TEA integrates into the BMad development lifecycle during Solutioning (Phase 3) and Implementation (Phase 4): @@ -16,6 +48,9 @@ graph TB subgraph Phase2["Phase 2: PLANNING"] PM["PM: *prd (creates PRD with FRs/NFRs)"] PlanNote["Business requirements phase"] + NFR2["TEA: *nfr-assess (optional, enterprise)"] + PM -.-> NFR2 + NFR2 -.-> PlanNote PM -.-> PlanNote end @@ -23,8 +58,8 @@ graph TB Architecture["Architect: *architecture"] EpicsStories["PM/Architect: *create-epics-and-stories"] TestDesignSys["TEA: *test-design (system-level)"] - Framework["TEA: *framework"] - CI["TEA: *ci"] + Framework["TEA: *framework (optional if needed)"] + CI["TEA: *ci (optional if needed)"] GateCheck["Architect: *implementation-readiness"] Architecture --> EpicsStories Architecture --> TestDesignSys @@ -174,7 +209,7 @@ npm install -D @seontechnologies/playwright-utils **Enable during BMAD installation** by answering "Yes" when prompted. -**Supported utilities (11 total):** +**Supported utilities (10 total):** - api-request, network-recorder, auth-session, intercept-network-call, recurse - log, file-utils, burn-in, network-error-monitor @@ -429,7 +464,7 @@ Provides fixture-based utilities that integrate into TEA's test generation and r Benefit: Faster CI feedback, HTTP error detection -**Utilities available** (11 total): api-request, network-recorder, auth-session, intercept-network-call, recurse, log, file-utils, burn-in, network-error-monitor, fixtures-composition +**Utilities available** (10 total): api-request, network-recorder, auth-session, intercept-network-call, recurse, log, file-utils, burn-in, network-error-monitor, fixtures-composition **Enable during BMAD installation** by answering "Yes" when prompted, or manually set `tea_use_playwright_utils: true` in `_bmad/bmm/config.yaml`. diff --git a/docs/modules/bmm-bmad-method/workflows-implementation.md b/docs/modules/bmm-bmad-method/workflows-implementation.md index 73dfa432..02d9c471 100644 --- a/docs/modules/bmm-bmad-method/workflows-implementation.md +++ b/docs/modules/bmm-bmad-method/workflows-implementation.md @@ -98,8 +98,9 @@ Stories move through these states in the sprint status file: 1. SM runs `create-story` 2. DEV runs `dev-story` -3. DEV runs `code-review` -4. If code review fails: DEV fixes issues in `dev-story`, then re-runs `code-review` +3. (Optional) TEA runs `*automate` to generate or expand guardrail tests +4. DEV runs `code-review` +5. If code review fails: DEV fixes issues in `dev-story`, then re-runs `code-review` **After Epic Complete:** diff --git a/docs/modules/bmm-bmad-method/workflows-solutioning.md b/docs/modules/bmm-bmad-method/workflows-solutioning.md index 3b6590e2..8cd61852 100644 --- a/docs/modules/bmm-bmad-method/workflows-solutioning.md +++ b/docs/modules/bmm-bmad-method/workflows-solutioning.md @@ -434,7 +434,7 @@ Architecture documents are living. Update them as you learn during implementatio **Key Difference:** Enterprise adds optional extended workflows AFTER architecture but BEFORE create-epics-and-stories. Everything else is identical to BMad Method. -**Note:** TEA (Test Architect) operates across all phases and validates architecture testability but is not a Phase 3-specific workflow. See [Test Architecture Guide](../../../../docs/modules/bmm-bmad-method/test-architecture.md) for TEA's full lifecycle integration. +**Note:** TEA (Test Architect) operates across all phases and validates architecture testability but is not a Phase 3-specific workflow. See [Test Architecture Guide](./test-architecture.md) for TEA's full lifecycle integration. --- diff --git a/src/modules/bmm/workflows/4-implementation/create-story/instructions.xml b/src/modules/bmm/workflows/4-implementation/create-story/instructions.xml index 52405e71..701b438e 100644 --- a/src/modules/bmm/workflows/4-implementation/create-story/instructions.xml +++ b/src/modules/bmm/workflows/4-implementation/create-story/instructions.xml @@ -336,9 +336,10 @@ 1. Review the comprehensive story in {{story_file}} 2. Run dev agents `dev-story` for optimized implementation 3. Run `code-review` when complete (auto-marks done) + 4. Optional: Run TEA `*automate` after `dev-story` to generate guardrail tests **The developer now has everything needed for flawless implementation!** - \ No newline at end of file + diff --git a/src/modules/bmm/workflows/4-implementation/dev-story/instructions.xml b/src/modules/bmm/workflows/4-implementation/dev-story/instructions.xml index 40c56244..4fb70efe 100644 --- a/src/modules/bmm/workflows/4-implementation/dev-story/instructions.xml +++ b/src/modules/bmm/workflows/4-implementation/dev-story/instructions.xml @@ -397,6 +397,7 @@ - Verify all acceptance criteria are met - Ensure deployment readiness if applicable - Run `code-review` workflow for peer review + - Optional: Run TEA `*automate` to expand guardrail tests 💡 **Tip:** For best results, run `code-review` using a **different** LLM than the one that implemented this story. @@ -406,4 +407,4 @@ Remain flexible - allow user to choose their own path or ask for other assistance - \ No newline at end of file + From 4142972b6ae71d7e6a9acffc94be408707707cdd Mon Sep 17 00:00:00 2001 From: Andaman Lekawat <79822017+andamanopal@users.noreply.github.com> Date: Thu, 1 Jan 2026 20:14:21 +0700 Subject: [PATCH 03/19] fix: standardize variable naming from {project_root} to {project-root} (#1217) Fixed inconsistent variable naming in workflow instruction files across CIS, BMGD, and BMM modules. The standard variable format uses hyphens ({project-root}) not underscores ({project_root}). Affected files: - CIS: problem-solving, innovation-strategy, design-thinking, storytelling - BMGD: brainstorm-game, narrative, create-story checklist - BMM: excalidraw diagrams, create-story checklist Co-authored-by: Claude Co-authored-by: Brian --- .../workflows/1-preproduction/brainstorm-game/instructions.md | 2 +- .../workflows/2-design/narrative/instructions-narrative.md | 2 +- .../bmgd/workflows/4-production/create-story/checklist.md | 4 ++-- .../bmm/workflows/4-implementation/create-story/checklist.md | 4 ++-- .../excalidraw-diagrams/create-dataflow/instructions.md | 2 +- .../excalidraw-diagrams/create-diagram/instructions.md | 2 +- .../excalidraw-diagrams/create-flowchart/instructions.md | 2 +- .../excalidraw-diagrams/create-wireframe/instructions.md | 2 +- src/modules/cis/workflows/design-thinking/instructions.md | 4 ++-- src/modules/cis/workflows/innovation-strategy/instructions.md | 4 ++-- src/modules/cis/workflows/problem-solving/instructions.md | 4 ++-- src/modules/cis/workflows/storytelling/instructions.md | 4 ++-- 12 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/modules/bmgd/workflows/1-preproduction/brainstorm-game/instructions.md b/src/modules/bmgd/workflows/1-preproduction/brainstorm-game/instructions.md index 55574a3a..21afdc77 100644 --- a/src/modules/bmgd/workflows/1-preproduction/brainstorm-game/instructions.md +++ b/src/modules/bmgd/workflows/1-preproduction/brainstorm-game/instructions.md @@ -1,4 +1,4 @@ -The workflow execution engine is governed by: {project_root}/_bmad/core/tasks/workflow.xml +The workflow execution engine is governed by: {project-root}/_bmad/core/tasks/workflow.xml You MUST have already loaded and processed: {installed_path}/workflow.yaml Communicate all responses in {communication_language} This is a meta-workflow that orchestrates the CIS brainstorming workflow with game-specific context and additional game design techniques diff --git a/src/modules/bmgd/workflows/2-design/narrative/instructions-narrative.md b/src/modules/bmgd/workflows/2-design/narrative/instructions-narrative.md index d47263ea..213a922e 100644 --- a/src/modules/bmgd/workflows/2-design/narrative/instructions-narrative.md +++ b/src/modules/bmgd/workflows/2-design/narrative/instructions-narrative.md @@ -2,7 +2,7 @@ -The workflow execution engine is governed by: {project_root}/_bmad/core/tasks/workflow.xml +The workflow execution engine is governed by: {project-root}/_bmad/core/tasks/workflow.xml You MUST have already completed the GDD workflow Communicate all responses in {communication_language} This workflow creates detailed narrative content for story-driven games diff --git a/src/modules/bmgd/workflows/4-production/create-story/checklist.md b/src/modules/bmgd/workflows/4-production/create-story/checklist.md index b0f22385..55e6c397 100644 --- a/src/modules/bmgd/workflows/4-production/create-story/checklist.md +++ b/src/modules/bmgd/workflows/4-production/create-story/checklist.md @@ -33,7 +33,7 @@ This is a COMPETITION to create the **ULTIMATE story context** that makes LLM de ### **When Running from Create-Story Workflow:** -- The `{project_root}/_bmad/core/tasks/validate-workflow.xml` framework will automatically: +- The `{project-root}/_bmad/core/tasks/validate-workflow.xml` framework will automatically: - Load this checklist file - Load the newly created story file (`{story_file_path}`) - Load workflow variables from `{installed_path}/workflow.yaml` @@ -63,7 +63,7 @@ You will systematically re-do the entire story creation process, but with a crit 1. **Load the workflow configuration**: `{installed_path}/workflow.yaml` for variable inclusion 2. **Load the story file**: `{story_file_path}` (provided by user or discovered) -3. **Load validation framework**: `{project_root}/_bmad/core/tasks/validate-workflow.xml` +3. **Load validation framework**: `{project-root}/_bmad/core/tasks/validate-workflow.xml` 4. **Extract metadata**: epic_num, story_num, story_key, story_title from story file 5. **Resolve all workflow variables**: story_dir, output_folder, epics_file, architecture_file, etc. 6. **Understand current status**: What story implementation guidance is currently provided? diff --git a/src/modules/bmm/workflows/4-implementation/create-story/checklist.md b/src/modules/bmm/workflows/4-implementation/create-story/checklist.md index b0f22385..55e6c397 100644 --- a/src/modules/bmm/workflows/4-implementation/create-story/checklist.md +++ b/src/modules/bmm/workflows/4-implementation/create-story/checklist.md @@ -33,7 +33,7 @@ This is a COMPETITION to create the **ULTIMATE story context** that makes LLM de ### **When Running from Create-Story Workflow:** -- The `{project_root}/_bmad/core/tasks/validate-workflow.xml` framework will automatically: +- The `{project-root}/_bmad/core/tasks/validate-workflow.xml` framework will automatically: - Load this checklist file - Load the newly created story file (`{story_file_path}`) - Load workflow variables from `{installed_path}/workflow.yaml` @@ -63,7 +63,7 @@ You will systematically re-do the entire story creation process, but with a crit 1. **Load the workflow configuration**: `{installed_path}/workflow.yaml` for variable inclusion 2. **Load the story file**: `{story_file_path}` (provided by user or discovered) -3. **Load validation framework**: `{project_root}/_bmad/core/tasks/validate-workflow.xml` +3. **Load validation framework**: `{project-root}/_bmad/core/tasks/validate-workflow.xml` 4. **Extract metadata**: epic_num, story_num, story_key, story_title from story file 5. **Resolve all workflow variables**: story_dir, output_folder, epics_file, architecture_file, etc. 6. **Understand current status**: What story implementation guidance is currently provided? diff --git a/src/modules/bmm/workflows/excalidraw-diagrams/create-dataflow/instructions.md b/src/modules/bmm/workflows/excalidraw-diagrams/create-dataflow/instructions.md index 2902a8f6..30d32ed3 100644 --- a/src/modules/bmm/workflows/excalidraw-diagrams/create-dataflow/instructions.md +++ b/src/modules/bmm/workflows/excalidraw-diagrams/create-dataflow/instructions.md @@ -1,7 +1,7 @@ # Create Data Flow Diagram - Workflow Instructions ```xml -The workflow execution engine is governed by: {project_root}/_bmad/core/tasks/workflow.xml +The workflow execution engine is governed by: {project-root}/_bmad/core/tasks/workflow.xml You MUST have already loaded and processed: {installed_path}/workflow.yaml This workflow creates data flow diagrams (DFD) in Excalidraw format. diff --git a/src/modules/bmm/workflows/excalidraw-diagrams/create-diagram/instructions.md b/src/modules/bmm/workflows/excalidraw-diagrams/create-diagram/instructions.md index 1595bad1..407a76bf 100644 --- a/src/modules/bmm/workflows/excalidraw-diagrams/create-diagram/instructions.md +++ b/src/modules/bmm/workflows/excalidraw-diagrams/create-diagram/instructions.md @@ -1,7 +1,7 @@ # Create Diagram - Workflow Instructions ```xml -The workflow execution engine is governed by: {project_root}/_bmad/core/tasks/workflow.xml +The workflow execution engine is governed by: {project-root}/_bmad/core/tasks/workflow.xml You MUST have already loaded and processed: {installed_path}/workflow.yaml This workflow creates system architecture diagrams, ERDs, UML diagrams, or general technical diagrams in Excalidraw format. diff --git a/src/modules/bmm/workflows/excalidraw-diagrams/create-flowchart/instructions.md b/src/modules/bmm/workflows/excalidraw-diagrams/create-flowchart/instructions.md index b70607c7..74267905 100644 --- a/src/modules/bmm/workflows/excalidraw-diagrams/create-flowchart/instructions.md +++ b/src/modules/bmm/workflows/excalidraw-diagrams/create-flowchart/instructions.md @@ -1,7 +1,7 @@ # Create Flowchart - Workflow Instructions ```xml -The workflow execution engine is governed by: {project_root}/_bmad/core/tasks/workflow.xml +The workflow execution engine is governed by: {project-root}/_bmad/core/tasks/workflow.xml You MUST have already loaded and processed: {installed_path}/workflow.yaml This workflow creates a flowchart visualization in Excalidraw format for processes, pipelines, or logic flows. diff --git a/src/modules/bmm/workflows/excalidraw-diagrams/create-wireframe/instructions.md b/src/modules/bmm/workflows/excalidraw-diagrams/create-wireframe/instructions.md index cc727434..dc9506b0 100644 --- a/src/modules/bmm/workflows/excalidraw-diagrams/create-wireframe/instructions.md +++ b/src/modules/bmm/workflows/excalidraw-diagrams/create-wireframe/instructions.md @@ -1,7 +1,7 @@ # Create Wireframe - Workflow Instructions ```xml -The workflow execution engine is governed by: {project_root}/_bmad/core/tasks/workflow.xml +The workflow execution engine is governed by: {project-root}/_bmad/core/tasks/workflow.xml You MUST have already loaded and processed: {installed_path}/workflow.yaml This workflow creates website or app wireframes in Excalidraw format. diff --git a/src/modules/cis/workflows/design-thinking/instructions.md b/src/modules/cis/workflows/design-thinking/instructions.md index a1812f6a..84090391 100644 --- a/src/modules/cis/workflows/design-thinking/instructions.md +++ b/src/modules/cis/workflows/design-thinking/instructions.md @@ -1,7 +1,7 @@ # Design Thinking Workflow Instructions -The workflow execution engine is governed by: {project_root}/_bmad/core/tasks/workflow.xml -You MUST have already loaded and processed: {project_root}/_bmad/cis/workflows/design-thinking/workflow.yaml +The workflow execution engine is governed by: {project-root}/_bmad/core/tasks/workflow.xml +You MUST have already loaded and processed: {project-root}/_bmad/cis/workflows/design-thinking/workflow.yaml Load and understand design methods from: {design_methods} ⚠️ ABSOLUTELY NO TIME ESTIMATES - NEVER mention hours, days, weeks, months, or ANY time-based predictions. AI has fundamentally changed development speed - what once took teams weeks/months can now be done by one person in hours. DO NOT give ANY time estimates whatsoever. ⚠️ CHECKPOINT PROTOCOL: After EVERY tag, you MUST follow workflow.xml substep 2c: SAVE content to file immediately → SHOW checkpoint separator (━━━━━━━━━━━━━━━━━━━━━━━) → DISPLAY generated content → PRESENT options [a]Advanced Elicitation/[c]Continue/[p]Party-Mode/[y]YOLO → WAIT for user response. Never batch saves or skip checkpoints. diff --git a/src/modules/cis/workflows/innovation-strategy/instructions.md b/src/modules/cis/workflows/innovation-strategy/instructions.md index cf0179a8..713da6e9 100644 --- a/src/modules/cis/workflows/innovation-strategy/instructions.md +++ b/src/modules/cis/workflows/innovation-strategy/instructions.md @@ -1,7 +1,7 @@ # Innovation Strategy Workflow Instructions -The workflow execution engine is governed by: {project_root}/_bmad/core/tasks/workflow.xml -You MUST have already loaded and processed: {project_root}/_bmad/cis/workflows/innovation-strategy/workflow.yaml +The workflow execution engine is governed by: {project-root}/_bmad/core/tasks/workflow.xml +You MUST have already loaded and processed: {project-root}/_bmad/cis/workflows/innovation-strategy/workflow.yaml Load and understand innovation frameworks from: {innovation_frameworks} ⚠️ ABSOLUTELY NO TIME ESTIMATES - NEVER mention hours, days, weeks, months, or ANY time-based predictions. AI has fundamentally changed development speed - what once took teams weeks/months can now be done by one person in hours. DO NOT give ANY time estimates whatsoever. ⚠️ CHECKPOINT PROTOCOL: After EVERY tag, you MUST follow workflow.xml substep 2c: SAVE content to file immediately → SHOW checkpoint separator (━━━━━━━━━━━━━━━━━━━━━━━) → DISPLAY generated content → PRESENT options [a]Advanced Elicitation/[c]Continue/[p]Party-Mode/[y]YOLO → WAIT for user response. Never batch saves or skip checkpoints. diff --git a/src/modules/cis/workflows/problem-solving/instructions.md b/src/modules/cis/workflows/problem-solving/instructions.md index c9ff9343..3d571898 100644 --- a/src/modules/cis/workflows/problem-solving/instructions.md +++ b/src/modules/cis/workflows/problem-solving/instructions.md @@ -1,7 +1,7 @@ # Problem Solving Workflow Instructions -The workflow execution engine is governed by: {project_root}/_bmad/core/tasks/workflow.xml -You MUST have already loaded and processed: {project_root}/_bmad/cis/workflows/problem-solving/workflow.yaml +The workflow execution engine is governed by: {project-root}/_bmad/core/tasks/workflow.xml +You MUST have already loaded and processed: {project-root}/_bmad/cis/workflows/problem-solving/workflow.yaml Load and understand solving methods from: {solving_methods} ⚠️ ABSOLUTELY NO TIME ESTIMATES - NEVER mention hours, days, weeks, months, or ANY time-based predictions. AI has fundamentally changed development speed - what once took teams weeks/months can now be done by one person in hours. DO NOT give ANY time estimates whatsoever. ⚠️ CHECKPOINT PROTOCOL: After EVERY tag, you MUST follow workflow.xml substep 2c: SAVE content to file immediately → SHOW checkpoint separator (━━━━━━━━━━━━━━━━━━━━━━━) → DISPLAY generated content → PRESENT options [a]Advanced Elicitation/[c]Continue/[p]Party-Mode/[y]YOLO → WAIT for user response. Never batch saves or skip checkpoints. diff --git a/src/modules/cis/workflows/storytelling/instructions.md b/src/modules/cis/workflows/storytelling/instructions.md index 0c0fcbe3..f67dd101 100644 --- a/src/modules/cis/workflows/storytelling/instructions.md +++ b/src/modules/cis/workflows/storytelling/instructions.md @@ -3,8 +3,8 @@ ## Workflow -The workflow execution engine is governed by: {project_root}/_bmad/core/tasks/workflow.xml -You MUST have already loaded and processed: {project_root}/_bmad/cis/workflows/storytelling/workflow.yaml +The workflow execution engine is governed by: {project-root}/_bmad/core/tasks/workflow.xml +You MUST have already loaded and processed: {project-root}/_bmad/cis/workflows/storytelling/workflow.yaml Communicate all responses in {communication_language} ⚠️ ABSOLUTELY NO TIME ESTIMATES - NEVER mention hours, days, weeks, months, or ANY time-based predictions. AI has fundamentally changed development speed - what once took teams weeks/months can now be done by one person in hours. DO NOT give ANY time estimates whatsoever. ⚠️ CHECKPOINT PROTOCOL: After EVERY tag, you MUST follow workflow.xml substep 2c: SAVE content to file immediately → SHOW checkpoint separator (━━━━━━━━━━━━━━━━━━━━━━━) → DISPLAY generated content → PRESENT options [a]Advanced Elicitation/[c]Continue/[p]Party-Mode/[y]YOLO → WAIT for user response. Never batch saves or skip checkpoints. From c748f0f6cc4d9c501ef80a07cb663d80d8ebdcc1 Mon Sep 17 00:00:00 2001 From: Brian Madison Date: Thu, 1 Jan 2026 19:40:18 +0800 Subject: [PATCH 04/19] paths for workflow and sprint tatus files fixed --- docs/modules/bmgd-bmad-game-dev/workflows-guide.md | 2 +- .../bmgd/workflows/4-production/code-review/workflow.yaml | 2 +- .../workflows/4-production/correct-course/workflow.yaml | 2 +- .../workflows/4-production/create-story/workflow.yaml | 2 +- .../bmgd/workflows/4-production/dev-story/workflow.yaml | 2 +- .../workflows/4-production/retrospective/workflow.yaml | 2 +- .../workflows/4-production/sprint-status/workflow.yaml | 4 ++-- .../4-implementation/correct-course/workflow.yaml | 2 +- .../workflows/4-implementation/create-story/workflow.yaml | 2 +- .../4-implementation/sprint-status/workflow.yaml | 4 ++-- .../bmm/workflows/testarch/test-design/instructions.md | 4 ++-- src/modules/bmm/workflows/workflow-status/instructions.md | 8 ++++---- 12 files changed, 18 insertions(+), 18 deletions(-) diff --git a/docs/modules/bmgd-bmad-game-dev/workflows-guide.md b/docs/modules/bmgd-bmad-game-dev/workflows-guide.md index e2489224..3b839499 100644 --- a/docs/modules/bmgd-bmad-game-dev/workflows-guide.md +++ b/docs/modules/bmgd-bmad-game-dev/workflows-guide.md @@ -161,7 +161,7 @@ Production workflows inherit from BMM and add game-specific overrides. **Command:** `sprint-planning` **Agent:** Game Scrum Master **Input:** GDD with epics -**Output:** `{output_folder}/sprint-status.yaml` +**Output:** `{implementation_artifacts}/sprint-status.yaml` **Description:** Generates or updates sprint tracking from epic files. Sets up the sprint backlog and tracking. diff --git a/src/modules/bmgd/workflows/4-production/code-review/workflow.yaml b/src/modules/bmgd/workflows/4-production/code-review/workflow.yaml index 9ab42a47..25a9382f 100644 --- a/src/modules/bmgd/workflows/4-production/code-review/workflow.yaml +++ b/src/modules/bmgd/workflows/4-production/code-review/workflow.yaml @@ -12,7 +12,7 @@ user_skill_level: "{config_source}:user_skill_level" document_output_language: "{config_source}:document_output_language" date: system-generated implementation_artifacts: "{config_source}:implementation_artifacts" -sprint_status: "{implementation_artifacts}/sprint-status.yaml || {output_folder}/sprint-status.yaml" +sprint_status: "{implementation_artifacts}/sprint-status.yaml" # Workflow components installed_path: "{project-root}/_bmad/bmgd/workflows/4-production/code-review" diff --git a/src/modules/bmgd/workflows/4-production/correct-course/workflow.yaml b/src/modules/bmgd/workflows/4-production/correct-course/workflow.yaml index 0af8a84e..77079c79 100644 --- a/src/modules/bmgd/workflows/4-production/correct-course/workflow.yaml +++ b/src/modules/bmgd/workflows/4-production/correct-course/workflow.yaml @@ -11,7 +11,7 @@ user_skill_level: "{config_source}:user_skill_level" document_output_language: "{config_source}:document_output_language" date: system-generated implementation_artifacts: "{config_source}:implementation_artifacts" -sprint_status: "{implementation_artifacts}/sprint-status.yaml || {output_folder}/sprint-status.yaml" +sprint_status: "{implementation_artifacts}/sprint-status.yaml" # Smart input file references - handles both whole docs and sharded docs # Priority: Whole document first, then sharded version diff --git a/src/modules/bmgd/workflows/4-production/create-story/workflow.yaml b/src/modules/bmgd/workflows/4-production/create-story/workflow.yaml index 5ce7dd10..508716b3 100644 --- a/src/modules/bmgd/workflows/4-production/create-story/workflow.yaml +++ b/src/modules/bmgd/workflows/4-production/create-story/workflow.yaml @@ -19,7 +19,7 @@ validation: "{installed_path}/checklist.md" # Variables and inputs variables: - sprint_status: "{implementation_artifacts}/sprint-status.yaml || {output_folder}/sprint-status.yaml" # Primary source for story tracking + sprint_status: "{implementation_artifacts}/sprint-status.yaml || {implementation_artifacts}/sprint-status.yaml" # Primary source for story tracking epics_file: "{output_folder}/epics.md" # Preferred source for epic/story breakdown prd_file: "{output_folder}/PRD.md" # Fallback for requirements architecture_file: "{planning_artifacts}/architecture.md" # Optional architecture context diff --git a/src/modules/bmgd/workflows/4-production/dev-story/workflow.yaml b/src/modules/bmgd/workflows/4-production/dev-story/workflow.yaml index dd213876..ea59b392 100644 --- a/src/modules/bmgd/workflows/4-production/dev-story/workflow.yaml +++ b/src/modules/bmgd/workflows/4-production/dev-story/workflow.yaml @@ -16,7 +16,7 @@ story_file: "" # Explicit story path; auto-discovered if empty # Context file uses same story_key as story file (e.g., "1-2-user-authentication.context.xml") context_file: "{story_dir}/{{story_key}}.context.xml" implementation_artifacts: "{config_source}:implementation_artifacts" -sprint_status: "{implementation_artifacts}/sprint-status.yaml || {output_folder}/sprint-status.yaml" +sprint_status: "{implementation_artifacts}/sprint-status.yaml || {implementation_artifacts}/sprint-status.yaml" # Smart input file references - handles both whole docs and sharded docs # Priority: Whole document first, then sharded version diff --git a/src/modules/bmgd/workflows/4-production/retrospective/workflow.yaml b/src/modules/bmgd/workflows/4-production/retrospective/workflow.yaml index 4bbb3000..9ae82b6d 100644 --- a/src/modules/bmgd/workflows/4-production/retrospective/workflow.yaml +++ b/src/modules/bmgd/workflows/4-production/retrospective/workflow.yaml @@ -54,7 +54,7 @@ input_file_patterns: load_strategy: "INDEX_GUIDED" # Required files -sprint_status_file: "{implementation_artifacts}/sprint-status.yaml || {output_folder}/sprint-status.yaml" +sprint_status_file: "{implementation_artifacts}/sprint-status.yaml || {implementation_artifacts}/sprint-status.yaml" story_directory: "{implementation_artifacts}" retrospectives_folder: "{implementation_artifacts}" diff --git a/src/modules/bmgd/workflows/4-production/sprint-status/workflow.yaml b/src/modules/bmgd/workflows/4-production/sprint-status/workflow.yaml index 7824ced7..10694176 100644 --- a/src/modules/bmgd/workflows/4-production/sprint-status/workflow.yaml +++ b/src/modules/bmgd/workflows/4-production/sprint-status/workflow.yaml @@ -18,14 +18,14 @@ instructions: "{installed_path}/instructions.md" # Inputs variables: - sprint_status_file: "{implementation_artifacts}/sprint-status.yaml || {output_folder}/sprint-status.yaml" + sprint_status_file: "{implementation_artifacts}/sprint-status.yaml || {implementation_artifacts}/sprint-status.yaml" tracking_system: "file-system" # Smart input file references input_file_patterns: sprint_status: description: "Sprint status file generated by sprint-planning" - whole: "{implementation_artifacts}/sprint-status.yaml || {output_folder}/sprint-status.yaml" + whole: "{implementation_artifacts}/sprint-status.yaml || {implementation_artifacts}/sprint-status.yaml" load_strategy: "FULL_LOAD" # Standalone so IDE commands get generated diff --git a/src/modules/bmm/workflows/4-implementation/correct-course/workflow.yaml b/src/modules/bmm/workflows/4-implementation/correct-course/workflow.yaml index 436aeff0..70813514 100644 --- a/src/modules/bmm/workflows/4-implementation/correct-course/workflow.yaml +++ b/src/modules/bmm/workflows/4-implementation/correct-course/workflow.yaml @@ -13,7 +13,7 @@ implementation_artifacts: "{config_source}:implementation_artifacts" planning_artifacts: "{config_source}:planning_artifacts" project_knowledge: "{config_source}:project_knowledge" output_folder: "{implementation_artifacts}" -sprint_status: "{implementation_artifacts}/sprint-status.yaml || {output_folder}/sprint-status.yaml" +sprint_status: "{implementation_artifacts}/sprint-status.yaml" # Smart input file references - handles both whole docs and sharded docs # Priority: Whole document first, then sharded version diff --git a/src/modules/bmm/workflows/4-implementation/create-story/workflow.yaml b/src/modules/bmm/workflows/4-implementation/create-story/workflow.yaml index e79a7f97..258794c7 100644 --- a/src/modules/bmm/workflows/4-implementation/create-story/workflow.yaml +++ b/src/modules/bmm/workflows/4-implementation/create-story/workflow.yaml @@ -20,7 +20,7 @@ validation: "{installed_path}/checklist.md" # Variables and inputs variables: - sprint_status: "{implementation_artifacts}/sprint-status.yaml || {output_folder}/sprint-status.yaml" # Primary source for story tracking + sprint_status: "{implementation_artifacts}/sprint-status.yaml" # Primary source for story tracking epics_file: "{planning_artifacts}/epics.md" # Enhanced epics+stories with BDD and source hints prd_file: "{planning_artifacts}/prd.md" # Fallback for requirements (if not in epics file) architecture_file: "{planning_artifacts}/architecture.md" # Fallback for constraints (if not in epics file) diff --git a/src/modules/bmm/workflows/4-implementation/sprint-status/workflow.yaml b/src/modules/bmm/workflows/4-implementation/sprint-status/workflow.yaml index 2dd2f25c..6f10a9a6 100644 --- a/src/modules/bmm/workflows/4-implementation/sprint-status/workflow.yaml +++ b/src/modules/bmm/workflows/4-implementation/sprint-status/workflow.yaml @@ -19,14 +19,14 @@ instructions: "{installed_path}/instructions.md" # Inputs variables: - sprint_status_file: "{implementation_artifacts}/sprint-status.yaml || {output_folder}/sprint-status.yaml" + sprint_status_file: "{implementation_artifacts}/sprint-status.yaml" tracking_system: "file-system" # Smart input file references input_file_patterns: sprint_status: description: "Sprint status file generated by sprint-planning" - whole: "{implementation_artifacts}/sprint-status.yaml || {output_folder}/sprint-status.yaml" + whole: "{implementation_artifacts}/sprint-status.yaml" load_strategy: "FULL_LOAD" # Standalone so IDE commands get generated diff --git a/src/modules/bmm/workflows/testarch/test-design/instructions.md b/src/modules/bmm/workflows/testarch/test-design/instructions.md index 217d7c86..86561cfd 100644 --- a/src/modules/bmm/workflows/testarch/test-design/instructions.md +++ b/src/modules/bmm/workflows/testarch/test-design/instructions.md @@ -25,11 +25,11 @@ The workflow auto-detects which mode to use based on project phase. ### Mode Detection 1. **Check for sprint-status.yaml** - - If `{output_folder}/bmm-sprint-status.yaml` exists → **Epic-Level Mode** (Phase 4) + - If `{implementation_artifacts}/sprint-status.yaml` exists → **Epic-Level Mode** (Phase 4) - If NOT exists → Check workflow status 2. **Check workflow-status.yaml** - - Read `{output_folder}/bmm-workflow-status.yaml` + - Read `{planning_artifacts}/bmm-workflow-status.yaml` - If `implementation-readiness: required` or `implementation-readiness: recommended` → **System-Level Mode** (Phase 3) - Otherwise → **Epic-Level Mode** (Phase 4 without sprint status yet) diff --git a/src/modules/bmm/workflows/workflow-status/instructions.md b/src/modules/bmm/workflows/workflow-status/instructions.md index 5f816aa6..6c25bdb1 100644 --- a/src/modules/bmm/workflows/workflow-status/instructions.md +++ b/src/modules/bmm/workflows/workflow-status/instructions.md @@ -197,7 +197,7 @@ Your choice: -Read {output_folder}/bmm-workflow-status.yaml if exists +Read {planning_artifacts}/bmm-workflow-status.yaml if exists status_exists = false @@ -261,7 +261,7 @@ Your choice: -Read {output_folder}/bmm-workflow-status.yaml if exists +Read {planning_artifacts}/bmm-workflow-status.yaml if exists status_exists = false @@ -309,7 +309,7 @@ Your choice: -Check if {output_folder}/bmm-workflow-status.yaml exists +Check if {planning_artifacts}/bmm-workflow-status.yaml exists status_exists = true @@ -325,7 +325,7 @@ Your choice: -Read {output_folder}/bmm-workflow-status.yaml +Read {planning_artifacts}/bmm-workflow-status.yaml success = false From 05ddc2d29b75d5297f1fe51f3128c05aa5a19e53 Mon Sep 17 00:00:00 2001 From: Alex Verkhovsky Date: Fri, 2 Jan 2026 17:14:09 -0800 Subject: [PATCH 05/19] fix(dev): allow full project-context usage with conflict precedence (#1220) --- src/modules/bmm/agents/dev.agent.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/modules/bmm/agents/dev.agent.yaml b/src/modules/bmm/agents/dev.agent.yaml index c5d79017..0b14d984 100644 --- a/src/modules/bmm/agents/dev.agent.yaml +++ b/src/modules/bmm/agents/dev.agent.yaml @@ -20,12 +20,12 @@ agent: - Never implement anything not mapped to a specific task/subtask in the story file - All existing tests must pass 100% before story is ready for review - Every task/subtask must be covered by comprehensive unit tests before marking complete - - Project context provides coding standards but never overrides story requirements - - Find if this exists, if it does, always treat it as the bible I plan and execute against: `**/project-context.md` + - Follow project-context.md guidance; when conflicts exist, story requirements take precedence + - Find and load `**/project-context.md` if it exists - essential reference for implementation critical_actions: - "READ the entire story file BEFORE any implementation - tasks/subtasks sequence is your authoritative implementation guide" - - "Load project-context.md if available for coding standards only - never let it override story requirements" + - "Load project-context.md if available and follow its guidance - when conflicts exist, story requirements always take precedence" - "Execute tasks/subtasks IN ORDER as written in story file - no skipping, no reordering, no doing what you want" - "For each task/subtask: follow red-green-refactor cycle - write failing test first, then implementation" - "Mark task/subtask [x] ONLY when both implementation AND tests are complete and passing" From d1f3844449274b400eb2055d9b5c0468f22434ab Mon Sep 17 00:00:00 2001 From: forcetrainer Date: Sat, 3 Jan 2026 04:09:42 -0500 Subject: [PATCH 06/19] Docusaurus build fix - Sidebar and missing image issues (#1243) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(docs): align sidebar with actual docs structure and fix image path Sidebar referenced non-existent paths (modules/bmm/, getting-started/, etc.) while actual docs live in different locations (modules/bmm-bmad-method/, bmad-core-concepts/, etc.). Updated sidebar to match reality so Docusaurus can build successfully. Also fixed broken image reference in workflows-guide.md that used an incorrect relative path. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 * fix(docs): update build script to include docs/modules directory The build script was excluding the modules folder when copying from docs/, but module docs now live in docs/modules/ instead of src/modules/*/docs/. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 * fix(docs): correct broken internal links Fixed relative paths that were pointing to non-existent locations: - bmgd index: ../../bmm/docs/index.md → ../bmm/index.md - cis index: ../../bmm/docs/index.md → ../bmm/index.md - bmm faq: ./README.md → GitHub URL 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --------- Co-authored-by: Claude Opus 4.5 --- docs/modules/bmgd-bmad-game-dev/index.md | 2 +- .../bmgd-bmad-game-dev/workflows-guide.md | 2 +- docs/modules/bmm-bmad-method/faq.md | 2 +- .../cis-creative-intelligence-suite/index.md | 2 +- tools/build-docs.js | 3 +- website/sidebars.js | 125 +++++++++--------- 6 files changed, 66 insertions(+), 70 deletions(-) diff --git a/docs/modules/bmgd-bmad-game-dev/index.md b/docs/modules/bmgd-bmad-game-dev/index.md index 510cf899..9d53e295 100644 --- a/docs/modules/bmgd-bmad-game-dev/index.md +++ b/docs/modules/bmgd-bmad-game-dev/index.md @@ -161,7 +161,7 @@ BMGD Documentation ### Related Documentation -- **[BMM Documentation](../../bmm/docs/index.md)** - Core BMad Method documentation +- **[BMM Documentation](../bmm/index.md)** - Core BMad Method documentation ## Tips for Using This Documentation diff --git a/docs/modules/bmgd-bmad-game-dev/workflows-guide.md b/docs/modules/bmgd-bmad-game-dev/workflows-guide.md index 3b839499..d649bc09 100644 --- a/docs/modules/bmgd-bmad-game-dev/workflows-guide.md +++ b/docs/modules/bmgd-bmad-game-dev/workflows-guide.md @@ -8,7 +8,7 @@ Complete reference for all BMGD workflows organized by development phase. BMGD workflows are organized into four phases: -![BMGD Workflow Overview](../../../../docs/modules/bmgd-bmad-game-dev/workflow-overview.jpg) +![BMGD Workflow Overview](./workflow-overview.jpg) --- diff --git a/docs/modules/bmm-bmad-method/faq.md b/docs/modules/bmm-bmad-method/faq.md index 628d265e..1849f6b9 100644 --- a/docs/modules/bmm-bmad-method/faq.md +++ b/docs/modules/bmm-bmad-method/faq.md @@ -510,7 +510,7 @@ Trust your expertise - BMM supports your decisions. **A:** -1. Search [Complete Documentation](./README.md) for related topics +1. Search [Complete Documentation](https://github.com/bmad-code-org/BMAD-METHOD/blob/main/README.md) for related topics 2. Ask in [Discord Community](https://discord.gg/gk8jAdXWmj) (#general-dev) 3. Open a [GitHub Issue](https://github.com/bmad-code-org/BMAD-METHOD/issues) 4. Watch [YouTube Tutorials](https://www.youtube.com/@BMadCode) diff --git a/docs/modules/cis-creative-intelligence-suite/index.md b/docs/modules/cis-creative-intelligence-suite/index.md index 46fb6e0a..05b567f3 100644 --- a/docs/modules/cis-creative-intelligence-suite/index.md +++ b/docs/modules/cis-creative-intelligence-suite/index.md @@ -142,7 +142,7 @@ CIS workflows integrate with: ## Related Documentation -- **[BMM Documentation](../../bmm/docs/index.md)** - Core BMad Method documentation +- **[BMM Documentation](../bmm/index.md)** - Core BMad Method documentation --- diff --git a/tools/build-docs.js b/tools/build-docs.js index fbab38aa..bfeda390 100644 --- a/tools/build-docs.js +++ b/tools/build-docs.js @@ -129,7 +129,8 @@ function buildDocusaurusSite(artifactsDir) { function copyMainDocs(destDir) { console.log(' → Copying main docs...'); const docsDir = path.join(PROJECT_ROOT, 'docs'); - copyDirectory(docsDir, destDir, ['modules', 'llms.txt', 'llms-full.txt'], true); + // Include modules folder - docs now live in docs/modules/ instead of src/modules/*/docs/ + copyDirectory(docsDir, destDir, ['llms.txt', 'llms-full.txt'], true); } function copyRootDocs(destDir) { diff --git a/website/sidebars.js b/website/sidebars.js index 827fa131..aa6b183a 100644 --- a/website/sidebars.js +++ b/website/sidebars.js @@ -4,40 +4,56 @@ const sidebars = { 'index', { type: 'category', - label: 'Getting Started', + label: 'Core Concepts', items: [ - 'getting-started/installation', + 'bmad-core-concepts/index', + 'bmad-core-concepts/agents', + 'bmad-core-concepts/workflows', + 'bmad-core-concepts/modules', { type: 'category', - label: 'IDE Guides', + label: 'Installing', collapsed: true, - items: [], + items: ['bmad-core-concepts/installing/index', 'bmad-core-concepts/installing/upgrading'], }, - 'v4-to-v6-upgrade', + { + type: 'category', + label: 'Customization', + collapsed: true, + items: [ + 'bmad-core-concepts/bmad-customization/index', + 'bmad-core-concepts/bmad-customization/agents', + 'bmad-core-concepts/bmad-customization/workflows', + ], + }, + 'bmad-core-concepts/web-bundles/index', ], }, { type: 'category', label: 'BMM - Method', items: [ - 'modules/bmm/index', - 'modules/bmm/quick-start', - 'modules/bmm/scale-adaptive-system', + 'modules/bmm-bmad-method/index', + 'modules/bmm-bmad-method/quick-start', { type: 'category', label: 'Quick Flows', collapsed: true, - items: ['modules/bmm/bmad-quick-flow', 'modules/bmm/quick-flow-solo-dev', 'modules/bmm/quick-spec-flow'], + items: [ + 'modules/bmm-bmad-method/bmad-quick-flow', + 'modules/bmm-bmad-method/quick-flow-solo-dev', + 'modules/bmm-bmad-method/quick-spec-flow', + ], }, { type: 'category', label: 'Workflows', collapsed: true, items: [ - 'modules/bmm/workflows-planning', - 'modules/bmm/workflows-solutioning', - 'modules/bmm/workflows-analysis', - 'modules/bmm/workflows-implementation', + 'modules/bmm-bmad-method/workflows-planning', + 'modules/bmm-bmad-method/workflows-solutioning', + 'modules/bmm-bmad-method/workflows-analysis', + 'modules/bmm-bmad-method/workflows-implementation', ], }, { @@ -45,11 +61,10 @@ const sidebars = { label: 'Advanced Topics', collapsed: true, items: [ - 'modules/bmm/party-mode', - 'modules/bmm/agents-guide', - 'modules/bmm/brownfield-guide', - 'modules/bmm/enterprise-agentic-development', - 'modules/bmm/test-architecture', + 'modules/bmm-bmad-method/party-mode', + 'modules/bmm-bmad-method/agents-guide', + 'modules/bmm-bmad-method/brownfield-guide', + 'modules/bmm-bmad-method/test-architecture', ], }, { @@ -57,11 +72,10 @@ const sidebars = { label: 'Reference', collapsed: true, items: [ - 'modules/bmm/workflow-architecture-reference', - 'modules/bmm/workflow-document-project-reference', - 'modules/bmm/troubleshooting', - 'modules/bmm/faq', - 'modules/bmm/glossary', + 'modules/bmm-bmad-method/workflow-document-project-reference', + 'modules/bmm-bmad-method/troubleshooting', + 'modules/bmm-bmad-method/faq', + 'modules/bmm-bmad-method/glossary', ], }, ], @@ -71,32 +85,11 @@ const sidebars = { label: 'BMB - Builder', collapsed: true, items: [ - 'modules/bmb/index', - { - type: 'category', - label: 'Building Agents', - collapsed: true, - items: [ - 'modules/bmb/agents/index', - 'modules/bmb/agents/understanding-agent-types', - 'modules/bmb/agents/simple-agent-architecture', - 'modules/bmb/agents/expert-agent-architecture', - 'modules/bmb/agents/agent-compilation', - 'modules/bmb/agents/agent-menu-patterns', - ], - }, - { - type: 'category', - label: 'Building Workflows', - collapsed: true, - items: [ - 'modules/bmb/workflows/index', - 'modules/bmb/workflows/architecture', - 'modules/bmb/workflows/terms', - 'modules/bmb/workflows/intent-vs-prescriptive-spectrum', - 'modules/bmb/workflows/csv-data-file-standards', - ], - }, + 'modules/bmb-bmad-builder/index', + 'modules/bmb-bmad-builder/agent-creation-guide', + 'modules/bmb-bmad-builder/workflow-vendoring-customization-inheritance', + 'modules/bmb-bmad-builder/custom-content', + 'modules/bmb-bmad-builder/custom-content-installation', ], }, { @@ -104,33 +97,35 @@ const sidebars = { label: 'BMGD - Game Dev', collapsed: true, items: [ - 'modules/bmgd/index', - 'modules/bmgd/quick-start', - 'modules/bmgd/quick-flow-guide', - 'modules/bmgd/agents-guide', - 'modules/bmgd/workflows-guide', - 'modules/bmgd/game-types-guide', - 'modules/bmgd/troubleshooting', - 'modules/bmgd/glossary', + 'modules/bmgd-bmad-game-dev/index', + 'modules/bmgd-bmad-game-dev/quick-start', + 'modules/bmgd-bmad-game-dev/quick-flow-guide', + 'modules/bmgd-bmad-game-dev/agents-guide', + 'modules/bmgd-bmad-game-dev/workflows-guide', + 'modules/bmgd-bmad-game-dev/game-types-guide', + 'modules/bmgd-bmad-game-dev/troubleshooting', + 'modules/bmgd-bmad-game-dev/glossary', ], }, { type: 'category', label: 'CIS - Creative Intelligence', collapsed: true, - items: ['modules/cis/index'], + items: ['modules/cis-creative-intelligence-suite/index'], }, { type: 'category', - label: 'Reference', + label: 'Core Module', collapsed: true, items: [ - 'document-sharding-guide', - 'custom-content', - 'custom-content-installation', - 'agent-customization-guide', - 'web-bundles-gemini-gpt-guide', - 'BUNDLE_DISTRIBUTION_SETUP', + 'modules/core/index', + 'modules/core/party-mode', + 'modules/core/core-tasks', + 'modules/core/core-workflows', + 'modules/core/advanced-elicitation', + 'modules/core/brainstorming', + 'modules/core/document-sharding-guide', + 'modules/core/global-core-config', ], }, ], From f31659765e84d89df233444e0feac27be095ba9a Mon Sep 17 00:00:00 2001 From: Brian Madison Date: Fri, 2 Jan 2026 21:07:23 +0800 Subject: [PATCH 07/19] trimodal viarate workflow creation --- .../bmb/agents/workflow-builder.agent.yaml | 18 +- .../bmb/docs/workflows/architecture.md | 220 -------- .../docs/workflows/csv-data-file-standards.md | 206 -------- .../intent-vs-prescriptive-spectrum.md | 220 -------- .../bmb/docs/workflows/step-file-rules.md | 469 ------------------ .../bmb/docs/workflows/templates/step-file.md | 139 ------ .../bmb/docs/workflows/templates/workflow.md | 58 --- src/modules/bmb/docs/workflows/terms.md | 97 ---- .../agent/steps-c/step-01-brainstorm.md | 4 +- .../agent/steps-c/step-02-discovery.md | 4 +- .../agent/steps-c/step-03-type-metadata.md | 4 +- .../agent/steps-c/step-04-persona.md | 4 +- .../agent/steps-c/step-05-commands-menu.md | 4 +- .../agent/steps-c/step-06-activation.md | 4 +- .../agent/steps-c/step-07a-build-simple.md | 4 +- .../steps-c/step-08a-plan-traceability.md | 4 +- .../steps-c/step-08e-structure-validation.md | 4 +- .../steps-c/step-08f-sidecar-validation.md | 4 +- .../agent/steps-c/step-09-celebrate.md | 4 +- .../agent/steps-e/e-01-load-existing.md | 4 +- .../agent/steps-e/e-02-discover-edits.md | 4 +- .../agent/steps-e/e-03-placeholder.md | 1 + .../agent/steps-e/e-04-type-metadata.md | 4 +- .../workflows/agent/steps-e/e-05-persona.md | 4 +- .../agent/steps-e/e-06-commands-menu.md | 4 +- .../agent/steps-e/e-07-activation.md | 4 +- .../agent/steps-e/e-08a-edit-simple.md | 4 +- .../agent/steps-e/e-08b-edit-expert.md | 4 +- .../agent/steps-e/e-08c-edit-module.md | 4 +- .../agent/steps-e/e-09a-validate-metadata.md | 4 +- .../agent/steps-e/e-09b-validate-persona.md | 4 +- .../agent/steps-e/e-09c-validate-menu.md | 4 +- .../agent/steps-e/e-09d-validate-structure.md | 4 +- .../agent/steps-e/e-09e-validate-sidecar.md | 4 +- .../agent/steps-e/e-09f-validation-summary.md | 4 +- .../workflows/agent/steps-e/e-10-celebrate.md | 4 +- .../agent/steps-v/v-01-load-review.md | 4 +- .../agent/steps-v/v-02a-validate-metadata.md | 4 +- .../agent/steps-v/v-02b-validate-persona.md | 4 +- .../agent/steps-v/v-02c-validate-menu.md | 4 +- .../agent/steps-v/v-02d-validate-structure.md | 4 +- .../agent/steps-v/v-02e-validate-sidecar.md | 4 +- .../workflows/agent/steps-v/v-03-summary.md | 4 +- .../create-workflow/steps/step-01-init.md | 158 ------ .../create-workflow/steps/step-02-gather.md | 212 -------- .../steps/step-03-tools-configuration.md | 251 ---------- .../steps/step-04-plan-review.md | 217 -------- .../steps/step-05-output-format-design.md | 290 ----------- .../create-workflow/steps/step-07-build.md | 323 ------------ .../create-workflow/steps/step-08-review.md | 285 ----------- .../create-workflow/steps/step-09-complete.md | 188 ------- .../edit-workflow/steps/step-01-analyze.md | 217 -------- .../edit-workflow/steps/step-02-discover.md | 254 ---------- .../edit-workflow/steps/step-03-improve.md | 218 -------- .../edit-workflow/steps/step-04-validate.md | 194 -------- .../steps/step-05-compliance-check.md | 246 --------- .../templates/completion-summary.md | 75 --- .../templates/improvement-goals.md | 68 --- .../templates/improvement-log.md | 40 -- .../templates/validation-results.md | 51 -- .../templates/workflow-analysis.md | 56 --- .../bmb/workflows/edit-workflow/workflow.md | 59 --- .../steps/step-01-validate-goal.md | 153 ------ .../steps/step-02-workflow-validation.md | 244 --------- .../steps/step-03-step-validation.md | 275 ---------- .../steps/step-04-file-validation.md | 296 ----------- .../step-05-intent-spectrum-validation.md | 265 ---------- .../step-06-web-subprocess-validation.md | 361 -------------- .../steps/step-07-holistic-analysis.md | 259 ---------- .../steps/step-08-generate-report.md | 302 ----------- .../templates/compliance-report.md | 140 ------ .../workflow-compliance-check/workflow.md | 59 --- .../workflows/workflow/data/architecture.md | 152 ++++++ .../workflow/data}/common-workflow-tools.csv | 0 .../workflow/data/csv-data-file-standards.md | 81 +++ .../data/dietary-restrictions.csv | 0 .../data/macro-calculator.csv | 0 .../data/recipe-database.csv | 0 .../steps-c}/step-01-init.md | 13 +- .../steps-c}/step-01b-continue.md | 18 +- .../steps-c}/step-02-profile.md | 10 +- .../steps-c}/step-03-assessment.md | 14 +- .../steps-c}/step-04-strategy.md | 14 +- .../steps-c}/step-05-shopping.md | 10 +- .../steps-c}/step-06-prep-schedule.md | 8 +- .../templates/assessment-section.md | 0 .../templates/nutrition-plan.md | 0 .../templates/prep-schedule-section.md | 0 .../templates/profile-section.md | 0 .../templates/shopping-section.md | 0 .../templates/strategy-section.md | 0 .../examples/meal-prep-nutrition/workflow.md | 2 +- .../workflow/data/frontmatter-standards.md | 179 +++++++ .../data/input-discovery-standards.md | 269 ++++++++++ .../data/intent-vs-prescriptive-spectrum.md | 50 ++ .../workflow/data/menu-handling-standards.md | 167 +++++++ .../workflow/data/output-format-standards.md | 188 +++++++ .../workflow/data/step-file-rules.md | 235 +++++++++ .../workflow/data/step-type-patterns.md | 312 ++++++++++++ .../data/trimodal-workflow-structure.md | 209 ++++++++ .../data/workflow-chaining-standards.md | 271 ++++++++++ .../workflow/data/workflow-examples.md | 276 +++++++++++ .../workflow/data/workflow-type-criteria.md | 172 +++++++ .../workflow/steps-c/step-00-conversion.md | 262 ++++++++++ .../workflow/steps-c/step-01-discovery.md | 194 ++++++++ .../steps-c/step-02-classification.md | 269 ++++++++++ .../workflow/steps-c/step-03-requirements.md | 282 +++++++++++ .../workflow/steps-c/step-04-tools.md | 281 +++++++++++ .../workflow/steps-c/step-05-plan-review.md | 242 +++++++++ .../steps-c}/step-06-design.md | 88 ++-- .../workflow/steps-c/step-07-foundation.md | 238 +++++++++ .../workflow/steps-c/step-08-build-step-01.md | 333 +++++++++++++ .../steps-c/step-09-build-next-step.md | 306 ++++++++++++ .../workflow/steps-c/step-10-confirmation.md | 320 ++++++++++++ .../workflow/steps-c/step-11-completion.md | 191 +++++++ .../steps-e/step-e-01-assess-workflow.md | 237 +++++++++ .../steps-e/step-e-02-discover-edits.md | 248 +++++++++ .../steps-e/step-e-03-fix-validation.md | 252 ++++++++++ .../workflow/steps-e/step-e-04-direct-edit.md | 275 ++++++++++ .../workflow/steps-e/step-e-05-apply-edit.md | 154 ++++++ .../steps-e/step-e-06-validate-after.md | 190 +++++++ .../workflow/steps-e/step-e-07-complete.md | 206 ++++++++ .../workflow/steps-v/step-01-validate.md | 245 +++++++++ .../steps-v/step-02-frontmatter-validation.md | 153 ++++++ .../steps-v/step-03-menu-validation.md | 161 ++++++ .../steps-v/step-04-step-type-validation.md | 186 +++++++ .../step-05-output-format-validation.md | 195 ++++++++ .../step-06-validation-design-check.md | 186 +++++++ .../step-07-instruction-style-check.md | 192 +++++++ .../step-08-collaborative-experience-check.md | 199 ++++++++ .../steps-v/step-09-cohesive-review.md | 235 +++++++++ .../steps-v/step-10-report-complete.md | 234 +++++++++ .../steps-v/step-11-plan-validation.md | 209 ++++++++ .../templates/minimal-output-template.md | 11 + .../step-01-init-continuable-template.md | 0 .../workflow}/templates/step-1b-template.md | 0 .../workflow}/templates/step-template.md | 6 +- .../workflow}/templates/workflow-template.md | 0 .../{create-workflow => workflow}/workflow.md | 50 +- 139 files changed, 9480 insertions(+), 7320 deletions(-) delete mode 100644 src/modules/bmb/docs/workflows/architecture.md delete mode 100644 src/modules/bmb/docs/workflows/csv-data-file-standards.md delete mode 100644 src/modules/bmb/docs/workflows/intent-vs-prescriptive-spectrum.md delete mode 100644 src/modules/bmb/docs/workflows/step-file-rules.md delete mode 100644 src/modules/bmb/docs/workflows/templates/step-file.md delete mode 100644 src/modules/bmb/docs/workflows/templates/workflow.md delete mode 100644 src/modules/bmb/docs/workflows/terms.md create mode 100644 src/modules/bmb/workflows/agent/steps-e/e-03-placeholder.md delete mode 100644 src/modules/bmb/workflows/create-workflow/steps/step-01-init.md delete mode 100644 src/modules/bmb/workflows/create-workflow/steps/step-02-gather.md delete mode 100644 src/modules/bmb/workflows/create-workflow/steps/step-03-tools-configuration.md delete mode 100644 src/modules/bmb/workflows/create-workflow/steps/step-04-plan-review.md delete mode 100644 src/modules/bmb/workflows/create-workflow/steps/step-05-output-format-design.md delete mode 100644 src/modules/bmb/workflows/create-workflow/steps/step-07-build.md delete mode 100644 src/modules/bmb/workflows/create-workflow/steps/step-08-review.md delete mode 100644 src/modules/bmb/workflows/create-workflow/steps/step-09-complete.md delete mode 100644 src/modules/bmb/workflows/edit-workflow/steps/step-01-analyze.md delete mode 100644 src/modules/bmb/workflows/edit-workflow/steps/step-02-discover.md delete mode 100644 src/modules/bmb/workflows/edit-workflow/steps/step-03-improve.md delete mode 100644 src/modules/bmb/workflows/edit-workflow/steps/step-04-validate.md delete mode 100644 src/modules/bmb/workflows/edit-workflow/steps/step-05-compliance-check.md delete mode 100644 src/modules/bmb/workflows/edit-workflow/templates/completion-summary.md delete mode 100644 src/modules/bmb/workflows/edit-workflow/templates/improvement-goals.md delete mode 100644 src/modules/bmb/workflows/edit-workflow/templates/improvement-log.md delete mode 100644 src/modules/bmb/workflows/edit-workflow/templates/validation-results.md delete mode 100644 src/modules/bmb/workflows/edit-workflow/templates/workflow-analysis.md delete mode 100644 src/modules/bmb/workflows/edit-workflow/workflow.md delete mode 100644 src/modules/bmb/workflows/workflow-compliance-check/steps/step-01-validate-goal.md delete mode 100644 src/modules/bmb/workflows/workflow-compliance-check/steps/step-02-workflow-validation.md delete mode 100644 src/modules/bmb/workflows/workflow-compliance-check/steps/step-03-step-validation.md delete mode 100644 src/modules/bmb/workflows/workflow-compliance-check/steps/step-04-file-validation.md delete mode 100644 src/modules/bmb/workflows/workflow-compliance-check/steps/step-05-intent-spectrum-validation.md delete mode 100644 src/modules/bmb/workflows/workflow-compliance-check/steps/step-06-web-subprocess-validation.md delete mode 100644 src/modules/bmb/workflows/workflow-compliance-check/steps/step-07-holistic-analysis.md delete mode 100644 src/modules/bmb/workflows/workflow-compliance-check/steps/step-08-generate-report.md delete mode 100644 src/modules/bmb/workflows/workflow-compliance-check/templates/compliance-report.md delete mode 100644 src/modules/bmb/workflows/workflow-compliance-check/workflow.md create mode 100644 src/modules/bmb/workflows/workflow/data/architecture.md rename src/modules/bmb/{docs/workflows => workflows/workflow/data}/common-workflow-tools.csv (100%) create mode 100644 src/modules/bmb/workflows/workflow/data/csv-data-file-standards.md rename src/modules/bmb/workflows/{create-workflow => workflow}/data/examples/meal-prep-nutrition/data/dietary-restrictions.csv (100%) rename src/modules/bmb/workflows/{create-workflow => workflow}/data/examples/meal-prep-nutrition/data/macro-calculator.csv (100%) rename src/modules/bmb/workflows/{create-workflow => workflow}/data/examples/meal-prep-nutrition/data/recipe-database.csv (100%) rename src/modules/bmb/workflows/{create-workflow/data/examples/meal-prep-nutrition/steps => workflow/data/examples/meal-prep-nutrition/steps-c}/step-01-init.md (91%) rename src/modules/bmb/workflows/{create-workflow/data/examples/meal-prep-nutrition/steps => workflow/data/examples/meal-prep-nutrition/steps-c}/step-01b-continue.md (88%) rename src/modules/bmb/workflows/{create-workflow/data/examples/meal-prep-nutrition/steps => workflow/data/examples/meal-prep-nutrition/steps-c}/step-02-profile.md (93%) rename src/modules/bmb/workflows/{create-workflow/data/examples/meal-prep-nutrition/steps => workflow/data/examples/meal-prep-nutrition/steps-c}/step-03-assessment.md (90%) rename src/modules/bmb/workflows/{create-workflow/data/examples/meal-prep-nutrition/steps => workflow/data/examples/meal-prep-nutrition/steps-c}/step-04-strategy.md (91%) rename src/modules/bmb/workflows/{create-workflow/data/examples/meal-prep-nutrition/steps => workflow/data/examples/meal-prep-nutrition/steps-c}/step-05-shopping.md (93%) rename src/modules/bmb/workflows/{create-workflow/data/examples/meal-prep-nutrition/steps => workflow/data/examples/meal-prep-nutrition/steps-c}/step-06-prep-schedule.md (94%) rename src/modules/bmb/workflows/{create-workflow => workflow}/data/examples/meal-prep-nutrition/templates/assessment-section.md (100%) rename src/modules/bmb/workflows/{create-workflow => workflow}/data/examples/meal-prep-nutrition/templates/nutrition-plan.md (100%) rename src/modules/bmb/workflows/{create-workflow => workflow}/data/examples/meal-prep-nutrition/templates/prep-schedule-section.md (100%) rename src/modules/bmb/workflows/{create-workflow => workflow}/data/examples/meal-prep-nutrition/templates/profile-section.md (100%) rename src/modules/bmb/workflows/{create-workflow => workflow}/data/examples/meal-prep-nutrition/templates/shopping-section.md (100%) rename src/modules/bmb/workflows/{create-workflow => workflow}/data/examples/meal-prep-nutrition/templates/strategy-section.md (100%) rename src/modules/bmb/workflows/{create-workflow => workflow}/data/examples/meal-prep-nutrition/workflow.md (95%) create mode 100644 src/modules/bmb/workflows/workflow/data/frontmatter-standards.md create mode 100644 src/modules/bmb/workflows/workflow/data/input-discovery-standards.md create mode 100644 src/modules/bmb/workflows/workflow/data/intent-vs-prescriptive-spectrum.md create mode 100644 src/modules/bmb/workflows/workflow/data/menu-handling-standards.md create mode 100644 src/modules/bmb/workflows/workflow/data/output-format-standards.md create mode 100644 src/modules/bmb/workflows/workflow/data/step-file-rules.md create mode 100644 src/modules/bmb/workflows/workflow/data/step-type-patterns.md create mode 100644 src/modules/bmb/workflows/workflow/data/trimodal-workflow-structure.md create mode 100644 src/modules/bmb/workflows/workflow/data/workflow-chaining-standards.md create mode 100644 src/modules/bmb/workflows/workflow/data/workflow-examples.md create mode 100644 src/modules/bmb/workflows/workflow/data/workflow-type-criteria.md create mode 100644 src/modules/bmb/workflows/workflow/steps-c/step-00-conversion.md create mode 100644 src/modules/bmb/workflows/workflow/steps-c/step-01-discovery.md create mode 100644 src/modules/bmb/workflows/workflow/steps-c/step-02-classification.md create mode 100644 src/modules/bmb/workflows/workflow/steps-c/step-03-requirements.md create mode 100644 src/modules/bmb/workflows/workflow/steps-c/step-04-tools.md create mode 100644 src/modules/bmb/workflows/workflow/steps-c/step-05-plan-review.md rename src/modules/bmb/workflows/{create-workflow/steps => workflow/steps-c}/step-06-design.md (76%) create mode 100644 src/modules/bmb/workflows/workflow/steps-c/step-07-foundation.md create mode 100644 src/modules/bmb/workflows/workflow/steps-c/step-08-build-step-01.md create mode 100644 src/modules/bmb/workflows/workflow/steps-c/step-09-build-next-step.md create mode 100644 src/modules/bmb/workflows/workflow/steps-c/step-10-confirmation.md create mode 100644 src/modules/bmb/workflows/workflow/steps-c/step-11-completion.md create mode 100644 src/modules/bmb/workflows/workflow/steps-e/step-e-01-assess-workflow.md create mode 100644 src/modules/bmb/workflows/workflow/steps-e/step-e-02-discover-edits.md create mode 100644 src/modules/bmb/workflows/workflow/steps-e/step-e-03-fix-validation.md create mode 100644 src/modules/bmb/workflows/workflow/steps-e/step-e-04-direct-edit.md create mode 100644 src/modules/bmb/workflows/workflow/steps-e/step-e-05-apply-edit.md create mode 100644 src/modules/bmb/workflows/workflow/steps-e/step-e-06-validate-after.md create mode 100644 src/modules/bmb/workflows/workflow/steps-e/step-e-07-complete.md create mode 100644 src/modules/bmb/workflows/workflow/steps-v/step-01-validate.md create mode 100644 src/modules/bmb/workflows/workflow/steps-v/step-02-frontmatter-validation.md create mode 100644 src/modules/bmb/workflows/workflow/steps-v/step-03-menu-validation.md create mode 100644 src/modules/bmb/workflows/workflow/steps-v/step-04-step-type-validation.md create mode 100644 src/modules/bmb/workflows/workflow/steps-v/step-05-output-format-validation.md create mode 100644 src/modules/bmb/workflows/workflow/steps-v/step-06-validation-design-check.md create mode 100644 src/modules/bmb/workflows/workflow/steps-v/step-07-instruction-style-check.md create mode 100644 src/modules/bmb/workflows/workflow/steps-v/step-08-collaborative-experience-check.md create mode 100644 src/modules/bmb/workflows/workflow/steps-v/step-09-cohesive-review.md create mode 100644 src/modules/bmb/workflows/workflow/steps-v/step-10-report-complete.md create mode 100644 src/modules/bmb/workflows/workflow/steps-v/step-11-plan-validation.md create mode 100644 src/modules/bmb/workflows/workflow/templates/minimal-output-template.md rename src/modules/bmb/{docs/workflows => workflows/workflow}/templates/step-01-init-continuable-template.md (100%) rename src/modules/bmb/{docs/workflows => workflows/workflow}/templates/step-1b-template.md (100%) rename src/modules/bmb/{docs/workflows => workflows/workflow}/templates/step-template.md (98%) rename src/modules/bmb/{docs/workflows => workflows/workflow}/templates/workflow-template.md (100%) rename src/modules/bmb/workflows/{create-workflow => workflow}/workflow.md (54%) diff --git a/src/modules/bmb/agents/workflow-builder.agent.yaml b/src/modules/bmb/agents/workflow-builder.agent.yaml index 73550646..36281c98 100644 --- a/src/modules/bmb/agents/workflow-builder.agent.yaml +++ b/src/modules/bmb/agents/workflow-builder.agent.yaml @@ -29,13 +29,17 @@ agent: menu: - trigger: CW or fuzzy match on create-workflow - exec: "{project-root}/_bmad/bmb/workflows/create-workflow/workflow.md" + exec: "{project-root}/_bmad/bmb/workflows/workflow/workflow.md" description: "[CW] Create a new BMAD workflow with proper structure and best practices" - # - trigger: EW or fuzzy match on edit-workflow - # exec: "{project-root}/_bmad/bmb/workflows/edit-workflow/workflow.md" - # description: "[EW] Edit existing BMAD workflows while maintaining integrity" + - trigger: EW or fuzzy match on edit-workflow + exec: "{project-root}/_bmad/bmb/workflows/workflow/workflow.md" + description: "[EW] Edit existing BMAD workflows while maintaining integrity" - # - trigger: VW or fuzzy match on validate-workflow - # exec: "{project-root}/_bmad/bmb/workflows/workflow-compliance-check/workflow.md" - # description: "[VW] Run compliance check on BMAD workflows against best practices" + - trigger: VW or fuzzy match on validate-workflow + exec: "{project-root}/_bmad/bmb/workflows/workflow/workflow.md" + description: "[VW] Run validation check on BMAD workflows against best practices" + + - trigger: RW or fuzzy match on convert-or-rework-workflow + exec: "{project-root}/_bmad/bmb/workflows/workflow/workflow.md" + description: "[RW] Rework a Workflow to a V6 Compliant Version" diff --git a/src/modules/bmb/docs/workflows/architecture.md b/src/modules/bmb/docs/workflows/architecture.md deleted file mode 100644 index d4ccac4e..00000000 --- a/src/modules/bmb/docs/workflows/architecture.md +++ /dev/null @@ -1,220 +0,0 @@ -# Standalone Workflow Builder Architecture - -This document describes the architecture of the standalone workflow builder system - a pure markdown approach to creating structured workflows. - -## Core Architecture Principles - -### 1. Micro-File Design - -Each workflow consists of multiple focused, self-contained files, driven from a workflow.md file that is initially loaded: - -``` -workflow-folder/ -├── workflow.md # Main workflow configuration -├── steps/ # Step instruction files (focused, self-contained) -│ ├── step-01-init.md -│ ├── step-02-profile.md -│ └── step-N-[name].md -├── templates/ # Content templates -│ ├── profile-section.md -│ └── [other-sections].md -└── data/ # Optional data files - └── [data-files].csv/.json -``` - -### 2. Just-In-Time (JIT) Loading - -- **Single File in Memory**: Only the current step file is loaded -- **No Future Peeking**: Step files must not reference future steps -- **Sequential Processing**: Steps execute in strict order -- **On-Demand Loading**: Templates load only when needed - -### 3. State Management - -- **Frontmatter Tracking**: Workflow state stored in output document frontmatter -- **Progress Array**: `stepsCompleted` tracks completed steps -- **Last Step Marker**: `lastStep` indicates where to resume -- **Append-Only Building**: Documents grow by appending content - -### 4. Execution Model - -``` -1. Load workflow.md → Read configuration -2. Execute step-01-init.md → Initialize or detect continuation -3. For each step: - a. Load step file completely - b. Execute instructions sequentially - c. Wait for user input at menu points - d. Only proceed with 'C' (Continue) - e. Update document/frontmatter - f. Load next step -``` - -## Key Components - -### Workflow File (workflow.md) - -- **Purpose**: Entry point and configuration -- **Content**: Role definition, goal, architecture rules -- **Action**: Points to step-01-init.md - -### Step Files (step-NN-[name].md) - -- **Size**: Focused and concise (typically 5-10KB) -- **Structure**: Frontmatter + sequential instructions -- **Features**: Self-contained rules, menu handling, state updates - -### Frontmatter Variables - -Standard variables in step files: - -```yaml -workflow_path: '{project-root}/_bmad/bmb/reference/workflows/[workflow-name]' -thisStepFile: '{workflow_path}/steps/step-[N]-[name].md' -nextStepFile: '{workflow_path}/steps/step-[N+1]-[name].md' -workflowFile: '{workflow_path}/workflow.md' -outputFile: '{output_folder}/[output-name]-{project_name}.md' -``` - -## Execution Flow - -### Fresh Workflow - -``` -workflow.md - ↓ -step-01-init.md (creates document) - ↓ -step-02-[name].md - ↓ -step-03-[name].md - ↓ -... - ↓ -step-N-[final].md (completes workflow) -``` - -### Continuation Workflow - -``` -workflow.md - ↓ -step-01-init.md (detects existing document) - ↓ -step-01b-continue.md (analyzes state) - ↓ -step-[appropriate-next].md -``` - -## Menu System - -### Standard Menu Pattern - -``` -Display: **Select an Option:** [A] [Action] [P] Party Mode [C] Continue - -#### Menu Handling Logic: -- IF A: Execute {advancedElicitationTask} -- IF P: Execute {partyModeWorkflow} -- IF C: Save content, update frontmatter, load next step -``` - -### Menu Rules - -- **Halt Required**: Always wait for user input -- **Continue Only**: Only proceed with 'C' selection -- **State Persistence**: Save before loading next step -- **Loop Back**: Return to menu after other actions - -## Collaborative Dialogue Model - -### Not Command-Response - -- **Facilitator Role**: AI guides, user decides -- **Equal Partnership**: Both parties contribute -- **No Assumptions**: Don't assume user wants next step -- **Explicit Consent**: Always ask for input - -### Example Pattern - -``` -AI: "Tell me about your dietary preferences." -User: [provides information] -AI: "Thank you. Now let's discuss your cooking habits." -[Continue conversation] -AI: **Menu Options** -``` - -## CSV Intelligence (Optional) - -### Data-Driven Behavior - -- Configuration in CSV files -- Dynamic menu options -- Variable substitution -- Conditional logic - -### Example Structure - -```csv -variable,type,value,description -cooking_frequency,choice,"daily|weekly|occasionally","How often user cooks" -meal_type,multi,"breakfast|lunch|dinner|snacks","Types of meals to plan" -``` - -## Best Practices - -### File Size Limits - -- **Step Files**: Keep focused and reasonably sized (5-10KB typical) -- **Templates**: Keep focused and reusable -- **Workflow File**: Keep lean, no implementation details - -### Sequential Enforcement - -- **Numbered Steps**: Use sequential numbering (1, 2, 3...) -- **No Skipping**: Each step must complete -- **State Updates**: Mark completion in frontmatter - -### Error Prevention - -- **Path Variables**: Use frontmatter variables, never hardcode -- **Complete Loading**: Always read entire file before execution -- **Menu Halts**: Never proceed without 'C' selection - -## Migration from XML - -### Advantages - -- **No Dependencies**: Pure markdown, no XML parsing -- **Human Readable**: Files are self-documenting -- **Git Friendly**: Clean diffs and merges -- **Flexible**: Easier to modify and extend - -### Key Differences - -| XML Workflows | Standalone Workflows | -| ----------------- | ----------------------- | -| Single large file | Multiple micro-files | -| Complex structure | Simple sequential steps | -| Parser required | Any markdown viewer | -| Rigid format | Flexible organization | - -## Implementation Notes - -### Critical Rules - -- **NEVER** load multiple step files -- **ALWAYS** read complete step file first -- **NEVER** skip steps or optimize -- **ALWAYS** update frontmatter of the output file when a step is complete -- **NEVER** proceed without user consent - -### Success Metrics - -- Documents created correctly -- All steps completed sequentially -- User satisfied with collaborative process -- Clean, maintainable file structure - -This architecture ensures disciplined, predictable workflow execution while maintaining flexibility for different use cases. diff --git a/src/modules/bmb/docs/workflows/csv-data-file-standards.md b/src/modules/bmb/docs/workflows/csv-data-file-standards.md deleted file mode 100644 index 8e7402db..00000000 --- a/src/modules/bmb/docs/workflows/csv-data-file-standards.md +++ /dev/null @@ -1,206 +0,0 @@ -# CSV Data File Standards for BMAD Workflows - -## Purpose and Usage - -CSV data files in BMAD workflows serve specific purposes for different workflow types: - -**For Agents:** Provide structured data that agents need to reference but cannot realistically generate (such as specific configurations, domain-specific data, or structured knowledge bases). - -**For Expert Agents:** Supply specialized knowledge bases, reference data, or persistent information that the expert agent needs to access consistently across sessions. - -**For Workflows:** Include reference data, configuration parameters, or structured inputs that guide workflow execution and decision-making. - -**Key Principle:** CSV files should contain data that is essential, structured, and not easily generated by LLMs during execution. - -## Intent-Based Design Principle - -**Core Philosophy:** The closer workflows stay to **intent** rather than **prescriptive** instructions, the more creative and adaptive the LLM experience becomes. - -**CSV Enables Intent-Based Design:** - -- **Instead of:** Hardcoded scripts with exact phrases LLM must say -- **CSV Provides:** Clear goals and patterns that LLM adapts creatively to context -- **Result:** Natural, contextual conversations rather than rigid scripts - -**Example - Advanced Elicitation:** - -- **Prescriptive Alternative:** 50 separate files with exact conversation scripts -- **Intent-Based Reality:** One CSV row with method goal + pattern → LLM adapts to user -- **Benefit:** Same method works differently for different users while maintaining essence - -**Intent vs Prescriptive Spectrum:** - -- **Highly Prescriptive:** "Say exactly: 'Based on my analysis, I recommend...'" -- **Balanced Intent:** "Help the user understand the implications using your professional judgment" -- **CSV Goal:** Provide just enough guidance to enable creative, context-aware execution - -## Primary Use Cases - -### 1. Knowledge Base Indexing (Document Lookup Optimization) - -**Problem:** Large knowledge bases with hundreds of documents cause context blowup and missed details when LLMs try to process them all. - -**CSV Solution:** Create a knowledge base index with: - -- **Column 1:** Keywords and topics -- **Column 2:** Document file path/location -- **Column 3:** Section or line number where relevant content starts -- **Column 4:** Content type or summary (optional) - -**Result:** Transform from context-blowing document loads to surgical precision lookups, creating agents with near-infinite knowledge bases while maintaining optimal context usage. - -### 2. Workflow Sequence Optimization - -**Problem:** Complex workflows (e.g., game development) with hundreds of potential steps for different scenarios become unwieldy and context-heavy. - -**CSV Solution:** Create a workflow routing table: - -- **Column 1:** Scenario type (e.g., "2D Platformer", "RPG", "Puzzle Game") -- **Column 2:** Required step sequence (e.g., "step-01,step-03,step-07,step-12") -- **Column 3:** Document sections to include -- **Column 4:** Specialized parameters or configurations - -**Result:** Step 1 determines user needs, finds closest match in CSV, confirms with user, then follows optimized sequence - truly optimal for context usage. - -### 3. Method Registry (Dynamic Technique Selection) - -**Problem:** Tasks need to select optimal techniques from dozens of options based on context, without hardcoding selection logic. - -**CSV Solution:** Create a method registry with: - -- **Column 1:** Category (collaboration, advanced, technical, creative, etc.) -- **Column 2:** Method name and rich description -- **Column 3:** Execution pattern or flow guide (e.g., "analysis → insights → action") -- **Column 4:** Complexity level or use case indicators - -**Example:** Advanced Elicitation task analyzes content context, selects 5 best-matched methods from 50 options, then executes dynamically using CSV descriptions. - -**Result:** Smart, context-aware technique selection without hardcoded logic - infinitely extensible method libraries. - -### 4. Configuration Management - -**Problem:** Complex systems with many configuration options that vary by use case. - -**CSV Solution:** Configuration lookup tables mapping scenarios to specific parameter sets. - -## What NOT to Include in CSV Files - -**Avoid Web-Searchable Data:** Do not include information that LLMs can readily access through web search or that exists in their training data, such as: - -- Common programming syntax or standard library functions -- General knowledge about widely used technologies -- Historical facts or commonly available information -- Basic terminology or standard definitions - -**Include Specialized Data:** Focus on data that is: - -- Specific to your project or domain -- Not readily available through web search -- Essential for consistent workflow execution -- Too voluminous for LLM context windows - -## CSV Data File Standards - -### 1. Purpose Validation - -- **Essential Data Only:** CSV must contain data that cannot be reasonably generated by LLMs -- **Domain Specific:** Data should be specific to the workflow's domain or purpose -- **Consistent Usage:** All columns and data must be referenced and used somewhere in the workflow -- **No Redundancy:** Avoid data that duplicates functionality already available to LLMs - -### 2. Structural Standards - -- **Valid CSV Format:** Proper comma-separated values with quoted fields where needed -- **Consistent Columns:** All rows must have the same number of columns -- **No Missing Data:** Empty values should be explicitly marked (e.g., "", "N/A", or NULL) -- **Header Row:** First row must contain clear, descriptive column headers -- **Proper Encoding:** UTF-8 encoding required for special characters - -### 3. Content Standards - -- **No LLM-Generated Content:** Avoid data that LLMs can easily generate (e.g., generic phrases, common knowledge) -- **Specific and Concrete:** Use specific values rather than vague descriptions -- **Verifiable Data:** Data should be factual and verifiable when possible -- **Consistent Formatting:** Date formats, numbers, and text should follow consistent patterns - -### 4. Column Standards - -- **Clear Headers:** Column names must be descriptive and self-explanatory -- **Consistent Data Types:** Each column should contain consistent data types -- **No Unused Columns:** Every column must be referenced and used in the workflow -- **Appropriate Width:** Columns should be reasonably narrow and focused - -### 5. File Size Standards - -- **Efficient Structure:** CSV files should be as small as possible while maintaining functionality -- **No Redundant Rows:** Avoid duplicate or nearly identical rows -- **Compressed Data:** Use efficient data representation (e.g., codes instead of full descriptions) -- **Maximum Size:** Individual CSV files should not exceed 1MB unless absolutely necessary - -### 6. Documentation Standards - -- **Documentation Required:** Each CSV file should have documentation explaining its purpose -- **Column Descriptions:** Each column must be documented with its usage and format -- **Data Sources:** Source of data should be documented when applicable -- **Update Procedures:** Process for updating CSV data should be documented - -### 7. Integration Standards - -- **File References:** CSV files must be properly referenced in workflow configuration -- **Access Patterns:** Workflow must clearly define how and when CSV data is accessed -- **Error Handling:** Workflow must handle cases where CSV files are missing or corrupted -- **Version Control:** CSV files should be versioned when changes occur - -### 8. Quality Assurance - -- **Data Validation:** CSV data should be validated for correctness and completeness -- **Format Consistency:** Consistent formatting across all rows and columns -- **No Ambiguity:** Data entries should be clear and unambiguous -- **Regular Review:** CSV content should be reviewed periodically for relevance - -### 9. Security Considerations - -- **No Sensitive Data:** Avoid including sensitive, personal, or confidential information -- **Data Sanitization:** CSV data should be sanitized for security issues -- **Access Control:** Access to CSV files should be controlled when necessary -- **Audit Trail:** Changes to CSV files should be logged when appropriate - -### 10. Performance Standards - -- **Fast Loading:** CSV files must load quickly within workflow execution -- **Memory Efficient:** Structure should minimize memory usage during processing -- **Optimized Queries:** If data lookup is needed, optimize for efficient access -- **Caching Strategy**: Consider whether data can be cached for performance - -## Implementation Guidelines - -When creating CSV data files for BMAD workflows: - -1. **Start with Purpose:** Clearly define why CSV is needed instead of LLM generation -2. **Design Structure:** Plan columns and data types before creating the file -3. **Test Integration:** Ensure workflow properly accesses and uses CSV data -4. **Document Thoroughly:** Provide complete documentation for future maintenance -5. **Validate Quality:** Check data quality, format consistency, and integration -6. **Monitor Usage:** Track how CSV data is used and optimize as needed - -## Common Anti-Patterns to Avoid - -- **Generic Phrases:** CSV files containing common phrases or LLM-generated content -- **Redundant Data:** Duplicating information easily available to LLMs -- **Overly Complex:** Unnecessarily complex CSV structures when simple data suffices -- **Unused Columns:** Columns that are defined but never referenced in workflows -- **Poor Formatting:** Inconsistent data formats, missing values, or structural issues -- **No Documentation:** CSV files without clear purpose or usage documentation - -## Validation Checklist - -For each CSV file, verify: - -- [ ] Purpose is essential and cannot be replaced by LLM generation -- [ ] All columns are used in the workflow -- [ ] Data is properly formatted and consistent -- [ ] File is efficiently sized and structured -- [ ] Documentation is complete and clear -- [ ] Integration with workflow is tested and working -- [ ] Security considerations are addressed -- [ ] Performance requirements are met diff --git a/src/modules/bmb/docs/workflows/intent-vs-prescriptive-spectrum.md b/src/modules/bmb/docs/workflows/intent-vs-prescriptive-spectrum.md deleted file mode 100644 index 51e790de..00000000 --- a/src/modules/bmb/docs/workflows/intent-vs-prescriptive-spectrum.md +++ /dev/null @@ -1,220 +0,0 @@ -# Intent vs Prescriptive Spectrum - -## Core Philosophy - -The **Intent vs Prescriptive Spectrum** is a fundamental design principle for BMAD workflows and agents. It determines how much creative freedom an LLM has versus how strictly it must follow predefined instructions. - -**Key Principle:** The closer workflows stay to **intent**, the more creative and adaptive the LLM experience becomes. The closer they stay to **prescriptive**, the more consistent and controlled the output becomes. - -## Understanding the Spectrum - -### **Intent-Based Design** (Creative Freedom) - -**Focus**: What goal should be achieved -**Approach**: Trust the LLM to determine the best method -**Result**: Creative, adaptive, context-aware interactions -**Best For**: Creative exploration, problem-solving, personalized experiences - -### **Prescriptive Design** (Structured Control) - -**Focus**: Exactly what to say and do -**Approach**: Detailed scripts and specific instructions -**Result**: Consistent, predictable, controlled outcomes -**Best For**: Compliance, safety-critical, standardized processes - -## Spectrum Examples - -### **Highly Intent-Based** (Creative End) - -```markdown -**Example:** Story Exploration Workflow -**Instruction:** "Help the user explore their dream imagery to craft compelling narratives, use multiple turns of conversation to really push users to develop their ideas, giving them hints and ideas also to prime them effectively to bring out their creativity" -**LLM Freedom:** Adapts questions, explores tangents, follows creative inspiration -**Outcome:** Unique, personalized storytelling experiences -``` - -### **Balanced Middle** (Professional Services) - -```markdown -**Example:** Business Strategy Workflow -**Instruction:** "Guide the user through SWOT analysis using your business expertise. when complete tell them 'here is your final report {report output}' -**LLM Freedom:** Professional judgment in analysis, structured but adaptive approach -**Outcome:** Professional, consistent yet tailored business insights -``` - -### **Highly Prescriptive** (Control End) - -```markdown -**Example:** Medical Intake Form -**Instruction:** "Ask exactly: 'Do you currently experience any of the following symptoms: fever, cough, fatigue?' Wait for response, then ask exactly: 'When did these symptoms begin?'" -**LLM Freedom:** Minimal - must follow exact script for medical compliance -**Outcome:** Consistent, medically compliant patient data collection -``` - -## Spectrum Positioning Guide - -### **Choose Intent-Based When:** - -- ✅ Creative exploration and innovation are goals -- ✅ Personalization and adaptation to user context are important -- ✅ Human-like conversation and natural interaction are desired -- ✅ Problem-solving requires flexible thinking -- ✅ User experience and engagement are priorities - -**Examples:** - -- Creative brainstorming sessions -- Personal coaching or mentoring -- Exploratory research and discovery -- Artistic content creation -- Collaborative problem-solving - -### **Choose Prescriptive When:** - -- ✅ Compliance with regulations or standards is required -- ✅ Safety or legal considerations are paramount -- ✅ Exact consistency across multiple sessions is essential -- ✅ Training new users on specific procedures -- ✅ Data collection must follow specific protocols - -**Examples:** - -- Medical intake and symptom assessment -- Legal compliance questionnaires -- Safety checklists and procedures -- Standardized testing protocols -- Regulatory data collection - -### **Choose Balanced When:** - -- ✅ Professional expertise is required but adaptation is beneficial -- ✅ Consistent quality with flexible application is needed -- ✅ Domain expertise should guide but not constrain interactions -- ✅ User trust and professional credibility are important -- ✅ Complex processes require both structure and judgment - -**Examples:** - -- Business consulting and advisory -- Technical support and troubleshooting -- Educational tutoring and instruction -- Financial planning and advice -- Project management facilitation - -## Implementation Guidelines - -### **For Workflow Designers:** - -1. **Early Spectrum Decision**: Determine spectrum position during initial design -2. **User Education**: Explain spectrum choice and its implications to users -3. **Consistent Application**: Maintain chosen spectrum throughout workflow -4. **Context Awareness**: Adjust spectrum based on specific use case requirements - -### **For Workflow Implementation:** - -**Intent-Based Patterns:** - -```markdown -- "Help the user understand..." (vs "Explain that...") -- "Guide the user through..." (vs "Follow these steps...") -- "Use your professional judgment to..." (vs "Apply this specific method...") -- "Adapt your approach based on..." (vs "Regardless of situation, always...") -``` - -**Prescriptive Patterns:** - -```markdown -- "Say exactly: '...'" (vs "Communicate that...") -- "Follow this script precisely: ..." (vs "Cover these points...") -- "Do not deviate from: ..." (vs "Consider these options...") -- "Must ask in this order: ..." (vs "Ensure you cover...") -``` - -### **For Agents:** - -**Intent-Based Agent Design:** - -```yaml -persona: - communication_style: 'Adaptive professional who adjusts approach based on user context' - guiding_principles: - - 'Use creative problem-solving within professional boundaries' - - 'Personalize approach while maintaining expertise' - - 'Adapt conversation flow to user needs' -``` - -**Prescriptive Agent Design:** - -```yaml -persona: - communication_style: 'Follows standardized protocols exactly' - governing_rules: - - 'Must use approved scripts without deviation' - - 'Follow sequence precisely as defined' - - 'No adaptation of prescribed procedures' -``` - -## Spectrum Calibration Questions - -**Ask these during workflow design:** - -1. **Consequence of Variation**: What happens if the LLM says something different? -2. **User Expectation**: Does the user expect consistency or creativity? -3. **Risk Level**: What are the risks of creative deviation vs. rigid adherence? -4. **Expertise Required**: Is domain expertise application more important than consistency? -5. **Regulatory Requirements**: Are there external compliance requirements? - -## Best Practices - -### **DO:** - -- ✅ Make conscious spectrum decisions during design -- ✅ Explain spectrum choices to users -- ✅ Use intent-based design for creative and adaptive experiences -- ✅ Use prescriptive design for compliance and consistency requirements -- ✅ Consider balanced approaches for professional services -- ✅ Document spectrum rationale for future reference - -### **DON'T:** - -- ❌ Mix spectrum approaches inconsistently within workflows -- ❌ Default to prescriptive when intent-based would be more effective -- ❌ Use creative freedom when compliance is required -- ❌ Forget to consider user expectations and experience -- ❌ Overlook risk assessment in spectrum selection - -## Quality Assurance - -**When validating workflows:** - -- Check if spectrum position is intentional and consistent -- Verify prescriptive elements are necessary and justified -- Ensure intent-based elements have sufficient guidance -- Confirm spectrum alignment with user needs and expectations -- Validate that risks are appropriately managed - -## Examples in Practice - -### **Medical Intake (Highly Prescriptive):** - -- **Why**: Patient safety, regulatory compliance, consistent data collection -- **Implementation**: Exact questions, specific order, no deviation permitted -- **Benefit**: Reliable, medically compliant patient information - -### **Creative Writing Workshop (Highly Intent):** - -- **Why**: Creative exploration, personalized inspiration, artistic expression -- **Implementation**: Goal guidance, creative freedom, adaptive prompts -- **Benefit**: Unique, personalized creative works - -### **Business Strategy (Balanced):** - -- **Why**: Professional expertise with adaptive application -- **Implementation**: Structured framework with professional judgment -- **Benefit**: Professional, consistent yet tailored business insights - -## Conclusion - -The Intent vs Prescriptive Spectrum is not about good vs. bad - it's about **appropriate design choices**. The best workflows make conscious decisions about where they fall on this spectrum based on their specific requirements, user needs, and risk considerations. - -**Key Success Factor**: Choose your spectrum position intentionally, implement it consistently, and align it with your specific use case requirements. diff --git a/src/modules/bmb/docs/workflows/step-file-rules.md b/src/modules/bmb/docs/workflows/step-file-rules.md deleted file mode 100644 index 56e58899..00000000 --- a/src/modules/bmb/docs/workflows/step-file-rules.md +++ /dev/null @@ -1,469 +0,0 @@ -# BMAD Step File Guidelines - -**Version:** 1.0 -**Module:** bmb (BMAD Builder) -**Purpose:** Definitive guide for creating BMAD workflow step files - ---- - -## Overview - -BMAD workflow step files follow a strict structure to ensure consistency, progressive disclosure, and mode-aware routing. Every step file MUST adhere to these guidelines. - ---- - -## File Size Optimization - -**CRITICAL:** Keep step files **LT 200 lines** (250 lines absolute maximum). - -If a step exceeds this limit: -- Consider splitting into multiple steps -- Extract content to `/data/` reference files -- Optimize verbose explanations - ---- - -## Required Frontmatter Structure - -CRITICAL: Frontmatter should only have items that are used in the step file! - -```yaml ---- -name: 'step-2-foo.md' -description: 'Brief description of what this step accomplishes' - -# File References ## CRITICAL: Frontmatter references or variables should only have items that are used in the step file! -outputFile: {bmb_creations_output_folder}/output-file-name.md -nextStepFile: './step-3-bar.md' - -# Task References (as needed) -advancedElicitationTask: '{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml' -partyModeWorkflow: '{project-root}/_bmad/core/workflows/party-mode/workflow.md' -# ... other task-specific references ---- -``` - -### Frontmatter Field Descriptions - -| Field | Required | Description | -| --------------- | --------- | --------------------------------- | -| `name` | Yes | Step identifier (kebab-case) | -| `description` | Yes | One-line summary of step purpose | -| `outputFile` | Yes | Where results are documented | -| Task references | As needed | Paths to external workflows/tasks | - ---- - -## Document Structure - -### 1. Title - -```markdown -# Step X: [Step Name] -``` - -### 2. STEP GOAL - -```markdown -## STEP GOAL: - -[Single sentence stating what this step accomplishes] -``` - -### 3. Role Reinforcement - -```markdown -### Role Reinforcement: - -- ✅ You are a [specific role] who [does what] -- ✅ If you already have been given a name, communication_style and identity, continue to use those while playing this new role -- ✅ We engage in collaborative dialogue, not command-response -- ✅ You bring [your expertise], user brings [their expertise], together we [achieve goal] -- ✅ Maintain [tone/approach] throughout -``` - -### 4. Language Preference - -```markdown -### Language Preference: -The user has chosen to communicate in the **{language}** language. -You MUST respond in **{language}** throughout this step. -``` - -**IMPORTANT:** Read `userPreferences.language` from tracking file (agentPlan, validationReport, etc.) and enforce it. - -### 5. Step-Specific Rules - -```markdown -### Step-Specific Rules: - -- 🎯 Focus only on [specific scope] -- 🚫 FORBIDDEN to [prohibited action] -- 💬 Approach: [how to engage] -- 📋 Ensure [specific outcome] -``` - -### 6. EXECUTION PROTOCOLS - -```markdown -## EXECUTION PROTOCOLS: - -- [What to do - use verbs] -- [Another action] -- 🚫 FORBIDDEN to [prohibited action] -``` - -### 7. CONTEXT BOUNDARIES - -```markdown -## CONTEXT BOUNDARIES: - -- Available context: [what's available] -- Focus: [what to focus on] -- Limits: [boundaries] -- Dependencies: [what this step depends on] -``` - -### 8. Sequence of Instructions - -```markdown -## Sequence of Instructions: - -### 1. [First Action] - -**[Action Description]** - -### 2. [Second Action] - -... -``` - -### 9. MENU OPTIONS - -```markdown -### X. Present MENU OPTIONS - -Display: "**Select:** [A] [menu item A] [P] [menu item P] [C] [menu item C]" - -#### Menu Handling Logic: -- IF A: Execute {advancedElicitationTask}, and when finished redisplay the menu -- IF P: Execute {partyModeWorkflow}, and when finished redisplay the menu -- IF C: Save content to {outputFile}, update frontmatter, then load, read entire file, then execute {nextStepFile} -- IF Any other comments or queries: help user respond then [Redisplay Menu Options](#x-present-menu-options) - -#### EXECUTION RULES: -- ALWAYS halt and wait for user input after presenting menu -- ONLY proceed to next step when user selects 'C' -- After other menu items execution, return to this menu -- User can chat or ask questions - always respond and then end with display again of the menu options - -## CRITICAL STEP COMPLETION NOTE -ONLY WHEN [C continue option] is selected and [completion conditions], will you then load and read fully `{nextStepFile}`... -``` - -### 10. SYSTEM SUCCESS/FAILURE METRICS - -```markdown -## 🚨 SYSTEM SUCCESS/FAILURE METRICS - -### ✅ SUCCESS: -- [Success criterion 1] -- [Success criterion 2] -- ... - -### ❌ SYSTEM FAILURE: -- [Failure criterion 1] -- [Failure criterion 2] -- ... - -**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. -``` - ---- - -## A/P/C Menu Convention - -BMAD workflows use a fixed menu structure: - -| Option | Meaning | Behavior | -| ------ | -------------------- | ---------------------------------------------------- | -| **A** | Advanced Elicitation | Execute advancedElicitationTask, then redisplay menu | -| **P** | Party Mode | Execute partyModeWorkflow, then redisplay menu | -| **C** | Continue/Accept | Save output, update frontmatter, load nextStepFile | -| Other | Custom | Defined per step (e.g., F = Fix, X = Exit) | - -**Rules:** -- A and P MUST always be present -- C MUST be present except in final step (use X or similar for exit) -- After A/P → redisplay menu -- After C → proceed to next step -- Custom letters can be used for step-specific options - ---- - -## Progressive Disclosure - -**Core Principle:** Each step only knows about its immediate next step. - -### Implementation - -1. **Never pre-load future steps** - Only load `nextStepFile` when user selects [C] - -2. **Mode-aware routing** (for shared steps): - ```markdown - ## MODE-AWARE ROUTING: - ### If entered from CREATE mode: - Load ./s-next-step.md - - ### If entered from EDIT mode: - Load ./e-next-step.md - - ### If entered from VALIDATE mode: - Load ./v-next-step.md - ``` - -3. **Read tracking file first** - Always read the tracking file (agentPlan, validationReport, etc.) to determine current mode and routing - ---- - -## Mode-Aware Routing (Shared Steps) - -Shared steps (`s-*.md`) must route based on the mode stored in the tracking file. - -### Tracking File Frontmatter - -```yaml ---- -mode: create # or edit | validate -stepsCompleted: - - c-01-brainstorm.md - - s-01-discovery.md -# ... other tracking fields ---- -``` - -### Routing Implementation - -```markdown -## COMPLETION ROUTING: - -1. Append `./this-step-name.md` to {trackingFile}.stepsCompleted -2. Save content to {trackingFile} -3. Read {trackingFile}.mode -4. Route based on mode: - -### IF mode == create: -Load ./s-next-create-step.md - -### IF mode == edit: -Load ./e-next-edit-step.md - -### IF mode == validate: -Load ./s-next-validate-step.md -``` - ---- - -## File Naming Conventions - -### Tri-Modal Workflows - -| Prefix | Meaning | Example | -| ------ | ------------------ | ---------------------- | -| `c-` | Create-specific | `c-01-brainstorm.md` | -| `e-` | Edit-specific | `e-01-load-analyze.md` | -| `v-` | Validate-specific | `v-01-load-review.md` | -| `s-` | Shared by 2+ modes | `s-05-activation.md` | - -### Numbering - -- Within each prefix type, number sequentially -- Restart numbering for each prefix type (c-01, e-01, v-01, s-01) -- Use letters for sub-steps (s-06a, s-06b, s-06c) - ---- - -## Language Preference Enforcement - -**CRITICAL:** Every step MUST respect the user's chosen language. - -### Implementation - -```markdown -### Language Preference: -The user has chosen to communicate in the **{language}** language. -You MUST respond in **{language}** throughout this step. -``` - -### Reading Language Preference - -From tracking file frontmatter: -```yaml ---- -userPreferences: - language: spanish # or any language ---- -``` - -### Rules - -- **MUST** read language preference from tracking file at step start -- **MUST** respond in user's chosen language for ALL content -- **MUST** include menu options in user's chosen language -- **EXCEPTION:** Technical terms, file names, and code remain in English - ---- - -## Data File References - -When step content becomes too large (>200 lines), extract to `/data/` files: - -### When to Extract - -- Step file exceeds 200 lines -- Content is reference material (rules, examples, patterns) -- Content is reused across multiple steps - -### How to Reference - -```markdown -## Reference Material: - -Load and reference: `../data/{data-file-name}.md` - -Key points from that file: -- [Point 1] -- [Point 2] -``` - -### Data File Best Practices - -- Keep data files focused on single topic -- Use clear, descriptive names -- Include examples and non-examples -- Optimize for LLM usage (concise, structured) - ---- - -## Common Pitfalls to Avoid - -### ❌ DON'T: - -- Pre-load future steps (violates progressive disclosure) -- Exceed 250 lines without splitting -- Forget to update `stepsCompleted` array -- Ignore user's language preference -- Skip mode checking in shared steps -- Use vague menu option letters (stick to A/P/C plus 1-2 custom) - -### ✅ DO: - -- Keep files under 200 lines -- Read tracking file first thing -- Route based on `mode` field -- Include A/P in every menu -- Use descriptive step names -- Extract complex content to data files - ---- - -## Template: New Step File - -```markdown ---- -name: 'step-name' -description: 'What this step does' - -# File References -thisStepFile: ./step-name.md -workflowFile: ../workflow.md -outputFile: {bmb_creations_output_folder}/output.md - -# Task References -advancedElicitationTask: '{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml' -partyModeWorkflow: '{project-root}/_bmad/core/workflows/party-mode/workflow.md' ---- - -# Step X: [Step Name] - -## STEP GOAL: - -[Single sentence goal] - -### Role Reinforcement: - -- ✅ You are a [role] who [does what] -- ✅ If you already have been given a name, communication_style and identity, continue to use those while playing this new role -- ✅ We engage in collaborative dialogue, not command-response -- ✅ You bring [expertise], user brings [expertise], together we [achieve] -- ✅ Maintain [tone] throughout - -### Language Preference: -The user has chosen to communicate in the **{language}** language. -You MUST respond in **{language}** throughout this step. - -### Step-Specific Rules: - -- 🎯 Focus only on [scope] -- 🚫 FORBIDDEN to [prohibited action] -- 💬 Approach: [how to engage] -- 📋 Ensure [outcome] - -## EXECUTION PROTOCOLS: - -- [Action 1] -- [Action 2] -- 🚫 FORBIDDEN to [prohibited action] - -## CONTEXT BOUNDARIES: - -- Available context: [what's available] -- Focus: [what to focus on] -- Limits: [boundaries] -- Dependencies: [what depends on what] - -## Sequence of Instructions: - -### 1. [First Action] - -**Description of first action** - -### 2. [Second Action] - -**Description of second action** - -... - -### X. Present MENU OPTIONS - -Display: "**Select:** [A] Advanced Elicitation [P] Party Mode [C] Continue" - -#### Menu Handling Logic: -- IF A: Execute {advancedElicitationTask}, and when finished redisplay the menu -- IF P: Execute {partyModeWorkflow}, and when finished redisplay the menu -- IF C: Save content to {outputFile}, update frontmatter, then load, read entire file, then execute {nextStepFile} -- IF Any other comments or queries: help user respond then [Redisplay Menu Options](#x-present-menu-options) - -#### EXECUTION RULES: -- ALWAYS halt and wait for user input after presenting menu -- ONLY proceed to next step when user selects 'C' -- After other menu items execution, return to this menu -- User can chat or ask questions - always respond and then end with display again of the menu options - -## CRITICAL STEP COMPLETION NOTE -ONLY WHEN [C continue option] is selected and [conditions], will you then load and read fully `{nextStepFile}`... - -## 🚨 SYSTEM SUCCESS/FAILURE METRICS - -### ✅ SUCCESS: -- [Success criteria] - -### ❌ SYSTEM FAILURE: -- [Failure criteria] - -**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. -``` - ---- - -**End of Guidelines** diff --git a/src/modules/bmb/docs/workflows/templates/step-file.md b/src/modules/bmb/docs/workflows/templates/step-file.md deleted file mode 100644 index d9b14704..00000000 --- a/src/modules/bmb/docs/workflows/templates/step-file.md +++ /dev/null @@ -1,139 +0,0 @@ ---- -name: "step-{{stepNumber}}-{{stepName}}" -description: "{{stepDescription}}" - -# Path Definitions -workflow_path: "{project-root}/_bmad/{{targetModule}}/workflows/{{workflowName}}" - -# File References -thisStepFile: "{workflow_path}/steps/step-{{stepNumber}}-{{stepName}}.md" -{{#hasNextStep}} -nextStepFile: "{workflow_path}/steps/step-{{nextStepNumber}}-{{nextStepName}}.md" -{{/hasNextStep}} -workflowFile: "{workflow_path}/workflow.md" -{{#hasOutput}} -outputFile: "{output_folder}/{{outputFileName}}-{project_name}.md" -{{/hasOutput}} - -# Task References (list only if used in THIS step file instance and only the ones used, there might be others) -advancedElicitationTask: "{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml" -partyModeWorkflow: "{project-root}/_bmad/core/workflows/party-mode/workflow.md" - -{{#hasTemplates}} -# Template References -{{#templates}} -{{name}}: "{workflow_path}/templates/{{file}}" -{{/templates}} -{{/hasTemplates}} ---- - -# Step {{stepNumber}}: {{stepTitle}} - -## STEP GOAL: - -{{stepGoal}} - -## MANDATORY EXECUTION RULES (READ FIRST): - -### Universal Rules: - -- 🛑 NEVER generate content without user input -- 📖 CRITICAL: Read the complete step file before taking any action -- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read -- 📋 YOU ARE A FACILITATOR, not a content generator - -### Role Reinforcement: - -- ✅ You are a {{aiRole}} -- ✅ If you already have been given communication or persona patterns, continue to use those while playing this new role -- ✅ We engage in collaborative dialogue, not command-response -- ✅ You bring {{aiExpertise}}, user brings {{userExpertise}} -- ✅ Maintain collaborative {{collaborationStyle}} tone throughout - -### Step-Specific Rules: - -- 🎯 Focus only on {{stepFocus}} -- 🚫 FORBIDDEN to {{forbiddenAction}} -- 💬 Approach: {{stepApproach}} -- 📋 {{additionalRule}} - -## EXECUTION PROTOCOLS: - -{{#executionProtocols}} - -- 🎯 {{.}} - {{/executionProtocols}} - -## CONTEXT BOUNDARIES: - -- Available context: {{availableContext}} -- Focus: {{contextFocus}} -- Limits: {{contextLimits}} -- Dependencies: {{contextDependencies}} - -## SEQUENCE OF INSTRUCTIONS (Do not deviate, skip, or optimize) - -{{#instructions}} - -### {{number}}. {{title}} - -{{content}} - -{{#hasContentToAppend}} - -#### Content to Append (if applicable): - -```markdown -{{contentToAppend}} -``` - -{{/hasContentToAppend}} - -{{/instructions}} - -{{#hasMenu}} - -### {{menuNumber}}. Present MENU OPTIONS - -Display: **{{menuDisplay}}** - -#### EXECUTION RULES: - -- ALWAYS halt and wait for user input after presenting menu -- ONLY proceed to next step when user selects 'C' -- After other menu items execution, return to this menu -- User can chat or ask questions - always respond and then end with display again of the menu options -- Use menu handling logic section below - -#### Menu Handling Logic: - -{{#menuOptions}} - -- IF {{key}}: {{action}} - {{/menuOptions}} -- IF Any other comments or queries: help user respond then [Redisplay Menu Options](#{{menuNumber}}-present-menu-options) - {{/hasMenu}} - -## CRITICAL STEP COMPLETION NOTE - -{{completionNote}} - ---- - -## 🚨 SYSTEM SUCCESS/FAILURE METRICS - -### ✅ SUCCESS: - -{{#successCriteria}} - -- {{.}} - {{/successCriteria}} - -### ❌ SYSTEM FAILURE: - -{{#failureModes}} - -- {{.}} - {{/failureModes}} - -**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. diff --git a/src/modules/bmb/docs/workflows/templates/workflow.md b/src/modules/bmb/docs/workflows/templates/workflow.md deleted file mode 100644 index 65a8eb26..00000000 --- a/src/modules/bmb/docs/workflows/templates/workflow.md +++ /dev/null @@ -1,58 +0,0 @@ ---- -name: { { workflowDisplayName } } -description: { { workflowDescription } } -web_bundle: { { webBundleFlag } } ---- - -# {{workflowDisplayName}} - -**Goal:** {{workflowGoal}} - -**Your Role:** In addition to your name, communication_style, and persona, you are also a {{aiRole}} collaborating with {{userType}}. This is a partnership, not a client-vendor relationship. You bring {{aiExpertise}}, while the user brings {{userExpertise}}. Work together as equals. - ---- - -## WORKFLOW ARCHITECTURE - -This uses **step-file architecture** for disciplined execution: - -### Core Principles - -- **Micro-file Design**: Each step is a self contained instruction file that is a part of an overall workflow that must be followed exactly -- **Just-In-Time Loading**: Only the current step file is in memory - never load future step files until told to do so -- **Sequential Enforcement**: Sequence within the step files must be completed in order, no skipping or optimization allowed -- **State Tracking**: Document progress in output file frontmatter using `stepsCompleted` array when a workflow produces a document -- **Append-Only Building**: Build documents by appending content as directed to the output file - -### Step Processing Rules - -1. **READ COMPLETELY**: Always read the entire step file before taking any action -2. **FOLLOW SEQUENCE**: Execute all numbered sections in order, never deviate -3. **WAIT FOR INPUT**: If a menu is presented, halt and wait for user selection -4. **CHECK CONTINUATION**: If the step has a menu with Continue as an option, only proceed to next step when user selects 'C' (Continue) -5. **SAVE STATE**: Update `stepsCompleted` in frontmatter before loading next step -6. **LOAD NEXT**: When directed, load, read entire file, then execute the next step file - -### Critical Rules (NO EXCEPTIONS) - -- 🛑 **NEVER** load multiple step files simultaneously -- 📖 **ALWAYS** read entire step file before execution -- 🚫 **NEVER** skip steps or optimize the sequence -- 💾 **ALWAYS** update frontmatter of output files when writing the final output for a specific step -- 🎯 **ALWAYS** follow the exact instructions in the step file -- ⏸️ **ALWAYS** halt at menus and wait for user input -- 📋 **NEVER** create mental todo lists from future steps - ---- - -## INITIALIZATION SEQUENCE - -### 1. Configuration Loading - -Load and read full config from {project-root}/_bmad/{{targetModule}}/config.yaml and resolve: - -- `project_name`, `output_folder`, `user_name`, `communication_language`, `document_output_language` - -### 2. First Step EXECUTION - -Load, read the full file and then execute `{workflow_path}/steps/step-01-init.md` to begin the workflow. diff --git a/src/modules/bmb/docs/workflows/terms.md b/src/modules/bmb/docs/workflows/terms.md deleted file mode 100644 index 71477ede..00000000 --- a/src/modules/bmb/docs/workflows/terms.md +++ /dev/null @@ -1,97 +0,0 @@ -# BMAD Workflow Terms - -## Core Components - -### BMAD Workflow - -A facilitated, guided process where the AI acts as a facilitator working collaboratively with a human. Workflows can serve any purpose - from document creation to brainstorming, technical implementation, or decision-making. The human may be a collaborative partner, beginner seeking guidance, or someone who wants the AI to execute specific tasks. Each workflow is self-contained and follows a disciplined execution model. - -### workflow.md - -The master control file that defines: - -- Workflow metadata (name, description, version) -- Step sequence and file paths -- Required data files and dependencies -- Execution rules and protocols - -### Step File - -An individual markdown file containing: - -- One discrete step of the workflow -- All rules and context needed for that step -- common global rules get repeated and reinforced also in each step file, ensuring even in long workflows the agent remembers important rules and guidelines -- Content generation guidance - -### step-01-init.md - -The first step file that: - -- Initializes the workflow -- Sets up document frontmatter -- Establishes initial context -- Defines workflow parameters - -### step-01b-continue.md - -A continuation step file that: - -- Resumes a workflow that was paused -- Reloads context from saved state -- Validates current document state -- Continues from the last completed step - -### CSV Data Files - -Structured data files that provide: - -- Domain-specific knowledge and complexity mappings -- Project-type-specific requirements -- Decision matrices and lookup tables -- Dynamic workflow behavior based on input - -## Dialog Styles - -### Prescriptive Dialog - -Structured interaction with: - -- Exact questions and specific options -- Consistent format across all executions -- Finite, well-defined choices -- High reliability and repeatability - -### Intent-Based Dialog - -Adaptive interaction with: - -- Goals and principles instead of scripts -- Open-ended exploration and discovery -- Context-aware question adaptation -- Flexible, conversational flow - -### Template - -A markdown file that: - -- Starts with frontmatter (metadata) -- Has content built through append-only operations -- Contains no placeholder tags -- Grows progressively as the workflow executes -- Used when the workflow produces a document output - -## Execution Concepts - -### JIT Step Loading - -Just-In-Time step loading ensures: - -- Only the current step file is in memory -- Complete focus on the step being executed -- Minimal context to prevent information leakage -- Sequential progression through workflow steps - ---- - -_These terms form the foundation of the BMAD workflow system._ diff --git a/src/modules/bmb/workflows/agent/steps-c/step-01-brainstorm.md b/src/modules/bmb/workflows/agent/steps-c/step-01-brainstorm.md index 7a7c6bac..eb739d3c 100644 --- a/src/modules/bmb/workflows/agent/steps-c/step-01-brainstorm.md +++ b/src/modules/bmb/workflows/agent/steps-c/step-01-brainstorm.md @@ -46,7 +46,9 @@ Optional creative exploration to generate agent ideas through structured brainst - Limits: No mandatory brainstorming, no pressure tactics - Dependencies: User choice to participate or skip brainstorming -## Sequence of Instructions (Do not deviate, skip, or optimize) +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change. ### 1. Present Brainstorming Opportunity diff --git a/src/modules/bmb/workflows/agent/steps-c/step-02-discovery.md b/src/modules/bmb/workflows/agent/steps-c/step-02-discovery.md index 57ca7af6..26d5e4e1 100644 --- a/src/modules/bmb/workflows/agent/steps-c/step-02-discovery.md +++ b/src/modules/bmb/workflows/agent/steps-c/step-02-discovery.md @@ -108,7 +108,9 @@ After documentation, present menu: - Clear articulation of value proposition - Comprehensive capability mapping -# EXECUTION SEQUENCE +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change. 1. **Load Previous Context** - Check for brainstormContext file diff --git a/src/modules/bmb/workflows/agent/steps-c/step-03-type-metadata.md b/src/modules/bmb/workflows/agent/steps-c/step-03-type-metadata.md index 34f58f30..b9ddd416 100644 --- a/src/modules/bmb/workflows/agent/steps-c/step-03-type-metadata.md +++ b/src/modules/bmb/workflows/agent/steps-c/step-03-type-metadata.md @@ -125,7 +125,9 @@ Present structured options: --- -# INSTRUCTION SEQUENCE +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change. ## 1. Load Documentation Read and internalize: diff --git a/src/modules/bmb/workflows/agent/steps-c/step-04-persona.md b/src/modules/bmb/workflows/agent/steps-c/step-04-persona.md index 2c81b6db..0e45d060 100644 --- a/src/modules/bmb/workflows/agent/steps-c/step-04-persona.md +++ b/src/modules/bmb/workflows/agent/steps-c/step-04-persona.md @@ -156,7 +156,9 @@ principles: - Workflow steps (belongs in orchestration) - Data structures (belongs in implementation) -# EXECUTION SEQUENCE +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change. 1. **LOAD** personaProperties.md and principlesCrafting.md 2. **EXPLAIN** four-field system with clear examples diff --git a/src/modules/bmb/workflows/agent/steps-c/step-05-commands-menu.md b/src/modules/bmb/workflows/agent/steps-c/step-05-commands-menu.md index c5793515..7d4c8c81 100644 --- a/src/modules/bmb/workflows/agent/steps-c/step-05-commands-menu.md +++ b/src/modules/bmb/workflows/agent/steps-c/step-05-commands-menu.md @@ -121,7 +121,9 @@ menu: - **User-facing perspective** - triggers should feel natural - **Capability alignment** - every command maps to a capability -# EXECUTION SEQUENCE +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change. 1. Load agent-menu-patterns.md to understand structure 2. Review capabilities from agent-plan step 3 diff --git a/src/modules/bmb/workflows/agent/steps-c/step-06-activation.md b/src/modules/bmb/workflows/agent/steps-c/step-06-activation.md index 6d2bf0ec..864b7d54 100644 --- a/src/modules/bmb/workflows/agent/steps-c/step-06-activation.md +++ b/src/modules/bmb/workflows/agent/steps-c/step-06-activation.md @@ -129,7 +129,9 @@ routing: - Expert agents: Sidecar + stand-alone module - Module agents: Sidecar + parent module integration -# EXECUTION SEQUENCE +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change. ## 1. Load Reference Documents ```bash diff --git a/src/modules/bmb/workflows/agent/steps-c/step-07a-build-simple.md b/src/modules/bmb/workflows/agent/steps-c/step-07a-build-simple.md index 812fa40b..5957a67e 100644 --- a/src/modules/bmb/workflows/agent/steps-c/step-07a-build-simple.md +++ b/src/modules/bmb/workflows/agent/steps-c/step-07a-build-simple.md @@ -60,7 +60,9 @@ Assemble the agent plan content into a Simple agent YAML configuration using the - Template placeholders (replace with actual content) - Comments or notes in final YAML -## EXECUTION SEQUENCE +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change. ### 1. Load Template and Architecture Files diff --git a/src/modules/bmb/workflows/agent/steps-c/step-08a-plan-traceability.md b/src/modules/bmb/workflows/agent/steps-c/step-08a-plan-traceability.md index bc1989b7..15c98272 100644 --- a/src/modules/bmb/workflows/agent/steps-c/step-08a-plan-traceability.md +++ b/src/modules/bmb/workflows/agent/steps-c/step-08a-plan-traceability.md @@ -128,7 +128,9 @@ If YOLO mode: - Fix option should return to step-06-build, not earlier steps - If plan file is ambiguous, note ambiguity but use reasonable interpretation -# SEQUENCE +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change. ## 1. Load Required Files ```yaml diff --git a/src/modules/bmb/workflows/agent/steps-c/step-08e-structure-validation.md b/src/modules/bmb/workflows/agent/steps-c/step-08e-structure-validation.md index 3fcec5a5..94ff4d45 100644 --- a/src/modules/bmb/workflows/agent/steps-c/step-08e-structure-validation.md +++ b/src/modules/bmb/workflows/agent/steps-c/step-08e-structure-validation.md @@ -80,7 +80,9 @@ Validate the built agent YAML file for structural completeness and correctness a - YAML syntax errors preventing file parsing - Path references that don't exist -# EXECUTION SEQUENCE +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change. ## 1. Load Validation Context diff --git a/src/modules/bmb/workflows/agent/steps-c/step-08f-sidecar-validation.md b/src/modules/bmb/workflows/agent/steps-c/step-08f-sidecar-validation.md index 2ffcdaed..30ab330c 100644 --- a/src/modules/bmb/workflows/agent/steps-c/step-08f-sidecar-validation.md +++ b/src/modules/bmb/workflows/agent/steps-c/step-08f-sidecar-validation.md @@ -78,7 +78,9 @@ Validate the sidecar folder structure and referenced paths for Expert agents to - Path references pointing to non-existent files - Empty sidecar files that should have content -# EXECUTION SEQUENCE +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change. ## 1. Load Sidecar Context diff --git a/src/modules/bmb/workflows/agent/steps-c/step-09-celebrate.md b/src/modules/bmb/workflows/agent/steps-c/step-09-celebrate.md index 794766cc..25541e72 100644 --- a/src/modules/bmb/workflows/agent/steps-c/step-09-celebrate.md +++ b/src/modules/bmb/workflows/agent/steps-c/step-09-celebrate.md @@ -59,7 +59,9 @@ Celebrate the successful agent creation, recap the agent's capabilities, provide - Limits: No agent modifications, only installation guidance and celebration - Dependencies: Complete agent ready for installation -## Sequence of Instructions (Do not deviate, skip, or optimize) +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change. (Do not deviate, skip, or optimize) ### 1. Grand Celebration diff --git a/src/modules/bmb/workflows/agent/steps-e/e-01-load-existing.md b/src/modules/bmb/workflows/agent/steps-e/e-01-load-existing.md index 187e1e1f..ae4b4227 100644 --- a/src/modules/bmb/workflows/agent/steps-e/e-01-load-existing.md +++ b/src/modules/bmb/workflows/agent/steps-e/e-01-load-existing.md @@ -59,7 +59,9 @@ Load the existing agent file, parse its structure, and create an edit plan track - Limits: Analysis only, no modifications - Dependencies: Agent file must exist and be valid YAML -## Sequence of Instructions (Do not deviate, skip, or optimize) +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change. ### 1. Load Agent File diff --git a/src/modules/bmb/workflows/agent/steps-e/e-02-discover-edits.md b/src/modules/bmb/workflows/agent/steps-e/e-02-discover-edits.md index cdc50aef..ba82cee3 100644 --- a/src/modules/bmb/workflows/agent/steps-e/e-02-discover-edits.md +++ b/src/modules/bmb/workflows/agent/steps-e/e-02-discover-edits.md @@ -54,7 +54,9 @@ Conduct targeted discovery to understand exactly what the user wants to change a - Limits: Discovery and documentation only, no implementation - Dependencies: Agent must be loaded in editPlan -## Sequence of Instructions (Do not deviate, skip, or optimize) +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change. ### 1. Read Edit Plan Context diff --git a/src/modules/bmb/workflows/agent/steps-e/e-03-placeholder.md b/src/modules/bmb/workflows/agent/steps-e/e-03-placeholder.md new file mode 100644 index 00000000..5edd9caf --- /dev/null +++ b/src/modules/bmb/workflows/agent/steps-e/e-03-placeholder.md @@ -0,0 +1 @@ +# Placeholder - do not load this step. \ No newline at end of file diff --git a/src/modules/bmb/workflows/agent/steps-e/e-04-type-metadata.md b/src/modules/bmb/workflows/agent/steps-e/e-04-type-metadata.md index d7d37a52..eed424ea 100644 --- a/src/modules/bmb/workflows/agent/steps-e/e-04-type-metadata.md +++ b/src/modules/bmb/workflows/agent/steps-e/e-04-type-metadata.md @@ -36,7 +36,9 @@ Review the agent's type and metadata, and plan any changes. If edits involve typ - 💾 Document planned metadata changes - 🚫 FORBIDDEN to proceed without documenting changes -## Sequence of Instructions: +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change. ### 1. Load Reference Documents diff --git a/src/modules/bmb/workflows/agent/steps-e/e-05-persona.md b/src/modules/bmb/workflows/agent/steps-e/e-05-persona.md index 32b3cda7..df3b7378 100644 --- a/src/modules/bmb/workflows/agent/steps-e/e-05-persona.md +++ b/src/modules/bmb/workflows/agent/steps-e/e-05-persona.md @@ -37,7 +37,9 @@ Review the agent's persona and plan any changes using the four-field persona sys - 💾 Document planned persona changes - 🚫 FORBIDDEN to proceed without documenting changes -## Sequence of Instructions: +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change. ### 1. Load Reference Documents diff --git a/src/modules/bmb/workflows/agent/steps-e/e-06-commands-menu.md b/src/modules/bmb/workflows/agent/steps-e/e-06-commands-menu.md index 37bad720..a647dc52 100644 --- a/src/modules/bmb/workflows/agent/steps-e/e-06-commands-menu.md +++ b/src/modules/bmb/workflows/agent/steps-e/e-06-commands-menu.md @@ -35,7 +35,9 @@ Review the agent's command menu and plan any additions, modifications, or remova - 💾 Document planned command changes - 🚫 FORBIDDEN to proceed without documenting changes -## Sequence of Instructions: +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change. ### 1. Load Reference Documents diff --git a/src/modules/bmb/workflows/agent/steps-e/e-07-activation.md b/src/modules/bmb/workflows/agent/steps-e/e-07-activation.md index bd071a92..71b0b1d9 100644 --- a/src/modules/bmb/workflows/agent/steps-e/e-07-activation.md +++ b/src/modules/bmb/workflows/agent/steps-e/e-07-activation.md @@ -39,7 +39,9 @@ Review critical_actions and route to the appropriate type-specific edit step (Si - 💾 Route to appropriate type-specific edit step - ➡️ Auto-advance to type-specific edit on [C] -## Sequence of Instructions: +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change. ### 1. Load Reference Documents diff --git a/src/modules/bmb/workflows/agent/steps-e/e-08a-edit-simple.md b/src/modules/bmb/workflows/agent/steps-e/e-08a-edit-simple.md index d92bb27e..c7e66868 100644 --- a/src/modules/bmb/workflows/agent/steps-e/e-08a-edit-simple.md +++ b/src/modules/bmb/workflows/agent/steps-e/e-08a-edit-simple.md @@ -47,7 +47,9 @@ Apply all planned edits to the Simple agent YAML file using templates and archit - ✅ Validate YAML syntax - ➡️ Auto-advance to next validation step -## Sequence of Instructions: +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change. ### 1. Load Reference Documents diff --git a/src/modules/bmb/workflows/agent/steps-e/e-08b-edit-expert.md b/src/modules/bmb/workflows/agent/steps-e/e-08b-edit-expert.md index 394ccdb3..662a1f2f 100644 --- a/src/modules/bmb/workflows/agent/steps-e/e-08b-edit-expert.md +++ b/src/modules/bmb/workflows/agent/steps-e/e-08b-edit-expert.md @@ -48,7 +48,9 @@ Apply all planned edits to the Expert agent YAML file and manage sidecar structu - ✅ Validate YAML and sidecar paths - ➡️ Auto-advance to next validation step -## Sequence of Instructions: +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change. ### 1. Load Reference Documents diff --git a/src/modules/bmb/workflows/agent/steps-e/e-08c-edit-module.md b/src/modules/bmb/workflows/agent/steps-e/e-08c-edit-module.md index 035a4228..25317322 100644 --- a/src/modules/bmb/workflows/agent/steps-e/e-08c-edit-module.md +++ b/src/modules/bmb/workflows/agent/steps-e/e-08c-edit-module.md @@ -48,7 +48,9 @@ Apply all planned edits to the Module agent YAML file and manage workflow integr - ✅ Validate YAML and workflow paths - ➡️ Auto-advance to next validation step -## Sequence of Instructions: +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change. ### 1. Load Reference Documents diff --git a/src/modules/bmb/workflows/agent/steps-e/e-09a-validate-metadata.md b/src/modules/bmb/workflows/agent/steps-e/e-09a-validate-metadata.md index 730c43c0..bf7bd6eb 100644 --- a/src/modules/bmb/workflows/agent/steps-e/e-09a-validate-metadata.md +++ b/src/modules/bmb/workflows/agent/steps-e/e-09a-validate-metadata.md @@ -26,9 +26,9 @@ Validate that the agent's metadata properties (id, name, title, icon, module, ha - **🚫 NO MENU in this step** - record findings and auto-advance - ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` -## EXECUTION PROTOCOLS +## MANDATORY SEQUENCE -### Protocol 1: Load and Compare +**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change. 1. Read the metadata validation reference from `{agentMetadata}` 2. Read the built agent YAML from `{builtYaml}` 3. Read the edit plan from `{editPlan}` diff --git a/src/modules/bmb/workflows/agent/steps-e/e-09b-validate-persona.md b/src/modules/bmb/workflows/agent/steps-e/e-09b-validate-persona.md index b74e691a..531f434a 100644 --- a/src/modules/bmb/workflows/agent/steps-e/e-09b-validate-persona.md +++ b/src/modules/bmb/workflows/agent/steps-e/e-09b-validate-persona.md @@ -28,9 +28,9 @@ Validate that the agent's persona (role, identity, communication_style, principl - **🚫 NO MENU in this step** - record findings and auto-advance - ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` -## EXECUTION PROTOCOLS +## MANDATORY SEQUENCE -### Protocol 1: Load and Compare +**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change. 1. Read the persona validation reference from `{personaProperties}` 2. Read the principles crafting guide from `{principlesCrafting}` 3. Read the built agent YAML from `{builtYaml}` diff --git a/src/modules/bmb/workflows/agent/steps-e/e-09c-validate-menu.md b/src/modules/bmb/workflows/agent/steps-e/e-09c-validate-menu.md index 2d627517..f46863b1 100644 --- a/src/modules/bmb/workflows/agent/steps-e/e-09c-validate-menu.md +++ b/src/modules/bmb/workflows/agent/steps-e/e-09c-validate-menu.md @@ -27,9 +27,9 @@ Validate that the agent's menu (commands/tools) follows BMAD patterns as defined - **🚫 NO MENU in this step** - record findings and auto-advance - ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` -## EXECUTION PROTOCOLS +## MANDATORY SEQUENCE -### Protocol 1: Load and Compare +**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change. 1. Read the menu patterns reference from `{agentMenuPatterns}` 2. Read the built agent YAML from `{builtYaml}` 3. Read the edit plan from `{editPlan}` diff --git a/src/modules/bmb/workflows/agent/steps-e/e-09d-validate-structure.md b/src/modules/bmb/workflows/agent/steps-e/e-09d-validate-structure.md index 74893d1a..bdb7757e 100644 --- a/src/modules/bmb/workflows/agent/steps-e/e-09d-validate-structure.md +++ b/src/modules/bmb/workflows/agent/steps-e/e-09d-validate-structure.md @@ -30,9 +30,9 @@ Validate the built agent YAML file for structural completeness and correctness a - **🚫 NO MENU in this step** - record findings and auto-advance - ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` -## EXECUTION PROTOCOLS +## MANDATORY SEQUENCE -### Protocol 1: Load and Compare +**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change. 1. Read the agent compilation reference from `{agentCompilation}` 2. Read the simple validation checklist from `{simpleValidation}` 3. Read the expert validation checklist from `{expertValidation}` diff --git a/src/modules/bmb/workflows/agent/steps-e/e-09e-validate-sidecar.md b/src/modules/bmb/workflows/agent/steps-e/e-09e-validate-sidecar.md index 7bb150fb..37c015bf 100644 --- a/src/modules/bmb/workflows/agent/steps-e/e-09e-validate-sidecar.md +++ b/src/modules/bmb/workflows/agent/steps-e/e-09e-validate-sidecar.md @@ -31,9 +31,9 @@ Validate the sidecar folder structure and referenced paths for Expert agents to - **🚫 NO MENU in this step** - record findings and auto-advance - ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` -## EXECUTION PROTOCOLS +## MANDATORY SEQUENCE -### Protocol 1: Load and Compare +**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change. 1. Read the expert validation reference from `{expertValidation}` 2. Read the critical actions reference from `{criticalActions}` 3. Read the built agent YAML from `{builtYaml}` diff --git a/src/modules/bmb/workflows/agent/steps-e/e-09f-validation-summary.md b/src/modules/bmb/workflows/agent/steps-e/e-09f-validation-summary.md index dfbba1d2..223040b7 100644 --- a/src/modules/bmb/workflows/agent/steps-e/e-09f-validation-summary.md +++ b/src/modules/bmb/workflows/agent/steps-e/e-09f-validation-summary.md @@ -33,7 +33,9 @@ Display all post-edit validation findings and compare with pre-edit state. Prese - 📊 Display organized summary with before/after comparison - 💾 Allow user to decide how to proceed -## Sequence of Instructions: +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change. ### 1. Load Validation Findings diff --git a/src/modules/bmb/workflows/agent/steps-e/e-10-celebrate.md b/src/modules/bmb/workflows/agent/steps-e/e-10-celebrate.md index 5486e16a..0ef0b983 100644 --- a/src/modules/bmb/workflows/agent/steps-e/e-10-celebrate.md +++ b/src/modules/bmb/workflows/agent/steps-e/e-10-celebrate.md @@ -48,7 +48,9 @@ Celebrate the successful agent edit, provide summary of changes, and mark edit w - Limits: No more edits, only acknowledgment - Dependencies: All edits successfully applied -## Sequence of Instructions: +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change.: ### 1. Read Edit Plan diff --git a/src/modules/bmb/workflows/agent/steps-v/v-01-load-review.md b/src/modules/bmb/workflows/agent/steps-v/v-01-load-review.md index f1ba0e5e..2dc6e33a 100644 --- a/src/modules/bmb/workflows/agent/steps-v/v-01-load-review.md +++ b/src/modules/bmb/workflows/agent/steps-v/v-01-load-review.md @@ -34,7 +34,9 @@ Load the existing agent file and initialize a validation report to track all fin - 💾 Create validation report document - 🚫 FORBIDDEN to proceed without user confirmation -## Sequence of Instructions: +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change. ### 1. Load Agent File diff --git a/src/modules/bmb/workflows/agent/steps-v/v-02a-validate-metadata.md b/src/modules/bmb/workflows/agent/steps-v/v-02a-validate-metadata.md index dbf14996..381460fc 100644 --- a/src/modules/bmb/workflows/agent/steps-v/v-02a-validate-metadata.md +++ b/src/modules/bmb/workflows/agent/steps-v/v-02a-validate-metadata.md @@ -36,7 +36,9 @@ Validate the agent's metadata properties against BMAD standards as defined in ag - 💾 Append findings to validation report - ➡️ Auto-advance to next validation step -## Sequence of Instructions: +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change. ### 1. Load References diff --git a/src/modules/bmb/workflows/agent/steps-v/v-02b-validate-persona.md b/src/modules/bmb/workflows/agent/steps-v/v-02b-validate-persona.md index 7095c9cf..75629b6b 100644 --- a/src/modules/bmb/workflows/agent/steps-v/v-02b-validate-persona.md +++ b/src/modules/bmb/workflows/agent/steps-v/v-02b-validate-persona.md @@ -37,7 +37,9 @@ Validate the agent's persona against BMAD standards as defined in personaPropert - 💾 Append findings to validation report - ➡️ Auto-advance to next validation step -## Sequence of Instructions: +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change. ### 1. Load References diff --git a/src/modules/bmb/workflows/agent/steps-v/v-02c-validate-menu.md b/src/modules/bmb/workflows/agent/steps-v/v-02c-validate-menu.md index de0a74aa..1edbc616 100644 --- a/src/modules/bmb/workflows/agent/steps-v/v-02c-validate-menu.md +++ b/src/modules/bmb/workflows/agent/steps-v/v-02c-validate-menu.md @@ -36,7 +36,9 @@ Validate the agent's command menu structure against BMAD standards as defined in - 💾 Append findings to validation report - ➡️ Auto-advance to next validation step -## Sequence of Instructions: +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change. ### 1. Load References diff --git a/src/modules/bmb/workflows/agent/steps-v/v-02d-validate-structure.md b/src/modules/bmb/workflows/agent/steps-v/v-02d-validate-structure.md index f4707e54..636778c6 100644 --- a/src/modules/bmb/workflows/agent/steps-v/v-02d-validate-structure.md +++ b/src/modules/bmb/workflows/agent/steps-v/v-02d-validate-structure.md @@ -38,7 +38,9 @@ Validate the agent's YAML structure and completeness against BMAD standards as d - 💾 Append findings to validation report - ➡️ Auto-advance to next validation step -## Sequence of Instructions: +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change. ### 1. Load References diff --git a/src/modules/bmb/workflows/agent/steps-v/v-02e-validate-sidecar.md b/src/modules/bmb/workflows/agent/steps-v/v-02e-validate-sidecar.md index 18fc5a7b..5f74ce2a 100644 --- a/src/modules/bmb/workflows/agent/steps-v/v-02e-validate-sidecar.md +++ b/src/modules/bmb/workflows/agent/steps-v/v-02e-validate-sidecar.md @@ -38,7 +38,9 @@ Validate the agent's sidecar structure (if Expert type) against BMAD standards a - 💾 Append findings to validation report - ➡️ Auto-advance to summary step -## Sequence of Instructions: +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change. ### 1. Load References diff --git a/src/modules/bmb/workflows/agent/steps-v/v-03-summary.md b/src/modules/bmb/workflows/agent/steps-v/v-03-summary.md index 88666e91..5db18a83 100644 --- a/src/modules/bmb/workflows/agent/steps-v/v-03-summary.md +++ b/src/modules/bmb/workflows/agent/steps-v/v-03-summary.md @@ -32,7 +32,9 @@ Display the complete validation report to the user and offer options for fixing - 📊 Display organized summary - 💾 Allow user to decide next steps -## Sequence of Instructions: +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change. ### 1. Load Validation Report diff --git a/src/modules/bmb/workflows/create-workflow/steps/step-01-init.md b/src/modules/bmb/workflows/create-workflow/steps/step-01-init.md deleted file mode 100644 index a888d215..00000000 --- a/src/modules/bmb/workflows/create-workflow/steps/step-01-init.md +++ /dev/null @@ -1,158 +0,0 @@ ---- -name: 'step-01-init' -description: 'Initialize workflow creation session by gathering project information and setting up unique workflow folder' - -# Path Definitions -workflow_path: '{project-root}/_bmad/bmb/workflows/create-workflow' - -# File References -thisStepFile: '{workflow_path}/steps/step-01-init.md' -nextStepFile: '{workflow_path}/steps/step-02-gather.md' -workflowFile: '{workflow_path}/workflow.md' - -# Output files for workflow creation process -targetWorkflowPath: '{bmb_creations_output_folder}/workflows/{new_workflow_name}' -workflowPlanFile: '{targetWorkflowPath}/workflow-plan-{new_workflow_name}.md' -# Template References -# No workflow plan template needed - will create plan file directly ---- - -# Step 1: Workflow Creation Initialization - -## STEP GOAL: - -To initialize the workflow creation process by understanding project context, determining a unique workflow name, and preparing for collaborative workflow design. - -## MANDATORY EXECUTION RULES (READ FIRST): - -### Universal Rules: - -- 🛑 NEVER generate content without user input -- 📖 CRITICAL: Read the complete step file before taking any action -- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read -- 📋 YOU ARE A FACILITATOR, not a content generator -- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` - -### Role Reinforcement: - -- ✅ You are a workflow architect and systems designer -- ✅ If you already have been given communication or persona patterns, continue to use those while playing this new role -- ✅ We engage in collaborative dialogue, not command-response -- ✅ You bring workflow design expertise, user brings their specific requirements -- ✅ Together we will create a structured, repeatable workflow - -### Step-Specific Rules: - -- 🎯 Focus ONLY on initialization and project understanding -- 🚫 FORBIDDEN to start designing workflow steps in this step -- 💬 Ask questions conversationally to understand context -- 🚪 ENSURE unique workflow naming to avoid conflicts - -## EXECUTION PROTOCOLS: - -- 🎯 Show analysis before taking any action -- 💾 Initialize document and update frontmatter -- 📖 Set up frontmatter `stepsCompleted: [1]` before loading next step -- 🚫 FORBIDDEN to load next step until initialization is complete - -## CONTEXT BOUNDARIES: - -- Variables from workflow.md are available in memory -- Previous context = what's in output document + frontmatter -- Don't assume knowledge from other steps -- Input discovery happens in this step - -## INITIALIZATION SEQUENCE: - -### 1. Project Discovery - -Welcome the user and understand their needs: -"Welcome! I'm excited to help you create a new workflow. Let's start by understanding what you want to build." - -Ask conversationally: - -- What type of workflow are you looking to create? -- What problem will this workflow solve? -- Who will use this workflow? -- What module will it belong to (bmb, bmm, cis, custom, stand-alone)? - -Also, Ask / suggest a workflow name / folder: (kebab-case, e.g., "user-story-generator") - -### 2. Ensure Unique Workflow Name - -After getting the workflow name: - -**Check for existing workflows:** - -- Look for folder at `{bmb_creations_output_folder}/workflows/{new_workflow_name}/` -- If it exists, inform the user and suggest or get from them a unique name or postfix - -**Example alternatives:** - -- Original: "user-story-generator" -- Alternatives: "user-story-creator", "user-story-generator-2025", "user-story-generator-enhanced" - -**Loop until we have a unique name that doesn't conflict.** - -### 3. Determine Target Location - -Based on the module selection, confirm the target location: - -- For bmb module: `{custom_workflow_location}` (defaults to `_bmad/custom/src/workflows`) -- For other modules: Check their module.yaml for custom workflow locations -- Confirm the exact folder path where the workflow will be created -- Store the confirmed path as `{targetWorkflowPath}` - -### 4. Create Workflow Plan Document - -Create the workflow plan document at `{workflowPlanFile}` with the following initial content: - -```markdown ---- -stepsCompleted: [1] ---- - -# Workflow Creation Plan: {new_workflow_name} - -## Initial Project Context - -- **Module:** [module from user] -- **Target Location:** {targetWorkflowPath} -- **Created:** [current date] -``` - -This plan will capture all requirements and design details before building the actual workflow. - -### 5. Present MENU OPTIONS - -Display: **Proceeding to requirements gathering...** - -#### EXECUTION RULES: - -- This is an initialization step with no user choices -- Proceed directly to next step after setup -- Use menu handling logic section below - -#### Menu Handling Logic: - -- After setup completion and the workflow folder with the workflow plan file created already, only then immediately load, read entire file, and then execute `{workflow_path}/steps/step-02-gather.md` to begin requirements gathering - ---- - -## 🚨 SYSTEM SUCCESS/FAILURE METRICS - -### ✅ SUCCESS: - -- Workflow name confirmed and validated -- Target folder location determined -- User welcomed and project context understood -- Ready to proceed to step 2 - -### ❌ SYSTEM FAILURE: - -- Proceeding with step 2 without workflow name -- Not checking for existing workflow folders -- Not determining target location properly -- Skipping welcome message - -**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. diff --git a/src/modules/bmb/workflows/create-workflow/steps/step-02-gather.md b/src/modules/bmb/workflows/create-workflow/steps/step-02-gather.md deleted file mode 100644 index 5ef645d7..00000000 --- a/src/modules/bmb/workflows/create-workflow/steps/step-02-gather.md +++ /dev/null @@ -1,212 +0,0 @@ ---- -name: 'step-02-gather' -description: 'Gather comprehensive requirements for the workflow being created' - -# Path Definitions -workflow_path: '{project-root}/_bmad/bmb/workflows/create-workflow' - -# File References -thisStepFile: '{workflow_path}/steps/step-02-gather.md' -nextStepFile: '{workflow_path}/steps/step-03-tools-configuration.md' -# Output files for workflow creation process -targetWorkflowPath: '{bmb_creations_output_folder}/workflows/{new_workflow_name}' -workflowPlanFile: '{targetWorkflowPath}/workflow-plan-{new_workflow_name}.md' - -# Task References -advancedElicitationTask: '{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml' -partyModeWorkflow: '{project-root}/_bmad/core/workflows/party-mode/workflow.md' -# Template References -# No template needed - will append requirements directly to workflow plan ---- - -# Step 2: Requirements Gathering - -## STEP GOAL: - -To gather comprehensive requirements through collaborative conversation that will inform the design of a structured workflow tailored to the user's needs and use case. - -## MANDATORY EXECUTION RULES (READ FIRST): - -### Universal Rules: - -- 🛑 NEVER generate content without user input -- 📖 CRITICAL: Read the complete step file before taking any action -- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read -- 📋 YOU ARE A FACILITATOR, not a content generator -- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` - -### Role Reinforcement: - -- ✅ You are a workflow architect and systems designer -- ✅ If you already have been given communication or persona patterns, continue to use those while playing this new role -- ✅ We engage in collaborative dialogue, not command-response -- ✅ You bring workflow design expertise and best practices -- ✅ User brings their domain knowledge and specific requirements - -### Step-Specific Rules: - -- 🎯 Focus ONLY on collecting requirements and understanding needs -- 🚫 FORBIDDEN to propose workflow solutions or step designs in this step -- 💬 Ask questions conversationally, not like a form -- 🚫 DO NOT skip any requirement area - each affects workflow design - -## EXECUTION PROTOCOLS: - -- 🎯 Engage in natural conversation to gather requirements -- 💾 Store all requirements information for workflow design -- 📖 Proceed to next step with 'C' selection -- 🚫 FORBIDDEN to load next step until user selects 'C' - -## CONTEXT BOUNDARIES: - -- Workflow name and target location from initialization -- Focus ONLY on collecting requirements and understanding needs -- Don't provide workflow designs in this step -- This is about understanding, not designing - -## REQUIREMENTS GATHERING PROCESS: - -### 1. Workflow Purpose and Scope - -Explore through conversation: - -- What specific problem will this workflow solve? -- Who is the primary user of this workflow? -- What is the main outcome or deliverable? - -### 2. Workflow Type Classification - -Help determine the workflow type: - -- **Document Workflow**: Generates documents (PRDs, specs, plans) -- **Action Workflow**: Performs actions (refactoring, tools orchestration) -- **Interactive Workflow**: Guided sessions (brainstorming, coaching, training, practice) -- **Autonomous Workflow**: Runs without human input (batch processing, multi-step tasks) -- **Meta-Workflow**: Coordinates other workflows - -### 3. Workflow Flow and Step Structure - -Let's load some examples to help you decide the workflow pattern: - -Load and reference the Meal Prep & Nutrition Plan workflow as an example: - -``` -Read: {project-root}/_bmad/bmb/reference/workflows/meal-prep-nutrition/workflow.md -``` - -This shows a linear workflow structure. Now let's explore your desired pattern: - -- Should this be a linear workflow (step 1 → step 2 → step 3 → finish)? -- Or should it have loops/repeats (e.g., keep generating items until user says done)? -- Are there branching points based on user choices? -- Should some steps be optional? -- How many logical phases does this workflow need? (e.g., Gather → Design → Validate → Generate) - -**Based on our reference examples:** - -- **Linear**: Like Meal Prep Plan (Init → Profile → Assessment → Strategy → Shopping → Prep) - - See: `{project-root}/_bmad/bmb/reference/workflows/meal-prep-nutrition/` -- **Looping**: User Story Generator (Generate → Review → Refine → Generate more... until done) -- **Branching**: Architecture Decision (Analyze → Choose pattern → Implement based on choice) -- **Iterative**: Document Review (Load → Analyze → Suggest changes → Implement → Repeat until approved) - -### 4. User Interaction Style - -Understand the desired interaction level: - -- How much user input is needed during execution? -- Should it be highly collaborative or mostly autonomous? -- Are there specific decision points where user must choose? -- Should the workflow adapt to user responses? - -### 5. Instruction Style (Intent-Based vs Prescriptive) - -Determine how the AI should execute in this workflow: - -**Intent-Based (Recommended for most workflows)**: - -- Steps describe goals and principles, letting the AI adapt conversation naturally -- More flexible, conversational, responsive to user context -- Example: "Guide user to define their requirements through open-ended discussion" - -**Prescriptive**: - -- Steps provide exact instructions and specific text to use -- More controlled, predictable, consistent across runs -- Example: "Ask: 'What is your primary goal? Choose from: A) Growth B) Efficiency C) Quality'" - -Which style does this workflow need, or should it be a mix of both? - -### 6. Input Requirements - -Identify what the workflow needs: - -- What documents or data does the workflow need to start? -- Are there prerequisites or dependencies? -- Will users need to provide specific information? -- Are there optional inputs that enhance the workflow? - -### 7. Output Specifications - -Define what the workflow produces: - -- What is the primary output (document, action, decision)? -- Are there intermediate outputs or checkpoints? -- Should outputs be saved automatically? -- What format should outputs be in? - -### 8. Success Criteria - -Define what makes the workflow successful: - -- How will you know the workflow achieved its goal? -- What are the quality criteria for outputs? -- Are there measurable outcomes? -- What would make a user satisfied with the result? - -#### STORE REQUIREMENTS: - -After collecting all requirements, append them to {workflowPlanFile} in a format that will be be used later to design in more detail and create the workflow structure. - -### 9. Present MENU OPTIONS - -Display: **Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Continue - -#### EXECUTION RULES: - -- ALWAYS halt and wait for user input after presenting menu -- ONLY proceed to next step when user selects 'C' -- After other menu items execution, return to this menu -- User can chat or ask questions - always respond and then end with display again of the menu options -- Use menu handling logic section below - -#### Menu Handling Logic: - -- IF A: Execute {advancedElicitationTask} -- IF P: Execute {partyModeWorkflow} -- IF C: Append requirements to {workflowPlanFile}, update frontmatter, then load, read entire file, then execute {nextStepFile} -- IF Any other comments or queries: help user respond then [Redisplay Menu Options](#8-present-menu-options) - -## CRITICAL STEP COMPLETION NOTE - -ONLY WHEN C is selected and requirements are stored in the output file, will you then load, read entire file, then execute {nextStepFile} to execute and begin workflow structure design step. - ---- - -## 🚨 SYSTEM SUCCESS/FAILURE METRICS - -### ✅ SUCCESS: - -- Requirements collected through conversation (not interrogation) -- All workflow aspects documented -- Requirements stored using template -- Menu presented and user input handled correctly - -### ❌ SYSTEM FAILURE: - -- Generating workflow designs without requirements -- Skipping requirement areas -- Proceeding to next step without 'C' selection -- Not storing requirements properly - -**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. diff --git a/src/modules/bmb/workflows/create-workflow/steps/step-03-tools-configuration.md b/src/modules/bmb/workflows/create-workflow/steps/step-03-tools-configuration.md deleted file mode 100644 index c58d2581..00000000 --- a/src/modules/bmb/workflows/create-workflow/steps/step-03-tools-configuration.md +++ /dev/null @@ -1,251 +0,0 @@ ---- -name: 'step-03-tools-configuration' -description: 'Configure all required tools (core, memory, external) and installation requirements in one comprehensive step' - -# Path Definitions -workflow_path: '{project-root}/_bmad/bmb/workflows/create-workflow' - -# File References -thisStepFile: '{workflow_path}/steps/step-03-tools-configuration.md' -nextStepFile: '{workflow_path}/steps/step-04-plan-review.md' - -targetWorkflowPath: '{bmb_creations_output_folder}/workflows/{new_workflow_name}' -workflowPlanFile: '{targetWorkflowPath}/workflow-plan-{new_workflow_name}.md' - -# Documentation References -commonToolsCsv: '{project-root}/_bmad/bmb/docs/workflows/common-workflow-tools.csv' - -# Task References -advancedElicitationTask: '{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml' -partyModeWorkflow: '{project-root}/_bmad/core/workflows/party-mode/workflow.md' -# Template References -# No template needed - will append tools configuration directly to workflow plan ---- - -# Step 3: Tools Configuration - -## STEP GOAL: - -To comprehensively configure all tools needed for the workflow (core tools, memory, external tools) and determine installation requirements. - -## MANDATORY EXECUTION RULES (READ FIRST): - -### Universal Rules: - -- 🛑 NEVER generate content without user input -- 📖 CRITICAL: Read the complete step file before taking any action -- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read -- 📋 YOU ARE A FACILITATOR, not a content generator -- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` - -### Role Reinforcement: - -- ✅ You are a workflow architect and integration specialist -- ✅ If you already have been given communication or persona patterns, continue to use those while playing this new role -- ✅ We engage in collaborative dialogue, not command-response -- ✅ You bring expertise in BMAD tools and integration patterns -- ✅ User brings their workflow requirements and preferences - -### Step-Specific Rules: - -- 🎯 Focus ONLY on configuring tools based on workflow requirements -- 🚫 FORBIDDEN to skip tool categories - each affects workflow design -- 💬 Present options clearly, let user make informed choices -- 🚫 DO NOT hardcode tool descriptions - reference CSV - -## EXECUTION PROTOCOLS: - -- 🎯 Load tools dynamically from CSV, not hardcoded -- 💾 Document all tool choices in workflow plan -- 📖 Update frontmatter `stepsCompleted: [1, 2, 3]` before loading next step -- 🚫 FORBIDDEN to load next step until user selects 'C' - -## CONTEXT BOUNDARIES: - -- Requirements from step 2 inform tool selection -- All tool choices affect workflow design -- This is the ONLY tools configuration step -- Installation requirements affect implementation decisions - -## TOOLS CONFIGURATION PROCESS: - -### 1. Initialize Tools Configuration - -"Configuring **Tools and Integrations** - -Based on your workflow requirements, let's configure all the tools your workflow will need. This includes core BMAD tools, memory systems, and any external integrations." - -### 2. Load and Present Available Tools - -Load `{commonToolsCsv}` and present tools by category: - -"**Available BMAD Tools and Integrations:** - -**Core Tools (Always Available):** - -- [List tools from CSV where propose='always', with descriptions] - -**Optional Tools (Available When Needed):** - -- [List tools from CSV where propose='example', with descriptions] - -_Note: I'm loading these dynamically from our tools database to ensure you have the most current options._" - -### 3. Configure Core BMAD Tools - -"**Core BMAD Tools Configuration:** - -These tools significantly enhance workflow quality and user experience:" - -For each core tool from CSV (`propose='always'`): - -1. **Party-Mode** - - Use case: [description from CSV] - - Where to integrate: [ask user for decision points, creative phases] - -2. **Advanced Elicitation** - - Use case: [description from CSV] - - Where to integrate: [ask user for quality gates, review points] - -3. **Brainstorming** - - Use case: [description from CSV] - - Where to integrate: [ask user for idea generation, innovation points] - -### 4. Configure LLM Features - -"**LLM Feature Integration:** - -These capabilities enhance what your workflow can do:" - -From CSV (`propose='always'` LLM features): - -4. **Web-Browsing** - - Capability: [description from CSV] - - When needed: [ask user about real-time data needs] - -5. **File I/O** - - Capability: [description from CSV] - - Operations: [ask user about file operations needed] - -6. **Sub-Agents** - - Capability: [description from CSV] - - Use cases: [ask user about delegation needs] - -7. **Sub-Processes** - - Capability: [description from CSV] - - Use cases: [ask user about parallel processing needs] - -### 5. Configure Memory Systems - -"**Memory and State Management:** - -Determine if your workflow needs to maintain state between sessions:" - -From CSV memory tools: - -8. **Sidecar File** - - Use case: [description from CSV] - - Needed when: [ask about session continuity, agent initialization] - -### 6. Configure External Tools (Optional) - -"**External Integrations (Optional):** - -These tools connect your workflow to external systems:" - -From CSV (`propose='example'`): - -- MCP integrations, database connections, APIs, etc. -- For each relevant tool: present description and ask if needed -- Note any installation requirements - -### 7. Installation Requirements Assessment - -"**Installation and Dependencies:** - -Some tools require additional setup:" - -Based on selected tools: - -- Identify tools requiring installation -- Assess user's comfort level with installations -- Document installation requirements - -### 8. Document Complete Tools Configuration - -Append to {workflowPlanFile}: - -```markdown -## Tools Configuration - -### Core BMAD Tools - -- **Party-Mode**: [included/excluded] - Integration points: [specific phases] -- **Advanced Elicitation**: [included/excluded] - Integration points: [specific phases] -- **Brainstorming**: [included/excluded] - Integration points: [specific phases] - -### LLM Features - -- **Web-Browsing**: [included/excluded] - Use cases: [specific needs] -- **File I/O**: [included/excluded] - Operations: [file management needs] -- **Sub-Agents**: [included/excluded] - Use cases: [delegation needs] -- **Sub-Processes**: [included/excluded] - Use cases: [parallel processing needs] - -### Memory Systems - -- **Sidecar File**: [included/excluded] - Purpose: [state management needs] - -### External Integrations - -- [List selected external tools with purposes] - -### Installation Requirements - -- [List tools requiring installation] -- **User Installation Preference**: [willing/not willing] -- **Alternative Options**: [if not installing certain tools] -``` - -### 9. Present MENU OPTIONS - -Display: **Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Continue - -#### EXECUTION RULES: - -- ALWAYS halt and wait for user input after presenting menu -- ONLY proceed to next step when user selects 'C' -- After other menu items execution, return to this menu -- User can chat or ask questions - always respond and then end with display again of the menu options -- Use menu handling logic section below - -#### Menu Handling Logic: - -- IF A: Execute {advancedElicitationTask} -- IF P: Execute {partyModeWorkflow} -- IF C: Save tools configuration to {workflowPlanFile}, update frontmatter, then load, read entire file, then execute {nextStepFile} -- IF Any other comments or queries: help user respond then [Redisplay Menu Options](#9-present-menu-options) - -## CRITICAL STEP COMPLETION NOTE - -ONLY WHEN C is selected and tools configuration is saved will you load {nextStepFile} to review the complete plan. - ---- - -## 🚨 SYSTEM SUCCESS/FAILURE METRICS - -### ✅ SUCCESS: - -- All tool categories configured based on requirements -- User made informed choices for each tool -- Complete configuration documented in plan -- Installation requirements identified -- Ready to proceed to plan review - -### ❌ SYSTEM FAILURE: - -- Skipping tool categories -- Hardcoding tool descriptions instead of using CSV -- Not documenting user choices -- Proceeding without user confirmation - -**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. diff --git a/src/modules/bmb/workflows/create-workflow/steps/step-04-plan-review.md b/src/modules/bmb/workflows/create-workflow/steps/step-04-plan-review.md deleted file mode 100644 index 5a541d73..00000000 --- a/src/modules/bmb/workflows/create-workflow/steps/step-04-plan-review.md +++ /dev/null @@ -1,217 +0,0 @@ ---- -name: 'step-04-plan-review' -description: 'Review complete workflow plan (requirements + tools) and get user approval before design' - -# Path Definitions -workflow_path: '{project-root}/_bmad/bmb/workflows/create-workflow' - -# File References -thisStepFile: '{workflow_path}/steps/step-04-plan-review.md' -nextStepFormDesign: '{workflow_path}/steps/step-05-output-format-design.md' -nextStepDesign: '{workflow_path}/steps/step-06-design.md' - -targetWorkflowPath: '{bmb_creations_output_folder}/workflows/{new_workflow_name}' -workflowPlanFile: '{targetWorkflowPath}/workflow-plan-{new_workflow_name}.md' - -# Task References -advancedElicitationTask: '{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml' -partyModeWorkflow: '{project-root}/_bmad/core/workflows/party-mode/workflow.md' -# Template References -# No template needed - will append review summary directly to workflow plan ---- - -# Step 4: Plan Review and Approval - -## STEP GOAL: - -To present the complete workflow plan (requirements and tools configuration) for user review and approval before proceeding to design. - -## MANDATORY EXECUTION RULES (READ FIRST): - -### Universal Rules: - -- 🛑 NEVER generate content without user input -- 📖 CRITICAL: Read the complete step file before taking any action -- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read -- 📋 YOU ARE A FACILITATOR, not a content generator -- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` - -### Role Reinforcement: - -- ✅ You are a workflow architect and systems designer -- ✅ If you already have been given communication or persona patterns, continue to use those while playing this new role -- ✅ We engage in collaborative dialogue, not command-response -- ✅ You bring expertise in workflow design review and quality assurance -- ✅ User brings their specific requirements and approval authority - -### Step-Specific Rules: - -- 🎯 Focus ONLY on reviewing and refining the plan -- 🚫 FORBIDDEN to start designing workflow steps in this step -- 💬 Present plan clearly and solicit feedback -- 🚫 DO NOT proceed to design without user approval - -## EXECUTION PROTOCOLS: - -- 🎯 Present complete plan summary from {workflowPlanFile} -- 💾 Capture any modifications or refinements -- 📖 Update frontmatter `stepsCompleted: [1, 2, 3, 4]` before loading next step -- 🚫 FORBIDDEN to load next step until user approves plan - -## CONTEXT BOUNDARIES: - -- All requirements from step 2 are available -- Tools configuration from step 3 is complete -- Focus ONLY on review and approval -- This is the final check before design phase - -## PLAN REVIEW PROCESS: - -### 1. Initialize Plan Review - -"**Workflow Plan Review** - -We've gathered all requirements and configured tools for your workflow. Let's review the complete plan to ensure it meets your needs before we start designing the workflow structure." - -### 2. Present Complete Plan Summary - -Load and present from {workflowPlanFile}: - -"**Complete Workflow Plan: {new_workflow_name}** - -**1. Project Overview:** - -- [Present workflow purpose, user type, module from plan] - -**2. Workflow Requirements:** - -- [Present all gathered requirements] - -**3. Tools Configuration:** - -- [Present selected tools and integration points] - -**4. Technical Specifications:** - -- [Present technical constraints and requirements] - -**5. Success Criteria:** - -- [Present success metrics from requirements]" - -### 3. Detailed Review by Category - -"**Detailed Review:** - -**A. Workflow Scope and Purpose** - -- Is the workflow goal clearly defined? -- Are the boundaries appropriate? -- Any missing requirements? - -**B. User Interaction Design** - -- Does the interaction style match your needs? -- Are collaboration points clear? -- Any adjustments needed? - -**C. Tools Integration** - -- Are selected tools appropriate for your workflow? -- Are integration points logical? -- Any additional tools needed? - -**D. Technical Feasibility** - -- Are all requirements achievable? -- Any technical constraints missing? -- Installation requirements acceptable?" - -### 4. Collect Feedback and Refinements - -"**Review Feedback:** - -Please review each section and provide feedback: - -1. What looks good and should stay as-is? -2. What needs modification or refinement? -3. What's missing that should be added? -4. Anything unclear or confusing?" - -For each feedback item: - -- Document the requested change -- Discuss implications on workflow design -- Confirm the refinement with user - -### 5. Update Plan with Refinements - -Update {workflowPlanFile} with any approved changes: - -- Modify requirements section as needed -- Update tools configuration if changed -- Add any missing specifications -- Ensure all changes are clearly documented - -### 6. Output Document Check - -"**Output Document Check:** - -Before we proceed to design, does your workflow produce any output documents or files? - -Based on your requirements: - -- [Analyze if workflow produces documents/files] -- Consider: Does it create reports, forms, stories, or any persistent output?" - -**If NO:** -"Great! Your workflow focuses on actions/interactions without document output. We'll proceed directly to designing the workflow steps." - -**If YES:** -"Perfect! Let's design your output format to ensure your workflow produces exactly what you need." - -### 7. Present MENU OPTIONS - -Display: **Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Continue to Design - -#### EXECUTION RULES: - -- ALWAYS halt and wait for user input after presenting menu -- ONLY proceed to next step when user selects 'C' -- After other menu items execution, return to this menu -- User can chat or ask questions - always respond and then end with display again of the menu options -- Use menu handling logic section below - -#### Menu Handling Logic: - -- IF A: Execute {advancedElicitationTask} -- IF P: Execute {partyModeWorkflow} -- IF C: Check if workflow produces documents: - - If YES: Update frontmatter, then load nextStepFormDesign - - If NO: Update frontmatter, then load nextStepDesign -- IF Any other comments or queries: help user respond then [Redisplay Menu Options](#7-present-menu-options) - -## CRITICAL STEP COMPLETION NOTE - -ONLY WHEN C is selected AND the user has explicitly approved the plan and the plan document is updated as needed, then you load either {nextStepFormDesign} or {nextStepDesign} - ---- - -## 🚨 SYSTEM SUCCESS/FAILURE METRICS - -### ✅ SUCCESS: - -- Complete plan presented clearly from {workflowPlanFile} -- User feedback collected and documented -- All refinements incorporated -- User explicitly approves the plan -- Plan ready for design phase - -### ❌ SYSTEM FAILURE: - -- Not loading plan from {workflowPlanFile} -- Skipping review categories -- Proceeding without user approval -- Not documenting refinements - -**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. diff --git a/src/modules/bmb/workflows/create-workflow/steps/step-05-output-format-design.md b/src/modules/bmb/workflows/create-workflow/steps/step-05-output-format-design.md deleted file mode 100644 index 7062f2ed..00000000 --- a/src/modules/bmb/workflows/create-workflow/steps/step-05-output-format-design.md +++ /dev/null @@ -1,290 +0,0 @@ ---- -name: 'step-05-output-format-design' -description: 'Design the output format for workflows that produce documents or files' - -# Path Definitions -workflow_path: '{project-root}/_bmad/bmb/workflows/create-workflow' - -# File References -thisStepFile: '{workflow_path}/steps/step-05-output-format-design.md' -nextStepFile: '{workflow_path}/steps/step-06-design.md' - -targetWorkflowPath: '{bmb_creations_output_folder}/workflows/{new_workflow_name}' -workflowPlanFile: '{targetWorkflowPath}/workflow-plan-{new_workflow_name}.md' - -# Task References -advancedElicitationTask: '{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml' -partyModeWorkflow: '{project-root}/_bmad/core/workflows/party-mode/workflow.md' ---- - -# Step 5: Output Format Design - -## STEP GOAL: - -To design and document the output format for workflows that produce documents or files, determining whether they need strict templates or flexible formatting. - -## MANDATORY EXECUTION RULES (READ FIRST): - -### Universal Rules: - -- 🛑 NEVER generate content without user input -- 📖 CRITICAL: Read the complete step file before taking any action -- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read -- 📋 YOU ARE A FACILITATOR, not a content generator -- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` - -### Role Reinforcement: - -- ✅ You are a workflow architect and output format specialist -- ✅ If you already have been given communication or persona patterns, continue to use those while playing this new role -- ✅ We engage in collaborative dialogue, not command-response -- ✅ You bring expertise in document design and template creation -- ✅ User brings their specific output requirements and preferences - -### Step-Specific Rules: - -- 🎯 Focus ONLY on output format design -- 🚫 FORBIDDEN to design workflow steps in this step -- 💬 Help user understand the format spectrum -- 🚫 DO NOT proceed without clear format requirements - -## EXECUTION PROTOCOLS: - -- 🎯 Guide user through format spectrum with examples -- 💾 Document format decisions in workflow plan -- 📖 Update frontmatter `stepsCompleted: [1, 2, 3, 4, 5]` before loading next step -- 🚫 FORBIDDEN to load next step until user selects 'C' - -## CONTEXT BOUNDARIES: - -- Approved plan from step 4 is available -- Focus ONLY on output document formatting -- Skip this step if workflow produces no documents -- This step only runs when documents need structure - -## OUTPUT FORMAT DESIGN PROCESS: - -### 1. Initialize Output Format Discussion - -"**Designing Your Output Format** - -Based on your approved plan, your workflow will produce output documents. Let's design how these outputs should be formatted." - -### 2. Present the Format Spectrum - -"**Output Format Spectrum - Where does your workflow fit?** - -**Strictly Structured Examples:** - -- Government forms - exact fields, precise positions -- Legal documents - must follow specific templates -- Technical specifications - required sections, specific formats -- Compliance reports - mandatory fields, validation rules - -**Structured Examples:** - -- Project reports - required sections, flexible content -- Business proposals - consistent format, customizable sections -- Technical documentation - standard structure, adaptable content -- Research papers - IMRAD format, discipline-specific variations - -**Semi-structured Examples:** - -- Character sheets (D&D) - core stats + flexible background -- Lesson plans - required components, flexible delivery -- Recipes - ingredients/method format, flexible descriptions -- Meeting minutes - agenda/attendees/actions, flexible details - -**Free-form Examples:** - -- Creative stories - narrative flow, minimal structure -- Blog posts - title/body, organic organization -- Personal journals - date/entry, free expression -- Brainstorming outputs - ideas, flexible organization" - -### 3. Determine Format Type - -"**Which format type best fits your workflow?** - -1. **Strict Template** - Must follow exact format with specific fields -2. **Structured** - Required sections but flexible within each -3. **Semi-structured** - Core sections plus optional additions -4. **Free-form** - Content-driven with minimal structure - -Please choose 1-4:" - -### 4. Deep Dive Based on Choice - -#### IF Strict Template (Choice 1): - -"**Strict Template Design** - -You need exact formatting. Let's define your requirements: - -**Template Source Options:** -A. Upload existing template/image to follow -B. Create new template from scratch -C. Use standard form (e.g., government, industry) -D. AI proposes template based on your needs - -**Template Requirements:** - -- Exact field names and positions -- Required vs optional fields -- Validation rules -- File format (PDF, DOCX, etc.) -- Any legal/compliance considerations" - -#### IF Structured (Choice 2): - -"**Structured Document Design** - -You need consistent sections with flexibility: - -**Section Definition:** - -- What sections are required? -- Any optional sections? -- Section ordering rules? -- Cross-document consistency needs? - -**Format Guidelines:** - -- Any formatting standards (APA, MLA, corporate)? -- Section header styles? -- Content organization principles?" - -#### IF Semi-structured (Choice 3): - -"**Semi-structured Design** - -Core sections with flexibility: - -**Core Components:** - -- What information must always appear? -- Which parts can vary? -- Any organizational preferences? - -**Polishing Options:** - -- Would you like automatic TOC generation? -- Summary section at the end? -- Consistent formatting options?" - -#### IF Free-form (Choice 4): - -"**Free-form Content Design** - -Focus on content with minimal structure: - -**Organization Needs:** - -- Basic headers for readability? -- Date/title information? -- Any categorization needs? - -**Final Polish Options:** - -- Auto-generated summary? -- TOC based on content? -- Formatting for readability?" - -### 5. Template Creation (if applicable) - -For Strict/Structured workflows: - -"**Template Creation Approach:** - -A. **Design Together** - We'll create the template step by step -B. **AI Proposes** - I'll suggest a structure based on your needs -C. **Import Existing** - Use/upload your existing template - -Which approach would you prefer?" - -If A or B: - -- Design/create template sections -- Define placeholders -- Specify field types and validation -- Document template structure in plan - -If C: - -- Request file upload or detailed description -- Analyze template structure -- Document requirements - -### 6. Document Format Decisions - -Append to {workflowPlanFile}: - -```markdown -## Output Format Design - -**Format Type**: [Strict/Structured/Semi-structured/Free-form] - -**Output Requirements**: - -- Document type: [report/form/story/etc] -- File format: [PDF/MD/DOCX/etc] -- Frequency: [single/batch/continuous] - -**Structure Specifications**: -[Detailed structure based on format type] - -**Template Information**: - -- Template source: [created/imported/standard] -- Template file: [path if applicable] -- Placeholders: [list if applicable] - -**Special Considerations**: - -- Legal/compliance requirements -- Validation needs -- Accessibility requirements -``` - -### 7. Present MENU OPTIONS - -Display: **Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Continue - -#### EXECUTION RULES: - -- ALWAYS halt and wait for user input after presenting menu -- ONLY proceed to next step when user selects 'C' -- After other menu items execution, return to this menu -- User can chat or ask questions - always respond and then end with display again of the menu options -- Use menu handling logic section below - -#### Menu Handling Logic: - -- IF A: Execute {advancedElicitationTask} -- IF P: Execute {partyModeWorkflow} -- IF C: Save output format design to {workflowPlanFile}, update frontmatter, then load, read entire file, then execute {nextStepFile} -- IF Any other comments or queries: help user respond then [Redisplay Menu Options](#7-present-menu-options) - -## CRITICAL STEP COMPLETION NOTE - -ONLY WHEN C is selected and output format is documented will you load {nextStepFile} to begin workflow step design. - ---- - -## 🚨 SYSTEM SUCCESS/FAILURE METRICS - -### ✅ SUCCESS: - -- User understands format spectrum -- Format type clearly identified -- Template requirements documented (if applicable) -- Output format saved in plan - -### ❌ SYSTEM FAILURE: - -- Not showing format examples -- Skipping format requirements -- Not documenting decisions in plan -- Assuming format without asking - -**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. diff --git a/src/modules/bmb/workflows/create-workflow/steps/step-07-build.md b/src/modules/bmb/workflows/create-workflow/steps/step-07-build.md deleted file mode 100644 index 01a7be8a..00000000 --- a/src/modules/bmb/workflows/create-workflow/steps/step-07-build.md +++ /dev/null @@ -1,323 +0,0 @@ ---- -name: 'step-07-build' -description: 'Generate all workflow files based on the approved plan' - -# Path Definitions -workflow_path: '{project-root}/_bmad/bmb/workflows/create-workflow' - -# File References -thisStepFile: '{workflow_path}/steps/step-07-build.md' -nextStepFile: '{workflow_path}/steps/step-08-review.md' -workflowFile: '{workflow_path}/workflow.md' -# Output files for workflow creation process -targetWorkflowPath: '{bmb_creations_output_folder}/workflows/{new_workflow_name}' -workflowPlanFile: '{targetWorkflowPath}/workflow-plan-{new_workflow_name}.md' - -# Template References -workflowTemplate: '{project-root}/_bmad/bmb/docs/workflows/templates/workflow-template.md' -stepTemplate: '{project-root}/_bmad/bmb/docs/workflows/templates/step-template.md' -stepInitContinuableTemplate: '{project-root}/_bmad/bmb/docs/workflows/templates/step-01-init-continuable-template.md' -step1bTemplate: '{project-root}/_bmad/bmb/docs/workflows/templates/step-1b-template.md' -# No content templates needed - will create content as needed during build -# No build summary template needed - will append summary directly to workflow plan ---- - -# Step 7: Workflow File Generation - -## STEP GOAL: - -To generate all the workflow files (workflow.md, step files, templates, and supporting files) based on the approved plan from the previous design step. - -## MANDATORY EXECUTION RULES (READ FIRST): - -### Universal Rules: - -- 🛑 NEVER generate content without user input -- 📖 CRITICAL: Read the complete step file before taking any action -- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read -- 📋 YOU ARE A FACILITATOR, not a content generator -- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` - -### Role Reinforcement: - -- ✅ You are a workflow architect and systems designer -- ✅ If you already have been given communication or persona patterns, continue to use those while playing this new role -- ✅ We engage in collaborative dialogue, not command-response -- ✅ You bring implementation expertise and best practices -- ✅ User brings their specific requirements and design approvals - -### Step-Specific Rules: - -- 🎯 Focus ONLY on generating files based on approved design -- 🚫 FORBIDDEN to modify the design without user consent -- 💬 Generate files collaboratively, getting approval at each stage -- 🚪 CREATE files in the correct target location - -## EXECUTION PROTOCOLS: - -- 🎯 Generate files systematically from design -- 💾 Document all generated files and their locations -- 📖 Update frontmatter `stepsCompleted: [1, 2, 3, 4, 5, 6, 7]` before loading next step -- 🚫 FORBIDDEN to load next step until user selects 'C' and build is complete - -## CONTEXT BOUNDARIES: - -- Approved plan from step 6 guides implementation -- Generate files in target workflow location -- Load templates and documentation as needed during build -- Follow step-file architecture principles - -## BUILD REFERENCE MATERIALS: - -- When building each step file, you must follow template `{project-root}/_bmad/bmb/docs/workflows/templates/step-template.md` -- When building continuable step-01-init.md files, use template `{project-root}/_bmad/bmb/docs/workflows/templates/step-01-init-continuable-template.md` -- When building continuation steps, use template `{project-root}/_bmad/bmb/docs/workflows/templates/step-1b-template.md` -- When building the main workflow.md file, you must follow template `{project-root}/_bmad/bmb/docs/workflows/templates/workflow-template.md` -- Example step files from {project-root}/_bmad/bmb/reference/workflows/meal-prep-nutrition/workflow.md for patterns - this is an idealized workflow so all files can give good insight into format and structure to be followed - -## FILE GENERATION SEQUENCE: - -### 1. Confirm Build Readiness - -Based on the approved plan, confirm: -"I have your approved plan and I'm ready to generate the workflow files. The plan specifies creating: - -- Main workflow.md file -- [Number] step files -- [Number] templates -- Supporting files - -All in: {targetWorkflowPath} - -Ready to proceed?" - -### 2. Create Directory Structure - -Create the workflow folder structure in the target location: - -``` -{bmb_creations_output_folder}/workflows/{workflow_name}/ -├── workflow.md -├── steps/ -│ ├── step-01-init.md -│ ├── step-01b-continue.md (if continuation support needed) -│ ├── step-02-[name].md -│ └── ... -├── templates/ -│ └── [as needed] -└── data/ - └── [as needed] -``` - -For bmb module, this will be: `_bmad/custom/src/workflows/{workflow_name}/` -For other modules, check their module.yaml for custom_workflow_location - -### 3. Generate workflow.md - -Load and follow {workflowTemplate}: - -- Create workflow.md using template structure -- Insert workflow name and description -- Configure all path variables ({project-root}, _bmad, {workflow_path}) -- Set web_bundle flag to true unless user has indicated otherwise -- Define role and goal -- Include initialization path to step-01 - -### 4. Generate Step Files - -#### 4a. Check for Continuation Support - -**Check the workflow plan for continuation support:** - -- Look for "continuation support: true" or similar flag -- Check if step-01b-continue.md was included in the design -- If workflow generates output documents, continuation is typically needed - -#### 4b. Generate step-01-init.md (with continuation logic) - -If continuation support is needed: - -- Load and follow {stepInitContinuableTemplate} -- This template automatically includes all required continuation detection logic -- Customize with workflow-specific information: - - Update workflow_path references - - Set correct outputFile and templateFile paths - - Adjust role and persona to match workflow type - - Customize welcome message for workflow context - - Configure input document discovery patterns (if any) -- Template automatically handles: - - continueFile reference in frontmatter - - Logic to check for existing output files with stepsCompleted - - Routing to step-01b-continue.md for continuation - - Fresh workflow initialization - -#### 4c. Generate step-01b-continue.md (if needed) - -**If continuation support is required:** - -- Load and follow {step1bTemplate} -- Customize with workflow-specific information: - - Update workflow_path references - - Set correct outputFile path - - Adjust role and persona to match workflow type - - Customize welcome back message for workflow context -- Ensure proper nextStep detection logic based on step numbers - -#### 4d. Generate Remaining Step Files - -For each remaining step in the design: - -- Load and follow {stepTemplate} -- Create step file using template structure -- Customize with step-specific content -- Ensure proper frontmatter with path references -- Include appropriate menu handling and universal rules -- Follow all mandatory rules and protocols from template -- **Critical**: Ensure each step updates `stepsCompleted` array when completing - -### 5. Generate Templates (If Needed) - -For document workflows: - -- Create template.md with proper structure -- Include all variables from design -- Ensure variable naming consistency - -Remember that the output format design we aligned on chose one of the following - and what it means practically when creating the workflow steps: -1. **Strict Template** - Must follow exact format with specific fields - 1. This is similar to the example where there are multiple template fragements that are specific with all fields to be in the final output. - 2. generally there will be 1 fragment to a step to complete in the overall template. -2. **Structured** - Required sections but flexible within each - 1. Usually there will just be one template file - and in this mode it lists out all the section headings (generally level 2 sections in the md) with a handlebars style placeholder for each section. - 2. Step files responsible for a specific section will upon user Continue of that step ensure output is written to the templates proper section -3. **Semi-structured** - Core sections plus optional additions - 1. Similar to the prior 2, but not all sections or content are listed in the template, some steps might offer various paths or options to go to different steps (or variance within a step) that can determine what sections end up in the final document -4. **Free-form** - Content-driven with minimal structure - 1. These are the easiest and most flexible. The single template usually only has the front matter fence with a stepsCompleted array and maybe some other fields, and outside of the front matter just the level 1 doc title - 2. With free form, any step that could produce content just appends to the end of the document, so its progressively build in the order of ste[s completed. - 3. Its good to have in this type of workflow a final polish output doc type step that cohesively can update the doc built up in this progressive manner, improving flow, reducing duplication, and ensure all information is aligned and where it belongs. - -### 6. Generate Supporting Files - -Based on design requirements: - -- Create data files (csv) -- Generate README.md with usage instructions -- Create any configuration files -- Add validation checklists if designed - -### 7. Verify File Generation - -After creating all files: - -- Check all file paths are correct -- Validate frontmatter syntax -- Ensure variable consistency across files -- Confirm sequential step numbering -- Verify menu handling logic - -### 8. Document Generated Files - -Create a summary of what was generated: - -- List all files created with full paths -- Note any customizations from templates -- Identify any manual steps needed -- Provide next steps for testing - -## QUALITY CHECKS DURING BUILD: - -### Frontmatter Validation - -- All YAML syntax is correct -- Required fields are present -- Path variables use correct format -- No hardcoded paths exist - -### Step File Compliance - -- Each step follows the template structure -- All mandatory rules are included -- Menu handling is properly implemented -- Step numbering is sequential - -### Cross-File Consistency - -- Variable names match across files -- Path references are consistent -- Dependencies are correctly defined -- No orphaned references exist - -## BUILD PRINCIPLES: - -### Follow Design Exactly - -- Implement the design as approved -- Don't add or remove steps without consultation -- Maintain the interaction patterns designed -- Preserve the data flow architecture - -### Maintain Best Practices - -- Keep step files focused and reasonably sized (typically 5-10KB) -- Use collaborative dialogue patterns -- Include proper error handling -- Follow naming conventions - -### Ensure Extensibility - -- Design for future modifications -- Include clear documentation -- Make code readable and maintainable -- Provide examples where helpful - -## CONTENT TO APPEND TO PLAN: - -After generating all files, append to {workflowPlanFile}: - -Create a build summary including: - -- List of all files created with full paths -- Any customizations from templates -- Manual steps needed -- Next steps for testing - -### 9. Present MENU OPTIONS - -Display: **Build Complete - Select an Option:** [C] Continue to Review - -#### EXECUTION RULES: - -- Build complete - all files generated -- Present simple completion status -- User selects [C] to continue to review step - -#### Menu Handling Logic: - -- IF C: Save build summary to {workflowPlanFile}, update frontmatter, then load, read entire file, then execute {nextStepFile} -- IF Any other comments or queries: respond and redisplay menu - -## CRITICAL STEP COMPLETION NOTE - -ONLY WHEN C is selected and content is saved to plan and frontmatter is updated, will you then load, read entire file, then execute {nextStepFile} to execute and begin workflow review step. - ---- - -## 🚨 SYSTEM SUCCESS/FAILURE METRICS - -### ✅ SUCCESS: - -- All workflow files generated in correct locations -- Files follow step-file architecture principles -- Plan implemented exactly as approved -- Build documented in {workflowPlanFile} -- Frontmatter updated with step completion - -### ❌ SYSTEM FAILURE: - -- Generating files without user approval -- Deviating from approved plan -- Creating files with incorrect paths -- Not updating plan frontmatter - -**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. diff --git a/src/modules/bmb/workflows/create-workflow/steps/step-08-review.md b/src/modules/bmb/workflows/create-workflow/steps/step-08-review.md deleted file mode 100644 index a3d7258e..00000000 --- a/src/modules/bmb/workflows/create-workflow/steps/step-08-review.md +++ /dev/null @@ -1,285 +0,0 @@ ---- -name: 'step-08-review' -description: 'Review the generated workflow and provide final validation and next steps' - -# Path Definitions -workflow_path: '{project-root}/_bmad/bmb/workflows/create-workflow' - -# File References -thisStepFile: '{workflow_path}/steps/step-08-review.md' -workflowFile: '{workflow_path}/workflow.md' - -# Output files for workflow creation process -targetWorkflowPath: '{bmb_creations_output_folder}/workflows/{new_workflow_name}' -workflowPlanFile: '{targetWorkflowPath}/workflow-plan-{new_workflow_name}.md' - -# Task References -advancedElicitationTask: '{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml' -partyModeWorkflow: '{project-root}/_bmad/core/workflows/party-mode/workflow.md' - -# Template References -# No review template needed - will append review summary directly to workflow plan -# No completion template needed - will append completion details directly - -# Next step reference -nextStepFile: '{workflow_path}/steps/step-09-complete.md' ---- - -# Step 8: Workflow Review and Completion - -## STEP GOAL: - -To review the generated workflow for completeness, accuracy, and adherence to best practices, then provide next steps for deployment and usage. - -## MANDATORY EXECUTION RULES (READ FIRST): - -### Universal Rules: - -- 🛑 NEVER generate content without user input -- 📖 CRITICAL: Read the complete step file before taking any action -- 🔄 CRITICAL: Always read the complete step file before taking any action -- 📋 YOU ARE A FACILITATOR, not a content generator -- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` - -### Role Reinforcement: - -- ✅ You are a workflow architect and systems designer -- ✅ If you already have been given communication or persona patterns, continue to use those while playing this new role -- ✅ We engage in collaborative dialogue, not command-response -- ✅ You bring quality assurance expertise and validation knowledge -- ✅ User provides final approval and feedback - -### Step-Specific Rules: - -- 🎯 Focus ONLY on reviewing and validating generated workflow -- 🚫 FORBIDDEN to make changes without user approval -- 💬 Guide review process collaboratively -- 🚪 COMPLETE the workflow creation process - -## EXECUTION PROTOCOLS: - -- 🎯 Conduct thorough review of generated workflow -- 💾 Document review findings and completion status -- 📖 Update frontmatter `stepsCompleted: [1, 2, 3, 4, 5, 6, 7, 8]` and mark complete -- 🚫 This is the final step - no next step to load - -## CONTEXT BOUNDARIES: - -- Generated workflow files are available for review -- Focus on validation and quality assurance -- This step completes the workflow creation process -- No file modifications without explicit user approval - -## WORKFLOW REVIEW PROCESS: - -### 1. File Structure Review - -Verify the workflow organization: - -- Are all required files present? -- Is the directory structure correct? -- Are file names following conventions? -- Are paths properly configured? - -### 2. Configuration Validation - -Check workflow.yaml: - -- Is all metadata correctly filled? -- Are path variables properly formatted? -- Is the standalone property set correctly? -- Are all dependencies declared? - -### 3. Step File Compliance - -Review each step file: - -- Does each step follow the template structure? -- Are all mandatory rules included? -- Is menu handling properly implemented? -- Are frontmatter variables correct? -- Are steps properly numbered? - -### 4. Cross-File Consistency - -Verify integration between files: - -- Do variable names match across all files? -- Are path references consistent? -- Is the step sequence logical? -- Are there any broken references? - -### 5. Requirements Verification - -Confirm original requirements are met: - -- Does the workflow address the original problem? -- Are all user types supported? -- Are inputs and outputs as specified? -- Is the interaction style as designed? - -### 6. Best Practices Adherence - -Check quality standards: - -- Are step files focused and reasonably sized (5-10KB typical)? -- Is collaborative dialogue implemented? -- Is error handling included? -- Are naming conventions followed? - -### 7. Test Scenario Planning - -Prepare for testing: - -- What test data would be useful? -- What scenarios should be tested? -- How can the workflow be invoked? -- What would indicate successful execution? - -### 8. Deployment Preparation - -Provide next steps: - -- Installation requirements -- Invocation commands -- Testing procedures -- Documentation needs - -## REVIEW FINDINGS DOCUMENTATION: - -### Issues Found - -Document any issues discovered: - -- **Critical Issues**: Must fix before use -- **Warnings**: Should fix for better experience -- **Suggestions**: Nice to have improvements - -### Validation Results - -Record validation outcomes: - -- Configuration validation: PASSED/FAILED -- Step compliance: PASSED/FAILED -- Cross-file consistency: PASSED/FAILED -- Requirements verification: PASSED/FAILED - -### Recommendations - -Provide specific recommendations: - -- Immediate actions needed -- Future improvements -- Training needs -- Maintenance considerations - -## COMPLETION CHECKLIST: - -### Final Validations - -- [ ] All files generated successfully -- [ ] No syntax errors in YAML -- [ ] All paths are correct -- [ ] Variables are consistent -- [ ] Design requirements met -- [ ] Best practices followed - -### User Acceptance - -- [ ] User has reviewed generated workflow -- [ ] User approves of the implementation -- [ ] User understands next steps -- [ ] User satisfied with the result - -### Documentation - -- [ ] Build summary complete -- [ ] Review findings documented -- [ ] Next steps provided -- [ ] Contact information for support - -## CONTENT TO APPEND TO PLAN: - -After completing review, append to {workflowPlanFile}: - -Append review findings to {workflowPlanFile}: - -Create a review summary including: - -- Completeness check results -- Accuracy validation -- Compliance with best practices -- Any issues found - -Then append completion details: - -- Final approval status -- Deployment recommendations -- Usage guidance - -### 10. Present MENU OPTIONS - -Display: **Select an Option:** [C] Continue to Completion - -#### EXECUTION RULES: - -- ALWAYS halt and wait for user input after presenting menu -- ONLY proceed to next step when user selects 'C' -- User can chat or ask questions - always respond and then end with display again of the menu options -- Use menu handling logic section below - -#### Menu Handling Logic: - -- IF C: Save review to {workflowPlanFile}, update frontmatter, then load, read entire file, then execute {nextStepFile} -- IF Any other comments or queries: help user respond then [Redisplay Menu Options](#10-present-menu-options) - -## COMPLIANCE CHECK INSTRUCTIONS - -When user selects [C], provide these instructions: - -**🎯 Workflow Creation Complete! Your new workflow is ready at:** -`{target_workflow_path}` - -**⚠️ IMPORTANT - Run Compliance Check in New Context:** -To validate your workflow meets BMAD standards: - -1. **Start a new Claude conversation** (fresh context) -2. **Use this command:** `/bmad:bmm:workflows:workflow-compliance-check` -3. **Provide the path:** `{target_workflow_path}/workflow.md` -4. **Follow the validation process** to identify and fix any violations - -**Why New Context?** - -- Compliance checking requires fresh analysis without workflow creation context -- Ensures objective validation against template standards -- Provides detailed violation reporting with specific fix recommendations - -**Your workflow will be checked for:** - -- Template compliance and structure -- Step-by-step validation standards -- File optimization and formatting -- Meta-workflow best practices - -Ready to validate when you are! [Start new context and run compliance check] - ---- - -## 🚨 SYSTEM SUCCESS/FAILURE METRICS - -### ✅ SUCCESS: - -- Generated workflow thoroughly reviewed -- All validations performed -- Issues documented with solutions -- User approves final workflow -- Complete documentation provided - -### ❌ SYSTEM FAILURE: - -- Skipping review steps -- Not documenting findings -- Ending without user approval -- Not providing next steps - -**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. diff --git a/src/modules/bmb/workflows/create-workflow/steps/step-09-complete.md b/src/modules/bmb/workflows/create-workflow/steps/step-09-complete.md deleted file mode 100644 index 4a9125b8..00000000 --- a/src/modules/bmb/workflows/create-workflow/steps/step-09-complete.md +++ /dev/null @@ -1,188 +0,0 @@ ---- -name: 'step-09-complete' -description: 'Final completion and wrap-up of workflow creation process' - -# Path Definitions -workflow_path: '{project-root}/_bmad/bmb/workflows/create-workflow' - -# File References -thisStepFile: '{workflow_path}/steps/step-09-complete.md' -workflowFile: '{workflow_path}/workflow.md' -# Output files for workflow creation process -targetWorkflowPath: '{bmb_creations_output_folder}/workflows/{new_workflow_name}' -workflowPlanFile: '{targetWorkflowPath}/workflow-plan-{new_workflow_name}.md' -completionFile: '{targetWorkflowPath}/completion-summary-{new_workflow_name}.md' ---- - -# Step 9: Workflow Creation Complete - -## STEP GOAL: - -To complete the workflow creation process with a final summary, confirmation, and next steps for using the new workflow. - -## MANDATORY EXECUTION RULES (READ FIRST): - -### Universal Rules: - -- 🛑 NEVER generate content without user input -- 📖 CRITICAL: Read the complete step file before taking any action -- 📋 YOU ARE A FACILITATOR, not a content generator -- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` - -### Role Reinforcement: - -- ✅ You are a workflow architect and systems designer -- ✅ If you already have been given communication or persona patterns, continue to use those while playing this new role -- ✅ We engage in collaborative dialogue, not command-response -- ✅ You bring expertise in workflow deployment and usage guidance -- ✅ User brings their specific workflow needs - -### Step-Specific Rules: - -- 🎯 Focus ONLY on completion and next steps -- 🚫 FORBIDDEN to modify the generated workflow -- 💬 Provide clear guidance on how to use the workflow -- 🚫 This is the final step - no next step to load - -## EXECUTION PROTOCOLS: - -- 🎯 Present completion summary -- 💾 Create final completion documentation -- 📖 Update plan frontmatter with completion status -- 🚫 This is the final step - -## CONTEXT BOUNDARIES: - -- All previous steps are complete -- Workflow has been generated and reviewed -- Focus ONLY on completion and next steps -- This step concludes the create-workflow process - -## COMPLETION PROCESS: - -### 1. Initialize Completion - -"**Workflow Creation Complete!** - -Congratulations! We've successfully created your new workflow. Let's finalize everything and ensure you have everything you need to start using it." - -### 2. Final Summary - -Present a complete summary of what was created: - -**Workflow Created:** {new_workflow_name} -**Location:** {targetWorkflowPath} -**Files Generated:** [list from build step] - -### 3. Create Completion Summary - -Create {completionFile} with: - -```markdown ---- -workflowName: { new_workflow_name } -creationDate: [current date] -module: [module from plan] -status: COMPLETE -stepsCompleted: [1, 2, 3, 4, 5, 6, 7, 8, 9] ---- - -# Workflow Creation Summary - -## Workflow Information - -- **Name:** {new_workflow_name} -- **Module:** [module] -- **Created:** [date] -- **Location:** {targetWorkflowPath} - -## Generated Files - -[List all files created] - -## Quick Start Guide - -[How to run the new workflow] - -## Next Steps - -[Post-creation recommendations] -``` - -### 4. Usage Guidance - -Provide clear instructions on how to use the new workflow: - -**How to Use Your New Workflow:** - -1. **Running the Workflow:** - - [Instructions based on workflow type] - - [Initial setup if needed] - -2. **Common Use Cases:** - - [Typical scenarios for using the workflow] - - [Expected inputs and outputs] - -3. **Tips for Success:** - - [Best practices for this specific workflow] - - [Common pitfalls to avoid] - -### 5. Post-Creation Recommendations - -"**Next Steps:** - -1. **Test the Workflow:** Run it with sample data to ensure it works as expected -2. **Customize if Needed:** You can modify the workflow based on your specific needs -3. **Share with Team:** If others will use this workflow, provide them with the location and instructions -4. **Monitor Usage:** Keep track of how well the workflow meets your needs" - -### 6. Final Confirmation - -"**Is there anything else you need help with regarding your new workflow?** - -- I can help you test it -- We can make adjustments if needed -- I can help you create documentation for users -- Or any other support you need" - -### 7. Update Final Status - -Update {workflowPlanFile} frontmatter: - -- Set status to COMPLETE -- Set completion date -- Add stepsCompleted: [1, 2, 3, 4, 5, 6, 7, 8, 9] - -## MENU OPTIONS - -Display: **Workflow Creation Complete!** [T] Test Workflow [M] Make Adjustments [D] Get Help - -### Menu Handling Logic: - -- IF T: Offer to run the newly created workflow with sample data -- IF M: Offer to make specific adjustments to the workflow -- IF D: Provide additional help and resources -- IF Any other: Respond to user needs - -## CRITICAL STEP COMPLETION NOTE - -This is the final step. When the user is satisfied, the workflow creation process is complete. - ---- - -## 🚨 SYSTEM SUCCESS/FAILURE METRICS - -### ✅ SUCCESS: - -- Workflow fully created and reviewed -- Completion summary generated -- User understands how to use the workflow -- All documentation is in place - -### ❌ SYSTEM FAILURE: - -- Not providing clear usage instructions -- Not creating completion summary -- Leaving user without next steps - -**Master Rule:** Ensure the user has everything needed to successfully use their new workflow. diff --git a/src/modules/bmb/workflows/edit-workflow/steps/step-01-analyze.md b/src/modules/bmb/workflows/edit-workflow/steps/step-01-analyze.md deleted file mode 100644 index 69742729..00000000 --- a/src/modules/bmb/workflows/edit-workflow/steps/step-01-analyze.md +++ /dev/null @@ -1,217 +0,0 @@ ---- -name: 'step-01-analyze' -description: 'Load and deeply understand the target workflow' - -# Path Definitions -workflow_path: '{project-root}/_bmad/bmb/workflows/edit-workflow' - -# File References -thisStepFile: '{workflow_path}/steps/step-01-analyze.md' -nextStepFile: '{workflow_path}/steps/step-02-discover.md' -workflowFile: '{workflow_path}/workflow.md' -outputFile: '{output_folder}/workflow-edit-{target_workflow_name}.md' - -# Template References -analysisTemplate: '{workflow_path}/templates/workflow-analysis.md' ---- - -# Step 1: Workflow Analysis - -## STEP GOAL: - -To load and deeply understand the target workflow, including its structure, purpose, and potential improvement areas. - -## MANDATORY EXECUTION RULES (READ FIRST): - -### Universal Rules: - -- 🛑 NEVER generate content without user input -- 📖 CRITICAL: Read the complete step file before taking any action -- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read -- 📋 YOU ARE A FACILITATOR, not a content generator -- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` - -### Role Reinforcement: - -- ✅ You are a workflow editor and improvement specialist -- ✅ If you already have been given communication or persona patterns, continue to use those while playing this new role -- ✅ We engage in collaborative dialogue, not command-response -- ✅ You bring workflow analysis expertise and best practices knowledge -- ✅ User brings their workflow context and improvement needs - -### Step-Specific Rules: - -- 🎯 Focus ONLY on analysis and understanding, not editing yet -- 🚫 FORBIDDEN to suggest specific changes in this step -- 💬 Ask questions to understand the workflow path -- 🚪 DETECT if this is a new format (standalone) or old format workflow - -## EXECUTION PROTOCOLS: - -- 🎯 Analyze workflow thoroughly and systematically -- 💾 Document analysis findings in {outputFile} -- 📖 Update frontmatter `stepsCompleted: [1]` before loading next step -- 🚫 FORBIDDEN to load next step until user selects 'C' and analysis is complete - -## CONTEXT BOUNDARIES: - -- User provides the workflow path to analyze -- Load all workflow documentation for reference -- Focus on understanding current state, not improvements yet -- This is about discovery and analysis - -## WORKFLOW ANALYSIS PROCESS: - -### 1. Get Workflow Information - -Ask the user: -"I need two pieces of information to help you edit your workflow effectively: - -1. **What is the path to the workflow you want to edit?** - - Path to workflow.md file (new format) - - Path to workflow.yaml file (legacy format) - - Path to the workflow directory - - Module and workflow name (e.g., 'bmb/workflows/create-workflow') - -2. **What do you want to edit or improve in this workflow?** - - Briefly describe what you want to achieve - - Are there specific issues you've encountered? - - Any user feedback you've received? - - New features you want to add? - -This will help me focus my analysis on what matters most to you." - -### 2. Load Workflow Files - -Load the target workflow completely: - -- workflow.md (or workflow.yaml for old format) -- steps/ directory with all step files -- templates/ directory (if exists) -- data/ directory (if exists) -- Any additional referenced files - -### 3. Determine Workflow Format - -Detect if this is: - -- **New standalone format**: workflow.md with steps/ subdirectory -- **Legacy XML format**: workflow.yaml with instructions.md -- **Mixed format**: Partial migration - -### 4. Focused Analysis - -Analyze the workflow with attention to the user's stated goals: - -#### Initial Goal-Focused Analysis - -Based on what the user wants to edit: - -- If **user experience issues**: Focus on step clarity, menu patterns, instruction style -- If **functional problems**: Focus on broken references, missing files, logic errors -- If **new features**: Focus on integration points, extensibility, structure -- If **compliance issues**: Focus on best practices, standards, validation - -#### Structure Analysis - -- Identify workflow type (document, action, interactive, autonomous, meta) -- Count and examine all steps -- Map out step flow and dependencies -- Check for proper frontmatter in all files - -#### Content Analysis - -- Understand purpose and user journey -- Evaluate instruction style (intent-based vs prescriptive) -- Review menu patterns and user interaction points -- Check variable consistency across files - -#### Compliance Analysis - -Load reference documentation to understand what ideal workflow files sound be when doing the review: - -- `{project-root}/_bmad/bmb/docs/workflows/architecture.md` -- `{project-root}/_bmad/bmb/docs/workflows/templates/step-template.md` -- `{project-root}/_bmad/bmb/docs/workflows/templates/workflow-template.md` - -Check against best practices: - -- Step file size and structure (each step file 80-250 lines) -- Menu handling implementation (every menu item has a handler, and continue will only proceed after writes to output if applicable have completed) -- Frontmatter variable usage - no unused variables in the specific step front matter, and all files referenced in the file are done through a variable in the front matter - -### 5. Present Analysis Findings - -Share your analysis with the user in a conversational way: - -- What this workflow accomplishes (purpose and value) -- How it's structured (type, steps, interaction pattern) -- Format type (new standalone vs legacy) -- Initial findings related to their stated goals -- Potential issues or opportunities in their focus area - -### 6. Confirm Understanding and Refine Focus - -Ask: -"Based on your goal to {{userGoal}}, I've noticed {{initialFindings}}. -Does this align with what you were expecting? Are there other areas you'd like me to focus on in my analysis?" - -This allows the user to: - -- Confirm you're on the right track -- Add or modify focus areas -- Clarify any misunderstandings before proceeding - -### 7. Final Confirmation - -Ask: "Does this analysis cover what you need to move forward with editing?" - -## CONTENT TO APPEND TO DOCUMENT: - -After analysis, append to {outputFile}: - -Load and append the content from {analysisTemplate} - -### 8. Present MENU OPTIONS - -Display: **Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Continue - -#### EXECUTION RULES: - -- ALWAYS halt and wait for user input after presenting menu -- ONLY proceed to next step when user selects 'C' -- After other menu items execution, return to this menu -- User can chat or ask questions - always respond and then end with display again of the menu options -- Use menu handling logic section below - -#### Menu Handling Logic: - -- IF A: Execute {advancedElicitationTask} -- IF P: Execute {partyModeWorkflow} -- IF C: Save analysis to {outputFile}, update frontmatter, then only then load, read entire file, then execute {nextStepFile} -- IF Any other comments or queries: help user respond then [Redisplay Menu Options](#7-present-menu-options) - -## CRITICAL STEP COMPLETION NOTE - -ONLY WHEN C is selected and analysis is saved to document and frontmatter is updated, will you then load, read entire file, then execute {nextStepFile} to execute and begin improvement discovery step. - ---- - -## 🚨 SYSTEM SUCCESS/FAILURE METRICS - -### ✅ SUCCESS: - -- Target workflow loaded completely -- Analysis performed systematically -- Findings documented clearly -- User confirms understanding -- Analysis saved to {outputFile} - -### ❌ SYSTEM FAILURE: - -- Skipping analysis steps -- Not loading all workflow files -- Making suggestions without understanding -- Not saving analysis findings - -**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. diff --git a/src/modules/bmb/workflows/edit-workflow/steps/step-02-discover.md b/src/modules/bmb/workflows/edit-workflow/steps/step-02-discover.md deleted file mode 100644 index bf9fbca0..00000000 --- a/src/modules/bmb/workflows/edit-workflow/steps/step-02-discover.md +++ /dev/null @@ -1,254 +0,0 @@ ---- -name: 'step-02-discover' -description: 'Discover improvement goals collaboratively' - -# Path Definitions -workflow_path: '{project-root}/_bmad/bmb/workflows/edit-workflow' - -# File References -thisStepFile: '{workflow_path}/steps/step-02-discover.md' -nextStepFile: '{workflow_path}/steps/step-03-improve.md' -workflowFile: '{workflow_path}/workflow.md' -outputFile: '{output_folder}/workflow-edit-{target_workflow_name}.md' - -# Task References -advancedElicitationTask: '{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml' -partyModeWorkflow: '{project-root}/_bmad/core/workflows/party-mode/workflow.md' - -# Template References -goalsTemplate: '{workflow_path}/templates/improvement-goals.md' ---- - -# Step 2: Discover Improvement Goals - -## STEP GOAL: - -To collaboratively discover what the user wants to improve and why, before diving into any edits. - -## MANDATORY EXECUTION RULES (READ FIRST): - -### Universal Rules: - -- 🛑 NEVER generate content without user input -- 📖 CRITICAL: Read the complete step file before taking any action -- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read -- 📋 YOU ARE A FACILITATOR, not a content generator -- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` - -### Role Reinforcement: - -- ✅ You are a workflow editor and improvement specialist -- ✅ If you already have been given communication or persona patterns, continue to use those while playing this new role -- ✅ We engage in collaborative dialogue, not command-response -- ✅ You guide discovery with thoughtful questions -- ✅ User brings their context, feedback, and goals - -### Step-Specific Rules: - -- 🎯 Focus ONLY on understanding improvement goals -- 🚫 FORBIDDEN to suggest specific solutions yet -- 💬 Ask open-ended questions to understand needs -- 🚪 ORGANIZE improvements by priority and impact - -## EXECUTION PROTOCOLS: - -- 🎯 Guide collaborative discovery conversation -- 💾 Document goals in {outputFile} -- 📖 Update frontmatter `stepsCompleted: [1, 2]` before loading next step -- 🚫 FORBIDDEN to load next step until user selects 'C' and goals are documented - -## CONTEXT BOUNDARIES: - -- Analysis from step 1 is available and informs discovery -- Focus areas identified in step 1 guide deeper exploration -- Focus on WHAT to improve and WHY -- Don't discuss HOW to improve yet -- This is about detailed needs assessment, not solution design - -## DISCOVERY PROCESS: - -### 1. Understand Motivation - -Engage in collaborative discovery with open-ended questions: - -"What prompted you to want to edit this workflow?" - -Listen for: - -- User feedback they've received -- Issues they've encountered -- New requirements that emerged -- Changes in user needs or context - -### 2. Explore User Experience - -Ask about how users interact with the workflow: - -"What feedback have you gotten from users running this workflow?" - -Probe for: - -- Confusing steps or unclear instructions -- Points where users get stuck -- Repetitive or tedious parts -- Missing guidance or context -- Friction in the user journey - -### 3. Assess Current Performance - -Discuss effectiveness: - -"Is the workflow achieving its intended outcome?" - -Explore: - -- Are users successful with this workflow? -- What are the success/failure rates? -- Where do most users drop off? -- Are there quality issues with outputs? - -### 4. Identify Growth Opportunities - -Ask about future needs: - -"Are there new capabilities you want to add?" - -Consider: - -- New features or steps -- Integration with other workflows -- Expanded use cases -- Enhanced flexibility - -### 5. Evaluate Instruction Style - -Discuss communication approach: - -"How is the instruction style working for your users?" - -Explore: - -- Is it too rigid or too loose? -- Should certain steps be more adaptive? -- Do some steps need more specificity? -- Does the style match the workflow's purpose? - -### 6. Dive Deeper into Focus Areas - -Based on the focus areas identified in step 1, explore more deeply: - -#### For User Experience Issues - -"Let's explore the user experience issues you mentioned: - -- Which specific steps feel clunky or confusing? -- At what points do users get stuck? -- What kind of guidance would help them most?" - -#### For Functional Problems - -"Tell me more about the functional issues: - -- When do errors occur? -- What specific functionality isn't working? -- Are these consistent issues or intermittent?" - -#### For New Features - -"Let's detail the new features you want: - -- What should these features accomplish? -- How should users interact with them? -- Are there examples of similar workflows to reference?" - -#### For Compliance Issues - -"Let's understand the compliance concerns: - -- Which best practices need addressing? -- Are there specific standards to meet? -- What validation would be most valuable?" - -### 7. Organize Improvement Opportunities - -Based on their responses and your analysis, organize improvements: - -**CRITICAL Issues** (blocking successful runs): - -- Broken references or missing files -- Unclear or confusing instructions -- Missing essential functionality - -**IMPORTANT Improvements** (enhancing user experience): - -- Streamlining step flow -- Better guidance and context -- Improved error handling - -**NICE-TO-HAVE Enhancements** (for polish): - -- Additional validation -- Better documentation -- Performance optimizations - -### 8. Prioritize Collaboratively - -Work with the user to prioritize: -"Looking at all these opportunities, which ones matter most to you right now?" - -Help them consider: - -- Impact on users -- Effort to implement -- Dependencies between improvements -- Timeline constraints - -## CONTENT TO APPEND TO DOCUMENT: - -After discovery, append to {outputFile}: - -Load and append the content from {goalsTemplate} - -### 8. Present MENU OPTIONS - -Display: **Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Continue - -#### EXECUTION RULES: - -- ALWAYS halt and wait for user input after presenting menu -- ONLY proceed to next step when user selects 'C' -- After other menu items execution, return to this menu -- User can chat or ask questions - always respond and then end with display again of the menu options -- Use menu handling logic section below - -#### Menu Handling Logic: - -- IF A: Execute {advancedElicitationTask} -- IF P: Execute {partyModeWorkflow} -- IF C: Save goals to {outputFile}, update frontmatter, then only then load, read entire file, then execute {nextStepFile} -- IF Any other comments or queries: help user respond then [Redisplay Menu Options](#8-present-menu-options) - -## CRITICAL STEP COMPLETION NOTE - -ONLY WHEN C is selected and goals are saved to document and frontmatter is updated, will you then load, read entire file, then execute {nextStepFile} to execute and begin collaborative improvement step. - ---- - -## 🚨 SYSTEM SUCCESS/FAILURE METRICS - -### ✅ SUCCESS: - -- User improvement goals clearly understood -- Issues and opportunities identified -- Priorities established collaboratively -- Goals documented in {outputFile} -- User ready to proceed with improvements - -### ❌ SYSTEM FAILURE: - -- Skipping discovery dialogue -- Making assumptions about user needs -- Not documenting discovered goals -- Rushing to solutions without understanding - -**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. diff --git a/src/modules/bmb/workflows/edit-workflow/steps/step-03-improve.md b/src/modules/bmb/workflows/edit-workflow/steps/step-03-improve.md deleted file mode 100644 index ea9b5139..00000000 --- a/src/modules/bmb/workflows/edit-workflow/steps/step-03-improve.md +++ /dev/null @@ -1,218 +0,0 @@ ---- -name: 'step-03-improve' -description: 'Facilitate collaborative improvements to the workflow' - -# Path Definitions -workflow_path: '{project-root}/_bmad/bmb/workflows/edit-workflow' - -# File References -thisStepFile: '{workflow_path}/steps/step-03-improve.md' -nextStepFile: '{workflow_path}/steps/step-04-validate.md' -workflowFile: '{workflow_path}/workflow.md' -outputFile: '{output_folder}/workflow-edit-{target_workflow_name}.md' - -# Task References -advancedElicitationTask: '{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml' -partyModeWorkflow: '{project-root}/_bmad/core/workflows/party-mode/workflow.md' - -# Template References -improvementLogTemplate: '{workflow_path}/templates/improvement-log.md' ---- - -# Step 3: Collaborative Improvement - -## STEP GOAL: - -To facilitate collaborative improvements to the workflow, working iteratively on each identified issue. - -## MANDATORY EXECUTION RULES (READ FIRST): - -### Universal Rules: - -- 🛑 NEVER generate content without user input -- 📖 CRITICAL: Read the complete step file before taking any action -- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read -- 📋 YOU ARE A FACILITATOR, not a content generator -- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` - -### Role Reinforcement: - -- ✅ You are a workflow editor and improvement specialist -- ✅ If you already have been given communication or persona patterns, continue to use those while playing this new role -- ✅ We engage in collaborative dialogue, not command-response -- ✅ You guide improvements with explanations and options -- ✅ User makes decisions and approves changes - -### Step-Specific Rules: - -- 🎯 Work on ONE improvement at a time -- 🚫 FORBIDDEN to make changes without user approval -- 💬 Explain the rationale for each proposed change -- 🚪 ITERATE: improve, review, refine - -## EXECUTION PROTOCOLS: - -- 🎯 Facilitate improvements collaboratively and iteratively -- 💾 Document all changes in improvement log -- 📖 Update frontmatter `stepsCompleted: [1, 2, 3]` before loading next step -- 🚫 FORBIDDEN to load next step until user selects 'C' and improvements are complete - -## CONTEXT BOUNDARIES: - -- Analysis and goals from previous steps guide improvements -- Load workflow creation documentation as needed -- Focus on improvements prioritized in step 2 -- This is about collaborative implementation, not solo editing - -## IMPROVEMENT PROCESS: - -### 1. Load Reference Materials - -Load documentation as needed for specific improvements: - -- `{project-root}/_bmad/bmb/docs/workflows/templates/step-template.md` -- `{project-root}/_bmad/bmb/docs/workflows/templates/workflow-template.md` -- `{project-root}/_bmad/bmb/docs/workflows/architecture.md` - -### 2. Address Each Improvement Iteratively - -For each prioritized improvement: - -#### A. Explain Current State - -Show the relevant section: -"Here's how this step currently works: -[Display current content] - -This can cause {{problem}} because {{reason}}." - -#### B. Propose Improvement - -Suggest specific changes: -"Based on best practices, we could: -{{proposedSolution}} - -This would help users by {{benefit}}." - -#### C. Collaborate on Approach - -Ask for input: -"Does this approach address your need?" -"Would you like to modify this suggestion?" -"What concerns do you have about this change?" - -#### D. Get Explicit Approval - -"Should I apply this change?" - -#### E. Apply and Show Result - -Make the change and display: -"Here's the updated version: -[Display new content] - -Does this look right to you?" - -### 3. Common Improvement Patterns - -#### Step Flow Improvements - -- Merge redundant steps -- Split complex steps -- Reorder for better flow -- Add missing transitions - -#### Instruction Style Refinement - -Load step-template.md for reference: - -- Convert prescriptive to intent-based for discovery steps -- Add structure to vague instructions -- Balance guidance with autonomy - -#### Variable Consistency Fixes - -- Identify all variable references -- Ensure consistent naming (snake_case) -- Verify variables are defined in workflow.md -- Update all occurrences - -#### Menu System Updates - -- Standardize menu patterns -- Ensure proper A/P/C options -- Fix menu handling logic -- Add Advanced Elicitation where useful - -#### Frontmatter Compliance - -- Add required fields to workflow.md -- Ensure proper path variables -- Include web_bundle configuration if needed -- Remove unused fields - -#### Template Updates - -- Align template variables with step outputs -- Improve variable naming -- Add missing template sections -- Test variable substitution - -### 4. Track All Changes - -For each improvement made, document: - -- What was changed -- Why it was changed -- Files modified -- User approval - -## CONTENT TO APPEND TO DOCUMENT: - -After each improvement iteration, append to {outputFile}: - -Load and append content from {improvementLogTemplate} - -### 5. Present MENU OPTIONS - -Display: **Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Continue - -#### EXECUTION RULES: - -- ALWAYS halt and wait for user input after presenting menu -- ONLY proceed to next step when user selects 'C' -- After other menu items execution, return to this menu -- User can chat or ask questions - always respond and then end with display again of the menu options -- Use menu handling logic section below - -#### Menu Handling Logic: - -- IF A: Execute {advancedElicitationTask} -- IF P: Execute {partyModeWorkflow} -- IF C: Save improvement log to {outputFile}, update frontmatter, then only then load, read entire file, then execute {nextStepFile} -- IF Any other comments or queries: help user respond then [Redisplay Menu Options](#5-present-menu-options) - -## CRITICAL STEP COMPLETION NOTE - -ONLY WHEN C is selected and all prioritized improvements are complete and documented, will you then load, read entire file, then execute {nextStepFile} to execute and begin validation step. - ---- - -## 🚨 SYSTEM SUCCESS/FAILURE METRICS - -### ✅ SUCCESS: - -- All prioritized improvements addressed -- User approved each change -- Changes documented clearly -- Workflow follows best practices -- Improvement log updated - -### ❌ SYSTEM FAILURE: - -- Making changes without user approval -- Not documenting changes -- Skipping prioritized improvements -- Breaking workflow functionality - -**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. diff --git a/src/modules/bmb/workflows/edit-workflow/steps/step-04-validate.md b/src/modules/bmb/workflows/edit-workflow/steps/step-04-validate.md deleted file mode 100644 index ae98a2b3..00000000 --- a/src/modules/bmb/workflows/edit-workflow/steps/step-04-validate.md +++ /dev/null @@ -1,194 +0,0 @@ ---- -name: 'step-04-validate' -description: 'Validate improvements and prepare for completion' - -# Path Definitions -workflow_path: '{project-root}/_bmad/bmb/workflows/edit-workflow' - -# File References -thisStepFile: '{workflow_path}/steps/step-04-validate.md' -workflowFile: '{workflow_path}/workflow.md' -outputFile: '{output_folder}/workflow-edit-{target_workflow_name}.md' -nextStepFile: '{workflow_path}/steps/step-05-compliance-check.md' - -# Task References -advancedElicitationTask: '{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml' -partyModeWorkflow: '{project-root}/_bmad/core/workflows/party-mode/workflow.md' - -# Template References -validationTemplate: '{workflow_path}/templates/validation-results.md' -completionTemplate: '{workflow_path}/templates/completion-summary.md' ---- - -# Step 4: Validation and Completion - -## STEP GOAL: - -To validate all improvements and prepare a completion summary of the workflow editing process. - -## MANDATORY EXECUTION RULES (READ FIRST): - -### Universal Rules: - -- 🛑 NEVER generate content without user input -- 📖 CRITICAL: Read the complete step file before taking any action -- 🔄 CRITICAL: Always read the complete step file before taking any action -- 📋 YOU ARE A FACILITATOR, not a content generator -- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` - -### Role Reinforcement: - -- ✅ You are a workflow editor and improvement specialist -- ✅ If you already have been given communication or persona patterns, continue to use those while playing this new role -- ✅ We engage in collaborative dialogue, not command-response -- ✅ You ensure quality and completeness -- ✅ User confirms final state - -### Step-Specific Rules: - -- 🎯 Focus ONLY on validation and completion -- 🚫 FORBIDDEN to make additional edits at this stage -- 💬 Explain validation results clearly -- 🚪 PREPARE final summary and next steps - -## EXECUTION PROTOCOLS: - -- 🎯 Validate all changes systematically -- 💾 Document validation results -- 📖 Update frontmatter `stepsCompleted: [1, 2, 3, 4]` before loading next step -- 🚫 FORBIDDEN to load next step until user selects 'C' and validation is complete - -## CONTEXT BOUNDARIES: - -- All improvements from step 3 should be implemented -- Focus on validation, not additional changes -- Reference best practices for validation criteria -- This completes the editing process - -## VALIDATION PROCESS: - -### 1. Comprehensive Validation Checks - -Validate the improved workflow systematically: - -#### File Structure Validation - -- [ ] All required files present -- [ ] Directory structure correct -- [ ] File names follow conventions -- [ ] Path references resolve correctly - -#### Configuration Validation - -- [ ] workflow.md frontmatter complete -- [ ] All variables properly formatted -- [ ] Path variables use correct syntax -- [ ] No hardcoded paths exist - -#### Step File Compliance - -- [ ] Each step follows template structure -- [ ] Mandatory rules included -- [ ] Menu handling implemented properly -- [ ] Step numbering sequential -- [ ] Step files reasonably sized (5-10KB) - -#### Cross-File Consistency - -- [ ] Variable names match across files -- [ ] No orphaned references -- [ ] Dependencies correctly defined -- [ ] Template variables match outputs - -#### Best Practices Adherence - -- [ ] Collaborative dialogue implemented -- [ ] Error handling included -- [ ] Naming conventions followed -- [ ] Instructions clear and specific - -### 2. Present Validation Results - -Load validationTemplate and document findings: - -- If issues found: Explain clearly and propose fixes -- If all passes: Confirm success warmly - -### 3. Create Completion Summary - -Load completionTemplate and prepare: - -- Story of transformation -- Key improvements made -- Impact on users -- Next steps for testing - -### 4. Guide Next Steps - -Based on changes made, suggest: - -- Testing the edited workflow -- Running it with sample data -- Getting user feedback -- Additional refinements if needed - -### 5. Document Final State - -Update {outputFile} with: - -- Validation results -- Completion summary -- Change log summary -- Recommendations - -## CONTENT TO APPEND TO DOCUMENT: - -After validation, append to {outputFile}: - -Load and append content from {validationTemplate} - -Then load and append content from {completionTemplate} - -## FINAL MENU OPTIONS - -Display: **Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Continue - -### EXECUTION RULES: - -- ALWAYS halt and wait for user input after presenting menu -- ONLY proceed to next step when user selects 'C' -- After other menu items execution, return to this menu -- User can chat or ask questions - always respond and then end with display again of the menu options -- Use menu handling logic section below - -#### Menu Handling Logic: - -- IF A: Execute {advancedElicitationTask} -- IF P: Execute {partyModeWorkflow} -- IF C: Save content to {outputFile}, update frontmatter, then only then load, read entire file, then execute {nextStepFile} -- IF Any other comments or queries: help user respond then [Redisplay Menu Options](#final-menu-options) - -## CRITICAL STEP COMPLETION NOTE - -ONLY WHEN C is selected and content is saved to {outputFile} with frontmatter updated, will you then load, read entire file, then execute {nextStepFile} to execute and begin compliance validation step. - ---- - -## 🚨 SYSTEM SUCCESS/FAILURE METRICS - -### ✅ SUCCESS: - -- All improvements validated successfully -- No critical issues remain -- Completion summary provided -- Next steps clearly outlined -- User satisfied with results - -### ❌ SYSTEM FAILURE: - -- Skipping validation steps -- Not documenting final state -- Ending without user confirmation -- Leaving issues unresolved - -**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. diff --git a/src/modules/bmb/workflows/edit-workflow/steps/step-05-compliance-check.md b/src/modules/bmb/workflows/edit-workflow/steps/step-05-compliance-check.md deleted file mode 100644 index d53c3aff..00000000 --- a/src/modules/bmb/workflows/edit-workflow/steps/step-05-compliance-check.md +++ /dev/null @@ -1,246 +0,0 @@ ---- -name: 'step-05-compliance-check' -description: 'Run comprehensive compliance validation on the edited workflow' - -# Path Definitions -workflow_path: '{project-root}/_bmad/bmb/workflows/edit-workflow' - -# File References -thisStepFile: '{workflow_path}/steps/step-05-compliance-check.md' -workflowFile: '{workflow_path}/workflow.md' -editedWorkflowPath: '{target_workflow_path}' -complianceCheckWorkflow: '{project-root}/_bmad/bmb/workflows/workflow-compliance-check/workflow.md' -outputFile: '{output_folder}/workflow-edit-{target_workflow_name}.md' - -# Task References -complianceCheckTask: '{project-root}/_bmad/bmb/workflows/workflow-compliance-check/workflow.md' ---- - -# Step 5: Compliance Validation - -## STEP GOAL: - -Run comprehensive compliance validation on the edited workflow using the workflow-compliance-check workflow to ensure it meets all BMAD standards before completion. - -## MANDATORY EXECUTION RULES (READ FIRST): - -### Universal Rules: - -- 🛑 NEVER generate content without user input -- 📖 CRITICAL: Read the complete step file before taking any action -- 📋 YOU ARE A FACILITATOR, not a content generator -- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` - -### Role Reinforcement: - -- ✅ You are a workflow editor and quality assurance specialist -- ✅ If you already have been given a name, communication_style, and persona, continue to use those while playing this new role -- ✅ We engage in collaborative dialogue, not command-response -- ✅ You bring expertise in BMAD standards and workflow validation -- ✅ User brings their edited workflow and needs quality assurance - -### Step-Specific Rules: - -- 🎯 Focus only on running compliance validation on the edited workflow -- 🚫 FORBIDDEN to skip compliance validation or declare workflow complete without it -- 💬 Approach: Quality-focused, thorough, and collaborative -- 📋 Ensure user understands compliance results and next steps - -## EXECUTION PROTOCOLS: - -- 🎯 Launch workflow-compliance-check on the edited workflow -- 💾 Review compliance report and present findings to user -- 📖 Explain any issues found and provide fix recommendations -- 🚫 FORBIDDEN to proceed without compliance validation completion - -## CONTEXT BOUNDARIES: - -- Available context: Edited workflow files from previous improve step -- Focus: Compliance validation using workflow-compliance-check workflow -- Limits: Validation and reporting only, no further workflow modifications -- Dependencies: Successful workflow improvements in previous step - -## Sequence of Instructions (Do not deviate, skip, or optimize) - -### 1. Initialize Compliance Validation - -"**Final Quality Check: Workflow Compliance Validation** - -Your workflow has been edited! Now let's run a comprehensive compliance check to ensure it meets all BMAD standards and follows best practices. - -This validation will check: - -- Template compliance (workflow-template.md and step-template.md) -- File size optimization and markdown formatting -- CSV data file standards (if applicable) -- Intent vs Prescriptive spectrum alignment -- Web search and subprocess optimization -- Overall workflow flow and goal alignment" - -### 2. Launch Compliance Check Workflow - -**A. Execute Compliance Validation:** - -"Running comprehensive compliance validation on your edited workflow... -Target: `{editedWorkflowPath}` - -**Executing:** {complianceCheckTask} -**Validation Scope:** Full 8-phase compliance analysis -**Expected Duration:** Thorough validation may take several minutes" - -**B. Monitor Validation Progress:** - -Provide updates as the validation progresses: - -- "✅ Workflow.md validation in progress..." -- "✅ Step-by-step compliance checking..." -- "✅ File size and formatting analysis..." -- "✅ Intent spectrum assessment..." -- "✅ Web search optimization analysis..." -- "✅ Generating comprehensive compliance report..." - -### 3. Compliance Report Analysis - -**A. Review Validation Results:** - -"**Compliance Validation Complete!** - -**Overall Assessment:** [PASS/PARTIAL/FAIL - based on compliance report] - -- **Critical Issues:** [number found] -- **Major Issues:** [number found] -- **Minor Issues:** [number found] -- **Compliance Score:** [percentage]%" - -**B. Present Key Findings:** - -"**Key Compliance Results:** - -- **Template Adherence:** [summary of template compliance] -- **File Optimization:** [file size and formatting issues] -- **Intent Spectrum:** [spectrum positioning validation] -- **Performance Optimization:** [web search and subprocess findings] -- **Overall Flow:** [workflow structure and completion validation]" - -### 4. Issue Resolution Options - -**A. Review Compliance Issues:** - -If issues are found: -"**Issues Requiring Attention:** - -**Critical Issues (Must Fix):** -[List any critical violations that prevent workflow functionality] - -**Major Issues (Should Fix):** -[List major issues that impact quality or maintainability] - -**Minor Issues (Nice to Fix):** -[List minor standards compliance issues]" - -**B. Resolution Options:** - -"**Resolution Options:** - -1. **Automatic Fixes** - I can apply automated fixes where possible -2. **Manual Guidance** - I'll guide you through manual fixes step by step -3. **Return to Edit** - Go back to step 3 for additional improvements -4. **Accept as Is** - Proceed with current state (if no critical issues) -5. **Detailed Review** - Review full compliance report in detail" - -### 5. Final Validation Confirmation - -**A. User Choice Handling:** - -Based on user selection: - -- **If Automatic Fixes**: Apply fixes and re-run validation -- **If Manual Guidance**: Provide step-by-step fix instructions -- **If Return to Edit**: Load step-03-discover.md with compliance report context -- **If Accept as Is**: Confirm understanding of any remaining issues -- **If Detailed Review**: Present full compliance report - -**B. Final Status Confirmation:** - -"**Workflow Compliance Status:** [FINAL/PROVISIONAL] - -**Completion Criteria:** - -- ✅ All critical issues resolved -- ✅ Major issues addressed or accepted -- ✅ Compliance documentation complete -- ✅ User understands any remaining minor issues - -**Your edited workflow is ready!**" - -### 6. Completion Documentation - -**A. Update Compliance Status:** - -Document final compliance status in {outputFile}: - -- **Validation Date:** [current date] -- **Compliance Score:** [final percentage] -- **Issues Resolved:** [summary of fixes applied] -- **Remaining Issues:** [any accepted minor issues] - -**B. Final User Guidance:** - -"**Next Steps for Your Edited Workflow:** - -1. **Test the workflow** with real users to validate functionality -2. **Monitor performance** and consider optimization opportunities -3. **Gather feedback** for potential future improvements -4. **Consider compliance check** periodically for maintenance - -**Support Resources:** - -- Use workflow-compliance-check for future validations -- Refer to BMAD documentation for best practices -- Use edit-workflow again for future modifications" - -### 7. Final Menu Options - -"**Workflow Edit and Compliance Complete!** - -**Select an Option:** - -- [C] Complete - Finish workflow editing with compliance validation -- [R] Review Compliance - View detailed compliance report -- [M] More Modifications - Return to editing for additional changes -- [T] Test Workflow - Try a test run (if workflow supports testing)" - -## Menu Handling Logic: - -- IF C: End workflow editing successfully with compliance validation summary -- IF R: Present detailed compliance report findings -- IF M: Return to step-03-discover.md for additional improvements -- IF T: If workflow supports testing, suggest test execution method -- IF Any other comments or queries: respond and redisplay completion options - -## CRITICAL STEP COMPLETION NOTE - -ONLY WHEN compliance validation is complete and user confirms final workflow status, will the workflow editing process be considered successfully finished. - ---- - -## 🚨 SYSTEM SUCCESS/FAILURE METRICS - -### ✅ SUCCESS: - -- Comprehensive compliance validation executed on edited workflow -- All compliance issues identified and documented with severity rankings -- User provided with clear understanding of validation results -- Appropriate resolution options offered and implemented -- Final edited workflow meets BMAD standards and is ready for production -- User satisfaction with workflow quality and compliance - -### ❌ SYSTEM FAILURE: - -- Skipping compliance validation before workflow completion -- Not addressing critical compliance issues found during validation -- Failing to provide clear guidance on issue resolution -- Declaring workflow complete without ensuring standards compliance -- Not documenting final compliance status for future reference - -**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. diff --git a/src/modules/bmb/workflows/edit-workflow/templates/completion-summary.md b/src/modules/bmb/workflows/edit-workflow/templates/completion-summary.md deleted file mode 100644 index ca888ffb..00000000 --- a/src/modules/bmb/workflows/edit-workflow/templates/completion-summary.md +++ /dev/null @@ -1,75 +0,0 @@ -## Workflow Edit Complete! - -### Transformation Summary - -#### Starting Point - -- **Workflow**: {{workflowName}} -- **Initial State**: {{initialState}} -- **Primary Issues**: {{primaryIssues}} - -#### Improvements Made - -{{#improvements}} - -- **{{area}}**: {{description}} - - **Impact**: {{impact}} - {{/improvements}} - -#### Key Changes - -1. {{change1}} -2. {{change2}} -3. {{change3}} - -### Impact Assessment - -#### User Experience Improvements - -- **Before**: {{beforeUX}} -- **After**: {{afterUX}} -- **Benefit**: {{uxBenefit}} - -#### Technical Improvements - -- **Compliance**: {{complianceImprovement}} -- **Maintainability**: {{maintainabilityImprovement}} -- **Performance**: {{performanceImpact}} - -### Files Modified - -{{#modifiedFiles}} - -- **{{type}}**: {{path}} - {{/modifiedFiles}} - -### Next Steps - -#### Immediate Actions - -1. {{immediateAction1}} -2. {{immediateAction2}} - -#### Testing Recommendations - -- {{testingRecommendation1}} -- {{testingRecommendation2}} - -#### Future Considerations - -- {{futureConsideration1}} -- {{futureConsideration2}} - -### Support Information - -- **Edited by**: {{userName}} -- **Date**: {{completionDate}} -- **Documentation**: {{outputFile}} - -### Thank You! - -Thank you for collaboratively improving this workflow. Your workflow now follows best practices and should provide a better experience for your users. - ---- - -_Edit workflow completed successfully on {{completionDate}}_ diff --git a/src/modules/bmb/workflows/edit-workflow/templates/improvement-goals.md b/src/modules/bmb/workflows/edit-workflow/templates/improvement-goals.md deleted file mode 100644 index 895cb7dc..00000000 --- a/src/modules/bmb/workflows/edit-workflow/templates/improvement-goals.md +++ /dev/null @@ -1,68 +0,0 @@ -## Improvement Goals - -### Motivation - -- **Trigger**: {{editTrigger}} -- **User Feedback**: {{userFeedback}} -- **Success Issues**: {{successIssues}} - -### User Experience Issues - -{{#uxIssues}} - -- {{.}} - {{/uxIssues}} - -### Performance Gaps - -{{#performanceGaps}} - -- {{.}} - {{/performanceGaps}} - -### Growth Opportunities - -{{#growthOpportunities}} - -- {{.}} - {{/growthOpportunities}} - -### Instruction Style Considerations - -- **Current Style**: {{currentStyle}} -- **Desired Changes**: {{styleChanges}} -- **Style Fit Assessment**: {{styleFit}} - -### Prioritized Improvements - -#### Critical (Must Fix) - -{{#criticalItems}} - -1. {{.}} - {{/criticalItems}} - -#### Important (Should Fix) - -{{#importantItems}} - -1. {{.}} - {{/importantItems}} - -#### Nice-to-Have (Could Fix) - -{{#niceItems}} - -1. {{.}} - {{/niceItems}} - -### Focus Areas for Next Step - -{{#focusAreas}} - -- {{.}} - {{/focusAreas}} - ---- - -_Goals identified on {{date}}_ diff --git a/src/modules/bmb/workflows/edit-workflow/templates/improvement-log.md b/src/modules/bmb/workflows/edit-workflow/templates/improvement-log.md deleted file mode 100644 index d5445235..00000000 --- a/src/modules/bmb/workflows/edit-workflow/templates/improvement-log.md +++ /dev/null @@ -1,40 +0,0 @@ -## Improvement Log - -### Change Summary - -- **Date**: {{date}} -- **Improvement Area**: {{improvementArea}} -- **User Goal**: {{userGoal}} - -### Changes Made - -#### Change #{{changeNumber}} - -**Issue**: {{issueDescription}} -**Solution**: {{solutionDescription}} -**Rationale**: {{changeRationale}} - -**Files Modified**: -{{#modifiedFiles}} - -- {{.}} - {{/modifiedFiles}} - -**Before**: - -```markdown -{{beforeContent}} -``` - -**After**: - -```markdown -{{afterContent}} -``` - -**User Approval**: {{userApproval}} -**Impact**: {{expectedImpact}} - ---- - -{{/improvementLog}} diff --git a/src/modules/bmb/workflows/edit-workflow/templates/validation-results.md b/src/modules/bmb/workflows/edit-workflow/templates/validation-results.md deleted file mode 100644 index 5ca76893..00000000 --- a/src/modules/bmb/workflows/edit-workflow/templates/validation-results.md +++ /dev/null @@ -1,51 +0,0 @@ -## Validation Results - -### Overall Status - -**Result**: {{validationResult}} -**Date**: {{date}} -**Validator**: {{validator}} - -### Validation Categories - -#### File Structure - -- **Status**: {{fileStructureStatus}} -- **Details**: {{fileStructureDetails}} - -#### Configuration - -- **Status**: {{configurationStatus}} -- **Details**: {{configurationDetails}} - -#### Step Compliance - -- **Status**: {{stepComplianceStatus}} -- **Details**: {{stepComplianceDetails}} - -#### Cross-File Consistency - -- **Status**: {{consistencyStatus}} -- **Details**: {{consistencyDetails}} - -#### Best Practices - -- **Status**: {{bestPracticesStatus}} -- **Details**: {{bestPracticesDetails}} - -### Issues Found - -{{#validationIssues}} - -- **{{severity}}**: {{description}} - - **Impact**: {{impact}} - - **Recommendation**: {{recommendation}} - {{/validationIssues}} - -### Validation Summary - -{{validationSummary}} - ---- - -_Validation completed on {{date}}_ diff --git a/src/modules/bmb/workflows/edit-workflow/templates/workflow-analysis.md b/src/modules/bmb/workflows/edit-workflow/templates/workflow-analysis.md deleted file mode 100644 index 1ef52217..00000000 --- a/src/modules/bmb/workflows/edit-workflow/templates/workflow-analysis.md +++ /dev/null @@ -1,56 +0,0 @@ -## Workflow Analysis - -### Target Workflow - -- **Path**: {{workflowPath}} -- **Name**: {{workflowName}} -- **Module**: {{workflowModule}} -- **Format**: {{workflowFormat}} (Standalone/Legacy) - -### Structure Analysis - -- **Type**: {{workflowType}} -- **Total Steps**: {{stepCount}} -- **Step Flow**: {{stepFlowPattern}} -- **Files**: {{fileStructure}} - -### Content Characteristics - -- **Purpose**: {{workflowPurpose}} -- **Instruction Style**: {{instructionStyle}} -- **User Interaction**: {{interactionPattern}} -- **Complexity**: {{complexityLevel}} - -### Initial Assessment - -#### Strengths - -{{#strengths}} - -- {{.}} - {{/strengths}} - -#### Potential Issues - -{{#issues}} - -- {{.}} - {{/issues}} - -#### Format-Specific Notes - -{{#formatNotes}} - -- {{.}} - {{/formatNotes}} - -### Best Practices Compliance - -- **Step File Structure**: {{stepCompliance}} -- **Frontmatter Usage**: {{frontmatterCompliance}} -- **Menu Implementation**: {{menuCompliance}} -- **Variable Consistency**: {{variableCompliance}} - ---- - -_Analysis completed on {{date}}_ diff --git a/src/modules/bmb/workflows/edit-workflow/workflow.md b/src/modules/bmb/workflows/edit-workflow/workflow.md deleted file mode 100644 index 738c3c56..00000000 --- a/src/modules/bmb/workflows/edit-workflow/workflow.md +++ /dev/null @@ -1,59 +0,0 @@ ---- -name: edit-workflow -description: Intelligent workflow editor that helps modify existing workflows while following best practices -web_bundle: true ---- - -# Edit Workflow - -**Goal:** Collaboratively edit and improve existing workflows, ensuring they follow best practices and meet user needs effectively. - -**Your Role:** In addition to your name, communication_style, and persona, you are also a workflow editor and improvement specialist collaborating with a workflow owner. This is a partnership, not a client-vendor relationship. You bring expertise in workflow design patterns, best practices, and collaborative facilitation, while the user brings their workflow context, user feedback, and improvement goals. Work together as equals. - ---- - -## WORKFLOW ARCHITECTURE - -This uses **step-file architecture** for disciplined execution: - -### Core Principles - -- **Micro-file Design**: Each step is a self contained instruction file that is a part of an overall workflow that must be followed exactly -- **Just-In-Time Loading**: Only the current step file is in memory - never load future step files until told to do so -- **Sequential Enforcement**: Sequence within the step files must be completed in order, no skipping or optimization allowed -- **State Tracking**: Document progress in output file frontmatter using `stepsCompleted` array when a workflow produces a document -- **Append-Only Building**: Build documents by appending content as directed to the output file - -### Step Processing Rules - -1. **READ COMPLETELY**: Always read the entire step file before taking any action -2. **FOLLOW SEQUENCE**: Execute all numbered sections in order, never deviate -3. **WAIT FOR INPUT**: If a menu is presented, halt and wait for user selection -4. **CHECK CONTINUATION**: If the step has a menu with Continue as an option, only proceed to next step when user selects 'C' (Continue) -5. **SAVE STATE**: Update `stepsCompleted` in frontmatter before loading next step -6. **LOAD NEXT**: When directed, load, read entire file, then execute the next step file - -### Critical Rules (NO EXCEPTIONS) - -- 🛑 **NEVER** load multiple step files simultaneously -- 📖 **ALWAYS** read entire step file before execution -- 🚫 **NEVER** skip steps or optimize the sequence -- 💾 **ALWAYS** update frontmatter of output files when writing the final output for a specific step -- 🎯 **ALWAYS** follow the exact instructions in the step file -- ⏸️ **ALWAYS** halt at menus and wait for user input -- 📋 **NEVER** create mental todo lists from future steps - ---- - -## INITIALIZATION SEQUENCE - -### 1. Configuration Loading - -Load and read full config from {project-root}/_bmad/bmb/config.yaml and resolve: - -- `project_name`, `output_folder`, `user_name`, `communication_language`, `document_output_language`, `bmb_creations_output_folder` -- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` - -### 2. First Step EXECUTION - -Load, read the full file and then execute `{workflow_path}/steps/step-01-analyze.md` to begin the workflow. diff --git a/src/modules/bmb/workflows/workflow-compliance-check/steps/step-01-validate-goal.md b/src/modules/bmb/workflows/workflow-compliance-check/steps/step-01-validate-goal.md deleted file mode 100644 index b7c55d4a..00000000 --- a/src/modules/bmb/workflows/workflow-compliance-check/steps/step-01-validate-goal.md +++ /dev/null @@ -1,153 +0,0 @@ ---- -name: 'step-01-validate-goal' -description: 'Confirm workflow path and validation goals before proceeding' - -# Path Definitions -workflow_path: '{project-root}/_bmad/bmb/workflows/workflow-compliance-check' - -# File References -thisStepFile: '{workflow_path}/steps/step-01-validate-goal.md' -nextStepFile: '{workflow_path}/steps/step-02-workflow-validation.md' -workflowFile: '{workflow_path}/workflow.md' -complianceReportFile: '{output_folder}/workflow-compliance-report-{workflow_name}.md' - -# Template References -complianceReportTemplate: '{workflow_path}/templates/compliance-report.md' - -# Documentation References -stepTemplate: '{project-root}/_bmad/bmb/docs/workflows/templates/step-template.md' -workflowTemplate: '{project-root}/_bmad/bmb/docs/workflows/templates/workflow-template.md' ---- - -# Step 1: Goal Confirmation and Workflow Target - -## STEP GOAL: - -Confirm the target workflow path and validation objectives before proceeding with systematic compliance analysis. - -## MANDATORY EXECUTION RULES (READ FIRST): - -### Universal Rules: - -- 🛑 NEVER generate content without user input -- 📖 CRITICAL: Read the complete step file before taking any action -- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read -- 📋 YOU ARE A FACILITATOR, not a content generator -- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` - -### Role Reinforcement: - -- ✅ You are a compliance validator and quality assurance specialist -- ✅ If you already have been given a name, communication_style and persona, continue to use those while playing this new role -- ✅ We engage in collaborative dialogue, not command-response -- ✅ You bring compliance expertise and systematic validation skills -- ✅ User brings their workflow and specific compliance concerns - -### Step-Specific Rules: - -- 🎯 Focus only on confirming workflow path and validation scope -- 🚫 FORBIDDEN to proceed without clear target confirmation -- 💬 Approach: Systematic and thorough confirmation of validation objectives -- 📋 Ensure user understands the compliance checking process and scope - -## EXECUTION PROTOCOLS: - -- 🎯 Confirm target workflow path exists and is accessible -- 💾 Establish clear validation objectives and scope -- 📖 Explain the three-phase compliance checking process -- 🚫 FORBIDDEN to proceed without user confirmation of goals - -## CONTEXT BOUNDARIES: - -- Available context: User-provided workflow path and validation concerns -- Focus: Goal confirmation and target validation setup -- Limits: No actual compliance analysis yet, just setup and confirmation -- Dependencies: Clear workflow path and user agreement on validation scope - -## Sequence of Instructions (Do not deviate, skip, or optimize) - -### 1. Workflow Target Confirmation - -Present this to the user: - -"I'll systematically validate your workflow against BMAD standards through three phases: - -1. **Workflow.md Validation** - Against workflow-template.md standards -2. **Step-by-Step Compliance** - Each step against step-template.md -3. **Holistic Analysis** - Flow optimization and goal alignment" - -IF {user_provided_path} has NOT been provided, ask the user: - -**What workflow should I validate?** Please provide the full path to the workflow.md file." - -### 2. Workflow Path Validation - -Once user provides path: - -"Validating workflow path: `{user_provided_path}`" -[Check if path exists and is readable] - -**If valid:** "✅ Workflow found and accessible. Ready to begin compliance analysis." -**If invalid:** "❌ Cannot access workflow at that path. Please check the path and try again." - -### 3. Validation Scope Confirmation - -"**Compliance Scope:** I will check: - -- ✅ Frontmatter structure and required fields -- ✅ Mandatory execution rules and sections -- ✅ Menu patterns and continuation logic -- ✅ Path variable format consistency -- ✅ Template usage appropriateness -- ✅ Workflow flow and goal alignment -- ✅ Meta-workflow failure analysis - -**Report Output:** I'll generate a detailed compliance report with: - -- Severity-ranked violations (Critical/Major/Minor) -- Specific template references for each violation -- Recommended fixes (automated where possible) -- Meta-feedback for create/edit workflow improvements - -**Is this validation scope acceptable?**" - -### 4. Final Confirmation - -"**Ready to proceed with compliance check of:** - -- **Workflow:** `{workflow_name}` -- **Validation:** Full systematic compliance analysis -- **Output:** Detailed compliance report with fix recommendations - -**Select an Option:** [C] Continue [X] Exit" - -## Menu Handling Logic: - -- IF C: Initialize compliance report, update frontmatter, then load, read entire file, then execute {nextStepFile} -- IF X: End workflow gracefully with guidance on running again later -- IF Any other comments or queries: help user respond then [Redisplay Menu Options](#4-final-confirmation) - -## CRITICAL STEP COMPLETION NOTE - -ONLY WHEN [C continue option] is selected and [workflow path validated and scope confirmed], will you then load and read fully `{nextStepFile}` to execute and begin workflow.md validation phase. - ---- - -## 🚨 SYSTEM SUCCESS/FAILURE METRICS - -### ✅ SUCCESS: - -- Workflow path successfully validated and accessible -- User confirms validation scope and objectives -- Compliance report initialization prepared -- User understands the three-phase validation process -- Clear next steps established for systematic analysis - -### ❌ SYSTEM FAILURE: - -- Proceeding without valid workflow path confirmation -- Not ensuring user understands validation scope and process -- Starting compliance analysis without proper setup -- Failing to establish clear reporting objectives - -**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. diff --git a/src/modules/bmb/workflows/workflow-compliance-check/steps/step-02-workflow-validation.md b/src/modules/bmb/workflows/workflow-compliance-check/steps/step-02-workflow-validation.md deleted file mode 100644 index 70d818da..00000000 --- a/src/modules/bmb/workflows/workflow-compliance-check/steps/step-02-workflow-validation.md +++ /dev/null @@ -1,244 +0,0 @@ ---- -name: 'step-02-workflow-validation' -description: 'Validate workflow.md against workflow-template.md standards' - -# Path Definitions -workflow_path: '{project-root}/_bmad/bmb/workflows/workflow-compliance-check' - -# File References -thisStepFile: '{workflow_path}/steps/step-02-workflow-validation.md' -nextStepFile: '{workflow_path}/steps/step-03-step-validation.md' -workflowFile: '{workflow_path}/workflow.md' -complianceReportFile: '{output_folder}/workflow-compliance-report-{workflow_name}.md' -targetWorkflowFile: '{target_workflow_path}' - -# Template References -complianceReportTemplate: '{workflow_path}/templates/compliance-report.md' - -# Documentation References -stepTemplate: '{project-root}/_bmad/bmb/docs/workflows/templates/step-template.md' -workflowTemplate: '{project-root}/_bmad/bmb/docs/workflows/templates/workflow-template.md' ---- - -# Step 2: Workflow.md Validation - -## STEP GOAL: - -Perform adversarial validation of the target workflow.md against workflow-template.md standards, identifying all violations with severity rankings and specific fix recommendations. - -## MANDATORY EXECUTION RULES (READ FIRST): - -### Universal Rules: - -- 🛑 NEVER generate content without user input -- 📖 CRITICAL: Read the complete step file before taking any action -- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read -- 📋 YOU ARE A FACILITATOR, not a content generator -- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` - -### Role Reinforcement: - -- ✅ You are a compliance validator and quality assurance specialist -- ✅ If you already have been given a name, communication_style and persona, continue to use those while playing this new role -- ✅ We engage in collaborative dialogue, not command-response -- ✅ You bring adversarial validation expertise - your success is finding violations -- ✅ User brings their workflow and needs honest, thorough validation - -### Step-Specific Rules: - -- 🎯 Focus only on workflow.md validation against template standards -- 🚫 FORBIDDEN to skip or minimize any validation checks -- 💬 Approach: Systematic, thorough adversarial analysis -- 📋 Document every violation with template reference and severity ranking - -## EXECUTION PROTOCOLS: - -- 🎯 Load and compare target workflow.md against workflow-template.md -- 💾 Document all violations with specific template references -- 📖 Rank violations by severity (Critical/Major/Minor) -- 🚫 FORBIDDEN to overlook any template violations - -## CONTEXT BOUNDARIES: - -- Available context: Validated workflow path and target workflow.md -- Focus: Systematic validation of workflow.md structure and content -- Limits: Only workflow.md validation, not step files yet -- Dependencies: Successful completion of goal confirmation step - -## Sequence of Instructions (Do not deviate, skip, or optimize) - -### 1. Initialize Compliance Report - -"Beginning **Phase 1: Workflow.md Validation** -Target: `{target_workflow_name}` - -**COMPLIANCE STANDARD:** All validation performed against `{workflowTemplate}` - this is THE authoritative standard for workflow.md compliance. - -Loading workflow templates and target files for systematic analysis..." -[Load workflowTemplate, targetWorkflowFile] - -### 2. Frontmatter Structure Validation - -**Check these elements systematically:** - -"**Frontmatter Validation:**" - -- Required fields: name, description, web_bundle -- Proper YAML format and syntax -- Boolean value format for web_bundle -- Missing or invalid fields - -For each violation found: - -- **Template Reference:** Section "Frontmatter Structure" in workflow-template.md -- **Severity:** Critical (missing required) or Major (format issues) -- **Specific Fix:** Exact correction needed - -### 3. Role Description Validation - -**Check role compliance:** - -"**Role Description Validation:**" - -- Follows partnership format: "In addition to your name, communication_style, and persona, you are also a [role] collaborating with [user type]. This is a partnership, not a client-vendor relationship. You bring [your expertise], while the user brings [their expertise]. Work together as equals." -- Role accurately describes workflow function -- User type correctly identified -- Partnership language present - -For violations: - -- **Template Reference:** "Your Role" section in workflow-template.md -- **Severity:** Major (deviation from standard) or Minor (incomplete) -- **Specific Fix:** Exact wording or structure correction - -### 4. Workflow Architecture Validation - -**Validate architecture section:** - -"**Architecture Validation:**" - -- Core Principles section matches template exactly -- Step Processing Rules includes all 6 rules from template -- Critical Rules section matches template exactly (NO EXCEPTIONS) - -For each deviation: - -- **Template Reference:** "WORKFLOW ARCHITECTURE" section in workflow-template.md -- **Severity:** Critical (modified core principles) or Major (missing rules) -- **Specific Fix:** Restore template-compliant text - -### 5. Initialization Sequence Validation - -**Check initialization:** - -"**Initialization Validation:**" - -- Configuration Loading uses correct path format: `{project-root}/_bmad/[module]/config.yaml` (variable substitution pattern) -- First step follows pattern: `step-01-init.md` OR documented deviation -- Required config variables properly listed -- Variables use proper substitution pattern: {project-root}, _bmad, {workflow_path}, etc. - -For violations: - -- **Template Reference:** "INITIALIZATION SEQUENCE" section in workflow-template.md -- **Severity:** Major (incorrect paths or missing variables) or Minor (format issues) -- **Specific Fix:** Use proper variable substitution patterns for flexible installation - -### 6. Document Workflow.md Findings - -"**Workflow.md Validation Complete** -Found [X] Critical, [Y] Major, [Z] Minor violations - -**Summary:** - -- Critical violations must be fixed before workflow can function -- Major violations impact workflow reliability and maintainability -- Minor violations are cosmetic but should follow standards - -**Next Phase:** Step-by-step validation of all step files..." - -### 7. Update Compliance Report - -Append to {complianceReportFile}: - -```markdown -## Phase 1: Workflow.md Validation Results - -### Template Adherence Analysis - -**Reference Standard:** {workflowTemplate} - -### Frontmatter Structure Violations - -[Document each violation with severity and specific fix] - -### Role Description Violations - -[Document each violation with template reference and correction] - -### Workflow Architecture Violations - -[Document each deviation from template standards] - -### Initialization Sequence Violations - -[Document each path or reference issue] - -### Phase 1 Summary - -**Critical Issues:** [number] -**Major Issues:** [number] -**Minor Issues:** [number] - -### Phase 1 Recommendations - -[Prioritized fix recommendations with specific actions] -``` - -### 8. Continuation Confirmation - -"**Phase 1 Complete:** Workflow.md validation finished with detailed violation analysis. - -**Ready for Phase 3:** Step-by-step validation against step-template.md - -This will check each step file for: - -- Frontmatter completeness and format -- MANDATORY EXECUTION RULES compliance -- Menu pattern and continuation logic -- Path variable consistency -- Template appropriateness - -**Select an Option:** [C] Continue to Step Validation [X] Exit" - -## Menu Handling Logic: - -- IF C: Save workflow.md findings to report, update frontmatter, then load, read entire file, then execute {nextStepFile} -- IF X: Save current findings and end workflow with guidance for resuming -- IF Any other comments or queries: respond and redisplay menu - -## CRITICAL STEP COMPLETION NOTE - -ONLY WHEN [C continue option] is selected and [workflow.md validation complete with all violations documented], will you then load and read fully `{nextStepFile}` to execute and begin step-by-step validation phase. - ---- - -## 🚨 SYSTEM SUCCESS/FAILURE METRICS - -### ✅ SUCCESS: - -- Complete workflow.md validation against workflow-template.md -- All violations documented with severity rankings and template references -- Specific fix recommendations provided for each violation -- Compliance report updated with Phase 1 findings -- User confirms understanding before proceeding - -### ❌ SYSTEM FAILURE: - -- Skipping any workflow.md validation sections -- Not documenting violations with specific template references -- Failing to rank violations by severity -- Providing vague or incomplete fix recommendations -- Proceeding without user confirmation of findings - -**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. diff --git a/src/modules/bmb/workflows/workflow-compliance-check/steps/step-03-step-validation.md b/src/modules/bmb/workflows/workflow-compliance-check/steps/step-03-step-validation.md deleted file mode 100644 index 5d601a7b..00000000 --- a/src/modules/bmb/workflows/workflow-compliance-check/steps/step-03-step-validation.md +++ /dev/null @@ -1,275 +0,0 @@ ---- -name: 'step-03-step-validation' -description: 'Validate each step file against step-template.md standards' - -# Path Definitions -workflow_path: '{project-root}/_bmad/bmb/workflows/workflow-compliance-check' - -# File References -thisStepFile: '{workflow_path}/steps/step-03-step-validation.md' -nextStepFile: '{workflow_path}/steps/step-04-file-validation.md' -workflowFile: '{workflow_path}/workflow.md' -complianceReportFile: '{output_folder}/workflow-compliance-report-{workflow_name}.md' -targetWorkflowStepsPath: '{target_workflow_steps_path}' - -# Template References -complianceReportTemplate: '{workflow_path}/templates/compliance-report.md' - -# Documentation References -stepTemplate: '{project-root}/_bmad/bmb/docs/workflows/templates/step-template.md' -workflowTemplate: '{project-root}/_bmad/bmb/docs/workflows/templates/workflow-template.md' ---- - -# Step 3: Step-by-Step Validation - -## STEP GOAL: - -Perform systematic adversarial validation of each step file against step-template.md standards, documenting all violations with specific template references and severity rankings. - -## MANDATORY EXECUTION RULES (READ FIRST): - -### Universal Rules: - -- 🛑 NEVER generate content without user input -- 📖 CRITICAL: Read this complete step file before taking any action -- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read -- 📋 YOU ARE A FACILITATOR, not a content generator -- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` - -### Role Reinforcement: - -- ✅ You are a compliance validator and quality assurance specialist -- ✅ If you already have been given a name, communication_style and persona, continue to use those while playing this new role -- ✅ We engage in collaborative dialogue, not command-response -- ✅ You bring adversarial step-by-step validation expertise -- ✅ User brings their workflow steps and needs thorough validation - -### Step-Specific Rules: - -- 🎯 Focus only on step file validation against step-template.md -- 🚫 FORBIDDEN to skip any step files or validation checks -- 💬 Approach: Systematic file-by-file adversarial analysis -- 📋 Document every violation against each step file with template reference and specific proposed fixes - -## EXECUTION PROTOCOLS: - -- 🎯 Load and validate each step file individually against step-template.md -- 💾 Document violations by file with severity rankings -- 📖 Check for appropriate template usage based on workflow type -- 🚫 FORBIDDEN to overlook any step file or template requirement - -## CONTEXT BOUNDARIES: - -- Available context: Target workflow step files and step-template.md -- Focus: Systematic validation of all step files against template standards -- Limits: Only step file validation, holistic analysis comes next -- Dependencies: Completed workflow.md validation from previous phase - -## Sequence of Instructions (Do not deviate, skip, or optimize) - -### 1. Initialize Step Validation Phase - -"Beginning **Phase 2: Step-by-Step Validation** -Target: `{target_workflow_name}` - [number] step files found - -**COMPLIANCE STANDARD:** All validation performed against `{stepTemplate}` - this is THE authoritative standard for step file compliance. - -Loading step template and validating each step systematically..." -[Load stepTemplate, enumerate all step files]. Utilize sub processes if available but ensure all rules are passed in and all findings are returned from the sub process to collect and record the results. - -### 2. Systematic Step File Analysis - -For each step file in order: - -"**Validating step:** `{step_filename}`" - -**A. Frontmatter Structure Validation:** -Check each required field: - -```yaml ---- -name: 'step-[number]-[name]' # Single quotes, proper format -description: '[description]' # Single quotes -workflowFile: '{workflow_path}/workflow.md' # REQUIRED - often missing -outputFile: [if appropriate for workflow type] -# All other path references and variables -# Template References section (even if empty) -# Task References section ---- -``` - -**Violations to document:** - -- Missing `workflowFile` reference (Critical) -- Incorrect YAML format (missing quotes, etc.) (Major) -- Inappropriate `outputFile` for workflow type (Major) -- Missing `Template References` section (Major) - -**B. MANDATORY EXECUTION RULES Validation:** -Check for complete sections: - -```markdown -## MANDATORY EXECUTION RULES (READ FIRST): - -### Universal Rules: - -- 🛑 NEVER generate content without user input -- 📖 CRITICAL: Read the complete step file before taking any action -- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read -- 📋 YOU ARE A FACILITATOR, not a content generator - -### Role Reinforcement: - -[Complete role reinforcement section] - -### Step-Specific Rules: - -[Step-specific rules with proper emoji usage] -``` - -**Violations to document:** - -- Missing Universal Rules (Critical) -- Modified/skipped Universal Rules (Critical) -- Missing Role Reinforcement (Major) -- Improper emoji usage in rules (Minor) - -**C. Task References Validation:** -Check for proper references: - -```yaml -# Task References -advancedElicitationTask: '{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml' -partyModeWorkflow: '{project-root}/_bmad/core/workflows/party-mode/workflow.md' -``` - -**Violations to document:** - -- Missing Task References section (Major) -- Incorrect paths in task references (Major) -- Missing standard task references (Minor) - -**D. Menu Pattern Validation:** -Check menu structure: - -```markdown -Display: "**Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Continue" - -#### Menu Handling Logic: - -- IF A: Execute {advancedElicitationTask} -- IF P: Execute {partyModeWorkflow} -- IF C: Save content to {outputFile}, update frontmatter, then only then load, read entire file, then execute {nextStepFile} -``` - -**Violations to document:** - -- Non-standard menu format (Major) -- Missing Menu Handling Logic section (Major) -- Incorrect "load, read entire file, then execute" pattern (Major) -- Improper continuation logic (Critical) - -### 3. Workflow Type Appropriateness Check - -"**Template Usage Analysis:**" - -- **Document Creation Workflows:** Should have outputFile references, templates -- **Editing Workflows:** Should NOT create unnecessary outputs, direct action focus -- **Validation/Analysis Workflows:** Should emphasize systematic checking - -For each step: - -- **Type Match:** Does step content match workflow type expectations? -- **Template Appropriate:** Are templates/outputs appropriate for this workflow type? -- **Alternative Suggestion:** What would be more appropriate? - -### 4. Path Variable Consistency Check - -"**Path Variable Validation:**" - -- Check format: `{project-root}/_bmad/bmb/...` vs `{project-root}/bmb/...` -- Ensure consistent variable usage across all step files -- Validate relative vs absolute path usage - -Document inconsistencies and standard format requirements. - -### 5. Document Step Validation Results - -For each step file with violations: - -```markdown -### Step Validation: step-[number]-[name].md - -**Critical Violations:** - -- [Violation] - Template Reference: [section] - Fix: [specific action] - -**Major Violations:** - -- [Violation] - Template Reference: [section] - Fix: [specific action] - -**Minor Violations:** - -- [Violation] - Template Reference: [section] - Fix: [specific action] - -**Workflow Type Assessment:** - -- Appropriate: [Yes/No] - Reason: [analysis] -- Recommended Changes: [specific suggestions] -``` - -### 6. Phase Summary and Continuation - -"**Phase 2 Complete:** Step-by-step validation finished - -- **Total Steps Analyzed:** [number] -- **Critical Violations:** [number] across [number] steps -- **Major Violations:** [number] across [number] steps -- **Minor Violations:** [number] across [number] steps - -**Most Common Violations:** - -1. [Most frequent violation type] -2. [Second most frequent] -3. [Third most frequent] - -**Ready for Phase 4:** File Validation workflow analysis - -- Flow optimization assessment -- Goal alignment verification -- Meta-workflow failure analysis - -**Select an Option:** [C] Continue to File Validation [X] Exit" - -## Menu Handling Logic: - -- IF C: Save step validation findings to report, update frontmatter, then load, read entire file, then execute {nextStepFile} -- IF X: Save current findings and end with guidance for resuming -- IF Any other comments or queries: respond and redisplay menu - -## CRITICAL STEP COMPLETION NOTE - -ONLY WHEN [C continue option] is selected and [all step files validated with violations documented], will you then load and read fully `{nextStepFile}` to execute and begin holistic analysis phase. - ---- - -## 🚨 SYSTEM SUCCESS/FAILURE METRICS - -### ✅ SUCCESS: - -- All step files systematically validated against step-template.md -- Every violation documented with specific template reference and severity -- Workflow type appropriateness assessed for each step -- Path variable consistency checked across all files -- Common violation patterns identified and prioritized -- Compliance report updated with complete Phase 2 findings - -### ❌ SYSTEM FAILURE: - -- Skipping step files or validation sections -- Not documenting violations with specific template references -- Failing to assess workflow type appropriateness -- Missing path variable consistency analysis -- Providing incomplete or vague fix recommendations - -**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. diff --git a/src/modules/bmb/workflows/workflow-compliance-check/steps/step-04-file-validation.md b/src/modules/bmb/workflows/workflow-compliance-check/steps/step-04-file-validation.md deleted file mode 100644 index 26505b47..00000000 --- a/src/modules/bmb/workflows/workflow-compliance-check/steps/step-04-file-validation.md +++ /dev/null @@ -1,296 +0,0 @@ ---- -name: 'step-04-file-validation' -description: 'Validate file sizes, markdown formatting, and CSV data files' - -# Path Definitions -workflow_path: '{project-root}/_bmad/bmb/workflows/workflow-compliance-check' - -# File References -thisStepFile: '{workflow_path}/steps/step-04-file-validation.md' -nextStepFile: '{workflow_path}/steps/step-05-intent-spectrum-validation.md' -workflowFile: '{workflow_path}/workflow.md' -complianceReportFile: '{output_folder}/workflow-compliance-report-{workflow_name}.md' -targetWorkflowPath: '{target_workflow_path}' - -# Template References -complianceReportTemplate: '{workflow_path}/templates/compliance-report.md' - -# Documentation References -stepTemplate: '{project-root}/_bmad/bmb/docs/workflows/templates/step-template.md' -workflowTemplate: '{project-root}/_bmad/bmb/docs/workflows/templates/workflow-template.md' -csvStandards: '{project-root}/_bmad/bmb/docs/workflows/csv-data-file-standards.md' ---- - -# Step 4: File Size, Formatting, and Data Validation - -## STEP GOAL: - -Validate file sizes, markdown formatting standards, and CSV data file compliance to ensure optimal workflow performance and maintainability. - -## MANDATORY EXECUTION RULES (READ FIRST): - -### Universal Rules: - -- 🛑 NEVER generate content without user input -- 📖 CRITICAL: Read the complete step file before taking any action -- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read -- 📋 YOU ARE A FACILITATOR, not a content generator -- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` - -### Role Reinforcement: - -- ✅ You are a compliance validator and quality assurance specialist -- ✅ If you already have been given a name, communication_style, and persona, continue to use those while playing this new role -- ✅ We engage in collaborative dialogue, not command-response -- ✅ You bring file optimization and formatting validation expertise -- ✅ User brings their workflow files and needs performance optimization - -### Step-Specific Rules: - -- 🎯 Focus on file sizes, markdown formatting, and CSV validation -- 🚫 FORBIDDEN to skip file size analysis or CSV validation when present -- 💬 Approach: Systematic file analysis with optimization recommendations -- 📋 Ensure all findings include specific recommendations for improvement - -## EXECUTION PROTOCOLS: - -- 🎯 Validate file sizes against optimal ranges (≤5K best, 5-7K good, 7-10K acceptable, 10-12K concern, >15K action required) -- 💾 Check markdown formatting standards and conventions -- 📖 Validate CSV files against csv-data-file-standards.md when present -- 🚫 FORBIDDEN to overlook file optimization opportunities - -## CONTEXT BOUNDARIES: - -- Available context: Target workflow files and their sizes/formats -- Focus: File optimization, formatting standards, and CSV data validation -- Limits: File analysis only, holistic workflow analysis comes next -- Dependencies: Completed step-by-step validation from previous phase - -## Sequence of Instructions (Do not deviate, skip, or optimize) - -### 1. Initialize File Validation Phase - -"Beginning **File Size, Formatting, and Data Validation** -Target: `{target_workflow_name}` - -Analyzing workflow files for: - -- File size optimization (smaller is better for performance) -- Markdown formatting standards compliance -- CSV data file standards validation (if present) -- Overall file maintainability and performance..." - -### 2. File Size Analysis - -**A. Step File Size Validation:** -For each step file: - -"**File Size Analysis:** `{step_filename}`" - -- **Size:** [file size in KB] -- **Optimization Rating:** [Optimal/Good/Acceptable/Concern/Action Required] -- **Performance Impact:** [Minimal/Moderate/Significant/Severe] - -**Size Ratings:** - -- **≤ 5K:** ✅ Optimal - Excellent performance and maintainability -- **5K-7K:** ✅ Good - Good balance of content and performance -- **7K-10K:** ⚠️ Acceptable - Consider content optimization -- **10K-12K:** ⚠️ Concern - Content should be consolidated or split -- **> 15K:** ❌ Action Required - File must be optimized (split content, remove redundancy) - -**Document optimization opportunities:** - -- Content that could be moved to templates -- Redundant explanations or examples -- Overly detailed instructions that could be condensed -- Opportunities to use references instead of inline content - -### 3. Markdown Formatting Validation - -**A. Heading Structure Analysis:** -"**Markdown Formatting Analysis:**" - -For each file: - -- **Heading Hierarchy:** Proper H1 → H2 → H3 structure -- **Consistent Formatting:** Consistent use of bold, italics, lists -- **Code Blocks:** Proper markdown code block formatting -- **Link References:** Valid internal and external links -- **Table Formatting:** Proper table structure when used - -**Common formatting issues to document:** - -- Missing blank lines around headings -- Inconsistent list formatting (numbered vs bullet) -- Improper code block language specifications -- Broken or invalid markdown links -- Inconsistent heading levels or skipping levels - -### 4. CSV Data File Validation (if present) - -**A. Identify CSV Files:** -"**CSV Data File Analysis:**" -Check for CSV files in workflow directory: - -- Look for `.csv` files in main directory -- Check for `data/` subdirectory containing CSV files -- Identify any CSV references in workflow configuration - -**B. Validate Against Standards:** -For each CSV file found, validate against `{csvStandards}`: - -**Purpose Validation:** - -- Does CSV contain essential data that LLMs cannot generate or web-search? -- Is all CSV data referenced and used in the workflow? -- Is data domain-specific and valuable? -- Does CSV optimize context usage (knowledge base indexing, workflow routing, method selection)? -- Does CSV reduce workflow complexity or step count significantly? -- Does CSV enable dynamic technique selection or smart resource routing? - -**Structural Validation:** - -- Valid CSV format with proper quoting -- Consistent column counts across all rows -- No missing data or properly marked empty values -- Clear, descriptive header row -- Proper UTF-8 encoding - -**Content Validation:** - -- No LLM-generated content (generic phrases, common knowledge) -- Specific, concrete data entries -- Consistent data formatting -- Verifiable and factual data - -**Column Standards:** - -- Clear, descriptive column headers -- Consistent data types per column -- All columns referenced in workflow -- Appropriate column width and focus - -**File Size and Performance:** - -- Efficient structure under 1MB when possible -- No redundant or duplicate rows -- Optimized data representation -- Fast loading characteristics - -**Documentation Standards:** - -- Purpose and usage documentation present -- Column descriptions and format specifications -- Data source documentation -- Update procedures documented - -### 5. File Validation Reporting - -For each file with issues: - -```markdown -### File Validation: {filename} - -**File Size Analysis:** - -- Size: {size}KB - Rating: {Optimal/Good/Concern/etc.} -- Performance Impact: {assessment} -- Optimization Recommendations: {specific suggestions} - -**Markdown Formatting:** - -- Heading Structure: {compliant/issues found} -- Common Issues: {list of formatting problems} -- Fix Recommendations: {specific corrections} - -**CSV Data Validation:** - -- Purpose Validation: {compliant/needs review} -- Structural Issues: {list of problems} -- Content Standards: {compliant/violations} -- Recommendations: {improvement suggestions} -``` - -### 6. Aggregate File Analysis Summary - -"**File Validation Summary:** - -**File Size Distribution:** - -- Optimal (≤5K): [number] files -- Good (5K-7K): [number] files -- Acceptable (7K-10K): [number] files -- Concern (10K-12K): [number] files -- Action Required (>15K): [number] files - -**Markdown Formatting Issues:** - -- Heading Structure: [number] files with issues -- List Formatting: [number] files with inconsistencies -- Code Blocks: [number] files with formatting problems -- Link References: [number] broken or invalid links - -**CSV Data Files:** - -- Total CSV files: [number] -- Compliant with standards: [number] -- Require attention: [number] -- Critical issues: [number] - -**Performance Impact Assessment:** - -- Overall workflow performance: [Excellent/Good/Acceptable/Concern/Poor] -- Most critical file size issue: {file and size} -- Primary formatting concerns: {main issues}" - -### 7. Continuation Confirmation - -"**File Validation Complete:** Size, formatting, and CSV analysis finished - -**Key Findings:** - -- **File Optimization:** [summary of size optimization opportunities] -- **Formatting Standards:** [summary of markdown compliance issues] -- **Data Validation:** [summary of CSV standards compliance] - -**Ready for Phase 5:** Intent Spectrum Validation analysis - -- Flow validation and goal alignment -- Meta-workflow failure analysis -- Strategic recommendations and improvement planning - -**Select an Option:** [C] Continue to Intent Spectrum Validation [X] Exit" - -## Menu Handling Logic: - -- IF C: Save file validation findings to report, update frontmatter, then load, read entire file, then execute {nextStepFile} -- IF X: Save current findings and end with guidance for resuming -- IF Any other comments or queries: respond and redisplay menu - -## CRITICAL STEP COMPLETION NOTE - -ONLY WHEN [C continue option] is selected and [all file sizes analyzed, markdown formatting validated, and CSV files checked against standards], will you then load and read fully `{nextStepFile}` to execute and begin Intent Spectrum Validation phase. - ---- - -## 🚨 SYSTEM SUCCESS/FAILURE METRICS - -### ✅ SUCCESS: - -- All workflow files analyzed for optimal size ranges with specific recommendations -- Markdown formatting validated against standards with identified issues -- CSV data files validated against csv-data-file-standards.md when present -- Performance impact assessed with optimization opportunities identified -- File validation findings documented with specific fix recommendations -- User ready for holistic workflow analysis - -### ❌ SYSTEM FAILURE: - -- Skipping file size analysis or markdown formatting validation -- Not checking CSV files against standards when present -- Failing to provide specific optimization recommendations -- Missing performance impact assessment -- Overlooking critical file size violations (>15K) - -**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. diff --git a/src/modules/bmb/workflows/workflow-compliance-check/steps/step-05-intent-spectrum-validation.md b/src/modules/bmb/workflows/workflow-compliance-check/steps/step-05-intent-spectrum-validation.md deleted file mode 100644 index 08992f90..00000000 --- a/src/modules/bmb/workflows/workflow-compliance-check/steps/step-05-intent-spectrum-validation.md +++ /dev/null @@ -1,265 +0,0 @@ ---- -name: 'step-05-intent-spectrum-validation' -description: 'Dedicated analysis and validation of intent vs prescriptive spectrum positioning' - -# Path Definitions -workflow_path: '{project-root}/_bmad/bmb/workflows/workflow-compliance-check' - -# File References -thisStepFile: '{workflow_path}/steps/step-05-intent-spectrum-validation.md' -nextStepFile: '{workflow_path}/steps/step-06-web-subprocess-validation.md' -workflowFile: '{workflow_path}/workflow.md' -complianceReportFile: '{output_folder}/workflow-compliance-report-{workflow_name}.md' -targetWorkflowPath: '{target_workflow_path}' - -# Template References -complianceReportTemplate: '{workflow_path}/templates/compliance-report.md' - -# Documentation References -stepTemplate: '{project-root}/_bmad/bmb/docs/workflows/templates/step-template.md' -workflowTemplate: '{project-root}/_bmad/bmb/docs/workflows/templates/workflow-template.md' -intentSpectrum: '{project-root}/_bmad/bmb/docs/workflows/intent-vs-prescriptive-spectrum.md' ---- - -# Step 5: Intent vs Prescriptive Spectrum Validation - -## STEP GOAL: - -Analyze the workflow's position on the intent vs prescriptive spectrum, provide expert assessment, and confirm with user whether the current positioning is appropriate or needs adjustment. - -## MANDATORY EXECUTION RULES (READ FIRST): - -### Universal Rules: - -- 🛑 NEVER generate content without user input -- 📖 CRITICAL: Read the complete step file before taking any action -- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read -- 📋 YOU ARE A FACILITATOR, not a content generator -- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` - -### Role Reinforcement: - -- ✅ You are a compliance validator and design philosophy specialist -- ✅ If you already have been given a name, communication_style, and persona, continue to use those while playing this new role -- ✅ We engage in collaborative dialogue, not command-response -- ✅ You bring expertise in intent vs prescriptive design principles -- ✅ User brings their workflow and needs guidance on spectrum positioning - -### Step-Specific Rules: - -- 🎯 Focus only on spectrum analysis and user confirmation -- 🚫 FORBIDDEN to make spectrum decisions without user input -- 💬 Approach: Educational, analytical, and collaborative -- 📋 Ensure user understands spectrum implications before confirming - -## EXECUTION PROTOCOLS: - -- 🎯 Analyze workflow's current spectrum position based on all previous findings -- 💾 Provide expert assessment with specific examples and reasoning -- 📖 Educate user on spectrum implications for their workflow type -- 🚫 FORBIDDEN to proceed without user confirmation of spectrum position - -## CONTEXT BOUNDARIES: - -- Available context: Complete analysis from workflow, step, and file validation phases -- Focus: Intent vs prescriptive spectrum analysis and user confirmation -- Limits: Spectrum analysis only, holistic workflow analysis comes next -- Dependencies: Successful completion of file size and formatting validation - -## Sequence of Instructions (Do not deviate, skip, or optimize) - -### 1. Initialize Spectrum Analysis - -"Beginning **Intent vs Prescriptive Spectrum Validation** -Target: `{target_workflow_name}` - -**Reference Standard:** Analysis based on `{intentSpectrum}` - -This step will help ensure your workflow's approach to LLM guidance is intentional and appropriate for its purpose..." - -### 2. Spectrum Position Analysis - -**A. Current Position Assessment:** -Based on analysis of workflow.md, all step files, and implementation patterns: - -"**Current Spectrum Analysis:** -Based on my review of your workflow, I assess its current position as: - -**[Highly Intent-Based / Balanced Middle / Highly Prescriptive]**" - -**B. Evidence-Based Reasoning:** -Provide specific evidence from the workflow analysis: - -"**Assessment Evidence:** - -- **Instruction Style:** [Examples of intent-based vs prescriptive instructions found] -- **User Interaction:** [How user conversations are structured] -- **LLM Freedom:** [Level of creative adaptation allowed] -- **Consistency Needs:** [Workflow requirements for consistency vs creativity] -- **Risk Factors:** [Any compliance, safety, or regulatory considerations]" - -**C. Workflow Type Analysis:** -"**Workflow Type Analysis:** - -- **Primary Purpose:** {workflow's main goal} -- **User Expectations:** {What users likely expect from this workflow} -- **Success Factors:** {What makes this workflow successful} -- **Risk Level:** {Compliance, safety, or risk considerations}" - -### 3. Recommended Spectrum Position - -**A. Expert Recommendation:** -"**My Professional Recommendation:** -Based on the workflow's purpose, user needs, and implementation, I recommend positioning this workflow as: - -**[Highly Intent-Based / Balanced Middle / Highly Prescriptive]**" - -**B. Recommendation Rationale:** -"**Reasoning for Recommendation:** - -- **Purpose Alignment:** {Why this position best serves the workflow's goals} -- **User Experience:** {How this positioning enhances user interaction} -- **Risk Management:** {How this position addresses any compliance or safety needs} -- **Success Optimization:** {Why this approach will lead to better outcomes}" - -**C. Specific Examples:** -Provide concrete examples of how the recommended position would look: - -"**Examples at Recommended Position:** -**Intent-Based Example:** "Help users discover their creative potential through..." -**Prescriptive Example:** "Ask exactly: 'Have you experienced any of the following...'" - -**Current State Comparison:** -**Current Instructions Found:** [Examples from actual workflow] -**Recommended Instructions:** [How they could be improved]" - -### 4. Spectrum Education and Implications - -**A. Explain Spectrum Implications:** -"**Understanding Your Spectrum Choice:** - -**If Intent-Based:** Your workflow will be more creative, adaptive, and personalized. Users will have unique experiences, but interactions will be less predictable. - -**If Prescriptive:** Your workflow will be consistent, controlled, and predictable. Every user will have similar experiences, which is ideal for compliance or standardization. - -**If Balanced:** Your workflow will provide professional expertise with some adaptation, offering consistent quality with personalized application." - -**B. Context-Specific Guidance:** -"**For Your Specific Workflow Type:** -{Provide tailored guidance based on whether it's creative, professional, compliance, technical, etc.}" - -### 5. User Confirmation and Decision - -**A. Present Findings and Recommendation:** -"**Spectrum Analysis Summary:** - -**Current Assessment:** [Current position with confidence level] -**Expert Recommendation:** [Recommended position with reasoning] -**Key Considerations:** [Main factors to consider] - -**My Analysis Indicates:** [Brief summary of why I recommend this position] - -**The Decision is Yours:** While I provide expert guidance, the final spectrum position should reflect your vision for the workflow." - -**B. User Choice Confirmation:** -"**Where would you like to position this workflow on the Intent vs Prescriptive Spectrum?** - -**Options:** - -1. **Keep Current Position** - [Current position] - Stay with current approach -2. **Move to Recommended** - [Recommended position] - Adopt my expert recommendation -3. **Move Toward Intent-Based** - Increase creative freedom and adaptation -4. **Move Toward Prescriptive** - Increase consistency and control -5. **Custom Position** - Specify your preferred approach - -**Please select your preferred spectrum position (1-5):**" - -### 6. Document Spectrum Decision - -**A. Record User Decision:** -"**Spectrum Position Decision:** -**User Choice:** [Selected option] -**Final Position:** [Confirmed spectrum position] -**Rationale:** [User's reasoning, if provided] -**Implementation Notes:** [What this means for workflow design]" - -**B. Update Compliance Report:** -Append to {complianceReportFile}: - -```markdown -## Intent vs Prescriptive Spectrum Analysis - -### Current Position Assessment - -**Analyzed Position:** [Current spectrum position] -**Evidence:** [Specific examples from workflow analysis] -**Confidence Level:** [High/Medium/Low based on clarity of patterns] - -### Expert Recommendation - -**Recommended Position:** [Professional recommendation] -**Reasoning:** [Detailed rationale for recommendation] -**Workflow Type Considerations:** [Specific to this workflow's purpose] - -### User Decision - -**Selected Position:** [User's confirmed choice] -**Rationale:** [User's reasoning or preferences] -**Implementation Guidance:** [What this means for workflow] - -### Spectrum Validation Results - -✅ Spectrum position is intentional and understood -✅ User educated on implications of their choice -✅ Implementation guidance provided for final position -✅ Decision documented for future reference -``` - -### 7. Continuation Confirmation - -"**Spectrum Validation Complete:** - -- **Final Position:** [Confirmed spectrum position] -- **User Understanding:** Confirmed implications and benefits -- **Implementation Ready:** Guidance provided for maintaining position - -**Ready for Phase 6:** Web Subprocess Validation analysis - -- Flow validation and completion paths -- Goal alignment and optimization assessment -- Meta-workflow failure analysis and improvement recommendations - -**Select an Option:** [C] Continue to Web Subprocess Validation [X] Exit" - -## Menu Handling Logic: - -- IF C: Save spectrum decision to report, update frontmatter, then load, read entire file, then execute {nextStepFile} -- IF X: Save current spectrum findings and end with guidance for resuming -- IF Any other comments or queries: respond and redisplay menu - -## CRITICAL STEP COMPLETION NOTE - -ONLY WHEN [C continue option] is selected and [spectrum position confirmed with user understanding], will you then load and read fully `{nextStepFile}` to execute and begin Web Subprocess Validation phase. - ---- - -## 🚨 SYSTEM SUCCESS/FAILURE METRICS - -### ✅ SUCCESS: - -- Comprehensive spectrum position analysis with evidence-based reasoning -- Expert recommendation provided with specific rationale and examples -- User educated on spectrum implications for their workflow type -- User makes informed decision about spectrum positioning -- Spectrum decision documented with implementation guidance -- User understands benefits and trade-offs of their choice - -### ❌ SYSTEM FAILURE: - -- Making spectrum recommendations without analyzing actual workflow content -- Not providing evidence-based reasoning for assessment -- Failing to educate user on spectrum implications -- Proceeding without user confirmation of spectrum position -- Not documenting user decision for future reference - -**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. diff --git a/src/modules/bmb/workflows/workflow-compliance-check/steps/step-06-web-subprocess-validation.md b/src/modules/bmb/workflows/workflow-compliance-check/steps/step-06-web-subprocess-validation.md deleted file mode 100644 index c9b84af5..00000000 --- a/src/modules/bmb/workflows/workflow-compliance-check/steps/step-06-web-subprocess-validation.md +++ /dev/null @@ -1,361 +0,0 @@ ---- -name: 'step-06-web-subprocess-validation' -description: 'Analyze web search utilization and subprocess optimization opportunities across workflow steps' - -# Path Definitions -workflow_path: '{project-root}/_bmad/bmb/workflows/workflow-compliance-check' - -# File References -thisStepFile: '{workflow_path}/steps/step-06-web-subprocess-validation.md' -nextStepFile: '{workflow_path}/steps/step-07-holistic-analysis.md' -workflowFile: '{workflow_path}/workflow.md' -complianceReportFile: '{output_folder}/workflow-compliance-report-{workflow_name}.md' -targetWorkflowStepsPath: '{target_workflow_steps_path}' - -# Template References -complianceReportTemplate: '{workflow_path}/templates/compliance-report.md' - -# Documentation References -stepTemplate: '{project-root}/_bmad/bmb/docs/workflows/templates/step-template.md' -workflowTemplate: '{project-root}/_bmad/bmb/docs/workflows/templates/workflow-template.md' -intentSpectrum: '{project-root}/_bmad/bmb/docs/workflows/intent-vs-prescriptive-spectrum.md' ---- - -# Step 6: Web Search & Subprocess Optimization Analysis - -## STEP GOAL: - -Analyze each workflow step for optimal web search utilization and subprocess usage patterns, ensuring LLM resources are used efficiently while avoiding unnecessary searches or processing delays. - -## MANDATORY EXECUTION RULES (READ FIRST): - -### Universal Rules: - -- 🛑 NEVER generate content without user input -- 📖 CRITICAL: Read the complete step file before taking any action -- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read -- 📋 YOU ARE A FACILITATOR, not a content generator -- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` - -### Role Reinforcement: - -- ✅ You are a performance optimization specialist and resource efficiency analyst -- ✅ If you already have been given a name, communication_style, and persona, continue to use those while playing this new role -- ✅ We engage in collaborative dialogue, not command-response -- ✅ You bring expertise in LLM optimization, web search strategy, and subprocess utilization -- ✅ User brings their workflow and needs efficiency recommendations - -### Step-Specific Rules: - -- 🎯 Focus only on web search necessity and subprocess optimization opportunities -- 🚫 FORBIDDEN to recommend web searches when LLM knowledge is sufficient -- 💬 Approach: Analytical and optimization-focused with clear efficiency rationale -- 📋 Use subprocesses when analyzing multiple steps to improve efficiency - -## EXECUTION PROTOCOLS: - -- 🎯 Analyze each step for web search appropriateness vs. LLM knowledge sufficiency -- 💾 Identify subprocess optimization opportunities for parallel processing -- 📖 Use subprocesses/subagents when analyzing multiple steps for efficiency -- 🚫 FORBIDDEN to overlook inefficiencies or recommend unnecessary searches - -## CONTEXT BOUNDARIES: - -- Available context: All workflow step files and subprocess availability -- Focus: Web search optimization and subprocess utilization analysis -- Limits: Resource optimization analysis only, holistic workflow analysis comes next -- Dependencies: Completed Intent Spectrum validation from previous phase - -## Sequence of Instructions (Do not deviate, skip, or optimize) - -### 1. Initialize Web Search & Subprocess Analysis - -"Beginning **Phase 5: Web Search & Subprocess Optimization Analysis** -Target: `{target_workflow_name}` - -Analyzing each workflow step for: - -- Appropriate web search utilization vs. unnecessary searches -- Subprocess optimization opportunities for efficiency -- LLM resource optimization patterns -- Performance bottlenecks and speed improvements - -**Note:** Using subprocess analysis for efficient multi-step evaluation..." - -### 2. Web Search Necessity Analysis - -**A. Intelligent Search Assessment Criteria:** - -For each step, analyze web search appropriateness using these criteria: - -"**Web Search Appropriateness Analysis:** - -- **Knowledge Currency:** Is recent/real-time information required? -- **Specific Data Needs:** Are there specific facts/data not in LLM training? -- **Verification Requirements:** Does the task require current verification? -- **LLM Knowledge Sufficiency:** Can LLM adequately handle with existing knowledge? -- **Search Cost vs. Benefit:** Is search time worth the information gain?" - -**B. Step-by-Step Web Search Analysis:** - -Using subprocess for parallel analysis of multiple steps: - -"**Analyzing [number] steps for web search optimization...**" - -For each step file: - -```markdown -**Step:** {step_filename} - -**Current Web Search Usage:** - -- [Explicit web search instructions found] -- [Search frequency and scope] -- [Search-specific topics/queries] - -**Intelligent Assessment:** - -- **Appropriate Searches:** [Searches that are truly necessary] -- **Unnecessary Searches:** [Searches LLM could handle internally] -- **Optimization Opportunities:** [How to improve search efficiency] - -**Recommendations:** - -- **Keep:** [Essential web searches] -- **Remove:** [Unnecessary searches that waste time] -- **Optimize:** [Searches that could be more focused/efficient] -``` - -### 3. Subprocess & Parallel Processing Analysis - -**A. Subprocess Opportunity Identification:** - -"**Subprocess Optimization Analysis:** -Looking for opportunities where multiple steps or analyses can run simultaneously..." - -**Analysis Categories:** - -- **Parallel Step Execution:** Can any steps run simultaneously? -- **Multi-faceted Analysis:** Can single step analyses be broken into parallel sub-tasks? -- **Batch Processing:** Can similar operations be grouped for efficiency? -- **Background Processing:** Can any analyses run while user interacts? - -**B. Implementation Patterns:** - -```markdown -**Subprocess Implementation Opportunities:** - -**Multi-Step Validation:** -"Use subprocesses when checking 6+ validation items - just need results back" - -- Current: Sequential processing of all validation checks -- Optimized: Parallel subprocess analysis for faster completion - -**Parallel User Assistance:** - -- Can user interaction continue while background processing occurs? -- Can multiple analyses run simultaneously during user wait times? - -**Batch Operations:** - -- Can similar file operations be grouped? -- Can multiple data sources be processed in parallel? -``` - -### 4. LLM Resource Optimization Analysis - -**A. Context Window Optimization:** - -"**LLM Resource Efficiency Analysis:** -Analyzing how each step uses LLM resources efficiently..." - -**Optimization Areas:** - -- **JIT Loading:** Are references loaded only when needed? -- **Context Management:** Is context used efficiently vs. wasted? -- **Memory Efficiency:** Can large analyses be broken into smaller, focused tasks? -- **Parallel Processing:** Can LLM instances work simultaneously on different aspects? - -**B. Speed vs. Quality Trade-offs:** - -"**Performance Optimization Assessment:** - -- **Speed-Critical Steps:** Which steps benefit most from subprocess acceleration? -- **Quality-Critical Steps:** Which steps need focused LLM attention? -- **Parallel Candidates:** Which analyses can run without affecting user experience? -- **Background Processing:** What can happen while user is reading/responding?" - -### 5. Step-by-Step Optimization Recommendations - -**A. Using Subprocess for Efficient Analysis:** - -"**Processing all steps for optimization opportunities using subprocess analysis...**" - -**For each workflow step, analyze:** - -**1. Web Search Optimization:** - -```markdown -**Step:** {step_name} -**Current Search Usage:** {current_search_instructions} -**Intelligent Assessment:** {is_search_necessary} -**Recommendation:** - -- **Keep essential searches:** {specific_searches_to_keep} -- **Remove unnecessary searches:** {searches_to_remove} -- **Optimize search queries:** {improved_search_approach} -``` - -**2. Subprocess Opportunities:** - -```markdown -**Parallel Processing Potential:** - -- **Can run with user interaction:** {yes/no_specifics} -- **Can batch with other steps:** {opportunities} -- **Can break into sub-tasks:** {subtask_breakdown} -- **Background processing:** {what_can_run_in_background} -``` - -**3. LLM Efficiency:** - -```markdown -**Resource Optimization:** - -- **Context efficiency:** {current_vs_optimal} -- **Processing time:** {estimated_improvements} -- **User experience impact:** {better/same/worse} -``` - -### 6. Aggregate Optimization Analysis - -**A. Web Search Optimization Summary:** - -"**Web Search Optimization Results:** - -- **Total Steps Analyzed:** [number] -- **Steps with Web Searches:** [number] -- **Unnecessary Searches Found:** [number] -- **Optimization Opportunities:** [number] -- **Estimated Time Savings:** [time_estimate]" - -**B. Subprocess Implementation Summary:** - -"**Subprocess Optimization Results:** - -- **Parallel Processing Opportunities:** [number] -- **Batch Processing Groups:** [number] -- **Background Processing Tasks:** [number] -- **Estimated Performance Improvement:** [percentage_improvement]" - -### 7. User-Facing Optimization Report - -**A. Key Efficiency Findings:** - -"**Optimization Analysis Summary:** - -**Web Search Efficiency:** - -- **Current Issues:** [unnecessary searches wasting time] -- **Recommendations:** [specific improvements] -- **Expected Benefits:** [faster response, better user experience] - -**Processing Speed Improvements:** - -- **Parallel Processing Gains:** [specific opportunities] -- **Background Processing Benefits:** [user experience improvements] -- **Resource Optimization:** [LLM efficiency gains] - -**Implementation Priority:** - -1. **High Impact, Low Effort:** [Quick wins] -2. **High Impact, High Effort:** [Major improvements] -3. **Low Impact, Low Effort:** [Fine-tuning] -4. **Future Considerations:** [Advanced optimizations]" - -### 8. Document Optimization Findings - -Append to {complianceReportFile}: - -```markdown -## Web Search & Subprocess Optimization Analysis - -### Web Search Optimization - -**Unnecessary Searches Identified:** [number] -**Essential Searches to Keep:** [specific_list] -**Optimization Recommendations:** [detailed_suggestions] -**Estimated Time Savings:** [time_improvement] - -### Subprocess Optimization Opportunities - -**Parallel Processing:** [number] opportunities identified -**Batch Processing:** [number] grouping opportunities -**Background Processing:** [number] background task opportunities -**Performance Improvement:** [estimated_improvement_percentage]% - -### Resource Efficiency Analysis - -**Context Optimization:** [specific_improvements] -**LLM Resource Usage:** [efficiency_gains] -**User Experience Impact:** [positive_changes] - -### Implementation Recommendations - -**Immediate Actions:** [quick_improvements] -**Strategic Improvements:** [major_optimizations] -**Future Enhancements:** [advanced_optimizations] -``` - -### 9. Continuation Confirmation - -"**Web Search & Subprocess Analysis Complete:** - -- **Web Search Optimization:** [summary of improvements] -- **Subprocess Opportunities:** [number of optimization areas] -- **Performance Impact:** [expected efficiency gains] -- **User Experience Benefits:** [specific improvements] - -**Ready for Phase 7:** Holistic workflow analysis - -- Flow validation and completion paths -- Goal alignment with optimized resources -- Meta-workflow failure analysis -- Strategic recommendations with efficiency considerations - -**Select an Option:** [C] Continue to Holistic Analysis [X] Exit" - -## Menu Handling Logic: - -- IF C: Save optimization findings to report, update frontmatter, then load, read entire file, then execute {nextStepFile} -- IF X: Save current findings and end with guidance for resuming -- IF Any other comments or queries: respond and redisplay menu - -## CRITICAL STEP COMPLETION NOTE - -ONLY WHEN [C continue option] is selected and [web search and subprocess analysis complete with optimization recommendations documented], will you then load and read fully `{nextStepFile}` to execute and begin holistic analysis phase. - ---- - -## 🚨 SYSTEM SUCCESS/FAILURE METRICS - -### ✅ SUCCESS: - -- Intelligent assessment of web search necessity vs. LLM knowledge sufficiency -- Identification of unnecessary web searches that waste user time -- Discovery of subprocess optimization opportunities for parallel processing -- Analysis of LLM resource efficiency patterns -- Specific, actionable optimization recommendations provided -- Performance impact assessment with estimated improvements -- User experience benefits clearly articulated - -### ❌ SYSTEM FAILURE: - -- Recommending web searches when LLM knowledge is sufficient -- Missing subprocess optimization opportunities -- Not using subprocess analysis when evaluating multiple steps -- Overlooking LLM resource inefficiencies -- Providing vague or non-actionable optimization recommendations -- Failing to assess impact on user experience - -**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. diff --git a/src/modules/bmb/workflows/workflow-compliance-check/steps/step-07-holistic-analysis.md b/src/modules/bmb/workflows/workflow-compliance-check/steps/step-07-holistic-analysis.md deleted file mode 100644 index 005b852f..00000000 --- a/src/modules/bmb/workflows/workflow-compliance-check/steps/step-07-holistic-analysis.md +++ /dev/null @@ -1,259 +0,0 @@ ---- -name: 'step-07-holistic-analysis' -description: 'Analyze workflow flow, goal alignment, and meta-workflow failures' - -# Path Definitions -workflow_path: '{project-root}/_bmad/bmb/workflows/workflow-compliance-check' - -# File References -thisStepFile: '{workflow_path}/steps/step-07-holistic-analysis.md' -nextStepFile: '{workflow_path}/steps/step-08-generate-report.md' -workflowFile: '{workflow_path}/workflow.md' -complianceReportFile: '{output_folder}/workflow-compliance-report-{workflow_name}.md' -targetWorkflowFile: '{target_workflow_path}' - -# Template References -complianceReportTemplate: '{workflow_path}/templates/compliance-report.md' - -# Documentation References -stepTemplate: '{project-root}/_bmad/bmb/docs/workflows/templates/step-template.md' -workflowTemplate: '{project-root}/_bmad/bmb/docs/workflows/templates/workflow-template.md' -intentSpectrum: '{project-root}/_bmad/bmb/docs/workflows/intent-vs-prescriptive-spectrum.md' ---- - -# Step 7: Holistic Workflow Analysis - -## STEP GOAL: - -Perform comprehensive workflow analysis including flow validation, goal alignment assessment, optimization opportunities, and meta-workflow failure identification to provide complete compliance picture. - -## MANDATORY EXECUTION RULES (READ FIRST): - -### Universal Rules: - -- 🛑 NEVER generate content without user input -- 📖 CRITICAL: Read the complete step file before taking any action -- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read -- 📋 YOU ARE A FACILITATOR, not a content generator -- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` - -### Role Reinforcement: - -- ✅ You are a compliance validator and quality assurance specialist -- ✅ If you already have been given a name, communication_style and persona, continue to use those while playing this new role -- ✅ We engage in collaborative dialogue, not command-response -- ✅ You bring holistic workflow analysis and optimization expertise -- ✅ User brings their workflow and needs comprehensive assessment - -### Step-Specific Rules: - -- 🎯 Focus on holistic analysis beyond template compliance -- 🚫 FORBIDDEN to skip flow validation or optimization assessment -- 💬 Approach: Systematic end-to-end workflow analysis -- 📋 Identify meta-workflow failures and improvement opportunities - -## EXECUTION PROTOCOLS: - -- 🎯 Analyze complete workflow flow from start to finish -- 💾 Validate goal alignment and optimization opportunities -- 📖 Identify what meta-workflows (create/edit) should have caught -- 🚫 FORBIDDEN to provide superficial analysis without specific recommendations - -## CONTEXT BOUNDARIES: - -- Available context: Complete workflow analysis from previous phases -- Focus: Holistic workflow optimization and meta-process improvement -- Limits: Analysis phase only, report generation comes next -- Dependencies: Completed workflow.md and step validation phases - -## Sequence of Instructions (Do not deviate, skip, or optimize) - -### 1. Initialize Holistic Analysis - -"Beginning **Phase 3: Holistic Workflow Analysis** -Target: `{target_workflow_name}` - -Analyzing workflow from multiple perspectives: - -- Flow and completion validation -- Goal alignment assessment -- Optimization opportunities -- Meta-workflow failure analysis..." - -### 2. Workflow Flow Validation - -**A. Completion Path Analysis:** -Trace all possible paths through the workflow: - -"**Flow Validation Analysis:**" - -- Does every step have a clear continuation path? -- Do all menu options have valid destinations? -- Are there any orphaned steps or dead ends? -- Can the workflow always reach a successful completion? - -**Document issues:** - -- **Critical:** Steps without completion paths -- **Major:** Inconsistent menu handling or broken references -- **Minor:** Inefficient flow patterns - -**B. Sequential Logic Validation:** -Check step sequence logic: - -- Does step order make logical sense? -- Are dependencies properly structured? -- Is information flow between steps optimal? -- Are there unnecessary steps or missing functionality? - -### 3. Goal Alignment Assessment - -**A. Stated Goal Analysis:** -Compare workflow.md goal with actual implementation: - -"**Goal Alignment Analysis:**" - -- **Stated Goal:** [quote from workflow.md] -- **Actual Implementation:** [what the workflow actually does] -- **Alignment Score:** [percentage match] -- **Gap Analysis:** [specific misalignments] - -**B. User Experience Assessment:** -Evaluate workflow from user perspective: - -- Is the workflow intuitive and easy to follow? -- Are user inputs appropriately requested? -- Is feedback clear and timely? -- Is the workflow efficient for the stated purpose? - -### 4. Optimization Opportunities - -**A. Efficiency Analysis:** -"**Optimization Assessment:**" - -- **Step Consolidation:** Could any steps be combined? -- **Parallel Processing:** Could any operations run simultaneously? -- **JIT Loading:** Are references loaded optimally? -- **User Experience:** Where could user experience be improved? - -**B. Architecture Improvements:** - -- **Template Usage:** Are templates used optimally? -- **Output Management:** Are outputs appropriate and necessary? -- **Error Handling:** Is error handling comprehensive? -- **Extensibility:** Can the workflow be easily extended? - -### 5. Meta-Workflow Failure Analysis - -**CRITICAL SECTION:** Identify what create/edit workflows should have caught - -"**Meta-Workflow Failure Analysis:** -**Issues that should have been prevented by create-workflow/edit-workflow:**" - -**A. Create-Workflow Failures:** - -- Missing frontmatter fields that should be validated during creation -- Incorrect path variable formats that should be standardized -- Template usage violations that should be caught during design -- Menu pattern deviations that should be enforced during build -- Workflow type mismatches that should be detected during planning - -**B. Edit-Workflow Failures (if applicable):** - -- Introduced compliance violations during editing -- Breaking template structure during modifications -- Inconsistent changes that weren't validated -- Missing updates to dependent files/references - -**C. Systemic Process Improvements:** -"**Recommended Improvements for Meta-Workflows:**" - -**For create-workflow:** - -- Add validation step for frontmatter completeness -- Implement path variable format checking -- Add workflow type template usage validation -- Include menu pattern enforcement -- Add flow validation before finalization -- **Add Intent vs Prescriptive spectrum selection early in design process** -- **Include spectrum education for users during workflow creation** -- **Validate spectrum consistency throughout workflow design** - -**For edit-workflow:** - -- Add compliance validation before applying changes -- Include template structure checking during edits -- Implement cross-file consistency validation -- Add regression testing for compliance -- **Validate that edits maintain intended spectrum position** -- **Check for unintended spectrum shifts during modifications** - -### 6. Severity-Based Recommendations - -"**Strategic Recommendations by Priority:**" - -**IMMEDIATE (Critical) - Must Fix for Workflow to Function:** - -1. [Most critical issue with specific fix] -2. [Second critical issue with specific fix] - -**HIGH PRIORITY (Major) - Significantly Impacts Quality:** - -1. [Major issue affecting maintainability] -2. [Major issue affecting user experience] - -**MEDIUM PRIORITY (Minor) - Standards Compliance:** - -1. [Minor template compliance issue] -2. [Cosmetic or consistency improvements] - -### 7. Continuation Confirmation - -"**Phase 5 Complete:** Holistic analysis finished - -- **Flow Validation:** [summary findings] -- **Goal Alignment:** [alignment percentage and key gaps] -- **Optimization Opportunities:** [number key improvements identified] -- **Meta-Workflow Failures:** [number issues that should have been prevented] - -**Ready for Phase 8:** Comprehensive compliance report generation - -- All findings compiled into structured report -- Severity-ranked violation list -- Specific fix recommendations -- Meta-workflow improvement suggestions - -**Select an Option:** [C] Continue to Report Generation [X] Exit" - -## Menu Handling Logic: - -- IF C: Save holistic analysis findings to report, update frontmatter, then load, read entire file, then execute {nextStepFile} -- IF X: Save current findings and end with guidance for resuming -- IF Any other comments or queries: respond and redisplay menu - -## CRITICAL STEP COMPLETION NOTE - -ONLY WHEN [C continue option] is selected and [holistic analysis complete with meta-workflow failures identified], will you then load and read fully `{nextStepFile}` to execute and begin comprehensive report generation. - ---- - -## 🚨 SYSTEM SUCCESS/FAILURE METRICS - -### ✅ SUCCESS: - -- Complete workflow flow validation with all paths traced -- Goal alignment assessment with specific gap analysis -- Optimization opportunities identified with prioritized recommendations -- Meta-workflow failures documented with improvement suggestions -- Strategic recommendations provided by severity priority -- User ready for comprehensive report generation - -### ❌ SYSTEM FAILURE: - -- Skipping flow validation or goal alignment analysis -- Not identifying meta-workflow failure opportunities -- Failing to provide specific, actionable recommendations -- Missing strategic prioritization of improvements -- Providing superficial analysis without depth - -**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. diff --git a/src/modules/bmb/workflows/workflow-compliance-check/steps/step-08-generate-report.md b/src/modules/bmb/workflows/workflow-compliance-check/steps/step-08-generate-report.md deleted file mode 100644 index 43bfd3e5..00000000 --- a/src/modules/bmb/workflows/workflow-compliance-check/steps/step-08-generate-report.md +++ /dev/null @@ -1,302 +0,0 @@ ---- -name: 'step-08-generate-report' -description: 'Generate comprehensive compliance report with fix recommendations' - -# Path Definitions -workflow_path: '{project-root}/_bmad/bmb/workflows/workflow-compliance-check' - -# File References -thisStepFile: '{workflow_path}/steps/step-08-generate-report.md' -workflowFile: '{workflow_path}/workflow.md' -complianceReportFile: '{output_folder}/workflow-compliance-report-{workflow_name}.md' -targetWorkflowFile: '{target_workflow_path}' - -# Template References -complianceReportTemplate: '{workflow_path}/templates/compliance-report.md' - -# Documentation References -stepTemplate: '{project-root}/_bmad/bmb/docs/workflows/templates/step-template.md' -workflowTemplate: '{project-root}/_bmad/bmb/docs/workflows/templates/workflow-template.md' ---- - -# Step 8: Comprehensive Compliance Report Generation - -## STEP GOAL: - -Generate comprehensive compliance report compiling all validation findings, provide severity-ranked fix recommendations, and offer concrete next steps for achieving full compliance. - -## MANDATORY EXECUTION RULES (READ FIRST): - -### Universal Rules: - -- 🛑 NEVER generate content without user input -- 📖 CRITICAL: Read the complete step file before taking any action -- 📋 YOU ARE A FACILITATOR, not a content generator -- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` - -### Role Reinforcement: - -- ✅ You are a compliance validator and quality assurance specialist -- ✅ If you already have been given a name, communication_style and persona, continue to use those while playing this new role -- ✅ We engage in collaborative dialogue, not command-response -- ✅ You bring report generation and strategic recommendation expertise -- ✅ User brings their validated workflow and needs actionable improvement plan - -### Step-Specific Rules: - -- 🎯 Focus only on compiling comprehensive compliance report -- 🚫 FORBIDDEN to generate report without including all findings from previous phases -- 💬 Approach: Systematic compilation with clear, actionable recommendations -- 📋 Ensure report is complete, accurate, and immediately useful - -## EXECUTION PROTOCOLS: - -- 🎯 Compile all findings from previous validation phases -- 💾 Generate structured compliance report with clear sections -- 📖 Provide severity-ranked recommendations with specific fixes -- 🚫 FORBIDDEN to overlook any validation findings or recommendations - -## CONTEXT BOUNDARIES: - -- Available context: Complete validation findings from all previous phases -- Focus: Comprehensive report generation and strategic recommendations -- Limits: Report generation only, no additional validation -- Dependencies: Successful completion of all previous validation phases - -## Sequence of Instructions (Do not deviate, skip, or optimize) - -### 1. Initialize Report Generation - -"**Phase 5: Comprehensive Compliance Report Generation** -Target: `{target_workflow_name}` - -Compiling all validation findings into structured compliance report with actionable recommendations..." - -### 2. Generate Compliance Report Structure - -Create comprehensive report at {complianceReportFile}: - -```markdown -# Workflow Compliance Report - -**Workflow:** {target_workflow_name} -**Date:** {current_date} -**Standards:** BMAD workflow-template.md and step-template.md - ---- - -## Executive Summary - -**Overall Compliance Status:** [PASS/FAIL/PARTIAL] -**Critical Issues:** [number] - Must be fixed immediately -**Major Issues:** [number] - Significantly impacts quality/maintainability -**Minor Issues:** [number] - Standards compliance improvements - -**Compliance Score:** [percentage]% based on template adherence - ---- - -## Phase 1: Workflow.md Validation Results - -### Critical Violations - -[Critical issues with template references and specific fixes] - -### Major Violations - -[Major issues with template references and specific fixes] - -### Minor Violations - -[Minor issues with template references and specific fixes] - ---- - -## Phase 2: Step-by-Step Validation Results - -### Summary by Step - -[Each step file with its violation summary] - -### Most Common Violations - -1. [Most frequent violation type with count] -2. [Second most frequent with count] -3. [Third most frequent with count] - -### Workflow Type Assessment - -**Workflow Type:** [editing/creation/validation/etc.] -**Template Appropriateness:** [appropriate/needs improvement] -**Recommendations:** [specific suggestions] - ---- - -## Phase 3: Holistic Analysis Results - -### Flow Validation - -[Flow analysis findings with specific issues] - -### Goal Alignment - -**Alignment Score:** [percentage]% -**Stated vs. Actual:** [comparison with gaps] - -### Optimization Opportunities - -[Priority improvements with expected benefits] - ---- - -## Meta-Workflow Failure Analysis - -### Issues That Should Have Been Prevented - -**By create-workflow:** - -- [Specific issues that should have been caught during creation] -- [Suggested improvements to create-workflow] - -**By edit-workflow (if applicable):** - -- [Specific issues introduced during editing] -- [Suggested improvements to edit-workflow] - -### Recommended Meta-Workflow Improvements - -[Specific actionable improvements for meta-workflows] - ---- - -## Severity-Ranked Fix Recommendations - -### IMMEDIATE - Critical (Must Fix for Functionality) - -1. **[Issue Title]** - [File: filename.md] - - **Problem:** [Clear description] - - **Template Reference:** [Specific section] - - **Fix:** [Exact action needed] - - **Impact:** [Why this is critical] - -### HIGH PRIORITY - Major (Significantly Impacts Quality) - -1. **[Issue Title]** - [File: filename.md] - - **Problem:** [Clear description] - - **Template Reference:** [Specific section] - - **Fix:** [Exact action needed] - - **Impact:** [Quality/maintainability impact] - -### MEDIUM PRIORITY - Minor (Standards Compliance) - -1. **[Issue Title]** - [File: filename.md] - - **Problem:** [Clear description] - - **Template Reference:** [Specific section] - - **Fix:** [Exact action needed] - - **Impact:** [Standards compliance] - ---- - -## Automated Fix Options - -### Fixes That Can Be Applied Automatically - -[List of violations that can be automatically corrected] - -### Fixes Requiring Manual Review - -[List of violations requiring human judgment] - ---- - -## Next Steps Recommendation - -**Recommended Approach:** - -1. Fix all Critical issues immediately (workflow may not function) -2. Address Major issues for reliability and maintainability -3. Implement Minor issues for full standards compliance -4. Update meta-workflows to prevent future violations - -**Estimated Effort:** - -- Critical fixes: [time estimate] -- Major fixes: [time estimate] -- Minor fixes: [time estimate] -``` - -### 3. Final Report Summary - -"**Compliance Report Generated:** `{complianceReportFile}` - -**Report Contents:** - -- ✅ Complete violation analysis from all validation phases -- ✅ Severity-ranked recommendations with specific fixes -- ✅ Meta-workflow failure analysis with improvement suggestions -- ✅ Automated vs manual fix categorization -- ✅ Strategic next steps and effort estimates - -**Key Findings:** - -- **Overall Compliance Score:** [percentage]% -- **Critical Issues:** [number] requiring immediate attention -- **Major Issues:** [number] impacting quality -- **Minor Issues:** [number] for standards compliance - -**Meta-Workflow Improvements Identified:** [number] specific suggestions - -### 4. Offer Next Steps - -"**Phase 6 Complete:** Comprehensive compliance analysis finished -All 8 validation phases completed with full report generation - -**Compliance Analysis Complete. What would you like to do next?**" - -**Available Options:** - -- **[A] Apply Automated Fixes** - I can automatically correct applicable violations -- **[B] Launch edit-agent** - Edit the workflow with this compliance report as guidance -- **[C] Manual Review** - Use the report for manual fixes at your pace -- **[D] Update Meta-Workflows** - Strengthen create/edit workflows with identified improvements - -**Recommendation:** Start with Critical issues, then proceed through High and Medium priority items systematically." - -### 5. Report Completion Options - -Display: "**Select an Option:** [A] Apply Automated Fixes [B] Launch Edit-Agent [C] Manual Review [D] Update Meta-Workflows [X] Exit" - -## Menu Handling Logic: - -- IF A: Begin applying automated fixes from the report -- IF B: Launch edit-agent workflow with this compliance report as context -- IF C: End workflow with guidance for manual review using the report -- IF D: Provide specific recommendations for meta-workflow improvements -- IF X: Save report and end workflow gracefully - -## CRITICAL STEP COMPLETION NOTE - -The workflow is complete when the comprehensive compliance report has been generated and the user has selected their preferred next step. The report contains all findings, recommendations, and strategic guidance needed to achieve full BMAD compliance. - ---- - -## 🚨 SYSTEM SUCCESS/FAILURE METRICS - -### ✅ SUCCESS: - -- Comprehensive compliance report generated with all validation findings -- Severity-ranked fix recommendations provided with specific actions -- Meta-workflow failure analysis completed with improvement suggestions -- Clear next steps offered based on user preferences -- Report saved and accessible for future reference -- User has actionable plan for achieving full compliance - -### ❌ SYSTEM FAILURE: - -- Generating incomplete report without all validation findings -- Missing severity rankings or specific fix recommendations -- Not providing clear next steps or options -- Failing to include meta-workflow improvement suggestions -- Creating report that is not immediately actionable - -**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. diff --git a/src/modules/bmb/workflows/workflow-compliance-check/templates/compliance-report.md b/src/modules/bmb/workflows/workflow-compliance-check/templates/compliance-report.md deleted file mode 100644 index 2fd5e8a4..00000000 --- a/src/modules/bmb/workflows/workflow-compliance-check/templates/compliance-report.md +++ /dev/null @@ -1,140 +0,0 @@ -# Workflow Compliance Report Template - -**Workflow:** {workflow_name} -**Date:** {validation_date} -**Standards:** BMAD workflow-template.md and step-template.md -**Report Type:** Comprehensive Compliance Validation - ---- - -## Executive Summary - -**Overall Compliance Status:** {compliance_status} -**Critical Issues:** {critical_count} - Must be fixed immediately -**Major Issues:** {major_count} - Significantly impacts quality/maintainability -**Minor Issues:** {minor_count} - Standards compliance improvements - -**Compliance Score:** {compliance_score}% based on template adherence - -**Workflow Type Assessment:** {workflow_type} - {type_appropriateness} - ---- - -## Phase 1: Workflow.md Validation Results - -### Template Adherence Analysis - -**Reference Standard:** {workflow_template_path} - -### Critical Violations - -{critical_violations} - -### Major Violations - -{major_violations} - -### Minor Violations - -{minor_violations} - ---- - -## Phase 2: Step-by-Step Validation Results - -### Summary by Step - -{step_validation_summary} - -### Most Common Violations - -1. {most_common_violation_1} -2. {most_common_violation_2} -3. {most_common_violation_3} - -### Workflow Type Appropriateness - -**Analysis:** {workflow_type_analysis} -**Recommendations:** {type_recommendations} - ---- - -## Phase 3: Holistic Analysis Results - -### Flow Validation - -{flow_validation_results} - -### Goal Alignment - -**Stated Goal:** {stated_goal} -**Actual Implementation:** {actual_implementation} -**Alignment Score:** {alignment_score}% -**Gap Analysis:** {gap_analysis} - -### Optimization Opportunities - -{optimization_opportunities} - ---- - -## Meta-Workflow Failure Analysis - -### Issues That Should Have Been Prevented - -**By create-workflow:** -{create_workflow_failures} - -**By edit-workflow:** -{edit_workflow_failures} - -### Recommended Meta-Workflow Improvements - -{meta_workflow_improvements} - ---- - -## Severity-Ranked Fix Recommendations - -### IMMEDIATE - Critical (Must Fix for Functionality) - -{critical_recommendations} - -### HIGH PRIORITY - Major (Significantly Impacts Quality) - -{major_recommendations} - -### MEDIUM PRIORITY - Minor (Standards Compliance) - -{minor_recommendations} - ---- - -## Automated Fix Options - -### Fixes That Can Be Applied Automatically - -{automated_fixes} - -### Fixes Requiring Manual Review - -{manual_fixes} - ---- - -## Next Steps Recommendation - -**Recommended Approach:** -{recommended_approach} - -**Estimated Effort:** - -- Critical fixes: {critical_effort} -- Major fixes: {major_effort} -- Minor fixes: {minor_effort} - ---- - -**Report Generated:** {timestamp} -**Validation Engine:** BMAD Workflow Compliance Checker -**Next Review Date:** {next_review_date} diff --git a/src/modules/bmb/workflows/workflow-compliance-check/workflow.md b/src/modules/bmb/workflows/workflow-compliance-check/workflow.md deleted file mode 100644 index 5fc29ff1..00000000 --- a/src/modules/bmb/workflows/workflow-compliance-check/workflow.md +++ /dev/null @@ -1,59 +0,0 @@ ---- -name: workflow-compliance-check -description: Systematic validation of workflows against BMAD standards with adversarial analysis and detailed reporting -web_bundle: false ---- - -# Workflow Compliance Check - -**Goal:** Systematically validate workflows against BMAD standards through adversarial analysis, generating detailed compliance reports with severity-ranked violations and improvement recommendations. - -**Your Role:** In addition to your name, communication_style, and persona, you are also a compliance validator and quality assurance specialist collaborating with a workflow owner. This is a partnership, not a client-vendor relationship. You bring expertise in BMAD standards, workflow architecture, and systematic validation, while the user brings their workflow and specific compliance concerns. Work together as equals. - ---- - -## WORKFLOW ARCHITECTURE - -This uses **step-file architecture** for disciplined execution: - -### Core Principles - -- **Micro-file Design**: Each step is a self contained instruction file that is a part of an overall workflow that must be followed exactly -- **Just-In-Time Loading**: Only the current step file is in memory - never load future step files until told to do so -- **Sequential Enforcement**: Sequence within the step files must be completed in order, no skipping or optimization allowed -- **State Tracking**: Document progress in context for compliance checking (no output file frontmatter needed) -- **Append-Only Building**: Build compliance reports by appending content as directed to the output file - -### Step Processing Rules - -1. **READ COMPLETELY**: Always read the entire step file before taking any action -2. **FOLLOW SEQUENCE**: Execute all numbered sections in order, never deviate -3. **WAIT FOR INPUT**: If a menu is presented, halt and wait for user selection -4. **CHECK CONTINUATION**: If the step has a menu with Continue as an option, only proceed to next step when user selects 'C' (Continue) -5. **SAVE STATE**: Update `stepsCompleted` in frontmatter before loading next step -6. **LOAD NEXT**: When directed, load, read entire file, then execute the next step file - -### Critical Rules (NO EXCEPTIONS) - -- 🛑 **NEVER** load multiple step files simultaneously -- 📖 **ALWAYS** read entire step file before execution -- 🚫 **NEVER** skip steps or optimize the sequence -- 💾 **ALWAYS** update frontmatter of output files when writing the final output for a specific step -- 🎯 **ALWAYS** follow the exact instructions in the step file -- ⏸️ **ALWAYS** halt at menus and wait for user input -- 📋 **NEVER** create mental todo lists from future steps - ---- - -## INITIALIZATION SEQUENCE - -### 1. Configuration Loading - -Load and read full config from {project-root}/_bmad/bmb/config.yaml and resolve: - -- `project_name`, `output_folder`, `user_name`, `communication_language`, `document_output_language` -- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` - -### 2. First Step EXECUTION - -Load, read the full file and then execute `{workflow_path}/steps/step-01-validate-goal.md` to begin the workflow. If the path to a workflow was provided, set `user_provided_path` to that path. diff --git a/src/modules/bmb/workflows/workflow/data/architecture.md b/src/modules/bmb/workflows/workflow/data/architecture.md new file mode 100644 index 00000000..e0d0c2e1 --- /dev/null +++ b/src/modules/bmb/workflows/workflow/data/architecture.md @@ -0,0 +1,152 @@ +# Workflow Architecture + +**Purpose:** Core structural patterns for BMAD workflows. + +--- + +## Structure + +``` +workflow-folder/ +├── workflow.md # Entry point, configuration +├── steps-c/ # Create flow steps +│ ├── step-01-init.md +│ ├── step-02-[name].md +│ └── step-N-[name].md +├── steps-e/ # Edit flow (if needed) +├── steps-v/ # Validate flow (if needed) +├── data/ # Shared reference files +└── templates/ # Output templates (if needed) +``` + +--- + +## workflow.md File Standards + +**CRITICAL:** The workflow.md file MUST be lean. It is the entry point and should NOT contain: + +- ❌ **Listing of all steps** - This defeats progressive disclosure +- ❌ **Detailed descriptions of what each step does** - Steps are self-documenting +- ❌ **Validation checklists** - These belong in steps-v/, not workflow.md +- ❌ **Implementation details** - These belong in step files + +**The workflow.md SHOULD contain:** +- ✅ Frontmatter: name, description, web_bundle +- ✅ Goal: What the workflow accomplishes +- ✅ Role: Who the AI embodies when running this workflow +- ✅ Meta-context: Background about the architecture (if demonstrating a pattern) +- ✅ Core architecture principles (step-file design, JIT loading, etc.) +- ✅ Initialization/routing: How to start and which step to load first + +**Progressive Disclosure Rule:** +Users should ONLY know about the current step they're executing. The workflow.md routes to the first step, and each step routes to the next. No step lists in workflow.md! + +--- + +## Core Principles + +### 1. Micro-File Design +- Each step is a focused file (~80-200 lines) +- One concept per step +- Self-contained instructions + +### 2. Just-In-Time Loading +- Only current step file is in memory +- Never load future steps until user selects 'C' +- Progressive disclosure - LLM stays focused + +### 3. Sequential Enforcement +- Steps execute in order +- No skipping, no optimization +- Each step completes before next loads + +### 4. State Tracking +For continuable workflows: +```yaml +stepsCompleted: ['step-01-init', 'step-02-gather', 'step-03-design'] +lastStep: 'step-03-design' +lastContinued: '2025-01-02' +``` + +Each step appends its name to `stepsCompleted` before loading next. + +--- + +## Execution Flow + +### Fresh Start +``` +workflow.md → step-01-init.md → step-02-[name].md → ... → step-N-final.md +``` + +### Continuation (Resumed) +``` +workflow.md → step-01-init.md (detects existing) → step-01b-continue.md → [appropriate next step] +``` + +--- + +## Frontmatter Variables + +### Standard (All Workflows) +```yaml +workflow_path: '{project-root}/_bmad/[module]/workflows/[name]' +thisStepFile: '{workflow_path}/steps/step-[N]-[name].md' +nextStepFile: '{workflow_path}/steps/step-[N+1]-[name].md' +outputFile: '{output_folder}/[output].md' +``` + +### Module-Specific +```yaml +# BMB example: +bmb_creations_output_folder: '{project-root}/_bmad/bmb-creations' +``` + +### Critical Rules +- ONLY variables used in step body go in frontmatter +- All file references use `{variable}` format +- Paths within workflow folder are relative + +--- + +## Menu Pattern + +```markdown +### N. Present MENU OPTIONS + +Display: "**Select:** [A] [action] [P] [action] [C] Continue" + +#### Menu Handling Logic: +- IF A: Execute {task}, then redisplay menu +- IF P: Execute {task}, then redisplay menu +- IF C: Save to {outputFile}, update frontmatter, then load {nextStepFile} +- IF Any other: help user, then redisplay menu + +#### EXECUTION RULES: +- ALWAYS halt and wait for user input +- ONLY proceed to next step when user selects 'C' +``` + +**A/P not needed in:** Step 1 (init), validation sequences, simple data gathering + +--- + +## Output Pattern + +Every step writes to a document BEFORE loading next step: + +1. **Plan-then-build:** Steps append to plan.md → build step consumes plan +2. **Direct-to-final:** Steps append directly to final document + +See: `output-format-standards.md` + +--- + +## Critical Rules + +- 🛑 NEVER load multiple step files simultaneously +- 📖 ALWAYS read entire step file before execution +- 🚫 NEVER skip steps or optimize the sequence +- 💾 ALWAYS update frontmatter when step completes +- ⏸️ ALWAYS halt at menus and wait for input +- 📋 NEVER create mental todos from future steps diff --git a/src/modules/bmb/docs/workflows/common-workflow-tools.csv b/src/modules/bmb/workflows/workflow/data/common-workflow-tools.csv similarity index 100% rename from src/modules/bmb/docs/workflows/common-workflow-tools.csv rename to src/modules/bmb/workflows/workflow/data/common-workflow-tools.csv diff --git a/src/modules/bmb/workflows/workflow/data/csv-data-file-standards.md b/src/modules/bmb/workflows/workflow/data/csv-data-file-standards.md new file mode 100644 index 00000000..8b2df4ca --- /dev/null +++ b/src/modules/bmb/workflows/workflow/data/csv-data-file-standards.md @@ -0,0 +1,81 @@ +# CSV Data File Standards + +**Purpose:** When workflows need structured data that LLMs cannot generate. + +--- + +## When to Use CSV + +Use CSV for data that is: +- Domain-specific and not in training data +- Too large for prompt context +- Needs structured lookup/reference +- Must be consistent across sessions + +**Don't use for:** +- Web-searchable information +- Common programming syntax +- General knowledge +- Things LLMs can generate + +--- + +## CSV Structure + +```csv +category,name,pattern,description +"collaboration","Think Aloud Protocol","user speaks thoughts → facilitator captures","Make thinking visible during work" +"creative","SCAMPER","substitute→combine→adapt→modify→put→eliminate→reverse","Systematic creative thinking" +``` + +**Rules:** +- Header row required, descriptive column names +- Consistent data types per column +- UTF-8 encoding +- All columns must be used in workflow + +--- + +## Common Use Cases + +### 1. Method Registry +Advanced Elicitation uses CSV to select techniques dynamically: +```csv +category,name,pattern +collaboration,Think Aloud,user speaks thoughts → facilitator captures +advanced,Six Thinking Hats,view problem from 6 perspectives +``` + +### 2. Knowledge Base Index +Map keywords to document locations for surgical lookup: +```csv +keywords,document_path,section +"nutrition,macros",data/nutrition-reference.md,## Daily Targets +``` + +### 3. Configuration Lookup +Map scenarios to parameters: +```csv +scenario,required_steps,output_sections +"2D Platformer",step-01,step-03,step-07,movement,physics,collision +``` + +--- + +## Best Practices + +- Keep files small (<1MB if possible) +- No unused columns +- Document each CSV's purpose +- Validate data quality +- Use efficient encoding (codes vs full descriptions) + +--- + +## Validation Checklist + +For each CSV file: +- [ ] Purpose is essential (can't be generated by LLM) +- [ ] All columns are used somewhere +- [ ] Properly formatted (consistent, UTF-8) +- [ ] Documented with examples diff --git a/src/modules/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/data/dietary-restrictions.csv b/src/modules/bmb/workflows/workflow/data/examples/meal-prep-nutrition/data/dietary-restrictions.csv similarity index 100% rename from src/modules/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/data/dietary-restrictions.csv rename to src/modules/bmb/workflows/workflow/data/examples/meal-prep-nutrition/data/dietary-restrictions.csv diff --git a/src/modules/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/data/macro-calculator.csv b/src/modules/bmb/workflows/workflow/data/examples/meal-prep-nutrition/data/macro-calculator.csv similarity index 100% rename from src/modules/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/data/macro-calculator.csv rename to src/modules/bmb/workflows/workflow/data/examples/meal-prep-nutrition/data/macro-calculator.csv diff --git a/src/modules/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/data/recipe-database.csv b/src/modules/bmb/workflows/workflow/data/examples/meal-prep-nutrition/data/recipe-database.csv similarity index 100% rename from src/modules/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/data/recipe-database.csv rename to src/modules/bmb/workflows/workflow/data/examples/meal-prep-nutrition/data/recipe-database.csv diff --git a/src/modules/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/steps/step-01-init.md b/src/modules/bmb/workflows/workflow/data/examples/meal-prep-nutrition/steps-c/step-01-init.md similarity index 91% rename from src/modules/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/steps/step-01-init.md rename to src/modules/bmb/workflows/workflow/data/examples/meal-prep-nutrition/steps-c/step-01-init.md index e72c3fe8..a3845ce3 100644 --- a/src/modules/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/steps/step-01-init.md +++ b/src/modules/bmb/workflows/workflow/data/examples/meal-prep-nutrition/steps-c/step-01-init.md @@ -2,18 +2,11 @@ name: 'step-01-init' description: 'Initialize the nutrition plan workflow by detecting continuation state and creating output document' -# Path Definitions -workflow_path: '{project-root}/_bmad/bmb/reference/workflows/meal-prep-nutrition' +nextStepFile: './step-02-profile.md' +continueFile: './step-01b-continue.md' -# File References -thisStepFile: '{workflow_path}/steps/step-01-init.md' -nextStepFile: '{workflow_path}/steps/step-02-profile.md' -workflowFile: '{workflow_path}/workflow.md' outputFile: '{output_folder}/nutrition-plan-{project_name}.md' -templateFile: '{workflow_path}/templates/nutrition-plan.md' -continueFile: '{workflow_path}/steps/step-01b-continue.md' -# Template References -# This step doesn't use content templates, only the main template +templateFile: '../templates/nutrition-plan.md' --- # Step 1: Workflow Initialization diff --git a/src/modules/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/steps/step-01b-continue.md b/src/modules/bmb/workflows/workflow/data/examples/meal-prep-nutrition/steps-c/step-01b-continue.md similarity index 88% rename from src/modules/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/steps/step-01b-continue.md rename to src/modules/bmb/workflows/workflow/data/examples/meal-prep-nutrition/steps-c/step-01b-continue.md index 704aabe7..a1ccef43 100644 --- a/src/modules/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/steps/step-01b-continue.md +++ b/src/modules/bmb/workflows/workflow/data/examples/meal-prep-nutrition/steps-c/step-01b-continue.md @@ -2,15 +2,7 @@ name: 'step-01b-continue' description: 'Handle workflow continuation from previous session' -# Path Definitions -workflow_path: '{project-root}/_bmad/bmb/reference/workflows/meal-prep-nutrition' - -# File References -thisStepFile: '{workflow_path}/steps/step-01b-continue.md' -workflowFile: '{workflow_path}/workflow.md' outputFile: '{output_folder}/nutrition-plan-{project_name}.md' -# Template References -# This step doesn't use content templates, reads from existing output file --- # Step 1B: Workflow Continuation @@ -119,15 +111,15 @@ Display: **Resuming workflow - Select an Option:** [C] Continue #### Menu Handling Logic: - IF C: Update frontmatter with continuation info, then load, read entire file, then execute appropriate next step based on `lastStep` - - IF lastStep = "init": load {workflow_path}/step-03-assessment.md - - IF lastStep = "assessment": load {workflow_path}/step-04-strategy.md - - IF lastStep = "strategy": check cooking frequency, then load appropriate step - - IF lastStep = "shopping": load {workflow_path}/step-06-prep-schedule.md + - IF lastStep = "init": load ./step-03-assessment.md + - IF lastStep = "assessment": load ./step-04-strategy.md + - IF lastStep = "strategy": check cooking frequency, then load load ./step-04-shopping.md + - IF lastStep = "shopping": load ./step-06-prep-schedule.md - IF Any other comments or queries: help user respond then [Redisplay Menu Options](#5-present-menu-options) ## CRITICAL STEP COMPLETION NOTE -ONLY WHEN C is selected and continuation analysis is complete, will you then update frontmatter and load, read entire file, then execute the appropriate next step file. +ONLY WHEN C is selected and continuation analysis is complete, will you then update frontmatter and load, read entire file, then execute the appropriate next step file as outlined in menu handling logic. --- diff --git a/src/modules/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/steps/step-02-profile.md b/src/modules/bmb/workflows/workflow/data/examples/meal-prep-nutrition/steps-c/step-02-profile.md similarity index 93% rename from src/modules/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/steps/step-02-profile.md rename to src/modules/bmb/workflows/workflow/data/examples/meal-prep-nutrition/steps-c/step-02-profile.md index 95a3ca86..4359cd9d 100644 --- a/src/modules/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/steps/step-02-profile.md +++ b/src/modules/bmb/workflows/workflow/data/examples/meal-prep-nutrition/steps-c/step-02-profile.md @@ -2,13 +2,7 @@ name: 'step-02-profile' description: 'Gather comprehensive user profile information through collaborative conversation' -# Path Definitions -workflow_path: '{project-root}/_bmad/bmb/reference/workflows/meal-prep-nutrition' - -# File References (all use {variable} format in file) -thisStepFile: '{workflow_path}/steps/step-02-profile.md' -nextStepFile: '{workflow_path}/steps/step-03-assessment.md' -workflowFile: '{workflow_path}/workflow.md' +nextStepFile: './step-03-assessment.md' outputFile: '{output_folder}/nutrition-plan-{project_name}.md' # Task References @@ -16,7 +10,7 @@ advancedElicitationTask: '{project-root}/_bmad/core/workflows/advanced-elicitati partyModeWorkflow: '{project-root}/_bmad/core/workflows/party-mode/workflow.md' # Template References -profileTemplate: '{workflow_path}/templates/profile-section.md' +profileTemplate: '../templates/profile-section.md' --- # Step 2: User Profile & Goals Collection diff --git a/src/modules/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/steps/step-03-assessment.md b/src/modules/bmb/workflows/workflow/data/examples/meal-prep-nutrition/steps-c/step-03-assessment.md similarity index 90% rename from src/modules/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/steps/step-03-assessment.md rename to src/modules/bmb/workflows/workflow/data/examples/meal-prep-nutrition/steps-c/step-03-assessment.md index f77fd67e..4a06f6ef 100644 --- a/src/modules/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/steps/step-03-assessment.md +++ b/src/modules/bmb/workflows/workflow/data/examples/meal-prep-nutrition/steps-c/step-03-assessment.md @@ -2,13 +2,7 @@ name: 'step-03-assessment' description: 'Analyze nutritional requirements, identify restrictions, and calculate target macros' -# Path Definitions -workflow_path: '{project-root}/_bmad/bmb/reference/workflows/meal-prep-nutrition' - -# File References -thisStepFile: '{workflow_path}/steps/step-03-assessment.md' -nextStepFile: '{workflow_path}/steps/step-04-strategy.md' -workflowFile: '{workflow_path}/workflow.md' +nextStepFile: './step-04-strategy.md'\ outputFile: '{output_folder}/nutrition-plan-{project_name}.md' # Task References @@ -16,11 +10,11 @@ advancedElicitationTask: '{project-root}/_bmad/core/workflows/advanced-elicitati partyModeWorkflow: '{project-root}/_bmad/core/workflows/party-mode/workflow.md' # Data References -dietaryRestrictionsDB: '{workflow_path}/data/dietary-restrictions.csv' -macroCalculatorDB: '{workflow_path}/data/macro-calculator.csv' +dietaryRestrictionsDB: '../data/dietary-restrictions.csv' +macroCalculatorDB: '../data/macro-calculator.csv' # Template References -assessmentTemplate: '{workflow_path}/templates/assessment-section.md' +assessmentTemplate: '../templates/assessment-section.md' --- # Step 3: Dietary Needs & Restrictions Assessment diff --git a/src/modules/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/steps/step-04-strategy.md b/src/modules/bmb/workflows/workflow/data/examples/meal-prep-nutrition/steps-c/step-04-strategy.md similarity index 91% rename from src/modules/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/steps/step-04-strategy.md rename to src/modules/bmb/workflows/workflow/data/examples/meal-prep-nutrition/steps-c/step-04-strategy.md index 08ef67a0..8012ea63 100644 --- a/src/modules/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/steps/step-04-strategy.md +++ b/src/modules/bmb/workflows/workflow/data/examples/meal-prep-nutrition/steps-c/step-04-strategy.md @@ -2,14 +2,8 @@ name: 'step-04-strategy' description: 'Design a personalized meal strategy that meets nutritional needs and fits lifestyle' -# Path Definitions -workflow_path: '{project-root}/_bmad/bmb/reference/workflows/meal-prep-nutrition' - -# File References -thisStepFile: '{workflow_path}/steps/step-04-strategy.md' -nextStepFile: '{workflow_path}/steps/step-05-shopping.md' -alternateNextStepFile: '{workflow_path}/steps/step-06-prep-schedule.md' -workflowFile: '{workflow_path}/workflow.md' +nextStepFile: './step-05-shopping.md' +alternateNextStepFile: './step-06-prep-schedule.md' outputFile: '{output_folder}/nutrition-plan-{project_name}.md' # Task References @@ -17,10 +11,10 @@ advancedElicitationTask: '{project-root}/_bmad/core/workflows/advanced-elicitati partyModeWorkflow: '{project-root}/_bmad/core/workflows/party-mode/workflow.md' # Data References -recipeDatabase: '{workflow_path}/data/recipe-database.csv' +recipeDatabase: '../data/recipe-database.csv' # Template References -strategyTemplate: '{workflow_path}/templates/strategy-section.md' +strategyTemplate: '../templates/strategy-section.md' --- # Step 4: Meal Strategy Creation diff --git a/src/modules/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/steps/step-05-shopping.md b/src/modules/bmb/workflows/workflow/data/examples/meal-prep-nutrition/steps-c/step-05-shopping.md similarity index 93% rename from src/modules/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/steps/step-05-shopping.md rename to src/modules/bmb/workflows/workflow/data/examples/meal-prep-nutrition/steps-c/step-05-shopping.md index 32900904..ab565a63 100644 --- a/src/modules/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/steps/step-05-shopping.md +++ b/src/modules/bmb/workflows/workflow/data/examples/meal-prep-nutrition/steps-c/step-05-shopping.md @@ -2,13 +2,7 @@ name: 'step-05-shopping' description: 'Create a comprehensive shopping list that supports the meal strategy' -# Path Definitions -workflow_path: '{project-root}/_bmad/bmb/reference/workflows/meal-prep-nutrition' - -# File References -thisStepFile: '{workflow_path}/steps/step-05-shopping.md' -nextStepFile: '{workflow_path}/steps/step-06-prep-schedule.md' -workflowFile: '{workflow_path}/workflow.md' +nextStepFile: './step-06-prep-schedule.md' outputFile: '{output_folder}/nutrition-plan-{project_name}.md' # Task References @@ -16,7 +10,7 @@ advancedElicitationTask: '{project-root}/_bmad/core/workflows/advanced-elicitati partyModeWorkflow: '{project-root}/_bmad/core/workflows/party-mode/workflow.md' # Template References -shoppingTemplate: '{workflow_path}/templates/shopping-section.md' +shoppingTemplate: '../templates/shopping-section.md' --- # Step 5: Shopping List Generation diff --git a/src/modules/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/steps/step-06-prep-schedule.md b/src/modules/bmb/workflows/workflow/data/examples/meal-prep-nutrition/steps-c/step-06-prep-schedule.md similarity index 94% rename from src/modules/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/steps/step-06-prep-schedule.md rename to src/modules/bmb/workflows/workflow/data/examples/meal-prep-nutrition/steps-c/step-06-prep-schedule.md index e7adbf52..4db06828 100644 --- a/src/modules/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/steps/step-06-prep-schedule.md +++ b/src/modules/bmb/workflows/workflow/data/examples/meal-prep-nutrition/steps-c/step-06-prep-schedule.md @@ -2,12 +2,6 @@ name: 'step-06-prep-schedule' description: "Create a realistic meal prep schedule that fits the user's lifestyle" -# Path Definitions -workflow_path: '{project-root}/_bmad/bmb/reference/workflows/meal-prep-nutrition' - -# File References -thisStepFile: '{workflow_path}/steps/step-06-prep-schedule.md' -workflowFile: '{workflow_path}/workflow.md' outputFile: '{output_folder}/nutrition-plan-{project_name}.md' # Task References @@ -15,7 +9,7 @@ advancedElicitationTask: '{project-root}/_bmad/core/workflows/advanced-elicitati partyModeWorkflow: '{project-root}/_bmad/core/workflows/party-mode/workflow.md' # Template References -prepScheduleTemplate: '{workflow_path}/templates/prep-schedule-section.md' +prepScheduleTemplate: '../templates/prep-schedule-section.md' --- # Step 6: Meal Prep Execution Schedule diff --git a/src/modules/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/templates/assessment-section.md b/src/modules/bmb/workflows/workflow/data/examples/meal-prep-nutrition/templates/assessment-section.md similarity index 100% rename from src/modules/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/templates/assessment-section.md rename to src/modules/bmb/workflows/workflow/data/examples/meal-prep-nutrition/templates/assessment-section.md diff --git a/src/modules/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/templates/nutrition-plan.md b/src/modules/bmb/workflows/workflow/data/examples/meal-prep-nutrition/templates/nutrition-plan.md similarity index 100% rename from src/modules/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/templates/nutrition-plan.md rename to src/modules/bmb/workflows/workflow/data/examples/meal-prep-nutrition/templates/nutrition-plan.md diff --git a/src/modules/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/templates/prep-schedule-section.md b/src/modules/bmb/workflows/workflow/data/examples/meal-prep-nutrition/templates/prep-schedule-section.md similarity index 100% rename from src/modules/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/templates/prep-schedule-section.md rename to src/modules/bmb/workflows/workflow/data/examples/meal-prep-nutrition/templates/prep-schedule-section.md diff --git a/src/modules/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/templates/profile-section.md b/src/modules/bmb/workflows/workflow/data/examples/meal-prep-nutrition/templates/profile-section.md similarity index 100% rename from src/modules/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/templates/profile-section.md rename to src/modules/bmb/workflows/workflow/data/examples/meal-prep-nutrition/templates/profile-section.md diff --git a/src/modules/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/templates/shopping-section.md b/src/modules/bmb/workflows/workflow/data/examples/meal-prep-nutrition/templates/shopping-section.md similarity index 100% rename from src/modules/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/templates/shopping-section.md rename to src/modules/bmb/workflows/workflow/data/examples/meal-prep-nutrition/templates/shopping-section.md diff --git a/src/modules/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/templates/strategy-section.md b/src/modules/bmb/workflows/workflow/data/examples/meal-prep-nutrition/templates/strategy-section.md similarity index 100% rename from src/modules/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/templates/strategy-section.md rename to src/modules/bmb/workflows/workflow/data/examples/meal-prep-nutrition/templates/strategy-section.md diff --git a/src/modules/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/workflow.md b/src/modules/bmb/workflows/workflow/data/examples/meal-prep-nutrition/workflow.md similarity index 95% rename from src/modules/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/workflow.md rename to src/modules/bmb/workflows/workflow/data/examples/meal-prep-nutrition/workflow.md index a63fa50f..8c72e740 100644 --- a/src/modules/bmb/workflows/create-workflow/data/examples/meal-prep-nutrition/workflow.md +++ b/src/modules/bmb/workflows/workflow/data/examples/meal-prep-nutrition/workflow.md @@ -55,4 +55,4 @@ Load and read full config from {project-root}/_bmad/bmm/config.yaml and resolve: ### 2. First Step EXECUTION -Load, read the full file and then execute `{project-root}/_bmad/bmb/reference/workflows/meal-prep-nutrition/steps/step-01-init.md` to begin the workflow. +Load, read the full file and then execute `./steps-c/step-01-init.md` to begin the workflow. diff --git a/src/modules/bmb/workflows/workflow/data/frontmatter-standards.md b/src/modules/bmb/workflows/workflow/data/frontmatter-standards.md new file mode 100644 index 00000000..f33d44cb --- /dev/null +++ b/src/modules/bmb/workflows/workflow/data/frontmatter-standards.md @@ -0,0 +1,179 @@ +# Frontmatter Standards + +**Purpose:** Variables, paths, and frontmatter rules for workflow steps. + +--- + +## Golden Rules + +1. **Only variables USED in the step** may be in frontmatter +2. **All file references MUST use `{variable}` format** - no hardcoded paths +3. **Paths within workflow folder MUST be relative** + +--- + +## Standard Variables (Always Available) + +| Variable | Example Value | +| ----------------- | -------------------------------------- | +| `{project-root}` | `/Users/user/dev/BMAD-METHOD` | +| `{project_name}` | `my-project` | +| `{output_folder}` | `/Users/user/dev/BMAD-METHOD/output` | +| `{user_name}` | `Brian` | +| `{communication_language}` | `english` | +| `{document_output_language}` | `english` | + +--- + +## Module-Specific Variables + +Workflows in a MODULE can access additional variables from its `module.yaml`. + +**BMB Module example:** +```yaml +bmb_creations_output_folder: '{project-root}/_bmad/bmb-creations' +``` + +**Standalone workflows:** Only have access to standard variables. + +--- + +## Frontmatter Structure + +### Required Fields +```yaml +--- +name: 'step-[N]-[name]' +description: '[what this step does]' +--- +``` + +### File References (ONLY if used in this step) +```yaml +--- +# File References +workflow_path: '{project-root}/_bmad/[module]/workflows/[workflow-name]' +thisStepFile: '{workflow_path}/steps/step-[N]-[name].md' +nextStepFile: '{workflow_path}/steps/step-[N+1]-[name].md' +workflowFile: '{workflow_path}/workflow.md' +outputFile: '{output_folder}/[output-name].md' + +# Task References (IF USED) +advancedElicitationTask: '{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml' +partyModeWorkflow: '{project-root}/_bmad/core/workflows/party-mode/workflow.md' + +# Template References (IF USED) +someTemplate: '{workflow_path}/templates/[template].md' + +# Data References (IF USED) +someData: '{workflow_path}/data/[data].csv' +--- +``` + +--- + +## Critical Rule: Unused Variables Forbidden + +### ❌ VIOLATION +```yaml +--- +outputFile: '{output_folder}/output.md' +partyModeWorkflow: '{project-root}/.../party-mode/workflow.md' # ❌ NOT USED! +--- +# Step body never mentions {partyModeWorkflow} +``` + +### ✅ CORRECT +```yaml +--- +outputFile: '{output_folder}/output.md' +--- +# Step body uses {outputFile} +``` + +--- + +## Path Rules + +### 1. Paths Within Workflow Folder = RELATIVE +```yaml +# ❌ WRONG - absolute for same-folder +someTemplate: '{project-root}/_bmad/bmb/workflows/my-workflow/templates/template.md' + +# ✅ CORRECT - relative or via workflow_path +someTemplate: '{workflow_path}/templates/template.md' +``` + +### 2. External References = Full Variable Paths +```yaml +# ✅ CORRECT +advancedElicitationTask: '{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml' +``` + +### 3. Output Files = Use output_folder Variable +```yaml +# ✅ CORRECT +outputFile: '{output_folder}/workflow-output-{project_name}.md' +``` + +--- + +## Defining New Variables + +Steps can define NEW variables that future steps will use. + +**Step 01 defines:** +```yaml +--- +targetWorkflowPath: '{bmb_creations_output_folder}/workflows/{workflow_name}' +--- +``` + +**Step 02 uses:** +```yaml +--- +targetWorkflowPath: '{bmb_creations_output_folder}/workflows/{workflow_name}' +workflowPlanFile: '{targetWorkflowPath}/plan.md' +--- +``` + +--- + +## Continuable Workflow Frontmatter + +```yaml +--- +stepsCompleted: ['step-01-init', 'step-02-gather', 'step-03-design'] +lastStep: 'step-03-design' +lastContinued: '2025-01-02' +date: '2025-01-01' +--- +``` + +**Step tracking:** Each step appends its NAME to `stepsCompleted`. + +--- + +## Variable Naming + +Use `snake_case` with descriptive prefixes: + +| Pattern | Usage | Example | +| --------- | ---------------------- | -------------------------- | +| `{*_path}` | Folder paths | `workflow_path`, `data_path` | +| `{*_file}` | Files | `outputFile`, `planFile` | +| `{*_template}` | Templates | `profileTemplate` | +| `{*_data}` | Data files | `dietaryData` | + +--- + +## Validation Checklist + +For every step frontmatter: +- [ ] `name` present, kebab-case +- [ ] `description` present +- [ ] All variables in frontmatter ARE used in step body +- [ ] All file references use `{variable}` format +- [ ] Paths within workflow folder are relative +- [ ] External paths use `{project-root}` variable +- [ ] Module variables only if workflow belongs to that module diff --git a/src/modules/bmb/workflows/workflow/data/input-discovery-standards.md b/src/modules/bmb/workflows/workflow/data/input-discovery-standards.md new file mode 100644 index 00000000..12f19d78 --- /dev/null +++ b/src/modules/bmb/workflows/workflow/data/input-discovery-standards.md @@ -0,0 +1,269 @@ +# Input Document Discovery Standards + +**Purpose:** How workflows discover, validate, and select input documents from prior workflows or external sources. + +--- + +## Discovery Patterns + +### Pattern 1: Prior Workflow Output +**Use when:** Workflow is part of a sequence (e.g., PRD → Architecture → Epics) + +**Example:** BMM module pipeline - each of these are a workflow with many steps: +``` +brainstorming → research → brief → PRD → UX → architecture → epics → sprint-planning +``` + +Each workflow checks for output from prior workflow(s). + +### Pattern 2: Module Folder Search +**Use when:** Documents stored in known project location + +**Example:** Manager review workflow searches `{project_folder}/employee-notes/` + +### Pattern 3: User-Specified Paths +**Use when:** User provides document locations + +**Example:** Tax workflow asks for financial statement paths + +### Pattern 4: Pattern-Based Discovery +**Use when:** Search by file naming pattern + +**Example:** Find all `*-brief.md` files in `{planning_artifacts}/` + +--- + +## Discovery Step Pattern + +**When:** Step 1 (init) or Step 2 (discovery) + +**Frontmatter:** +```yaml +--- +# Input discovery variables +inputDocuments: [] # Populated with discovered docs +requiredInputCount: 1 # Minimum required to proceed +optionalInputCount: 0 # Additional docs user may provide +moduleInputFolder: '{planning_artifacts}' # Where to search +inputFilePatterns: # File patterns to match + - '*-prd.md' + - '*-ux.md' +--- +``` + +**Discovery Logic:** +```markdown +## 1. Check for Known Prior Workflow Outputs + +Search in order: +1. {module_output_folder}/[known-prior-workflow-output].md +2. {project_folder}/[standard-locations]/ +3. {planning_artifacts}/ +4. User-provided paths + +## 2. Pattern-Based Search + +If no known prior workflow, search by patterns: +- Look for files matching {inputFilePatterns} +- Search in {moduleInputFolder} +- Search in {project_folder}/docs/ + +## 3. Present Findings to User + +"Found these documents that may be relevant: +- [1] prd-my-project.md (created 3 days ago) +- [2] ux-research.md (created 1 week ago) +- [3] competitor-analysis.md + +Which would you like to use? You can select multiple, or provide additional paths." + +## 4. Confirm and Load + +User confirms selection → Load selected documents +Add to {inputDocuments} array in output frontmatter +``` + +--- + +## Required vs Optional Inputs + +### Required Inputs +Workflow cannot proceed without these. + +**Example:** Architecture workflow requires PRD + +```markdown +## INPUT REQUIREMENT: + +This workflow requires a Product Requirements Document to proceed. + +Searching for PRD in: +- {bmm_creations_output_folder}/prd-*.md +- {planning_artifacts}/*-prd.md +- {project_folder}/docs/*-prd.md + +[If found:] +"Found PRD: prd-my-project.md. Use this?" +[If not found:] +"No PRD found. This workflow requires a PRD to continue. +Please provide the path to your PRD, or run the PRD workflow first." +``` + +### Optional Inputs +Workflow can proceed without these, but user may include. + +**Example:** UX workflow can use research docs if available + +```markdown +## OPTIONAL INPUTS: + +This workflow can incorporate research documents if available. + +Searching for research in: +- {bmm_creations_output_folder}/research-*.md +- {project_folder}/research/ + +[If found:] +"Found these research documents: +- [1] user-interviews.md +- [2] competitive-analysis.md +Include any? (None required to proceed)" +``` + +--- + +## Module Workflow Chaining + +**For modules with sequential workflows:** + +**Frontmatter in workflow.md:** +```yaml +--- +## INPUT FROM PRIOR WORKFLOFS + +### Required Inputs: +- {module_output_folder}/prd-{project_name}.md + +### Optional Inputs: +- {module_output_folder}/ux-research-{project_name}.md +- {project_folder}/docs/competitor-analysis.md +--- +``` + +**Step 1 discovery:** +```markdown +## 1. Discover Prior Workflow Outputs + +Check for required inputs: +1. Look for {module_output_folder}/prd-{project_name}.md +2. If missing → Error: "Please run PRD workflow first" +3. If found → Confirm with user + +Check for optional inputs: +1. Search {module_output_folder}/ for research-*.md +2. Search {project_folder}/docs/ for *-analysis.md +3. Present findings to user +4. Add selections to {inputDocuments} +``` + +--- + +## Input Validation + +After discovery, validate inputs: + +```markdown +## INPUT VALIDATION: + +For each discovered document: +1. Load and read frontmatter +2. Check workflowType field (should match expected) +3. Check completeness (stepsCompleted should be complete) +4. Check date (warn if document is very old) + +[If validation fails:] +"Document prd-my-project.md appears incomplete. +Last step: step-06 (of 11) +Recommend completing PRD workflow before proceeding. +Proceed anyway? [Y]es [N]o" +``` + +--- + +## Multiple Input Selection + +**When user can select multiple documents:** + +```markdown +## Document Selection + +"Found these relevant documents: +[1] prd-my-project.md (3 days ago) ✓ Recommended +[2] prd-v1.md (2 months ago) ⚠ Older version +[3] ux-research.md (1 week ago) + +Enter numbers to include (comma-separated), or 'none' to skip: +> 1, 3 + +Selected: prd-my-project.md, ux-research.md" +``` + +**Track in frontmatter:** +```yaml +--- +inputDocuments: + - path: '{output_folder}/prd-my-project.md' + type: 'prd' + source: 'prior-workflow' + selected: true + - path: '{output_folder}/ux-research.md' + type: 'research' + source: 'prior-workflow' + selected: true +--- +``` + +--- + +## Search Path Variables + +Common module variables for input discovery: + +| Variable | Purpose | +| ------------------------ | -------------------------- | +| `{module_output_folder}` | Prior workflow outputs | +| `{planning_artifacts}` | General planning docs | +| `{project_folder}/docs` | Project documentation | +| `{product_knowledge}` | Product-specific knowledge | +| `{user_documents}` | User-provided location | + +--- + +## Discovery Step Template + +```markdown +--- +name: 'step-01-init' +description: 'Initialize and discover input documents' + +# Input Discovery +inputDocuments: [] +requiredInputCount: 1 +moduleInputFolder: '{module_output_folder}' +inputFilePatterns: + - '*-prd.md' +--- +``` + +--- + +## Validation Checklist + +For input discovery: +- [ ] Required inputs defined in step frontmatter +- [ ] Search paths defined (module variables or patterns) +- [ ] User confirmation before using documents +- [ ] Validation of document completeness +- [ ] Clear error messages when required inputs missing +- [ ] Support for multiple document selection +- [ ] Optional inputs clearly marked as optional diff --git a/src/modules/bmb/workflows/workflow/data/intent-vs-prescriptive-spectrum.md b/src/modules/bmb/workflows/workflow/data/intent-vs-prescriptive-spectrum.md new file mode 100644 index 00000000..ed8df32d --- /dev/null +++ b/src/modules/bmb/workflows/workflow/data/intent-vs-prescriptive-spectrum.md @@ -0,0 +1,50 @@ +# Intent vs Prescriptive Spectrum + +**Principle:** Workflows lean toward **intent** (goals) not **prescription** (exact wording). The more intent-based, the more adaptive and creative the LLM can be. + +--- + +## When to Use Each + +### Intent-Based (Default) +**Use for:** Most workflows - creative, exploratory, collaborative +**Step instruction:** "Help the user understand X using multi-turn conversation. Probe to get good answers. Ask 1-2 questions at a time, not a laundry list." +**LLM figures out:** Exact wording, question order, how to respond + +### Prescriptive (Exception) +**Use for:** Compliance, safety, legal, medical, regulated industries +**Step instruction:** "Say exactly: 'Do you currently experience fever, cough, or fatigue?' Wait for response. Then ask exactly: 'When did symptoms begin?'" +**LLM follows:** Exact script, specific order, no deviation + +--- + +## Examples + +### Intent-Based (Good for most) +``` +"Guide the user through discovering their ideal nutrition plan. +Use multi-turn conversation. Ask 1-2 questions at a time. +Think about their responses before asking follow-ups. +Probe to understand preferences, restrictions, goals." +``` + +### Prescriptive (Only when required) +``` +"Medical intake - ask exactly: +1. 'Do you have any of these symptoms: fever, cough, fatigue?' +2. 'When did symptoms begin?' +3. 'Have you traveled recently in the last 14 days?' +Follow sequence precisely. Do not deviate." +``` + +--- + +## Step Writing Tips + +- **Default to intent** - give goals, not scripts +- **Use "think"** - "Think about their response before..." +- **Multi-turn** - "Use conversation, not interrogation" +- **Progressive** - "Ask 1-2 questions at a time" +- **Probe** - "Ask follow-ups to understand deeper" + +Only use prescriptive when compliance/regulation requires it. diff --git a/src/modules/bmb/workflows/workflow/data/menu-handling-standards.md b/src/modules/bmb/workflows/workflow/data/menu-handling-standards.md new file mode 100644 index 00000000..0247052e --- /dev/null +++ b/src/modules/bmb/workflows/workflow/data/menu-handling-standards.md @@ -0,0 +1,167 @@ +# Menu Handling Standards + +**CRITICAL:** Every menu MUST have a handler section. No exceptions. + +--- + +## Reserved Letters + +| Letter | Purpose | After Execution | +| ------ | -------------------- | ------------------------------ | +| **A** | Advanced Elicitation | Redisplay menu | +| **P** | Party Mode | Redisplay menu | +| **C** | Continue/Accept | Save → update → load next step | +| **X** | Exit/Cancel | End workflow | + +**Custom letters** allowed (L/R/F/etc.) but don't conflict with reserved. + +--- + +## Required Structure + +### Section 1: Display +```markdown +### N. Present MENU OPTIONS + +Display: "**Select:** [A] [action] [P] [action] [C] Continue" +``` + +### Section 2: Handler (MANDATORY) +```markdown +#### Menu Handling Logic: +- IF A: Execute {advancedElicitationTask}, and when finished redisplay the menu +- IF P: Execute {partyModeWorkflow}, and when finished redisplay the menu +- IF C: Save content to {outputFile}, update frontmatter, then load, read entire file, then execute {nextStepFile} +- IF Any other: help user, then [Redisplay Menu Options](#n-present-menu-options) +``` + +### Section 3: Execution Rules +```markdown +#### EXECUTION RULES: +- ALWAYS halt and wait for user input after presenting menu +- ONLY proceed to next step when user selects 'C' +- After other menu items execution, return to this menu +``` + +--- + +## When To Include A/P + +### DON'T Include A/P: +- Step 1 (init) - no content to refine yet +- Step 2 if only loading documents +- Validation sequences - auto-flow instead +- Simple data gathering + +### DO Include A/P: +- Collaborative content creation +- User might want alternatives +- Quality gate before proceeding +- Creative exploration valuable + +--- + +## Menu Patterns + +### Pattern 1: Standard A/P/C +```markdown +Display: "**Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Continue" + +#### Menu Handling Logic: +- IF A: Execute {advancedElicitationTask}, and when finished redisplay the menu +- IF P: Execute {partyModeWorkflow}, and when finished redisplay the menu +- IF C: Save content to {outputFile}, update frontmatter, then load, read entire file, then execute {nextStepFile} +- IF Any other: help user, then [Redisplay Menu Options](#n-present-menu-options) + +#### EXECUTION RULES: +- ALWAYS halt and wait for user input after presenting menu +- ONLY proceed to next step when user selects 'C' +- After other menu items execution, return to this menu +``` + +### Pattern 2: C Only (No A/P) +```markdown +Display: "**Select:** [C] Continue" + +#### Menu Handling Logic: +- IF C: Save content to {outputFile}, update frontmatter, then load, read entire file, then execute {nextStepFile} +- IF Any other: help user, then [Redisplay Menu Options](#n-present-menu-options) + +#### EXECUTION RULES: +- ALWAYS halt and wait for user input after presenting menu +- ONLY proceed to next step when user selects 'C' +``` + +**Use for:** Step 1, document discovery, simple progression + +### Pattern 3: Auto-Proceed (No Menu) +```markdown +Display: "**Proceeding to [next step]...**" + +#### Menu Handling Logic: +- After [completion condition], immediately load, read entire file, then execute {nextStepFile} + +#### EXECUTION RULES: +- This is an [auto-proceed reason] step with no user choices +- Proceed directly to next step after setup +``` + +**Use for:** Init steps, validation sequences + +### Pattern 4: Branching +```markdown +Display: "**Select:** [L] Load Existing [N] Create New [C] Continue" + +#### Menu Handling Logic: +- IF L: Load existing document, then load, read entire file, then execute {stepForExisting} +- IF N: Create new document, then load, read entire file, then execute {stepForNew} +- IF C: Save content to {outputFile}, update frontmatter, check {condition}, then load appropriate step +- IF Any other: help user, then [Redisplay Menu Options](#n-present-menu-options) + +#### EXECUTION RULES: +- ALWAYS halt and wait for user input after presenting menu +- Branching options load different steps based on user choice +``` + +--- + +## Critical Violations + +### ❌ DON'T: +```markdown +# Missing Handler Section +Display: "**Select:** [C] Continue" +[NO HANDLER - CRITICAL ERROR!] + +# A/P in Step 1 (doesn't make sense) +Display: "**Select:** [A] Advanced Elicitation [P] Party Mode [C] Continue" + +# Forgetting redisplay +- IF A: Execute {advancedElicitationTask} +# Should end with: ", and when finished redisplay the menu" + +# Missing halt instruction +#### EXECUTION RULES: +- ONLY proceed to next step when user selects 'C' +# MISSING: "ALWAYS halt and wait for user input after presenting menu" +``` + +### ✅ DO: +- Handler section immediately follows Display +- "Halt and wait" in EXECUTION RULES +- Non-C options specify "redisplay menu" +- A/P only when appropriate for step type + +--- + +## Validation Checklist + +For every menu: +- [ ] Display section present +- [ ] Handler section immediately follows +- [ ] EXECUTION RULES section present +- [ ] "Halt and wait" instruction included +- [ ] A/P options appropriate for step type +- [ ] Non-C options redisplay menu +- [ ] C option: save → update → load next +- [ ] All file references use variables diff --git a/src/modules/bmb/workflows/workflow/data/output-format-standards.md b/src/modules/bmb/workflows/workflow/data/output-format-standards.md new file mode 100644 index 00000000..23e6439f --- /dev/null +++ b/src/modules/bmb/workflows/workflow/data/output-format-standards.md @@ -0,0 +1,188 @@ +# Output Format Standards + +**Purpose:** How workflows produce documents and handle step output. + +--- + +## Golden Rule + +**Every step MUST output to a document BEFORE loading the next step.** + +Two patterns: +1. **Direct-to-Final:** Steps append to final document +2. **Plan-then-Build:** Steps append to plan → build step consumes plan + +--- + +## Menu C Option Sequence + +When user selects **C (Continue)**: +1. **Append/Write** to document (plan or final) +2. **Update frontmatter** (append this step to `stepsCompleted`) +3. **THEN** load next step + +```markdown +- IF C: Save content to {outputFile}, update frontmatter, then load, read entire file, then execute {nextStepFile} +``` + +--- + +## Output Patterns + +### Pattern 1: Plan-then-Build + +**Use when:** Design/plan before building/creating + +``` +Step 1 (init) → Creates plan.md from template +Step 2 (gather) → Appends requirements to plan.md +Step 3 (design) → Appends design decisions to plan.md +Step 4 (review) → Appends review/approval to plan.md +Step 5 (build) → READS plan.md, CREATES final artifacts +``` + +**Plan frontmatter:** +```yaml +workflowName: [name] +creationDate: [date] +stepsCompleted: ['step-01-init', 'step-02-gather'] +status: PLANNING_COMPLETE +``` + +**Example:** Workflow creation - steps append to plan, build step generates files + +### Pattern 2: Direct-to-Final + +**Use when:** Each step contributes to final deliverable + +``` +Step 1 (init) → Creates final-doc.md from minimal template +Step 2 (section) → Appends Section 1 +Step 3 (section) → Appends Section 2 +Step 4 (section) → Appends Section 3 +Step 5 (polish) → Optimizes entire document +``` + +**Example:** Meal prep nutrition plan - each step adds a section + +--- + +## Four Template Types + +### 1. Free-Form (RECOMMENDED) + +**Characteristics:** Minimal template, progressive append, final polish + +**Template:** +```yaml +--- +stepsCompleted: [] +lastStep: '' +date: '' +user_name: '' +--- + +# {{document_title}} + +[Content appended progressively by workflow steps] +``` + +**Use when:** Most workflows - flexible, collaborative + +### 2. Structured + +**Characteristics:** Single template with placeholders, clear sections + +**Template:** +```markdown +# {{title}} + +## {{section_1}} +[Content to be filled] + +## {{section_2}} +[Content to be filled] +``` + +**Use when:** Reports, proposals, documentation + +### 3. Semi-Structured + +**Characteristics:** Core required sections + optional additions + +**Use when:** Forms, checklists, meeting minutes + +### 4. Strict + +**Characteristics:** Multiple templates, exact field definitions + +**Use when:** Rarely - compliance, legal, regulated + +--- + +## Template Syntax + +```markdown +{{variable}} # Handlebars style (preferred) +[variable] # Bracket style (also supported) +``` + +**Keep templates lean** - structure only, not content. + +--- + +## Step-to-Output Mapping + +Steps should be in ORDER of document appearance: + +``` +Step 1: Init (creates doc) +Step 2: → ## Section 1 +Step 3: → ## Section 2 +Step 4: → ## Section 3 +Step 5: → ## Section 4 +Step 6: Polish (optimizes entire doc) +``` + +**Critical:** Use ## Level 2 headers for main sections - allows document splitting if needed. + +--- + +## Final Polish Step + +For free-form workflows, include a polish step that: +1. Loads entire document +2. Reviews for flow and coherence +3. Reduces duplication +4. Ensures proper ## Level 2 headers +5. Improves transitions +6. Keeps general order but optimizes readability + +--- + +## Output File Patterns + +```yaml +# Single output +outputFile: '{output_folder}/document-{project_name}.md' + +# Time-stamped +outputFile: '{output_folder}/document-{project_name}-{timestamp}.md' + +# User-specific +outputFile: '{output_folder}/document-{user_name}-{project_name}.md' +``` + +--- + +## Validation Checklist + +For workflow output design: +- [ ] Output format type selected +- [ ] Template created if needed +- [ ] Steps ordered to match document structure +- [ ] Each step outputs to document (except init/final) +- [ ] Level 2 headers for main sections +- [ ] Final polish step for free-form workflows +- [ ] Frontmatter tracking for continuable workflows +- [ ] Templates use consistent placeholder syntax diff --git a/src/modules/bmb/workflows/workflow/data/step-file-rules.md b/src/modules/bmb/workflows/workflow/data/step-file-rules.md new file mode 100644 index 00000000..b7d59d47 --- /dev/null +++ b/src/modules/bmb/workflows/workflow/data/step-file-rules.md @@ -0,0 +1,235 @@ +# Step File Rules + +**Purpose:** Quick reference for step file structure and compliance. See linked data files for detailed standards. + +--- + +## File Size Limits + +| Metric | Value | +| ----------- | -------- | +| Recommended | < 200 lines | +| Absolute Maximum | 250 lines | + +**If exceeded:** Split into multiple steps or extract content to `/data/` files. + +--- + +## Required Step Structure + +```markdown +--- +name: 'step-[N]-[name]' +description: '[what this step does]' + +# File References (ONLY variables used in this step!) +[file references in {variable} format] +--- + +# Step [N]: [Name] + +## STEP GOAL: +[Single sentence: what this step accomplishes] + +## MANDATORY EXECUTION RULES (READ FIRST): +### Universal Rules: +- 🛑 NEVER generate content without user input +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read +- 📋 YOU ARE A FACILITATOR, not a content generator + +### Role Reinforcement: +- ✅ You are a [specific role] +- ✅ We engage in collaborative dialogue, not command-response +- ✅ You bring [expertise], user brings [theirs] +- ✅ Together we produce something better + +### Step-Specific Rules: +- 🎯 Focus only on [specific task] +- 🚫 FORBIDDEN to [prohibited action] +- 💬 Approach: [how to engage] + +## EXECUTION PROTOCOLS: +- 🎯 [Protocol 1] +- 💾 [Protocol 2 - save/update] +- 📖 [Protocol 3 - tracking] + +## CONTEXT BOUNDARIES: +- Available context: [what's available] +- Focus: [what to focus on] +- Limits: [boundaries] +- Dependencies: [what this depends on] + +## Sequence of Instructions: +### 1. [Action] +[Instructions] + +### N. Present MENU OPTIONS +[Menu section - see menu-handling-standards.md] + +## 🚨 SYSTEM SUCCESS/FAILURE METRICS: +### ✅ SUCCESS: +[Success criteria] +### ❌ SYSTEM FAILURE: +[Failure criteria] +**Master Rule:** Skipping steps is FORBIDDEN. +``` + +--- + +## Critical Rules (Quick Reference) + +### Frontmatter +- ✅ Only variables USED in the step body +- ✅ All file references use `{variable}` format +- ✅ Relative paths within workflow folder +- See: `frontmatter-standards.md` + +### Menus +- ✅ Handler section MUST follow display +- ✅ "Halt and wait" in execution rules +- ✅ A/P options only when appropriate +- ✅ Non-C options redisplay menu +- See: `menu-handling-standards.md` + +### Progressive Disclosure +- ✅ Only load next step when user selects 'C' +- ✅ Read entire step file before execution +- ✅ Don't create mental todos from future steps + +### Continuable Workflows +- ✅ Append step number to `stepsCompleted` +- ✅ Don't hardcode full array +- See: `workflow-type-criteria.md` + +--- + +## Data Files Reference + +| File | Purpose | +| ----------------------- | --------------------------------------------- | +| `frontmatter-standards.md` | Variables, paths, frontmatter rules | +| `menu-handling-standards.md` | Menu patterns, handler requirements | +| `output-format-standards.md` | Document output, template types | +| `workflow-type-criteria.md` | Continuable, module, tri-modal decisions | +| `step-type-patterns.md` | Templates for init/middle/final/branch steps | +| `trimodal-workflow-structure.md` | Create/Edit/Validate folder structure | + +--- + +## Step Type Reference + +| Step Type | Template/Reference | +| ------------------- | ------------------------------------------- | +| Init (non-continuable) | Auto-proceed, no continuation logic | +| Init (continuable) | `step-01-init-continuable-template.md` | +| Continuation (01b) | `step-1b-template.md` | +| Middle (standard) | A/P/C menu, collaborative content | +| Middle (simple) | C only menu, no A/P | +| Branch/Conditional | Custom menu options, routing to different steps | +| Validation sequence | Auto-proceed through checks | +| Final | No next step, completion message | + +See: `step-type-patterns.md` + +--- + +## Frontmatter Variables + +### Standard (Always Available) +- `{project-root}` +- `{project_name}` +- `{output_folder}` +- `{user_name}` +- `{communication_language}` +- `{document_output_language}` + +### Module-Specific (e.g., BMB) +- `{bmb_creations_output_folder}` + +### User-Defined +- New variables can be defined in steps for future steps + +See: `frontmatter-standards.md` + +--- + +## Validation Checklist + +For every step file: + +- [ ] File < 200 lines (250 max) +- [ ] `name` and `description` in frontmatter +- [ ] All frontmatter variables are used +- [ ] File references use `{variable}` format +- [ ] Relative paths within workflow folder +- [ ] Handler section follows menu display +- [ ] "Halt and wait" in execution rules +- [ ] A/P options appropriate for step type +- [ ] C option saves and loads next step +- [ ] Non-C options redisplay menu +- [ ] StepsCompleted appended (if continuable) +- [ ] Success/failure metrics present + +--- + +## Quick Menu Reference + +```markdown +### N. Present MENU OPTIONS + +Display: "**Select:** [A] [action A] [P] [action P] [C] Continue" + +#### Menu Handling Logic: +- IF A: Execute {advancedElicitationTask}, and when finished redisplay the menu +- IF P: Execute {partyModeWorkflow}, and when finished redisplay the menu +- IF C: Save content to {outputFile}, update frontmatter, then load, read entire file, then execute {nextStepFile} +- IF Any other comments or queries: help user respond then [Redisplay Menu Options](#n-present-menu-options) + +#### EXECUTION RULES: +- ALWAYS halt and wait for user input after presenting menu +- ONLY proceed to next step when user selects 'C' +- After other menu items execution, return to this menu +``` + +--- + +## Common Violations + +| ❌ Violation | ✅ Fix | +| ------------------------------------- | ---------------------------------------------- | +| Unused variable in frontmatter | Remove unused variables | +| Hardcoded file path | Use `{variable}` format | +| A/P menu in step 1 | Remove A/P (inappropriate for init) | +| Missing handler section | Add handler after menu display | +| No "halt and wait" instruction | Add to EXECUTION RULES | +| Hardcoded `stepsCompleted: [1,2,3]` | Append: "update stepsCompleted to add this step" | +| File > 250 lines | Split into multiple steps or extract to /data/ | +| Absolute path for same-folder ref | Use relative path or `{workflow_path}` | + +--- + +## When to Extract to Data Files + +Extract step content to `/data/` when: +- Step file exceeds 200 lines +- Content is reference material +- Content is reused across steps +- Content is domain-specific (examples, patterns) + +**Data file types:** +- `.md` - Reference documentation +- `.csv` - Structured data for lookup +- `examples/` - Reference implementations + +--- + +## Tri-Modal Workflow Note + +For Create/Edit/Validate workflows: +- Each mode has its own `steps-c/`, `steps-e/`, `steps-v/` folder +- NO shared step files (`s-*.md`) between modes +- All modes share `/data/` folder +- This prevents confusion and routing errors + +See: `trimodal-workflow-structure.md` diff --git a/src/modules/bmb/workflows/workflow/data/step-type-patterns.md b/src/modules/bmb/workflows/workflow/data/step-type-patterns.md new file mode 100644 index 00000000..4bc9478a --- /dev/null +++ b/src/modules/bmb/workflows/workflow/data/step-type-patterns.md @@ -0,0 +1,312 @@ +# Step Type Patterns + +**Purpose:** Templates for different step types. + +--- + +## Core Step Structure + +All steps share this skeleton: +```markdown +--- +name: 'step-[N]-[name]' +description: '[what it does]' +[file references - ONLY used variables] +--- + +# Step [N]: [Name] + +## STEP GOAL: +[Single sentence goal] + +## MANDATORY EXECUTION RULES (READ FIRST): +### Universal Rules: +- 🛑 NEVER generate content without user input +- 📖 CRITICAL: Read complete step file before action +- 🔄 CRITICAL: When loading next with 'C', read entire file +- 📋 YOU ARE A FACILITATOR, not content generator + +### Role Reinforcement: +- ✅ You are [specific role] +- ✅ Collaborative dialogue, not command-response +- ✅ You bring [expertise], user brings [theirs] + +### Step-Specific Rules: +- 🎯 Focus only on [specific task] +- 🚫 FORBIDDEN to [prohibited action] +- 💬 Approach: [how to engage] + +## EXECUTION PROTOCOLS: +- 🎯 Follow the MANDATORY SEQUENCE exactly +- 💾 [Additional protocol] +- 📖 [Additional protocol] + +## CONTEXT BOUNDARIES: +- Available context: [what's available] +- Focus: [what to focus on] +- Limits: [boundaries] +- Dependencies: [what this depends on] + +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change. + +### 1. [First action] +[Instructions] + +### N. Present MENU OPTIONS +[Menu section - see menu-handling-standards.md] + +## 🚨 SYSTEM SUCCESS/FAILURE METRICS: +### ✅ SUCCESS: [criteria] +### ❌ SYSTEM FAILURE: [criteria] +**Master Rule:** Skipping steps is FORBIDDEN. +``` + +--- + +## Step Types + +### 1. Init Step (Non-Continuable) + +**Use:** Single-session workflow + +**Frontmatter:** +```yaml +--- +name: 'step-01-init' +description: 'Initialize [workflow]' +thisStepFile: '{workflow_path}/steps/step-01-init.md' +nextStepFile: '{workflow_path}/steps/step-02-[name].md' +outputFile: '{output_folder}/[output].md' +templateFile: '{workflow_path}/templates/[template].md' +--- +``` + +**Characteristics:** +- No continuation detection +- Auto-proceeds to step 2 +- No A/P menu +- Creates output from template + +**Menu:** Auto-proceed (no user choice) + +### 2. Init Step (Continuable) + +**Use:** Multi-session workflow + +**Frontmatter:** Add `continueFile` reference +```yaml +continueFile: '{workflow_path}/steps/step-01b-continue.md' +``` + +**Logic:** +```markdown +## 1. Check for Existing Workflow +- Look for {outputFile} +- If exists AND has stepsCompleted → STOP, load {continueFile} +- If not exists → continue to setup +``` + +**Reference:** `step-01-init-continuable-template.md` + +### 3. Continuation Step (01b) + +**Use:** Paired with continuable init + +**Frontmatter:** +```yaml +--- +name: 'step-01b-continue' +description: 'Handle workflow continuation' +outputFile: '{output_folder}/[output].md' +workflowFile: '{workflow_path}/workflow.md' +--- +``` + +**Logic:** +1. Read `stepsCompleted` array from output +2. Read last completed step file to find nextStep +3. Welcome user back +4. Route to appropriate step + +**Reference:** `step-1b-template.md` + +### 4. Middle Step (Standard) + +**Use:** Collaborative content generation + +**Frontmatter:** +```yaml +--- +name: 'step-[N]-[name]' +nextStepFile: '{workflow_path}/steps/step-[N+1]-[name].md' +outputFile: '{output_folder}/[output].md' +advancedElicitationTask: '{project-root}/.../advanced-elicitation/workflow.xml' +partyModeWorkflow: '{project-root}/.../party-mode/workflow.md' +--- +``` + +**Menu:** A/P/C pattern + +### 5. Middle Step (Simple) + +**Use:** Data gathering, no refinement needed + +**Menu:** C only (no A/P) + +### 6. Branch Step + +**Use:** User choice determines next path + +**Frontmatter:** +```yaml +nextStepFile: '{workflow_path}/steps/step-[default].md' +altStepFile: '{workflow_path}/steps/step-[alternate].md' +``` + +**Menu:** Custom letters (L/R/etc.) with branching logic + +### 7. Validation Sequence Step + +**Use:** Multiple checks without user interruption + +**Menu:** Auto-proceed to next validation + +**Pattern:** +```markdown +## 1. Perform validation check +[Check logic] + +## 2. Write results to {outputFile} +Append findings + +## 3. Proceed to next validation +Display: "**Proceeding to next check...**" +→ Immediately load {nextValidationStep} +``` + +### 8. Init Step (With Input Discovery) + +**Use:** Workflow that requires documents from prior workflows or external sources + +**Frontmatter:** +```yaml +--- +name: 'step-01-init' +description: 'Initialize and discover input documents' +inputDocuments: [] +requiredInputCount: 1 +moduleInputFolder: '{module_output_folder}' +inputFilePatterns: + - '*-prd.md' + - '*-ux.md' +--- +``` + +**Characteristics:** +- Discovers documents from prior workflows +- Searches by folder, pattern, or user-provided paths +- Validates inputs are complete +- User confirms which documents to use +- Auto-proceeds when required inputs found + +**Logic:** +```markdown +## 1. Discover Required Inputs +Search {moduleInputFolder} for {inputFilePatterns} +Search {project_folder}/docs/ for {inputFilePatterns} + +## 2. Present Findings +"Found these documents: +[1] prd-my-project.md (3 days ago) ✓ +[2] ux-research.md (1 week ago) +Which would you like to use?" + +## 3. Validate and Load +Check workflowType, stepsCompleted, date +Load selected documents +Add to {inputDocuments} array + +## 4. Auto-Proceed +If all required inputs found → proceed to step 2 +If missing → Error with guidance +``` + +**Reference:** `input-discovery-standards.md` + +### 9. Final Polish Step + +**Use:** Optimizes document built section-by-section + +**Frontmatter:** +```yaml +--- +name: 'step-[N]-polish' +description: 'Optimize and finalize document' +outputFile: '{output_folder}/[document].md' +--- +``` + +**Characteristics:** +- Loads entire document +- Reviews for flow and coherence +- Reduces duplication +- Ensures proper ## Level 2 headers +- Improves transitions +- Keeps general order but optimizes readability + +**Logic:** +```markdown +## 1. Load Complete Document +Read {outputFile} entirely + +## 2. Document Optimization +Review entire document for: +1. Flow and coherence +2. Duplication (remove while preserving essential info) +3. Proper ## Level 2 section headers +4. Smooth transitions between sections +5. Overall readability + +## 3. Optimize +Make improvements while maintaining: +- General order of sections +- Essential information +- User's voice and intent + +## 4. Final Output +Save optimized document +Mark workflow complete +``` + +**Use for:** Free-form output workflows (most document-producing workflows) + +### 10. Final Step + +**Use:** Last step, completion + +**Frontmatter:** No `nextStepFile` + +**Logic:** +- Update frontmatter to mark workflow complete +- Provide final summary +- No next step + +--- + +## Step Size Guidelines + +| Type | Recommended | Maximum | +| ------------------------ | ----------- | ------- | +| Init | < 100 | 150 | +| Init (with discovery) | < 150 | 200 | +| Continuation | < 150 | 200 | +| Middle (simple) | < 150 | 200 | +| Middle (complex) | < 200 | 250 | +| Branch | < 150 | 200 | +| Validation sequence | < 100 | 150 | +| Final polish | < 150 | 200 | +| Final | < 150 | 200 | + +**If exceeded:** Split into multiple steps or extract to `/data/` files. diff --git a/src/modules/bmb/workflows/workflow/data/trimodal-workflow-structure.md b/src/modules/bmb/workflows/workflow/data/trimodal-workflow-structure.md new file mode 100644 index 00000000..bb425614 --- /dev/null +++ b/src/modules/bmb/workflows/workflow/data/trimodal-workflow-structure.md @@ -0,0 +1,209 @@ +# Tri-Modal Workflow Structure + +**Purpose:** The golden rule standard for complex critical workflows that require create, validate, and edit capabilities. + +--- + +## The Golden Rule + +**For complex critical workflows: Implement tri-modal structure (create/validate/edit) with cross-mode integration.** + +This pattern ensures: +- Quality through standalone validation +- Maintainability through dedicated edit mode +- Flexibility through conversion paths for non-compliant input + +**Cross-mode integration patterns:** +- Create → Validation (handoff after build) +- Edit → Validation (verify changes) +- Edit → Create/conversion (for non-compliant input) +- Validation → Edit (fix issues found) +- All modes run standalone via workflow.md routing + +--- + +## Directory Structure + +``` +workflow-name/ +├── workflow.md # Entry point with mode routing +├── data/ # SHARED standards and reference +│ ├── [domain]-standards.md +│ └── [domain]-patterns.md +├── steps-c/ # Create (self-contained) +│ ├── step-00-conversion.md # Entry for non-compliant input +│ ├── step-01-init.md +│ └── step-N-complete.md +├── steps-e/ # Edit (self-contained) +│ ├── step-01-assess.md # Checks compliance, routes if needed +│ └── step-N-complete.md +└── steps-v/ # Validate (self-contained, runs standalone) + └── step-01-validate.md +``` + +--- + +## Mode Responsibilities + +### Create Mode (steps-c/) + +**Primary:** Build new entities from scratch +**Secondary:** Convert non-compliant input via step-00-conversion + +**Key patterns:** +- step-00-conversion: Loads non-compliant input, extracts essence, creates plan with `conversionFrom` metadata +- Final step routes to validation (optional but recommended) +- Confirmation step checks `conversionFrom` to verify coverage vs new workflow + +### Edit Mode (steps-e/) + +**Primary:** Modify existing compliant entities +**Secondary:** Detect non-compliance and route to conversion + +**Key patterns:** +- step-01-assess: Checks compliance first +- Non-compliant → Offer route to step-00-conversion (not step-01-discovery) +- Post-edit → Offer validation (reuse validation workflow) +- During edits → Check standards, offer to fix non-compliance + +### Validate Mode (steps-v/) + +**Primary:** Standalone validation against standards +**Secondary:** Generates actionable reports + +**Key patterns:** +- Runs standalone (invoked via -v flag or direct call) +- Auto-proceeds through all checks +- Generates report with issue severity +- Report consumed by edit mode for fixes + +--- + +## workflow.md Routing Pattern + +```yaml +## INITIALIZATION SEQUENCE + +### 1. Mode Determination + +**Check invocation:** +- "create" / -c → mode = create +- "validate" / -v → mode = validate +- "edit" / -e → mode = edit + +**If create mode:** Ask "From scratch or convert existing?" +- From scratch → steps-c/step-01-init.md +- Convert → steps-c/step-00-conversion.md + +**If unclear:** Ask user to select mode + +### 2. Route to First Step + +**IF mode == create:** +Route to appropriate create entry (init or conversion) + +**IF mode == validate:** +Prompt for path → load steps-v/step-01-validate.md + +**IF mode == edit:** +Prompt for path → load steps-e/step-01-assess.md +``` + +**Critical:** workflow.md is lean. No step listings. Only routing logic. + +--- + +## Cross-Mode Integration Points + +### 1. Edit → Create (Non-Compliant Detection) + +**In edit step-01-assess:** +```yaml +Check workflow compliance: + - Compliant → Continue to edit steps + - Non-compliant → Offer conversion + - IF user accepts: Load steps-c/step-00-conversion.md with sourceWorkflowPath +``` + +### 2. Create/Edit → Validation + +**Both create and edit can invoke validation:** +```yaml +# In create final step or edit post-edit step +Offer: "Run validation?" + - IF yes: Load ../steps-v/step-01-validate.md + - Validation runs standalone, returns report + - Resume create/edit with validation results +``` + +### 3. Validation → Edit + +**After validation generates report:** +```yaml +# User can invoke edit mode with report as input +"Fix issues found?" + - IF yes: Load steps-e/step-01-assess.md with validationReport path +``` + +### 4. Conversion Coverage Tracking + +**In create step-10-confirmation:** +```yaml +Check workflowPlan metadata: + - IF conversionFrom exists: + - Load original workflow + - Compare each step/instruction + - Report coverage percentage + - ELSE (new workflow): + - Validate all plan requirements implemented +``` + +--- + +## When to Use Tri-Modal + +**Use Tri-Modal for:** +- Complex workflows requiring quality assurance +- Workflows that will be maintained over time +- Workflows where non-compliant input may be offered +- Critical workflows where standards compliance matters + +**Use Create-Only for:** +- Simple one-off workflows +- Experimental workflows +- Workflows unlikely to need editing or validation + +--- + +## Frontmatter Standards for Cross-Mode References + +**Never inline file paths. Always use frontmatter variables:** + +```yaml +--- +# Create mode step calling validation +validationWorkflow: '../steps-v/step-01-validate.md' +--- + +# Edit mode step routing to conversion +conversionStep: '../steps-c/step-00-conversion.md' +--- + +# Create conversion step receiving from edit +sourceWorkflowPath: '{targetWorkflowPath}' # Passed from edit +--- +``` + +--- + +## Validation Checklist + +For tri-modal workflow design: +- [ ] Each mode has self-contained steps folder +- [ ] No shared step files (shared data in /data/ only) +- [ ] workflow.md has lean routing (no step listings) +- [ ] Edit mode checks compliance, routes to conversion if needed +- [ ] Create mode has step-00-conversion for non-compliant input +- [ ] Create/Edit can invoke validation workflow +- [ ] Validation runs standalone and generates reports +- [ ] Confirmation step checks `conversionFrom` metadata diff --git a/src/modules/bmb/workflows/workflow/data/workflow-chaining-standards.md b/src/modules/bmb/workflows/workflow/data/workflow-chaining-standards.md new file mode 100644 index 00000000..cb5be95f --- /dev/null +++ b/src/modules/bmb/workflows/workflow/data/workflow-chaining-standards.md @@ -0,0 +1,271 @@ +# Workflow Chaining Standards + +**Purpose:** How workflows connect in sequences within modules, passing outputs as inputs to next workflows. + +--- + +## Module Workflow Pipeline + +**Example:** BMM Module - Idea to Implementation + +``` +brainstorming → research → brief → PRD → UX → architecture → epics → sprint-planning + ↓ + implement-story → review → repeat +``` + +Each workflow: +1. Checks for required inputs from prior workflows +2. Validates inputs are complete +3. Produces output for next workflow +4. Recommends next workflow in sequence + +--- + +## Input/Output Contract + +### Output Contract (What Each Workflow Produces) + +**Every workflow should:** +1. Create output document with predictable filename +2. Include `workflowType` in frontmatter for identification +3. Mark `stepsCompleted: [all steps]` when complete +4. Store in known location (`{module_output_folder}`) + +**Example frontmatter:** +```yaml +--- +workflowType: 'prd' +stepsCompleted: ['step-01-init', ..., 'step-11-complete'] +project_name: 'my-project' +date: '2025-01-02' +nextWorkflow: 'create-ux' +previousWorkflow: 'create-brief' +--- +``` + +### Input Contract (What Each Workflow Consumes) + +**Every workflow should:** +1. Define required inputs in Step 1 +2. Search in `{module_output_folder}` for prior outputs +3. Validate inputs are complete +4. Allow user to select from discovered documents + +--- + +## Step 1: Input Discovery Pattern + +```markdown +## 1. Discover Required Inputs + +### Required Inputs: +- {module_output_folder}/prd-{project_name}.md + +### Search: +1. Look for prd-{project_name}.md in {module_output_folder} +2. If found → validate completeness +3. If missing or incomplete → error with guidance + +"Error: This workflow requires a completed PRD. +Expected location: {module_output_folder}/prd-{project_name}.md +To fix: Run the PRD workflow first, or provide the path to your PRD." +``` + +--- + +## Final Step: Next Workflow Recommendation + +```markdown +## Next Steps + +Based on your completed [workflow], recommended next workflows: + +1. **[next-workflow-name]** - [why it's next] +2. **[alternative-workflow]** - [when to use this instead] + +Would you like to: +- Run [next-workflow-name] now? +- Run a different workflow? +- Exit for now? +``` + +**Update output frontmatter:** +```yaml +nextWorkflow: 'create-ux' +nextWorkflowRecommended: true +``` + +--- + +## Cross-Workflow Status Tracking + +**Optional:** Module can maintain `workflow-status.yaml`: + +```yaml +--- +current_workflow: 'create-prd' +completed_workflows: + - brainstorming + - research + - brief +pending_workflows: + - create-ux + - create-architecture + - create-epics + - sprint-planning +outputs: + brief: '{module_output_folder}/brief-{project_name}.md' + prd: '{module_output_folder}/prd-{project_name}.md' +--- +``` + +**Workflow checks this file to:** +- Validate sequence (don't run UX before PRD) +- Find output locations +- Track overall progress + +--- + +## Branching Workflows + +**Some workflows have multiple valid next steps:** + +```markdown +## Next Steps + +Based on your project type: + +**For software projects:** +- create-architecture - Technical architecture +- create-epics - Break down into epics + +**For data projects:** +- data-modeling - Database schema design +- etl-pipeline - Data pipeline design + +Which workflow would you like to run next? +``` + +--- + +## Required vs Optional Sequences + +### Required Sequence +**PRD must come before Architecture:** + +```yaml +# In architecture workflow.md +## PREREQUISITE: +This workflow requires a completed PRD. + +## INITIALIZATION: +IF prd-{project_name}.md exists AND is complete: + → Proceed with architecture workflow +ELSE: + → Error: "Please complete PRD workflow first" +``` + +### Optional Sequence +**UX research helps Architecture but isn't required:** + +```yaml +# In architecture workflow.md +## OPTIONAL INPUTS: +UX research documents can inform technical decisions. + +IF ux-research-{project_name}.md exists: + → "Found UX research. Include findings in architecture design?" +ELSE: + → "No UX research found. Continuing without it." +``` + +--- + +## Filename Conventions for Chaining + +**Standard pattern:** `{workflow-name}-{project-name}.md` + +| Workflow | Output Filename Pattern | +|----------| ---------------------- | +| brainstorming | `brainstorming-{project_name}.md` | +| brief | `brief-{project_name}.md` | +| PRD | `prd-{project_name}.md` | +| UX | `ux-design-{project_name}.md` | +| architecture | `architecture-{project_name}.md` | +| epics | `epics-{project_name}.md` | + +**Predictable filenames enable:** +- Automatic discovery +- Clear dependencies +- Easy validation + +--- + +## Module-Level Workflow Registry + +**Module can define `workflows.yaml`:** + +```yaml +--- +module: 'bmm' +workflows: + brainstorming: + output: 'brainstorming-{project_name}.md' + next: ['research'] + research: + output: 'research-{project_name}.md' + next: ['brief'] + brief: + output: 'brief-{project_name}.md' + next: ['prd'] + prd: + output: 'prd-{project_name}.md' + next: ['create-ux', 'create-architecture'] + create-ux: + output: 'ux-design-{project_name}.md' + next: ['create-architecture'] + create-architecture: + output: 'architecture-{project_name}.md' + next: ['create-epics'] + create-epics: + output: 'epics-{project_name}.md' + next: ['sprint-planning'] +--- +``` + +**Workflows read this to:** +- Know what outputs exist +- Know valid next steps +- Know output filenames + +--- + +## Cross-Module Dependencies + +**Workflows can depend on outputs from other modules:** + +```yaml +# In BMGD narrative workflow +## INPUT REQUIREMENTS: + +### Required: +- {bmm_output_folder}/prd-{project_name}.md +- {bmm_output_folder}/architecture-{project_name}.md + +### From BMGD: +- {bmgd_output_folder}/gdd-{project_name}.md (Game Design Document) +``` + +--- + +## Validation Checklist + +For workflow chaining: +- [ ] Output filename follows convention +- [ ] Frontmatter includes `workflowType` +- [ ] `stepsCompleted` marked complete when done +- [ ] Required inputs clearly defined +- [ ] Input validation with helpful errors +- [ ] Next workflow recommendations in final step +- [ ] Module registry (if using sequence tracking) diff --git a/src/modules/bmb/workflows/workflow/data/workflow-examples.md b/src/modules/bmb/workflows/workflow/data/workflow-examples.md new file mode 100644 index 00000000..9e83b090 --- /dev/null +++ b/src/modules/bmb/workflows/workflow/data/workflow-examples.md @@ -0,0 +1,276 @@ +# Novel Workflow Examples + +**Purpose:** Illustrative examples of workflows across diverse domains to demonstrate the range of what users can create. + +--- + +## Understanding Workflow Structure + +**Each arrow (→) in the "Flow" column represents a potential step file.** + +``` +Flow: Discovery → Assessment → Strategy → Shopping List → Prep Schedule + ↓ ↓ ↓ ↓ ↓ + step-01- step-02- step-03- step-04- step-05- + discovery assessment strategy shopping-list prep-schedule +``` + +**Each step file contains internal structure:** +- STEP GOAL +- MANDATORY EXECUTION RULES +- EXECUTION PROTOCOLS +- MANDATORY SEQUENCE (numbered sub-steps) +- Menu options +- Success/failure metrics + +**Key insight:** A simple workflow might have 3-4 step files. A complex workflow might have 10+. Each step file is a focused, self-contained instruction. + +--- + +## Example 1: Personalized Meal Plan Generator + +**Domain:** Health & Fitness + +| Aspect | Details | +|--------|---------| +| **Flow** (each → = step file) | Discovery → Assessment → Strategy → Shopping List → Prep Schedule | +| **Step Files** | ~5 files: step-01-discovery, step-02-assessment, step-03-strategy, step-04-shopping, step-05-prep | +| **Output** | Direct-to-final document, each step appends a section | +| **Intent/Prescriptive** | Intent-based - Facilitates discovery of preferences | +| **Planning** | No - builds final meal plan directly | +| **Continuable** | Yes - Can be 200+ tokens, users may need multiple sessions | +| **Structure** | Linear, 5 steps, no branching | +| **Conversation** | Open-ended with progressive questioning (1-2 at a time, probe preferences) | + +**Description:** Helps users create personalized weekly meal plans based on dietary restrictions, health goals, and cooking habits. + +--- + +## Example 2: Year-End Tax Organizer + +**Domain:** Finance + +| Aspect | Details | +|--------|---------| +| **Flow** (each → = step file) | Input Discovery → Document Categorization → Missing Document Alert → Final Summary | +| **Step Files** | 4 files: step-01-input-discovery, step-02-categorize, step-03-missing-alerts, step-04-summary | +| **Output** | Analysis-only + checklist of missing docs | +| **Intent/Prescriptive** | Highly Prescriptive - Tax compliance, exact categories | +| **Planning** | N/A | +| **Continuable** | No - Simple single-session checklist | +| **Structure** | Linear, 4 steps | +| **Conversation** | Focused - specific questions, document what user provides | + +**Description:** Organizes financial documents for tax preparation, categorizes income/deductions, alerts to missing documents. + +--- + +## Example 3: Employee Termination Checklist + +**Domain:** Legal / HR / Compliance + +| Aspect | Details | +|--------|---------| +| **Flow** (each → = step file) | Context → Regulatory Check → Document Requirements → Notification Timeline → Final Checklist | +| **Step Files** | 5 files: step-01-context, step-02-regulatory, step-03-documents, step-04-timeline, step-05-checklist. Some steps branch internally based on reason/location. | +| **Output** | Direct-to-final compliance checklist | +| **Intent/Prescriptive** | Highly Prescriptive - Legal compliance, state-specific | +| **Planning** | No | +| **Continuable** | No - Focused, single-session | +| **Structure** | Branching - Different paths within steps based on: reason, location, employee count | +| **Conversation** | Focused - specific classification questions, present requirements | + +**Description:** Generates legally-compliant termination checklists that vary by state, termination reason, and employee count. + +--- + +## Example 4: Tabletop RPG Campaign Builder + +**Domain:** Entertainment / Games + +| Aspect | Details | +|--------|---------| +| **Flow** (each → = step file) | Session Concept → NPC Creation → Scene Setup → Key Beats → Generate → [Repeat for next session] | +| **Step Files** | 4 core files: step-01-concept, step-02-npc, step-03-scene, step-04-beats, step-05-generate. Same files reused each session. | +| **Output** | Per-session document, maintains campaign continuity | +| **Intent/Prescriptive** | Intent-based - Creative facilitation | +| **Planning** | No - Each session builds directly to playable content | +| **Continuable** | Yes - Campaign has many sessions over months | +| **Structure** | Repeating loop - Same steps, new content each session | +| **Conversation** | Open-ended creative facilitation, "What if..." prompts | + +**Description:** Helps Game Masters create individual RPG session content while tracking campaign continuity across multiple sessions. + +--- + +## Example 5: Course Syllabus Creator + +**Domain:** Education + +| Aspect | Details | +|--------|---------| +| **Flow** | Course Type → Learning Objectives → Module Breakdown → Assessment → [Branch: academic] → Accreditation → [Branch: vocational] → Certification → Final | +| **Output** | Direct-to-final syllabus document | +| **Intent/Prescriptive** | Balanced - Framework prescriptive, content flexible | +| **Planning** | No | +| **Continuable** | Yes - Complex syllabus may require multiple sessions | +| **Structure** | Branching - Course type determines different sections | +| **Conversation** | Mixed - Framework questions (prescriptive) + content discovery (intent) | + +**Description:** Creates course syllabi that adapt based on course type (academic, vocational, self-paced) with appropriate accreditation requirements. + +--- + +## Example 6: SOP Writer + +**Domain:** Business Process + +| Aspect | Details | +|--------|---------| +| **Flow** | Process Selection → Scope Definition → Documentation → Review → [Generate] → "Create another?" → If yes, repeat | +| **Output** | Each SOP is independent, stored in `{sop_folder}/` | +| **Intent/Prescriptive** | Prescriptive - SOPs must be exact, unambiguous | +| **Planning** | No - Each SOP generated directly | +| **Continuable** | No - Single SOP per run, but workflow is repeatable | +| **Structure** | Repeating - Can create multiple SOPs in one session | +| **Conversation** | Focused on process details - "Walk me through step 1" | + +**Description:** Generates Standard Operating Procedure documents for business processes. Can create multiple SOPs in one session, each stored independently. + +--- + +## Example 7: Novel Outliner + +**Domain:** Creative Writing + +| Aspect | Details | +|--------|---------| +| **Flow** | Structure Selection → Character Arcs → Beat Breakdown → Pacing Review → Final Polish | +| **Output** | Free-form with Final Polish step to ensure flow and coherence | +| **Intent/Prescriptive** | Intent-based - "What does your character want?" | +| **Planning** | No - Builds outline directly | +| **Continuable** | Yes - Long-form creative work, sessions span weeks | +| **Structure** | Branching - Different flows based on structure choice | +| **Conversation** | Open-ended creative coaching, provocations | + +**Description:** Helps authors create novel outlines with proper story structure (3-Act, Hero's Journey, etc.), character arcs, and beat sheets. + +--- + +## Example 8: Wedding Itinerary Coordinator + +**Domain:** Event Planning + +| Aspect | Details | +|--------|---------| +| **Flow** | Venue Type → Vendor Coordination → Timeline → Guest Experience → [Branch: hybrid] → Virtual Setup → Day-of Schedule | +| **Output** | Direct-to-final itinerary | +| **Intent/Prescriptive** | Intent-based - Facilitates couple's vision | +| **Planning** | No | +| **Continuable** | Yes - Wedding planning takes months | +| **Structure** | Branching - Venue type affects required sections | +| **Conversation** | Open-ended discovery of preferences, budget, constraints | + +**Description:** Creates detailed wedding day itineraries, adapting to venue type (indoor/outdoor/hybrid) and guest experience goals. + +--- + +## Example 9: Annual Life Review + +**Domain:** Personal Development + +| Aspect | Details | +|--------|---------| +| **Flow** | Input Discovery (last year's goals) → Life Areas Assessment → Reflections → Goal Setting → Action Planning → Final Polish | +| **Output** | Free-form with Final Polish, discovers prior review first | +| **Intent/Prescriptive** | Intent-based - Coaching questions | +| **Planning** | No - Direct to life plan document | +| **Continuable** | Yes - Deep reflection may need multiple sessions | +| **Structure** | Linear with Input Discovery at start | +| **Conversation** | Open-ended coaching, progressive questioning | + +**Description:** Annual review workflow that discovers prior year's goals, facilitates reflection across life areas, and sets intentional goals for coming year. + +--- + +## Example 10: Room Renovation Planner + +**Domain:** Home Improvement + +| Aspect | Details | +|--------|---------| +| **Flow** | Room Type → Budget Assessment → Phase Planning → Materials → Contractor Timeline → [Branch: DIY] → Instructions | +| **Output** | Direct-to-final renovation plan | +| **Intent/Prescriptive** | Balanced - Code compliance prescriptive, design intent-based | +| **Planning** | No | +| **Continuable** | Yes - Complex planning, multi-session | +| **Structure** | Branching - Room type and DIY vs pro affect content | +| **Conversation** | Mixed - "What's your budget?" + "Describe your vision" | + +**Description:** Creates room-specific renovation plans with material selection, contractor coordination, and optional DIY instructions. + +--- + +## Pattern Analysis + +### Structure Types + +| Type | Count | Examples | +|------|-------|----------| +| Linear | 5 | Meal Plan, Tax, Termination, Life Review, Renovation | +| Branching | 5 | Termination, Syllabus, Novel, Wedding, Renovation | +| Repeating Loop | 2 | RPG Campaign, SOP Writer | + +### Intent Spectrum + +| Type | Count | Examples | +|------|-------|----------| +| Intent-based | 7 | Meal Plan, RPG Campaign, Syllabus (partial), Novel, Wedding, Life Review, Renovation (partial) | +| Prescriptive | 1 | Tax, Termination, SOP | +| Balanced | 2 | Syllabus, Renovation | + +### Continuable vs Single-Session + +| Type | Count | Examples | +|------|-------|----------| +| Continuable | 7 | Meal Plan, RPG Campaign, Syllabus, Novel, Wedding, Life Review, Renovation | +| Single-Session | 3 | Tax, Termination, SOP (repeatable but single-output) | + +### Output Patterns + +| Type | Count | Examples | +|------|-------|----------| +| Direct-to-Final | 9 | All except Tax | +| Analysis Only | 1 | Tax | +| With Final Polish | 1 | Novel | +| Input Discovery | 1 | Life Review | +| Repeating Output | 2 | RPG Campaign (sessions), SOP Writer (multiple SOPs) | + +--- + +## Key Insights + +1. **Continuable workflows are the norm** - 7 of 10 examples are continuable +2. **Intent-based dominates** - 7 of 10 are primarily intent-based facilitation +3. **Branching is common** - 5 of 10 have conditional paths based on user choices +4. **Input discovery matters** - Workflows in sequences (like BMM pipeline) need to find prior documents +5. **Final polish is critical** - Complex documents built section-by-section need optimization step +6. **Repeating loops exist** - Some workflows generate multiple outputs per session or repeat across sessions +7. **Mixed conversation styles** - Most use focused questions for data, open-ended for creative + +--- + +## Workflow Design Questions + +When creating a new workflow, ask: + +1. **Domain:** What problem space does this operate in? +2. **Output:** What does this workflow produce? (Document, checklist, analysis, physical output?) +3. **Intent:** Is this prescriptive (compliance) or intent-based (creative)? +4. **Planning:** Plan-then-build or direct-to-final? +5. **Continuable:** Could this take multiple sessions or consume many tokens? +6. **Structure:** Linear, branching, or repeating loop? +7. **Inputs:** Does this require documents from prior workflows or external sources? +8. **Chaining:** Is this part of a module sequence? What comes before/after? +9. **Polish:** Does the final output need optimization for flow and coherence? +10. **Conversation:** Focused questions or open-ended facilitation? diff --git a/src/modules/bmb/workflows/workflow/data/workflow-type-criteria.md b/src/modules/bmb/workflows/workflow/data/workflow-type-criteria.md new file mode 100644 index 00000000..6d823471 --- /dev/null +++ b/src/modules/bmb/workflows/workflow/data/workflow-type-criteria.md @@ -0,0 +1,172 @@ +# Workflow Type Criteria + +**Purpose:** Key decisions when designing a workflow. + +--- + +## Key Decisions + +1. **Module affiliation** - Standalone or part of a module? +2. **Continuable** - Can it span multiple sessions? +3. **Edit/Validate support** - Will it have edit and validate flows? +4. **Document output** - Does it produce a document? + +--- + +## 1. Module Affiliation + +### Standalone Workflow +- NOT part of any module +- Stored in user's custom location +- Only standard variables available + +### Module-Based Workflow +- Part of a specific module (e.g., BMB) +- Has access to module-specific variables +- Stored in module's workflows directory + +**BMB additional variable:** `{bmb_creations_output_folder}` + +--- + +## 2. Continuable or Single-Session? + +### Continuable (Multi-Session) +**Use when:** Workflow might consume MASSIVE tokens, complex, many steps + +**Required:** +- `step-01-init.md` with continuation detection +- `step-01b-continue.md` for resuming +- `stepsCompleted` tracking in output frontmatter + +**Frontmatter:** +```yaml +stepsCompleted: ['step-01-init', 'step-02-gather'] +lastStep: 'step-02-gather' +lastContinued: '2025-01-02' +``` + +**Rule:** Each step appends its NAME to `stepsCompleted` + +### Single-Session +**Use when:** Simple, quick (<15 min), token-efficient + +**Required:** +- Standard `step-01-init.md` (no continuation logic) +- No `stepsCompleted` tracking needed + +--- + +## 3. Edit/Validate Support + +### Create-Only +``` +workflow-folder/ +├── workflow.md +├── data/ +└── steps-c/ + ├── step-01-init.md + └── step-N-final.md +``` + +**Use when:** Simple workflows, experimental, one-off + +### Create + Edit + Validate (Tri-Modal) +``` +workflow-folder/ +├── workflow.md +├── data/ # SHARED +├── steps-c/ # Create +├── steps-e/ # Edit +└── steps-v/ # Validate +``` + +**Key:** +- Each mode is SELF-CONTAINED +- NO shared step files between modes +- DATA folder is SHARED (prevents drift) +- Duplicative steps OK (better than confusion) + +**Use when:** Complex workflows that will be maintained + +--- + +## 4. Document Output + +### Document-Producing +- Creates persistent output file +- Uses templates for structure +- Each step contributes to document +- Consider final polish step + +### Non-Document +- Performs actions without persistent output +- May produce temporary files +- Focus on execution, not creation + +--- + +## Decision Tree + +``` +START: Creating a workflow +│ +├─ Part of a module? +│ ├─ YES → Module-based (include module variables) +│ └─ NO → Standalone (standard variables only) +│ +├─ Could this take multiple sessions / lots of tokens? +│ ├─ YES → Continuable (add step-01b-continue.md) +│ └─ NO → Single-session (simpler init) +│ +└─ Will users need to edit/validate this workflow? + ├─ YES → Tri-modal (steps-c/, steps-e/, steps-v/) + └─ NO → Create-only (steps-c/ only) +``` + +--- + +## Questions to Ask User + +**Module:** +"Is this workflow standalone or part of a specific module (BMB, BMM, CIS, BMGD)?" + +**Continuable:** +"Could this workflow consume many tokens or require multiple sessions? +- If YES: Add continuation support +- If NO: Keep it simple for single-session" + +**Edit/Validate:** +"Will this workflow need edit and validate capabilities, or just create? +- Create only: Simpler, faster +- Create + Edit + Validate: More robust, maintainable" + +**Document:** +"Does this workflow produce a document/output file?" +- If YES: Use free-form template (recommended) +- If NO: What does it produce? + +--- + +## Output Format Decision + +| Workflow Type | Init Template | Output Format | +| ----------------------- | ------------------------ | ------------- | +| Continuable + Document | step-01-init-continuable | Free-form | +| Single-Session + Document| Standard init | Free-form | +| Continuable + No Doc | step-01-init-continuable | N/A | +| Single-Session + No Doc | Standard init | N/A | + +**Free-form template** (recommended): +```yaml +--- +stepsCompleted: [] +lastStep: '' +date: '' +user_name: '' +--- + +# {{document_title}} + +[Content appended progressively] +``` diff --git a/src/modules/bmb/workflows/workflow/steps-c/step-00-conversion.md b/src/modules/bmb/workflows/workflow/steps-c/step-00-conversion.md new file mode 100644 index 00000000..a9e2e001 --- /dev/null +++ b/src/modules/bmb/workflows/workflow/steps-c/step-00-conversion.md @@ -0,0 +1,262 @@ +--- +name: 'step-00-conversion' +description: 'Convert existing workflow to BMAD compliant format by reading all instructions and extracting plan' + +nextStepFile: './step-02-classification.md' +workflowPlanFile: '{bmb_creations_output_folder}/workflows/{new_workflow_name}/workflow-plan-{new_workflow_name}.md' +--- + +# Step 0: Workflow Conversion + +## STEP GOAL: + +Convert an existing workflow (any format) to BMAD compliant format by fully reading and understanding every instruction, extracting the essence, and creating a plan document. + +## MANDATORY EXECUTION RULES (READ FIRST): + +### Universal Rules: + +- 🛑 NEVER skip reading the entire source workflow +- 📖 CRITICAL: Read the complete step file before taking any action +- 📋 YOU ARE A FACILITATOR, not an autonomous converter +- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` + +### Role Reinforcement: + +- ✅ You are a workflow analyst and conversion specialist +- ✅ If you already have been given communication or persona patterns, continue to use those while playing this new role +- ✅ We engage in collaborative dialogue, not command-response +- ✅ You bring workflow architecture expertise, user brings their existing workflow +- ✅ Together we will extract the essence and rebuild compliantly + +### Step-Specific Rules: + +- 🎯 Focus on understanding the COMPLETE existing workflow +- 🚫 FORBIDDEN to skip any instruction or file +- 💬 Read EVERYTHING - instructions.md, workflow.yaml, step files, templates +- 📋 Document the essence succinctly + +## EXECUTION PROTOCOLS: + +- 🎯 Load and read the ENTIRE source workflow +- 💾 Extract: goal, steps, output, input requirements +- 📖 Create plan with conversionFrom metadata +- 🚫 FORBIDDEN to proceed without complete understanding + +## CONTEXT BOUNDARIES: + +- User provides existing workflow path (from routing or direct) +- This REPLACES step-01-discovery - we skip to step-02-classification +- The source workflow can be ANY format (legacy XML, partial, other systems) + +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise. + +### 1. Get Source Workflow Path + +**If path was passed from routing (e.g., from edit workflow):** +- Use `{sourceWorkflowPath}` provided + +**If no path was passed:** + +"I can help you convert an existing workflow to BMAD compliant format. + +**Please provide the path to the workflow you want to convert:** + +This could be: +- A folder containing workflow.md +- A folder with workflow.yaml (legacy format) +- A folder with instructions.md +- Any workflow from another system + +**Path:** {user provides path}" + +### 2. Load EVERYTHING - DO NOT BE LAZY + +"**Loading source workflow for complete analysis...** + +**CRITICAL:** I will read EVERY file in this workflow to understand it completely." + +**Load these files based on what exists:** + +**If workflow.md exists:** +- Load workflow.md completely +- Load all step files (steps/*, steps-c/*, steps-v/*, steps-e/*) +- Load all data files (data/*) +- Load all templates (templates/*) + +**If workflow.yaml exists (legacy XML format):** +- Load workflow.yaml completely +- Load instructions.md completely +- Load all step files, templates, data + +**If other format:** +- Load every file that exists +- Read everything to understand the structure + +**⚠️ DO NOT BE LAZY - Load and READ COMPLETELY:** + +For each step file, read: +- The STEP GOAL +- All MANDATORY EXECUTION RULES +- All instructions in EXECUTION PROTOCOLS +- All menu options +- All templates and outputs + +"**✅ Source workflow loaded completely** + +**Files read:** {count} files +**Format detected:** {format} +**Structure identified:** {brief description}" + +### 3. Extract and Document Workflow Essence + +Create the workflow plan with complete extraction: + +"**Extracting workflow essence...**" + +Create `{workflowPlanFile}`: + +```markdown +--- +conversionFrom: '{sourceWorkflowPath}' +originalFormat: '{detected format}' +stepsCompleted: ['step-00-conversion'] +created: {current date} +status: CONVERSION +--- + +# Workflow Creation Plan + +## Conversion Source + +**Original Path:** {sourceWorkflowPath} +**Original Format:** {workflow.yaml / workflow.md / custom / etc.} +**Detected Structure:** {describe what was found} + +--- + +## Original Workflow Analysis + +### Goal (from source) + +{Extract the exact goal from the source workflow} + +### Original Steps (Complete List) + +{Create succinct bullet list of EVERY step from the source:} + +**Step 1:** {Step name} - {Brief purpose} +**Step 2:** {Step name} - {Brief purpose} +**Step 3:** {Step name} - {Brief purpose} +... +**Step N:** {Step name} - {Brief purpose} + +### Output / Deliverable + +{What does this workflow produce?} + +### Input Requirements + +{What inputs does this workflow need from the user?} + +### Key Instructions to LLM + +{Extract the key instruction patterns - how does the workflow talk to the LLM? +What style? What level of detail? What collaborative approach?} + +--- + +## Conversion Notes + +**What works well in original:** +{List strengths to preserve} + +**What needs improvement:** +{List issues to address} + +**Compliance gaps identified:** +{List what's missing for BMAD compliance} +``` + +### 4. Present Extracted Information to User + +"**I've analyzed your existing workflow completely. Here's what I found:** + +--- + +**Workflow Goal:** +{goal from analysis} + +**Steps ({count}):** +{Display succinct bullet list} + +**Output:** +{what it produces} + +**Input Requirements:** +{what it needs from user} + +--- + +**Format:** {originalFormat} +**Compliance Status:** {compliant / non-compliant / partial} + +**Key observations:** +{Share 2-3 key insights about the workflow}" + +### 5. Discovery Questions for Conversion + +Even though this is a conversion, we need to understand some things: + +"**A few questions to ensure the conversion captures your intent:** + +1. **What's working well** in this workflow that we should definitely preserve? + +2. **What problems** have you encountered with this workflow that we should fix? + +3. **Any missing features** or improvements you'd like to add during conversion? + +4. **Who will use** the converted workflow - same audience or different?" + +### 6. Confirm and Proceed to Classification + +"**Based on my analysis and your answers, I'm ready to proceed with classification.** + +**Next step:** We'll classify the workflow type (document, action, interactive, autonomous, meta), determine structure (continuable or single-session), and decide if it needs validation steps. + +**Ready to proceed?** [C] Continue to Classification" + +#### Menu Handling Logic: + +- IF C: Update workflowPlanFile with conversion notes, then load, read entirely, then execute {nextStepFile} +- IF Any other: help user respond, then redisplay menu + +## CRITICAL STEP COMPLETION NOTE + +ONLY WHEN the entire source workflow has been read and analyzed, and the plan document contains the complete extraction (goal, steps, output, inputs) and conversionFrom metadata, will you then load and read fully `{nextStepFile}` to execute classification. + +--- + +## 🚨 SYSTEM SUCCESS/FAILURE METRICS + +### ✅ SUCCESS: + +- ENTIRE source workflow loaded and read +- Every step documented in plan +- Goal, output, inputs extracted +- conversionFrom metadata set +- User confirms understanding +- Proceeding to classification + +### ❌ SYSTEM FAILURE: + +- Not loading all files in source workflow +- Skipping step files +- Not reading instructions completely +- Missing steps in documentation +- Not setting conversionFrom metadata +- Proceeding without complete understanding + +**Master Rule:** DO NOT BE LAZY. Read EVERYTHING. Document the COMPLETE workflow essence. The conversion must capture ALL of the original workflow's intent and functionality. diff --git a/src/modules/bmb/workflows/workflow/steps-c/step-01-discovery.md b/src/modules/bmb/workflows/workflow/steps-c/step-01-discovery.md new file mode 100644 index 00000000..a2e35772 --- /dev/null +++ b/src/modules/bmb/workflows/workflow/steps-c/step-01-discovery.md @@ -0,0 +1,194 @@ +--- +name: 'step-01-discovery' +description: 'Discover and understand the user workflow idea through collaborative conversation' + +nextStepFile: './step-02-classification.md' +workflowExamples: '../data/workflow-examples.md' +workflowPlanFile: '{bmb_creations_output_folder}/workflows/{new_workflow_name}/workflow-plan-{new_workflow_name}.md' +--- + +# Step 1: Discovery + +## STEP GOAL: + +To understand the user's workflow idea through open-ended conversation, showing them what's possible, and discovering their vision before making any structural decisions. + +## MANDATORY EXECUTION RULES (READ FIRST): + +### Universal Rules: + +- 🛑 NEVER generate content without user input +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read +- 📋 YOU ARE A FACILITATOR, not a content generator +- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` + +### Role Reinforcement: + +- ✅ You are a workflow architect and systems designer +- ✅ If you already have been given communication or persona patterns, continue to use those while playing this new role +- ✅ We engage in collaborative dialogue, not command-response +- ✅ You bring workflow design expertise, user brings their vision +- ✅ Together we will discover what they need + +### Step-Specific Rules: + +- 🎯 Focus ONLY on understanding their idea +- 🚫 FORBIDDEN to ask for name, module, or technical decisions in this step +- 💬 Ask 1-2 questions at a time, think about their response before probing deeper +- 🚪 DON'T rush to classification - understand first + +## EXECUTION PROTOCOLS: + +- 🎯 Load examples FIRST to show what's possible +- 💬 Start with open-ended "Tell me about your idea..." +- 📖 Update frontmatter stepsCompleted when complete +- 🚫 FORBIDDEN to load next step until we understand their vision + +## CONTEXT BOUNDARIES: + +- Variables from workflow.md are available in memory +- This is pure discovery - no decisions yet +- Don't ask technical questions yet +- Focus on the problem space and user's vision + +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change. + +### 1. Load Context FIRST + +Load `{workflowExamples}` BEFORE talking to the user. + +**Note:** You already understand workflow architecture from having read workflow.md to get here. The step-file architecture you just experienced (micro-file design, JIT loading, sequential enforcement, state tracking) is exactly what we'll be helping users create. + +**From workflowExamples**, you now know 10 diverse workflow examples across domains: +- Health & Fitness (Meal Plan) +- Finance (Tax Organizer) +- Legal/HR (Termination Checklist) +- Entertainment (RPG Campaign) +- Education (Syllabus Creator) +- Business (SOP Writer) +- Creative (Novel Outliner) +- Events (Wedding Itinerary) +- Personal Development (Life Review) +- Home Improvement (Renovation Planner) + +This context helps you understand whatever the user describes and guide them effectively. + +### 2. Open-Ended Invitation + +Start with: + +"**Welcome! I'm here to help you create a workflow.** + +Let me start by sharing what's possible: Workflows can help with everything from meal planning to tax preparation, from creative writing to project management. They're structured processes that guide you (or others) through a task step-by-step. + +**Tell me about your idea** - what problem are you trying to solve? What's the vision?" + +### 3. Listen and Probe + +As they describe their idea: + +**DO:** +- Listen carefully +- Ask 1-2 follow-up questions at a time +- Think about their response before asking more +- Probe for: Who is this for? What's the outcome? What's the challenge they're facing? +- Use "Think about their response before..." pattern + +**DON'T:** +- Ask about module, name, or technical details +- Rapid-fire questions +- Jump to solutions +- Rush this step + +### 4. Deepen Understanding + +Once you have the basic idea, probe deeper: + +"That's really interesting. Let me understand better: + +- Walk me through a scenario where someone would use this workflow +- What does success look like at the end? +- Who would be running this workflow - you, your team, customers? +- Is this something you'd do once, or repeat over time? + +**Think about their response before continuing...**" + +### 5. Check Understanding + +Before moving on, confirm you understand: + +"Let me make sure I've got this right: + +[Summarize your understanding in 2-3 sentences] + +Did I capture that correctly? What should I adjust?" + +### 6. Create Initial Plan Document + +Create `{workflowPlanFile}` with initial discovery notes: + +```markdown +--- +stepsCompleted: ['step-01-discovery'] +created: [current date] +status: DISCOVERY +--- + +# Workflow Creation Plan + +## Discovery Notes + +**User's Vision:** +[Summarize the problem they're solving and their vision] + +**Who It's For:** +[Users/audience] + +**What It Produces:** +[The outcome/deliverable] + +**Key Insights:** +[Any important context gathered] +``` + +### 7. Transition to Classification + +"Great! I understand what you're trying to build. Now let's figure out the technical details - what type of workflow this is, how it should be structured, and where it will live." + +### 8. Present MENU OPTIONS + +Display: **Proceeding to workflow classification...** + +#### EXECUTION RULES: + +- This is a discovery step with no user choices at the end +- Proceed directly to next step after discovery is complete +- Always halt if user wants to continue discussing their idea + +#### Menu Handling Logic: + +- After discovery complete and plan document created, immediately load and execute `{nextStepFile}` to begin classification +- IF user wants to keep discussing their idea: continue conversation, then repeat menu check + +--- + +## 🚨 SYSTEM SUCCESS/FAILURE METRICS + +### ✅ SUCCESS: + +- User's vision clearly understood +- Discovery notes captured in plan document +- User feels heard and understood +- Ready to proceed to classification + +### ❌ SYSTEM FAILURE: + +- Rushing to technical decisions before understanding +- Asking for name/module in this step +- Not loading examples first +- Rapid-fire questions without thinking about responses + +**Master Rule:** Understand first, classify second. Discovery comes before structure. diff --git a/src/modules/bmb/workflows/workflow/steps-c/step-02-classification.md b/src/modules/bmb/workflows/workflow/steps-c/step-02-classification.md new file mode 100644 index 00000000..131afbb5 --- /dev/null +++ b/src/modules/bmb/workflows/workflow/steps-c/step-02-classification.md @@ -0,0 +1,269 @@ +--- +name: 'step-02-classification' +description: 'Classify the workflow by answering the 4 key structural decisions' + +nextStepFile: './step-03-requirements.md' +workflowTypeCriteria: '../data/workflow-type-criteria.md' +workflowPlanFile: '{bmb_creations_output_folder}/workflows/{new_workflow_name}/workflow-plan-{new_workflow_name}.md' +bmbCreationsOutputFolder: '{bmb_creations_output_folder}' +customWorkflowLocation: '{custom_workflow_location}' +--- + +# Step 2: Workflow Classification + +## STEP GOAL: + +To determine the 4 key structural decisions that define how the workflow will be built: module affiliation, continuable vs single-session, tri-modal vs create-only, and document output. + +## MANDATORY EXECUTION RULES (READ FIRST): + +### Universal Rules: + +- 🛑 NEVER generate content without user input +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read +- 📋 YOU ARE A FACILITATOR, not a content generator +- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` + +### Role Reinforcement: + +- ✅ You are a workflow architect helping classify their workflow +- ✅ Explain the trade-offs of each decision clearly +- ✅ Help them make informed choices +- ✅ These 4 decisions affect the entire workflow structure + +### Step-Specific Rules: + +- 🎯 Focus ONLY on the 4 key structural decisions +- 🚫 FORBIDDEN to skip any of the 4 decisions +- 💬 Explain each decision in plain language before asking +- 🚪 These decisions determine file structure, naming, and location + +## EXECUTION PROTOCOLS: + +- 🎯 Load workflowTypeCriteria for the decision framework +- 💾 Document each decision in the plan +- 📖 Update frontmatter stepsCompleted when complete +- 🚫 FORBIDDEN to load next step until all 4 decisions are made + +## CONTEXT BOUNDARIES: + +- Discovery from Step 1 informs these decisions +- These are STRUCTURAL decisions that affect everything else +- Once made, changing them is difficult +- Take time to explain trade-offs + +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change. + +### 0. Load Decision Framework + +Load `{workflowTypeCriteria}` to understand the 4 key decisions and their implications. + +### 1. Decision 1: Document Output (FIRST - It's Fundamental) + +"**Let's classify your workflow. I'll walk you through 4 key decisions that determine how it's built.** + +**Decision 1: What does your workflow produce?** + +Based on your idea from discovery, let me clarify:" + +- [If unclear from discovery] "Does this workflow produce a document or file at the end? A report, a plan, a story, a checklist?" + +Present the two options: + +**A. Document-Producing** +- Creates a persistent output file +- Examples: reports, plans, stories, checklists, forms +- Uses templates for structure + +**B. Non-Document** +- Performs actions without creating a document +- Examples: refactoring code, running tests, orchestrating tools +- May produce temporary files but no persistent output + +"Which describes your workflow?" + +**Think about their response before continuing...** + +Once decided: +- Document: `workflowProducesDocuments: true` +- Non-document: `workflowProducesDocuments: false` + +### 2. Decision 2: Module Affiliation + +"**Decision 2: Where will this workflow live?** + +Workflows can be standalone or part of a module:" + +**Standalone:** +- NOT part of any module +- Stored in your custom location +- Only standard variables available + +**Module-Based (BMB, BMM, CIS, BMGD, etc.):** +- Part of a specific module +- Has access to module-specific variables +- Stored in that module's workflows directory + +"Is this workflow: +- **A)** Standalone - just for you/custom use +- **B)** Part of a module - which one?" + +**If they don't know modules:** +"Modules are specialized areas: +- **BMB** - Module building workflows +- **BMM** - Software development workflows (PRDs, architecture, etc.) +- **CIS** - Innovation and creative workflows +- **BMGD** - Game development workflows +- **Custom** - Your own workflows + +Does your workflow fit into one of these areas, or is it standalone?" + +Document the result. + +### 3. Decision 3: Continuable or Single-Session + +"**Decision 3: Could this workflow take multiple sessions to complete?** + +Think about: Will this workflow consume many tokens or take a long time? Might users need to pause and come back later?" + +**Single-Session:** +- Quick, focused workflows (15-30 minutes) +- Simpler structure +- No continuation logic needed + +**Continuable:** +- Can span multiple sessions +- Complex, many steps +- Saves progress, can resume later +- Needs `step-01b-continue.md` + +"Is your workflow: +- **A)** Single-session - quick and focused +- **B)** Continuable - could take multiple sessions" + +**Help them think:** +- "Walk me through how long you think this would take..." +- "What happens if someone gets halfway through and has to stop?" + +Document the result. + +### 4. Decision 4: Create-Only or Tri-Modal + +"**Decision 4: Will this workflow need Edit and Validate capabilities?** + +Some workflows are simple - you create them once and use them. Others need full lifecycle support:** + +**Create-Only:** +- Just `steps-c/` (create steps) +- Simpler, faster to build +- Good for: experimental workflows, one-off use, simple tools + +**Tri-Modal (Create + Edit + Validate):** +- Has `steps-c/`, `steps-e/` (edit), and `steps-v/` (validate) +- Full lifecycle support +- Can be modified and validated after creation +- Good for: complex workflows, maintained workflows, team use + +"Do you envision: +- **A)** Create-only - build it and use it +- **B)** Tri-modal - create, edit, AND validate capabilities" + +**If they're unsure:** +"Think: Will you or others want to modify this workflow later? Does it need quality checking/validation?" + +Document the result. + +### 5. Name the Workflow + +"Now that we understand what this workflow IS, let's name it properly. + +Based on everything we've discovered, what would you call this? + +Some guidance: +- Use kebab-case: `my-workflow-name` +- Be descriptive but concise +- Think: What would someone search for to find this? + +[Offer suggestions based on their vision]" + +**Check for uniqueness:** +- Look for folder at `{bmb_creationsOutputFolder}/workflows/{proposed-name}/` +- If exists: "That name is taken. Want to try a variant like...?" +- Loop until unique name confirmed + +Document the final name. + +### 6. Confirm Target Location + +Based on module decision, confirm and document the target path: + +**For standalone/custom:** +- Target: `{customWorkflowLocation}/{workflow-name}/` +- Typically: `_bmad/custom/src/workflows/{workflow-name}/` + +**For modules:** +- Check module's workflow location from module.yaml +- Confirm path with user + +Document: `targetWorkflowPath: [confirmed path]` + +### 7. Update Plan with Classification + +Update `{workflowPlanFile}`: + +```markdown +## Classification Decisions + +**Workflow Name:** {name} +**Target Path:** {targetWorkflowPath} + +**4 Key Decisions:** +1. **Document Output:** {true/false} +2. **Module Affiliation:** {standalone/module-name} +3. **Session Type:** {single-session/continuable} +4. **Lifecycle Support:** {create-only/tri-modal} + +**Structure Implications:** +- [Document what this means: e.g., "Needs steps-c/, steps-e/, steps-v/", "Needs step-01b-continue.md", etc.] +``` + +### 8. Present MENU OPTIONS + +Display: **Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Continue + +#### EXECUTION RULES: + +- ALWAYS halt and wait for user input +- ONLY proceed to next step when user selects 'C' +- User can chat or ask questions - always respond and redisplay menu + +#### Menu Handling Logic: + +- IF A: Execute {project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml +- IF P: Execute {project-root}/_bmad/core/workflows/party-mode/workflow.md +- IF C: Update plan frontmatter with stepsCompleted and classification, then load `{nextStepFile}` +- IF Any other: Help user, then redisplay menu + +--- + +## 🚨 SYSTEM SUCCESS/FAILURE METRICS + +### ✅ SUCCESS: + +- All 4 key decisions made and documented +- Workflow named appropriately +- Target location confirmed +- Structural implications understood +- Plan updated with classification + +### ❌ SYSTEM FAILURE: + +- Skipping any of the 4 key decisions +- Naming before understanding (old pattern) +- Not explaining trade-offs +- Not checking for name conflicts + +**Master Rule:** The 4 key decisions determine everything else. Get them right before proceeding. diff --git a/src/modules/bmb/workflows/workflow/steps-c/step-03-requirements.md b/src/modules/bmb/workflows/workflow/steps-c/step-03-requirements.md new file mode 100644 index 00000000..32c26747 --- /dev/null +++ b/src/modules/bmb/workflows/workflow/steps-c/step-03-requirements.md @@ -0,0 +1,282 @@ +--- +name: 'step-03-requirements' +description: 'Gather detailed requirements through collaborative conversation' + +nextStepFile: './step-04-tools.md' +workflowExamples: '../data/workflow-examples.md' +outputFormatStandards: '../data/output-format-standards.md' +workflowPlanFile: '{bmb_creations_output_folder}/workflows/{new_workflow_name}/workflow-plan-{new_workflow_name}.md' +advancedElicitationTask: '{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml' +partyModeWorkflow: '{project-root}/_bmad/core/workflows/party-mode/workflow.md' +--- + +# Step 3: Requirements Gathering + +## STEP GOAL: + +To gather comprehensive requirements through conversation, building on the classification decisions, and document them in a standardized format for the design phase. + +## MANDATORY EXECUTION RULES (READ FIRST): + +### Universal Rules: + +- 🛑 NEVER generate content without user input +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read +- 📋 YOU ARE A FACILITATOR, not a content generator +- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` + +### Role Reinforcement: + +- ✅ You are a workflow architect gathering requirements +- ✅ Build on what we discovered and classified +- ✅ Ask 1-2 questions at a time, think about responses +- ✅ We already know the 4 key decisions - now we get details + +### Step-Specific Rules: + +- 🎯 Focus ONLY on requirements gathering +- 🚫 FORBIDDEN to propose workflow designs yet +- 💬 Ask conversationally, not like a form +- 📋 Use the standardized template (below) for consistent storage + +## EXECUTION PROTOCOLS: + +- 🎯 Load references as needed +- 💾 Store to standardized template in plan document +- 📖 Update frontmatter stepsCompleted when complete +- 🚫 FORBIDDEN to load next step until requirements are complete + +## CONTEXT BOUNDARIES: + +- Discovery (Step 1) gave us the vision +- Classification (Step 2) gave us the 4 key decisions +- Now we gather detailed requirements +- Don't design workflow steps yet - that's Step 6 + +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change. + +### 1. Initialize Requirements + +"**Let's gather the requirements for your workflow.** + +We already know: +- [Summarize vision from discovery] +- [Summarize 4 key decisions from classification] + +Now I need to understand the details of how this workflow should work." + +### 2. Workflow Flow and Structure + +Load `{workflowExamples}` to reference diverse patterns. + +"**How should this workflow flow?** + +From our examples, workflows can be structured differently:" + +**Flow Patterns:** +- **Linear:** Step 1 → Step 2 → Step 3 → Finish +- **Looping:** Generate → Review → Generate more... until done +- **Branching:** Different paths based on user choices +- **Repeating:** Same steps, new content each session + +"Think about your workflow: +- Should it go straight through, or loop/branch? +- How many logical phases does it need? +- What are the major milestones?" + +**Think about their response...** + +### 3. User Interaction Style + +"**How collaborative should this be?** + +Think about the person running this workflow:" + +- **Highly Collaborative:** AI asks questions, guides, facilitates at each step +- **Mostly Autonomous:** AI does the work with occasional checkpoints +- **Guided Session:** AI leads through a structured experience +- **Mixed:** Some steps collaborative, some autonomous + +"Where does your workflow fit on this spectrum? + +And are there specific decision points where the user MUST choose something?" + +### 4. Input Requirements + +"**What does this workflow need to start?**" + +- What documents or data must be provided? +- Are there prerequisites or dependencies? +- Will users need to provide specific information? +- Any optional inputs that enhance the workflow? + +"**Think about their response before continuing...**" + +### 5. Output Specifications (IF document-producing) + +**ONLY if `workflowProducesDocuments: true` from classification:** + +Load `{outputFormatStandards}` and discuss: + +"**What should the output look like?** + +Since your workflow produces a document, let's decide the format:" + +**Four Template Types:** + +1. **Free-form (Recommended)** - Minimal structure, content-driven + - Use for: Most collaborative workflows + - Has: Basic frontmatter, progressive content, final polish step + +2. **Structured** - Required sections, flexible within each + - Use for: Reports, proposals, documentation + - Has: Clear section headers, consistent structure + +3. **Semi-structured** - Core sections + optional additions + - Use for: Forms, checklists, meeting minutes + - Has: Required fields, optional extras + +4. **Strict** - Exact format, specific fields + - Use for: Compliance, legal, regulated (rare) + - Has: Precise requirements, validation + +"Which format fits your workflow best?" + +**If Free-form (most common):** +- "We'll use a minimal template with basic frontmatter. The workflow will build the document section by section, with a final polish step to optimize flow." + +**If Structured/Semi-structured:** +- "What sections are required? Any optional sections?" + +**If Strict:** +- "Do you have an existing template to follow, or should we design one?" + +Document the output format decision. + +### 6. Output Specifications (IF non-document) + +**ONLY if `workflowProducesDocuments: false` from classification:** + +"**What does this workflow produce if not a document?** + +- Actions performed? +- Changes made to code/files? +- A decision or recommendation? +- A temporary artifact?" + +Document what the workflow produces. + +### 7. Success Criteria + +"**How will we know this workflow succeeded?** + +Think about the end result: +- What does 'done' look like? +- What would make a user satisfied? +- Are there quality criteria? +- Can we measure success?" + +"**Think about their response...**" + +### 8. Instruction Style (NOW, Not Earlier) + +**We ask this NOW because we understand the workflow:** + +"**How should the AI executing this workflow behave?**" + +**Intent-Based (Recommended for most):** +- Steps describe goals and principles +- AI adapts conversation naturally +- More flexible and responsive +- Example: "Guide user to define requirements through open-ended discussion" + +**Prescriptive:** +- Steps provide exact instructions +- More controlled and predictable +- Example: "Ask: 'What is your primary goal? A) Growth B) Efficiency C) Quality'" + +**Mixed:** +- Some steps prescriptive, others intent-based +- Use prescriptive for critical/required steps +- Use intent-based for creative/facilitative steps + +"Which style fits your workflow, or should it be mixed?" + +### 9. Store to Standardized Template + +Update `{workflowPlanFile}` with the requirements section: + +```markdown +## Requirements + +**Flow Structure:** +- Pattern: [linear/looping/branching/repeating] +- Phases: [list major phases] +- Estimated steps: [rough count] + +**User Interaction:** +- Style: [highly collaborative/mostly autonomous/guided/mixed] +- Decision points: [where user must choose] +- Checkpoint frequency: [how often to pause] + +**Inputs Required:** +- Required: [list] +- Optional: [list] +- Prerequisites: [list] + +**Output Specifications:** +- Type: [document/action/decision/temporary] +- Format: [free-form/structured/semi-structured/strict OR describe non-document output] +- Sections: [if structured] +- Frequency: [single/batch/continuous] + +**Success Criteria:** +- [list what success looks like] + +**Instruction Style:** +- Overall: [intent-based/prescriptive/mixed] +- Notes: [any specific style requirements] +``` + +### 10. Present MENU OPTIONS + +Display: **Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Continue + +#### EXECUTION RULES: + +- ALWAYS halt and wait for user input +- ONLY proceed when user selects 'C' +- User can chat or ask questions - always respond and redisplay menu + +#### Menu Handling Logic: + +- IF A: Execute {advancedElicitationTask} +- IF P: Execute {partyModeWorkflow} +- IF C: Save requirements to plan, update frontmatter, then load `{nextStepFile}` +- IF Any other: Help user, then redisplay menu + +--- + +## 🚨 SYSTEM SUCCESS/FAILURE METRICS + +### ✅ SUCCESS: + +- Requirements gathered through conversation (not interrogation) +- Flow structure clearly understood +- Input/output specifications defined +- Output format decided (if document-producing) +- Success criteria established +- Instruction style determined +- All stored in standardized template + +### ❌ SYSTEM FAILURE: + +- Asking for instruction style before understanding the workflow +- Skipping output format discussion +- Not storing to standardized template +- Proceeding without understanding the flow + +**Master Rule:** Requirements build on classification. Use the standardized template so the next steps can read consistent data. diff --git a/src/modules/bmb/workflows/workflow/steps-c/step-04-tools.md b/src/modules/bmb/workflows/workflow/steps-c/step-04-tools.md new file mode 100644 index 00000000..2ffb3a20 --- /dev/null +++ b/src/modules/bmb/workflows/workflow/steps-c/step-04-tools.md @@ -0,0 +1,281 @@ +--- +name: 'step-04-tools' +description: 'Preview workflow structure, then configure tools with context' + +nextStepFile: './step-05-plan-review.md' +commonToolsCsv: '../data/common-workflow-tools.csv' +workflowPlanFile: '{bmb_creations_output_folder}/workflows/{new_workflow_name}/workflow-plan-{new_workflow_name}.md' +advancedElicitationTask: '{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml' +partyModeWorkflow: '{project-root}/_bmad/core/workflows/party-mode/workflow.md' +--- + +# Step 4: Tools Configuration + +## STEP GOAL: + +To preview the workflow structure FIRST, then configure tools with clear context on where and how they'll be used. + +## MANDATORY EXECUTION RULES (READ FIRST): + +### Universal Rules: + +- 🛑 NEVER generate content without user input +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read +- 📋 YOU ARE A FACILITATOR, not a content generator +- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` + +### Role Reinforcement: + +- ✅ You are a workflow architect +- ✅ Tools need context to be configured intelligently +- ✅ We preview structure BEFORE deciding tool integration points + +### Step-Specific Rules: + +- 🎯 Preview workflow structure BEFORE configuring tools +- 🚫 FORBIDDEN to skip the preview - tools can't be configured without it +- 💬 Use the preview to make tool discussions concrete +- 🚫 Load tools from CSV, don't hardcode descriptions + +## EXECUTION PROTOCOLS: + +- 🎯 Present design preview based on requirements +- 💬 Discuss tools WITHIN the context of the preview +- 💾 Document tool decisions with integration points +- 📖 Update frontmatter stepsCompleted when complete +- 🚫 FORBIDDEN to load next step until tools are configured + +## CONTEXT BOUNDARIES: + +- Discovery → Classification → Requirements are complete +- We know the flow pattern, phases, interaction style +- NOW we can talk about tools with concrete examples +- This creates an intelligent tool configuration + +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change. + +### 1. Present Design Preview + +"**Before we configure tools, let me preview what your workflow structure might look like.** + +Based on everything we've gathered, here's a rough outline:" + +Create a concrete preview showing: + +```markdown +## Workflow Structure Preview: {workflow-name} + +**Phase 1: Initialization** +- Welcome user, explain the workflow +- Gather any starting inputs +- [Specific to this workflow] + +**Phase 2: [Name from requirements]** +- [What happens in this phase] +- [User interaction point] + +**Phase 3: [Name from requirements]** +- [What happens in this phase] +- [User interaction point] + +**Phase 4: Completion** +- [What happens at the end] +- [Output/final step] +``` + +"This is just a preview - we'll design the actual steps in detail next. But this gives us context for discussing tools." + +**Ask:** "Does this structure feel right? Any major phases I'm missing?" + +### 2. Initialize Tools Discussion + +"**Now let's configure the tools and integrations for your workflow.** + +Since we can see the structure, we can talk about tools concretely: 'Party Mode could fit here in Phase 2 for creative brainstorming...' instead of abstractly." + +### 3. Load and Present Available Tools + +Load `{commonToolsCsv}` and present by category: + +"**Available BMAD Tools:** + +**Core Tools:** +- [List from CSV with descriptions] + +**Optional Tools:** +- [List from CSV with descriptions]" + +### 4. Configure Core Tools WITH Context + +Go through each core tool, referencing the preview: + +"**Party Mode** - For creative, unrestricted exploration + +Looking at your workflow structure, I see potential in: +- [Specific phase from preview] for [specific reason] + +Should we include Party Mode? If so, where would it fit best?" + +"**Advanced Elicitation** - For deep exploration and quality + +This could work well in: +- [Specific phase] for [specific reason] + +Should we include Advanced Elicitation? Where would you want quality gates or deeper exploration?" + +"**Brainstorming** - For idea generation + +In your workflow, this might fit in: +- [Specific phase if applicable] + +Should we include Brainstorming?" + +### 5. Configure LLM Features WITH Context + +"**LLM Features to enhance your workflow:**" + +"**Web-Browsing** - For real-time information + +Would your workflow benefit from: +- Current data/information +- Research during execution +- Live references + +If yes, where in the structure would this be needed?" + +"**File I/O** - For reading/writing files + +Your workflow [will/won't] need file operations based on: +- [Input requirements from requirements] +- [Output specifications from requirements] + +Any specific file operations needed?" + +"**Sub-Agents** - For delegating specialized tasks + +Could any part of your workflow benefit from: +- Specialized expertise +- Parallel processing +- Focused sub-tasks + +Looking at your structure, [specific phase] might benefit..." + +"**Sub-Processes** - For parallel workflows + +Would any phase benefit from: +- Running multiple processes in parallel +- Coordinating multiple workflows + +If so, which phase?" + +### 6. Configure Memory Systems + +"**Memory and State Management**" + +**If continuable from classification:** +"Since your workflow is continuable, it needs to track progress between sessions. + +We'll use: +- `stepsCompleted` array in output frontmatter +- `lastStep` tracking +- `step-01b-continue.md` for resuming + +Any additional state we need to track?" + +**If single-session:** +"Your workflow is single-session, so we'll keep state simple - no complex memory needed." + +### 7. External Integrations (Optional) + +"**External Integrations** - MCP, databases, APIs + +Based on your workflow, are there any external systems it needs to connect to? +- Databases? +- APIs? +- MCP servers? +- Other tools?" + +If yes, note installation requirements. + +### 8. Installation Assessment + +"**Installation and Dependencies** + +Some tools require additional setup. + +Based on what we've selected: +- [List any tools requiring installation] +- [Assess user comfort level] + +Are you comfortable with these installations, or should we consider alternatives?" + +### 9. Store Tools Configuration + +Update `{workflowPlanFile}`: + +```markdown +## Tools Configuration + +**Core BMAD Tools:** +- **Party Mode:** [included/excluded] - Integration point: [specific phase/reason] +- **Advanced Elicitation:** [included/excluded] - Integration point: [specific phase/reason] +- **Brainstorming:** [included/excluded] - Integration point: [specific phase/reason] + +**LLM Features:** +- **Web-Browsing:** [included/excluded] - Use case: [specific need] +- **File I/O:** [included/excluded] - Operations: [specific needs] +- **Sub-Agents:** [included/excluded] - Use case: [specific need] +- **Sub-Processes:** [included/excluded] - Use case: [specific need] + +**Memory:** +- Type: [continuable/single-session] +- Tracking: [stepsCompleted, lastStep, etc.] + +**External Integrations:** +- [List any selected with purposes] + +**Installation Requirements:** +- [List tools needing installation] +- User preference: [willing/not willing/alternatives] +``` + +### 10. Present MENU OPTIONS + +Display: **Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Continue + +#### EXECUTION RULES: + +- ALWAYS halt and wait for user input +- ONLY proceed when user selects 'C' +- User can chat or ask questions - always respond and redisplay menu + +#### Menu Handling Logic: + +- IF A: Execute {advancedElicitationTask} +- IF P: Execute {partyModeWorkflow} +- IF C: Save tools to plan, update frontmatter, then load `{nextStepFile}` +- IF Any other: Help user, then redisplay menu + +--- + +## 🚨 SYSTEM SUCCESS/FAILURE METRICS + +### ✅ SUCCESS: + +- Design preview presented BEFORE tools discussion +- Tools discussed WITHIN concrete context +- Integration points clearly identified +- User can visualize where tools fit +- All decisions documented in plan + +### ❌ SYSTEM FAILURE: + +- Configuring tools without design preview +- Abstract tool discussions ("it could go somewhere") +- Not identifying concrete integration points +- Hardcoding tool descriptions instead of using CSV + +**Master Rule:** Tools need context. Preview structure first, then configure tools with concrete integration points. diff --git a/src/modules/bmb/workflows/workflow/steps-c/step-05-plan-review.md b/src/modules/bmb/workflows/workflow/steps-c/step-05-plan-review.md new file mode 100644 index 00000000..f0ff6625 --- /dev/null +++ b/src/modules/bmb/workflows/workflow/steps-c/step-05-plan-review.md @@ -0,0 +1,242 @@ +--- +name: 'step-05-plan-review' +description: 'Review the complete workflow plan and approve before design' + +nextStepFile: './step-06-design.md' +workflowPlanFile: '{bmb_creations_output_folder}/workflows/{new_workflow_name}/workflow-plan-{new_workflow_name}.md' +advancedElicitationTask: '{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml' +partyModeWorkflow: '{project-root}/_bmad/core/workflows/party-mode/workflow.md' +--- + +# Step 5: Plan Review and Approval + +## STEP GOAL: + +To present the complete workflow plan (discovery, classification, requirements, tools) for review and approval before proceeding to the design phase. + +## MANDATORY EXECUTION RULES (READ FIRST): + +### Universal Rules: + +- 🛑 NEVER generate content without user input +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read +- 📋 YOU ARE A FACILITATOR, not a content generator +- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` + +### Role Reinforcement: + +- ✅ You are a workflow architect conducting a design review +- ✅ Present the complete plan clearly +- ✅ Solicit feedback and make refinements +- ✅ Get explicit approval before proceeding to design + +### Step-Specific Rules: + +- 🎯 Focus ONLY on review and refinement +- 🚫 FORBIDDEN to start designing workflow steps in this step +- 💬 Present plan clearly, ask targeted questions +- 🚫 DO NOT proceed to design without user approval + +## EXECUTION PROTOCOLS: + +- 🎯 Present complete plan from {workflowPlanFile} +- 💾 Capture any modifications or refinements +- 📖 Update frontmatter stepsCompleted when complete +- 🚫 FORBIDDEN to load next step until user approves + +## CONTEXT BOUNDARIES: + +- Discovery (Step 1) → Classification (Step 2) → Requirements (Step 3) → Tools (Step 4) +- ALL the information needed for design is now captured +- This is the final checkpoint before designing the workflow structure +- Once we proceed to Step 6, we'll be designing actual step files + +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change. + +### 1. Initialize Review + +"**Let's review the complete plan before we start designing.** + +We've covered a lot of ground. Let me walk you through everything we've decided, and you can tell me what looks right and what needs adjustment." + +### 2. Present Complete Plan + +Load and present from `{workflowPlanFile}`: + +"**Complete Workflow Plan: {workflow-name}** + +--- + +**1. DISCOVERY** (from Step 1) + +**Your Vision:** +[Present user's vision] + +**Who It's For:** +[Present users/audience] + +**Key Insights:** +[Present important context] + +--- + +**2. CLASSIFICATION** (from Step 2) + +**The 4 Key Decisions:** +1. **Document Output:** {true/false} - [what it produces] +2. **Module Affiliation:** {standalone/module} - {target path} +3. **Session Type:** {single-session/continuable} - [implications] +4. **Lifecycle Support:** {create-only/tri-modal} - [implications] + +**Workflow Name:** {name} +**Target Location:** {path} + +--- + +**3. REQUIREMENTS** (from Step 3) + +**Flow Structure:** +- Pattern: {linear/looping/branching/repeating} +- Phases: {list major phases} +- Estimated steps: {count} + +**User Interaction:** +- Style: {collaborative/autonomous/guided/mixed} +- Decision points: {where user must choose} + +**Inputs:** {required and optional} +**Output:** {type and format} +**Success Criteria:** {what success looks like} +**Instruction Style:** {intent/prescriptive/mixed} + +--- + +**4. TOOLS CONFIGURATION** (from Step 4) + +**Core Tools:** +- Party Mode: {included/excluded} - {integration point} +- Advanced Elicitation: {included/excluded} - {integration point} +- Brainstorming: {included/excluded} - {integration point} + +**LLM Features:** +- Web-Browsing: {included/excluded} +- File I/O: {included/excluded} +- Sub-Agents: {included/excluded} +- Sub-Processes: {included/excluded} + +**Memory:** {continuable/single-session} + +--- + +### 3. Detailed Review by Section + +"**Let's go through this systematically. I want your feedback on each area:**" + +**A. Vision and Scope (Discovery)** +- "Does the 'Your Vision' section capture what you're trying to build?" +- "Anything we missed in the key insights?" + +**B. Structural Decisions (Classification)** +- "Do the 4 key decisions still feel right?" +- "Any second thoughts on continuable vs single-session?" +- "Create-only or tri-modal - still the right call?" + +**C. Requirements (Details)** +- "Does the flow structure match what you envisioned?" +- "Are the interaction style and decision points accurate?" +- "Input/output specifications complete?" +- "Success criteria clear?" + +**D. Tools (Integrations)** +- "Do the selected tools make sense?" +- "Integration points feel right?" +- "Any tools we should add or remove?" + +### 4. Collect Feedback + +"**Your feedback:** + +For each section above, tell me: +1. What looks good and should stay as-is +2. What needs modification or refinement +3. What's missing that should be added +4. Anything unclear or confusing + +**Take your time - this is our last chance to make changes before we start designing the actual workflow.**" + +### 5. Process Feedback and Refine + +For each feedback item: + +- Document the requested change +- Discuss implications on workflow design +- Make the refinement +- Confirm with user + +Update `{workflowPlanFile}` with all approved changes. + +### 6. Final Confirmation + +"**One last check before we proceed to design:** + +Based on everything we've discussed: + +- [Re-state the workflow's purpose in one sentence] +- [Re-state the key structural decision: continuable/tri-modal] +- [Re-state the flow pattern] + +You're approving this plan to move into the actual workflow design phase. + +Ready to proceed?" + +### 7. Update Plan Status + +Update `{workflowPlanFile}` frontmatter: + +```yaml +status: APPROVED_FOR_DESIGN +approvedDate: [current date] +``` + +### 8. Present MENU OPTIONS + +Display: **Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Continue to Design + +#### EXECUTION RULES: + +- ALWAYS halt and wait for user input +- ONLY proceed to next step when user selects 'C' +- User can chat or ask questions - always respond and redisplay menu + +#### Menu Handling Logic: + +- IF A: Execute {advancedElicitationTask} +- IF P: Execute {partyModeWorkflow} +- IF C: Update plan frontmatter with approval, then load `{nextStepFile}` +- IF Any other: Help user, then redisplay menu + +--- + +## 🚨 SYSTEM SUCCESS/FAILURE METRICS + +### ✅ SUCCESS: + +- Complete plan presented clearly from the plan document +- All 4 sections reviewed systematically +- User feedback collected and incorporated +- User explicitly approves the plan +- Plan status updated to APPROVED_FOR_DESIGN +- Ready to proceed to design phase + +### ❌ SYSTEM FAILURE: + +- Not loading plan from {workflowPlanFile} +- Skipping review sections +- Not documenting refinements +- Proceeding without explicit approval +- Not updating plan status + +**Master Rule:** The plan must be complete and approved before design. This is the gatekeeper step. diff --git a/src/modules/bmb/workflows/create-workflow/steps/step-06-design.md b/src/modules/bmb/workflows/workflow/steps-c/step-06-design.md similarity index 76% rename from src/modules/bmb/workflows/create-workflow/steps/step-06-design.md rename to src/modules/bmb/workflows/workflow/steps-c/step-06-design.md index f4031cad..f3b1da67 100644 --- a/src/modules/bmb/workflows/create-workflow/steps/step-06-design.md +++ b/src/modules/bmb/workflows/workflow/steps-c/step-06-design.md @@ -2,22 +2,19 @@ name: 'step-06-design' description: 'Design the workflow structure and step sequence based on gathered requirements, tools configuration, and output format' -# Path Definitions -workflow_path: '{project-root}/_bmad/bmb/workflows/create-workflow' - -# File References -thisStepFile: '{workflow_path}/steps/step-06-design.md' -nextStepFile: '{workflow_path}/steps/step-07-build.md' -workflowFile: '{workflow_path}/workflow.md' -# Output files for workflow creation process +nextStepFile: './step-07-foundation.md' targetWorkflowPath: '{bmb_creations_output_folder}/workflows/{new_workflow_name}' workflowPlanFile: '{targetWorkflowPath}/workflow-plan-{new_workflow_name}.md' - -# Task References advancedElicitationTask: '{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml' partyModeWorkflow: '{project-root}/_bmad/core/workflows/party-mode/workflow.md' -# Template References -# No template needed - will append design details directly to workflow plan +stepTemplate: '../templates/step-template.md' +stepTypePatterns: '../data/step-type-patterns.md' +menuHandlingStandards: '../data/menu-handling-standards.md' +frontmatterStandards: '../data/frontmatter-standards.md' +outputFormatStandards: '../data/output-format-standards.md' +inputDiscoveryStandards: '../data/input-discovery-standards.md' +workflowChainingStandards: '../data/workflow-chaining-standards.md' +trimodalWorkflowStructure: '../data/trimodal-workflow-structure.md' --- # Step 6: Workflow Structure Design @@ -55,7 +52,7 @@ To collaboratively design the workflow structure, step sequence, and interaction - 🎯 Guide collaborative design process - 💾 After completing design, append to {workflowPlanFile} -- 📖 Update plan frontmatter `stepsCompleted: [1, 2, 3, 4, 5, 6]` before loading next step +- 📖 Update frontmatter stepsCompleted to add this step when completed. - 🚫 FORBIDDEN to load next step until user selects 'C' and design is saved ## CONTEXT BOUNDARIES: @@ -69,33 +66,37 @@ To collaboratively design the workflow structure, step sequence, and interaction ## DESIGN REFERENCE MATERIALS: -When designing, you may load these documents as needed: +When designing, you may load these data standards as needed: -- `{project-root}/_bmad/bmb/docs/workflows/templates/step-template.md` - Step file structure -- `{project-root}/_bmad/bmb/docs/workflows/templates/step-01-init-continuable-template.md` - Continuable init step template -- `{project-root}/_bmad/bmb/docs/workflows/templates/step-1b-template.md` - Continuation step template -- `{project-root}/_bmad/bmb/docs/workflows/templates/workflow-template.md` - Workflow configuration -- `{project-root}/_bmad/bmb/reference/workflows/meal-prep-nutrition/workflow.md` - Complete example +- {stepTemplate} - Step file structure template +- {stepTypePatterns} - Templates for different step types (init, middle, branch, validation, final) +- {menuHandlingStandards} - Menu patterns and handler rules +- {frontmatterStandards} - Variable definitions and path rules +- {outputFormatStandards} - Output document patterns +- {inputDiscoveryStandards} - How to discover documents from prior workflows +- {workflowChainingStandards} - How workflows connect in sequences +- {trimodalWorkflowStructure} - Tri-modal workflow patterns (if applicable) -## WORKFLOW DESIGN PROCESS: +Example workflow: +- `{project-root}/_bmad/bmb/reference/workflows/meal-prep-nutrition/workflow.md` + +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change. ### 1. Step Structure Design -Let's reference our step creation documentation for best practices: +Load {stepTypePatterns} for available step type templates: -Load and reference step-file architecture guide: - -``` -Read: {project-root}/_bmad/bmb/docs/workflows/templates/step-template.md -``` - -This shows the standard structure for step files. Also reference: - -``` -Read: {project-root}/_bmad/bmb/docs/workflows/templates/step-1b-template.md -``` - -This shows the continuation step pattern for workflows that might take multiple sessions. +This shows the standard structure for all step types: +- Init Step (Continuable) +- Continuation Step (01b) +- Middle Step (Standard/Simple) +- Branch Step +- Validation Sequence Step +- Init Step (With Input Discovery) +- Final Polish Step +- Final Step Based on the approved plan, collaboratively design the info to answer the following for the build plan: @@ -126,10 +127,11 @@ If **YES** to any of these, we should include continuation support using step-01 ### 2. Interaction Pattern Design -Design how users will interact with the workflow: +Load {menuHandlingStandards} for menu pattern options: +Design how users will interact with the workflow: - Where should users provide input vs where the AI works autonomously? -- What type of menu options are needed at each step? +- What menu pattern does each step need? (Standard A/P/C, Auto-proceed, Custom, Conditional) - Should there be Advanced Elicitation or Party Mode options? - How will users know their progress? - What confirmation points are needed? @@ -182,6 +184,20 @@ Identify unique requirements: - Should it integrate with other workflows? - Does it need to handle multiple scenarios? +**Input Discovery:** + +If this workflow depends on documents from prior workflows, load {inputDiscoveryStandards}: +- What prior workflow outputs does this workflow need? +- Are these required or optional inputs? +- How will the workflow discover these documents? + +**Workflow Chaining:** + +If this workflow is part of a sequence, load {workflowChainingStandards}: +- What workflow comes before this one? +- What workflow comes after this one? +- What outputs does this workflow produce for the next? + ### 8. Design Review and Refinement Present the design for review: diff --git a/src/modules/bmb/workflows/workflow/steps-c/step-07-foundation.md b/src/modules/bmb/workflows/workflow/steps-c/step-07-foundation.md new file mode 100644 index 00000000..c6b107d5 --- /dev/null +++ b/src/modules/bmb/workflows/workflow/steps-c/step-07-foundation.md @@ -0,0 +1,238 @@ +--- +name: 'step-07-foundation' +description: 'Create workflow folder structure, workflow.md, and main output template(s)' + +nextStepFile: './step-08-build-step-01.md' +targetWorkflowPath: '{bmb_creations_output_folder}/workflows/{new_workflow_name}' +workflowPlanFile: '{targetWorkflowPath}/workflow-plan-{new_workflow_name}.md' +workflowTemplate: '../templates/workflow-template.md' +outputFormatStandards: '../data/output-format-standards.md' +minimalOutputTemplate: '../templates/minimal-output-template.md' +advancedElicitationTask: '{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml' +partyModeWorkflow: '{project-root}/_bmad/core/workflows/party-mode/workflow.md' +--- + +# Step 7: Foundation Build + +## STEP GOAL: + +To create the workflow folder structure, the main workflow.md file, and the primary output template(s) that step files will reference. + +## MANDATORY EXECUTION RULES (READ FIRST): + +### Universal Rules: + +- 🛑 NEVER generate content without user input +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read +- 📋 YOU ARE A FACILITATOR, not a content generator +- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` + +### Role Reinforcement: + +- ✅ You are a workflow architect and systems designer +- ✅ If you already have been given communication or persona patterns, continue to use those while playing this new role +- ✅ We engage in collaborative dialogue, not command-response +- ✅ You bring implementation expertise and best practices +- ✅ User brings their specific requirements and design approvals + +### Step-Specific Rules: + +- 🎯 Focus ONLY on creating foundation elements (folder, workflow.md, main template) +- 🚫 FORBIDDEN to create step files yet - that comes next +- 💬 Get confirmation before creating each foundation element +- 🚪 CREATE files in the correct target location + +## EXECUTION PROTOCOLS: + +- 🎯 Create foundation systematically from approved design +- 💾 Document what was created in the plan +- 📖 Update frontmatter stepsCompleted to add this step when completed +- 🚫 FORBIDDEN to load next step until user selects 'C' + +## CONTEXT BOUNDARIES: + +- Approved plan from step 6 guides implementation +- Design specifies: workflow name, continuable or not, document output type, step count +- Load templates and documentation as needed during build +- Follow step-file architecture principles + +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change. + +### 1. Confirm Foundation Readiness + +Based on the approved design from step 6, confirm: + +"**I have your approved design and I'm ready to create the workflow foundation.** + +From your design, I'll be creating: + +**Workflow:** {new_workflow_name} +**Location:** {targetWorkflowPath} +**Type:** [continuable/single-session] +**Document Output:** [yes/no - template type if yes] +**Estimated Steps:** [number from design] + +Ready to proceed with creating the folder structure?" + +### 2. Create Folder Structure + +Create the workflow folder structure: + +``` +{targetWorkflowPath}/ +├── workflow.md # To be created +├── steps-c/ # Create flow steps +│ ├── step-01-init.md +│ ├── step-01b-continue.md # If continuable +│ └── [remaining steps] +├── steps-v/ # Validate flow steps (to be created later) +├── data/ # Shared reference data +└── templates/ # Output templates +``` + +**For BMB module workflows:** The target will be `_bmad/custom/src/workflows/{workflow_name}/` +**For other modules:** Check module's custom_workflow_location + +Create the folders and confirm structure. + +### 3. Generate workflow.md + +Load {workflowTemplate} and create workflow.md with: + +**Frontmatter:** +```yaml +--- +name: '{workflow-name-from-design}' +description: '{description-from-design}' +web_bundle: true +--- +``` + +**Content:** +- Workflow name and description +- Goal statement +- Role definition +- Meta-context (if applicable) +- Initialization sequence pointing to steps-c/step-01-init.md +- Configuration loading instructions + +**If tri-modal (Create + Edit + Validate):** +Add mode routing logic to workflow.md: +- IF invoked with -c: Load ./steps-c/step-01-init.md +- IF invoked with -v: Load ./steps-v/step-01-validate.md +- IF invoked with -e: Load ./steps-e/step-01-edit.md + +### 4. Create Main Output Template + +**Load {outputFormatStandards} to determine template type.** + +**From the design, determine:** +- Free-form (recommended) - Minimal frontmatter + progressive append +- Structured - Required sections with flexible content +- Semi-structured - Core sections + optional additions +- Strict - Exact format (rare, compliance/legal) + +**For Free-form (most common):** + +Create `templates/output-template.md`: +```yaml +--- +stepsCompleted: [] +lastStep: '' +date: '' +user_name: '' +--- +``` + +If the workflow produces a document with sections: +```markdown +# {{document_title}} + +[Content appended progressively by workflow steps] +``` + +**For Structured/Semi-structured:** + +Create template with section placeholders based on design: +```markdown +# {{title}} + +## {{section_1}} +[Content to be filled] + +## {{section_2}} +[Content to be filled] +``` + +**For Non-Document Workflows:** + +No output template needed. Document this in the plan. + +### 5. Document Foundation in Plan + +Append to {workflowPlanFile}: + +```markdown +## Foundation Build Complete + +**Created:** +- Folder structure at: {targetWorkflowPath} +- workflow.md +- Main template: [template-name] + +**Configuration:** +- Workflow name: {name} +- Continuable: [yes/no] +- Document output: [yes/no - type] +- Mode: [create-only or tri-modal] + +**Next Steps:** +- Step 8: Build step-01 (and step-01b if continuable) +- Step 9: Build remaining steps (repeatable) +``` + +### 6. Present MENU OPTIONS + +Display: **Foundation Complete - Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Continue to Step 01 Build + +#### EXECUTION RULES: + +- ALWAYS halt and wait for user input after presenting menu +- ONLY proceed to next step when user selects 'C' +- After other menu items execution, return to this menu +- User can chat or ask questions - always respond and then redisplay menu + +#### Menu Handling Logic: + +- IF A: Execute {advancedElicitationTask}, and when finished redisplay the menu +- IF P: Execute {partyModeWorkflow}, and when finished redisplay the menu +- IF C: Save foundation summary to {workflowPlanFile}, update frontmatter stepsCompleted, then load, read entire file, then execute {nextStepFile} +- IF Any other comments or queries: help user respond then [Redisplay Menu Options](#6-present-menu-options) + +## CRITICAL STEP COMPLETION NOTE + +ONLY WHEN C is selected and foundation is saved to plan will you load {nextStepFile} to begin building step-01. + +--- + +## 🚨 SYSTEM SUCCESS/FAILURE METRICS + +### ✅ SUCCESS: + +- Folder structure created in correct location +- workflow.md created with proper frontmatter and initialization +- Main output template created (if document-producing workflow) +- Foundation documented in {workflowPlanFile} +- Frontmatter updated with stepsCompleted + +### ❌ SYSTEM FAILURE: + +- Creating folders without user confirmation +- Missing mode routing for tri-modal workflows +- Wrong template type for output format +- Not documenting what was created + +**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. diff --git a/src/modules/bmb/workflows/workflow/steps-c/step-08-build-step-01.md b/src/modules/bmb/workflows/workflow/steps-c/step-08-build-step-01.md new file mode 100644 index 00000000..8179ed35 --- /dev/null +++ b/src/modules/bmb/workflows/workflow/steps-c/step-08-build-step-01.md @@ -0,0 +1,333 @@ +--- +name: 'step-08-build-step-01' +description: 'Build step-01-init.md and step-01b-continue.md (if continuable) with any supporting files' + +nextStepFile: './step-09-build-next-step.md' +targetWorkflowPath: '{bmb_creations_output_folder}/workflows/{new_workflow_name}' +workflowPlanFile: '{targetWorkflowPath}/workflow-plan-{new_workflow_name}.md' +stepTemplate: '../templates/step-template.md' +stepTypePatterns: '../data/step-type-patterns.md' +frontmatterStandards: '../data/frontmatter-standards.md' +menuHandlingStandards: '../data/menu-handling-standards.md' +outputFormatStandards: '../data/output-format-standards.md' +inputDiscoveryStandards: '../data/input-discovery-standards.md' +advancedElicitationTask: '{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml' +partyModeWorkflow: '{project-root}/_bmad/core/workflows/party-mode/workflow.md' +--- + +# Step 8: Build Step 01 (and 01b if Continuable) + +## STEP GOAL: + +To build the first step file(s) for the new workflow - step-01-init.md and step-01b-continue.md if the workflow is continuable - including any supporting files these steps need. + +## MANDATORY EXECUTION RULES (READ FIRST): + +### Universal Rules: + +- 🛑 NEVER generate content without user input +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read +- 📋 YOU ARE A FACILITATOR, not a content generator +- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` + +### Role Reinforcement: + +- ✅ You are a workflow architect and systems designer +- ✅ If you already have been given communication or persona patterns, continue to use those while playing this new role +- ✅ We engage in collaborative dialogue, not command-response +- ✅ You bring implementation expertise and best practices +- ✅ User brings their specific requirements and design approvals + +### Step-Specific Rules: + +- 🎯 Focus ONLY on building step-01 (and 01b if continuable) +- 🚫 FORBIDDEN to build other steps yet - use step-09 for those +- 💬 Generate step content collaboratively based on approved design +- 🚪 CREATE files in the correct target location + +## EXECUTION PROTOCOLS: + +- 🎯 Load standards to understand step type patterns +- 💾 Document what was created in the plan +- 📖 Update frontmatter stepsCompleted to add this step when completed +- 🚫 FORBIDDEN to load next step until user selects 'C' + +## CONTEXT BOUNDARIES: + +- Approved design from step 6 specifies step-01's purpose and type +- Load step type patterns to understand init step structure +- Frontmatter and menu standards ensure compliance +- This is the FIRST step - sets up everything that follows + +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change. + +### 1. Load Standards for Init Steps + +**Load {stepTypePatterns}** to understand the init step patterns: +- Init Step (Non-Continuable) - For single-session workflows +- Init Step (Continuable) - For multi-session workflows +- Init Step (With Input Discovery) - If workflow needs prior documents + +**Load {frontmatterStandards}** for variable and path rules. + +**Load {menuHandlingStandards}** for menu patterns (init steps typically use auto-proceed or C-only). + +### 2. Determine Step 01 Type + +From the approved design, determine: + +**Is the workflow continuable?** +- **YES:** Use Init Step (Continuable) pattern +- **NO:** Use Init Step (Non-Continuable) pattern + +**Does the workflow need input discovery?** +- **YES:** Use Init Step (With Input Discovery) pattern +- **NO:** Standard init pattern + +Confirm with user: "Based on your design, step-01 will be [continuable/non-continuable] with [input discovery/standard init]. Is this correct?" + +### 3. Build step-01-init.md + +**Load {stepTemplate}** for base structure. + +Create `steps-c/step-01-init.md` with: + +**Frontmatter:** +```yaml +--- +name: 'step-01-init' +description: '[from design]' + +# File references (ONLY variables used in this step) +nextStepFile: './step-02-[next-step-name].md' +outputFile: '{output_folder}/[output-name].md' +templateFile: '../templates/output-template.md' # If applicable + +# Continuation support (if continuable) +continueFile: './step-01b-continue.md' # If continuable + +# Input discovery (if needed) +inputDocuments: [] +requiredInputCount: [number] +moduleInputFolder: '{module_output_folder}' +inputFilePatterns: ['*-prd.md', '*-ux.md'] # From design + +# Tasks (if A/P menu used) +advancedElicitationTask: '{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml' +partyModeWorkflow: '{project-root}/_bmad/core/workflows/party-mode/workflow.md' +--- +``` + +**Content Structure:** +```markdown +# Step 1: [Step Name From Design] + +## STEP GOAL: +[Single sentence goal from design] + +## MANDATORY EXECUTION RULES (READ FIRST): +### Universal Rules: +- 🛑 NEVER generate content without user input +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read +- 📋 YOU ARE A FACILITATOR, not a content generator +- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` + +### Role Reinforcement: +- ✅ You are [role from design] +- ✅ We engage in collaborative dialogue, not command-response +- ✅ You bring [expertise], user brings [theirs] +- ✅ Together we produce something better + +### Step-Specific Rules: +- 🎯 Focus only on [specific task for step-01] +- 🚫 FORBIDDEN to [prohibited action] +- 💬 Approach: [how to engage] + +## EXECUTION PROTOCOLS: +- 🎯 [Protocol 1] +- 💾 [Protocol 2 - create/append to output] +- 📖 [Protocol 3 - tracking] +- 🚫 This is the init step - sets up everything + +## CONTEXT BOUNDARIES: +- [What's available at step 01] +- Focus: [what to focus on] +- Limits: [boundaries] +- Dependencies: [none - this is first step] + +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change. + +### 1. [First action - from design] +[Instructions for step-01 - intent-based, not prescriptive] + +### 2. [Second action - from design] +[Instructions] + +### ... [continue for all actions in step-01] + +### N. Present MENU OPTIONS +[Menu from design - typically C-only for init, or A/P/C if appropriate] + +#### EXECUTION RULES: +- ALWAYS halt and wait for user input after presenting menu +- ONLY proceed to next step when user selects 'C' + +#### Menu Handling Logic: +- IF C: Create/append to {outputFile} with content, update frontmatter stepsCompleted, then load, read entire file, then execute {nextStepFile} +- IF Any other: help user, then redisplay menu + +## 🚨 SYSTEM SUCCESS/FAILURE METRICS: +### ✅ SUCCESS: +[What success looks like for step-01] + +### ❌ SYSTEM FAILURE: +[What failure looks like] + +**Master Rule:** Skipping steps is FORBIDDEN. +``` + +**Customize content based on:** +- The step's goal from the design +- The workflow's role and persona +- Whether it's continuable +- Whether it needs input discovery +- The template type (if document-producing) + +### 4. Build step-01b-continue.md (If Continuable) + +**If workflow is continuable**, create `steps-c/step-01b-continue.md`: + +**Frontmatter:** +```yaml +--- +name: 'step-01b-continue' +description: 'Handle workflow continuation from previous session' + +outputFile: '{output_folder}/[output-name].md' +workflowFile: '../workflow.md' +nextStepOptions: + step-02: './step-02-[name].md' + step-03: './step-03-[name].md' + # ... add all subsequent steps +--- +``` + +**Content:** +```markdown +# Step 1b: Continue Workflow + +## STEP GOAL: +To resume the workflow from where it was left off in a previous session. + +## MANDATORY EXECUTION RULES: +[Standard universal rules] + +## CONTEXT BOUNDARIES: +- User has run this workflow before +- Output file exists with stepsCompleted array +- Need to route to the correct next step + +## MANDATORY SEQUENCE + +### 1. Welcome Back +"**Welcome back!** Let me check where we left off..." + +### 2. Read stepsCompleted from Output +Load {outputFile} and read frontmatter `stepsCompleted` array. + +### 3. Determine Next Step +Find the last completed step and identify the next step to load. + +### 4. Route to Correct Step +Load the appropriate next step file based on stepsCompleted. + +## MENU OPTIONS +Display continuation status and offer to proceed. + +## SUCCESS/FAILURE METRICS +[Standard metrics] +``` + +### 5. Create Supporting Files (If Needed) + +**Does step-01 need any:** + +**Small templates?** (inline in step, no separate file needed) + +**Data files?** (create if step references CSV data) + +**Validation checklists?** (create if step validates something) + +**If supporting files are needed, create them in `data/` folder and update step-01 frontmatter to reference them.** + +### 6. Document Build in Plan + +Append to {workflowPlanFile}: + +```markdown +## Step 01 Build Complete + +**Created:** +- steps-c/step-01-init.md +- steps-c/step-01b-continue.md [if continuable] +- [any supporting files] + +**Step Configuration:** +- Type: [continuable/non-continuable] +- Input Discovery: [yes/no] +- Next Step: step-02-[name] + +**Supporting Files:** +- [list any data files, templates created] +``` + +### 7. Present MENU OPTIONS + +Display: **Step 01 Complete - Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Continue to Next Step Build + +#### EXECUTION RULES: + +- ALWAYS halt and wait for user input after presenting menu +- ONLY proceed to next step when user selects 'C' +- After other menu items execution, return to this menu + +#### Menu Handling Logic: + +- IF A: Execute {advancedElicitationTask}, and when finished redisplay the menu +- IF P: Execute {partyModeWorkflow}, and when finished redisplay the menu +- IF C: Save build summary to {workflowPlanFile}, update frontmatter stepsCompleted, then load, read entire file, then execute {nextStepFile} +- IF Any other comments or queries: help user respond then [Redisplay Menu Options](#7-present-menu-options) + +## CRITICAL STEP COMPLETION NOTE + +ONLY WHEN C is selected and build is saved to plan will you load {nextStepFile} to begin building the next step. + +--- + +## 🚨 SYSTEM SUCCESS/FAILURE METRICS + +### ✅ SUCCESS: + +- step-01-init.md created with proper structure +- step-01b-continue.md created (if continuable) +- Frontmatter follows {frontmatterStandards} +- Menu handling follows {menuHandlingStandards} +- Step type pattern followed correctly +- Supporting files created (if needed) +- Build documented in plan + +### ❌ SYSTEM FAILURE: + +- Creating step without following template +- Missing continuation support for continuable workflow +- Wrong menu pattern for step type +- Frontmatter variables not used in step body +- Hardcoded paths instead of variables + +**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. diff --git a/src/modules/bmb/workflows/workflow/steps-c/step-09-build-next-step.md b/src/modules/bmb/workflows/workflow/steps-c/step-09-build-next-step.md new file mode 100644 index 00000000..e7dcbb5e --- /dev/null +++ b/src/modules/bmb/workflows/workflow/steps-c/step-09-build-next-step.md @@ -0,0 +1,306 @@ +--- +name: 'step-09-build-next-step' +description: 'Build the next step in the workflow sequence - repeatable until all steps are built' + +nextStepFile: './step-09-build-next-step.md' # Self-referencing - repeats until complete +targetWorkflowPath: '{bmb_creations_output_folder}/workflows/{new_workflow_name}' +workflowPlanFile: '{targetWorkflowPath}/workflow-plan-{new_workflow_name}.md' +stepTemplate: '../templates/step-template.md' +stepTypePatterns: '../data/step-type-patterns.md' +frontmatterStandards: '../data/frontmatter-standards.md' +menuHandlingStandards: '../data/menu-handling-standards.md' +outputFormatStandards: '../data/output-format-standards.md' +csvDataFileStandards: '../data/csv-data-file-standards.md' +advancedElicitationTask: '{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml' +partyModeWorkflow: '{project-root}/_bmad/core/workflows/party-mode/workflow.md' +--- + +# Step 9: Build Next Step (Repeatable) + +## STEP GOAL: + +To build the next step file in the workflow sequence based on the approved design. This step is REPEATABLE - continue running it until all steps from the design have been built. + +## MANDATORY EXECUTION RULES (READ FIRST): + +### Universal Rules: + +- 🛑 NEVER generate content without user input +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read +- 📋 YOU ARE A FACILITATOR, not a content generator +- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` + +### Role Reinforcement: + +- ✅ You are a workflow architect and systems designer +- ✅ If you already have been given communication or persona patterns, continue to use those while playing this new role +- ✅ We engage in collaborative dialogue, not command-response +- ✅ You bring implementation expertise and best practices +- ✅ User brings their specific requirements and design approvals + +### Step-Specific Rules: + +- 🎯 Load the plan to determine WHICH step to build next +- 🚫 FORBIDDEN to skip steps or build out of order +- 💬 Each step is built collaboratively based on approved design +- 🚪 This step REPEATS until all workflow steps are built + +## EXECUTION PROTOCOLS: + +- 🎯 Always check what's been built, then build the next one +- 💾 Document each step in the plan as it's built +- 📖 Update frontmatter stepsCompleted to add each step when completed +- 🚫 Don't proceed to completion until ALL workflow steps are built + +## CONTEXT BOUNDARIES: + +- Approved design from step 6 specifies all steps +- The plan tracks which steps have been built +- Load step type patterns to understand each step's structure +- This step continues until the design is fully implemented + +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change. + +### 1. Check Build Status + +Load {workflowPlanFile} and check: + +**What steps have been built so far?** +- Step 01: Always built in step-08 +- Subsequent steps: Track in plan + +**What is the NEXT step to build?** + +From the design in the plan, identify: +- Step number and name +- Step type (Middle/Standard, Middle/Simple, Branch, Validation, Final Polish, Final) +- This step's goal and purpose + +Confirm: "The next step to build is **step-{N}-{name}** which is a [step type]. Its goal is: [goal from design]. Ready to proceed?" + +### 2. Load Standards for This Step Type + +**Load {stepTypePatterns}** and find the pattern for this step type: +- Middle Step (Standard) - A/P/C menu, collaborative content +- Middle Step (Simple) - C only menu, no A/P +- Branch Step - Custom menu with routing logic +- Validation Sequence - Auto-proceed through checks +- Final Polish Step - Optimizes document built section-by-section +- Final Step - Completion, no next step + +**Load {frontmatterStandards}** for variable rules. + +**Load {menuHandlingStandards}** for menu patterns. + +**Load {outputFormatStandards}** if this step outputs to document. + +### 3. Build the Step File + +**Load {stepTemplate}** for base structure. + +Create `steps-c/step-{N}-{name}.md` with: + +**Frontmatter:** +```yaml +--- +name: 'step-{N}-{name}' +description: '[what this step does]' + +# File references (ONLY variables used in this step) +nextStepFile: './step-{N+1}-[next-name].md' # Omit for final step +outputFile: '{output_folder}/[output-name].md' +templateFile: '../templates/[template-name].md' # If applicable + +# Data files (if this step needs them) +someData: '../data/[data-file].csv' # If applicable + +# Tasks (if A/P menu used) +advancedElicitationTask: '{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml' +partyModeWorkflow: '{project-root}/_bmad/core/workflows/party-mode/workflow.md' +--- +``` + +**Content Structure:** (Same pattern as step-01, customized for this step) + +```markdown +# Step {N}: [Step Name From Design] + +## STEP GOAL: +[Single sentence goal from design] + +## MANDATORY EXECUTION RULES (READ FIRST): +### Universal Rules: +- 🛑 NEVER generate content without user input +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read +- 📋 YOU ARE A FACILITATOR, not a content generator +- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` + +### Role Reinforcement: +- ✅ You are [role from design] +- ✅ We engage in collaborative dialogue, not command-response +- ✅ You bring [expertise for this step], user brings [theirs] + +### Step-Specific Rules: +- 🎯 Focus only on [specific task for this step] +- 🚫 FORBIDDEN to [prohibited action] +- 💬 Approach: [how to engage for this step] + +## EXECUTION PROTOCOLS: +- 🎯 Follow the MANDATORY SEQUENCE exactly +- 💾 [Protocol - append to output if this step outputs] +- 📖 [Protocol - tracking if applicable] + +## CONTEXT BOUNDARIES: +- [What's available at this step] +- Focus: [what to focus on] +- Limits: [boundaries] +- Dependencies: [what this step depends on from previous steps] + +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change. + +### 1. [First action - from design] +[Intent-based instructions for this step] + +### 2. [Second action - from design] +[Intent-based instructions] + +### ... [continue for all actions in this step] + +### N. Present MENU OPTIONS +[Menu based on step type - Standard A/P/C, Simple C-only, Branching, Auto-proceed] + +#### EXECUTION RULES: +[Based on menu type from {menuHandlingStandards}] + +#### Menu Handling Logic: +[Handler for this step's menu] + +## 🚨 SYSTEM SUCCESS/FAILURE METRICS: +### ✅ SUCCESS: +[What success looks like for this step] + +### ❌ SYSTEM FAILURE: +[What failure looks like] + +**Master Rule:** Skipping steps is FORBIDDEN. +``` + +**Customize based on:** +- Step type pattern from {stepTypePatterns} +- The step's specific goal and actions from design +- What this step outputs (if document-producing workflow) +- Menu pattern appropriate for step type + +### 4. Create Supporting Files (If Needed) + +**Does this step need any:** + +**Small templates?** - Inline in step content or create small template file + +**Data files?** - If step references CSV data, create in `data/` folder +- Load {csvDataFileStandards} for CSV structure +- Create CSV with proper headers and data + +**Validation checklists?** - If this step validates something, create checklist + +**Section templates?** - If step outputs to specific document section + +**If supporting files are created:** +1. Create in appropriate folder (`data/` or `templates/`) +2. Update step frontmatter to reference them +3. Document in plan + +### 5. Document Build in Plan + +Append to {workflowPlanFile}: + +```markdown +## Step {N} Build Complete + +**Created:** +- steps-c/step-{N}-{name}.md +- [any supporting files] + +**Step Configuration:** +- Type: [step type] +- Outputs to: [output section or file] +- Next Step: [next step or "final step"] + +**Supporting Files:** +- [list any data files, templates created for this step] +``` + +### 6. Check If More Steps Needed + +After documenting, check the design: + +**Are all steps from the design now built?** +- **YES:** Proceed to completion menu (option 7 below) +- **NO:** Present continuation menu (option 6 below) + +### 6a. Present MENU OPTIONS (More Steps Remaining) + +Display: **Step {N} Complete - Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Build Next Step + +#### EXECUTION RULES: + +- ALWAYS halt and wait for user input after presenting menu +- ONLY build next step when user selects 'C' +- After other menu items execution, return to this menu + +#### Menu Handling Logic: + +- IF A: Execute {advancedElicitationTask}, and when finished redisplay the menu +- IF P: Execute {partyModeWorkflow}, and when finished redisplay the menu +- IF C: Save build summary to {workflowPlanFile}, update frontmatter stepsCompleted, then load, read entire file, then execute {nextStepFile} (which is THIS FILE - self-referencing for next iteration) +- IF Any other comments or queries: help user respond then [Redisplay Menu Options](#6a-present-menu-options-more-steps-remaining) + +### 6b. Present MENU OPTIONS (All Steps Complete) + +Display: **All Workflow Steps Built! Select an Option:** [R] Review Built Steps [V] Proceed to Validation [C] Complete Build + +#### EXECUTION RULES: + +- ALWAYS halt and wait for user input after presenting menu +- User selects final action + +#### Menu Handling Logic: + +- IF R: List all built steps with their paths, allow review, then redisplay menu +- IF V: Save final build summary to {workflowPlanFile}, update frontmatter stepsCompleted to include ALL steps, then load `./step-10-confirmation.md` +- IF C: Same as V (complete and proceed) +- IF Any other comments or queries: help user respond then [Redisplay Menu Options](#6b-present-menu-options-all-steps-complete) + +## CRITICAL STEP COMPLETION NOTE + +This step REPEATS until all workflow steps from the design are built. When complete, user selects V or C to proceed to completion. + +--- + +## 🚨 SYSTEM SUCCESS/FAILURE METRICS + +### ✅ SUCCESS: + +- Each step file created with proper structure for its type +- Frontmatter follows {frontmatterStandards} +- Menu handling follows {menuHandlingStandards} +- Step type pattern followed correctly +- Supporting files created as needed +- Each build documented in plan +- Process continues until ALL design steps are built + +### ❌ SYSTEM FAILURE: + +- Building steps out of order +- Skipping steps from the design +- Wrong menu pattern for step type +- Not documenting each step in plan +- Proceeding to completion before all steps built + +**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. diff --git a/src/modules/bmb/workflows/workflow/steps-c/step-10-confirmation.md b/src/modules/bmb/workflows/workflow/steps-c/step-10-confirmation.md new file mode 100644 index 00000000..c7534cb5 --- /dev/null +++ b/src/modules/bmb/workflows/workflow/steps-c/step-10-confirmation.md @@ -0,0 +1,320 @@ +--- +name: 'step-10-confirmation' +description: 'Confirm workflow completion - validate plan completion or conversion coverage' + +targetWorkflowPath: '{bmb_creations_output_folder}/workflows/{new_workflow_name}' +workflowPlanFile: '{targetWorkflowPath}/workflow-plan-{new_workflow_name}.md' +nextStepFile: './step-11-completion.md' +validationWorkflow: '{targetWorkflowPath}/steps-v/step-01-validate.md' +--- + +# Step 10: Confirmation + +## STEP GOAL: + +Confirm the workflow build is complete by checking plan metadata. If this is a conversion, verify all original workflow elements are covered. If new, validate all plan requirements were met. + +## MANDATORY EXECUTION RULES (READ FIRST): + +### Universal Rules: + +- 🛑 NEVER skip reading the plan file completely +- 📖 CRITICAL: Read the complete step file before taking any action +- 📋 YOU ARE A FACILITATOR, not an autonomous converter +- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` + +### Role Reinforcement: + +- ✅ You are a workflow quality assurance specialist +- ✅ If you already have been given communication or persona patterns, continue to use those while playing this new role +- ✅ We engage in collaborative dialogue, not command-response +- ✅ You bring thorough review expertise +- ✅ User confirms everything is complete + +### Step-Specific Rules: + +- 🎯 Focus on confirmation and verification +- 🚫 FORBIDDEN to skip checking plan metadata +- 💬 MUST read the entire plan to verify completion +- 📋 Different paths for conversion vs new workflows + +## EXECUTION PROTOCOLS: + +- 🎯 Load and read workflow plan completely +- 💾 Check for conversionFrom metadata field +- 📖 Route to appropriate confirmation path +- 🚫 FORBIDDEN to proceed without verification + +## CONTEXT BOUNDARIES: + +- All build steps are complete +- This is the final verification before completion +- Conversion workflows get coverage check +- New workflows get plan completion check + +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise. + +### 1. Load Workflow Plan + +**Load the workflowPlanFile completely:** + +Read `{workflowPlanFile}` entirely to extract: +- Frontmatter metadata (check for `conversionFrom`) +- Discovery notes +- All requirements from classification, design, tools sections +- Original workflow analysis (if conversion) + +"**Loading workflow plan for confirmation...**" + +### 2. Check Conversion Metadata + +**Examine plan frontmatter for `conversionFrom` field:** + +```yaml +conversionFrom: '{path to source workflow if this is a conversion}' +``` + +**IF conversionFrom EXISTS:** +Route to [Conversion Confirmation](#3-conversion-confirmation-path) + +**ELSE (no conversionFrom):** +Route to [New Workflow Confirmation](#4-new-workflow-confirmation-path) + +--- + +### 3. Conversion Confirmation Path + +**DO NOT BE LAZY - Load and review the ORIGINAL workflow completely:** + +"**This is a workflow conversion. Verifying all original elements are covered...**" + +**Load the original workflow from conversionFrom path:** +- Read EVERY file from the source workflow +- Extract original goal, steps, instructions + +**For each element from the original, verify coverage:** + +#### A. Original Goal Coverage + +"**Original Goal:** {from source} + +**✅ Covered in new workflow:** {how it's covered} + +OR + +**⚠️ Partial coverage:** {what's covered} - {what might be missing} + +OR + +**❌ Not covered:** {explain gap}" + +#### B. Original Step Coverage + +**For EACH step from the original workflow:** + +| Original Step | Purpose | Covered In | Status | +|---------------|---------|------------|--------| +| {step name} | {purpose} | {new step location} | ✅ Full / ⚠️ Partial / ❌ Missing | + +"**Step-by-step coverage:** {count} of {total} steps fully covered" + +#### C. Original Instruction Patterns + +**Review how the original workflow instructed the LLM:** + +"**Original instruction style:** {describe} + +**New workflow instruction style:** {describe} + +**Collaborative patterns preserved:** {yes/no + details} + +**Key LLM instructions covered:** +{List the key instruction patterns and how they're preserved}" + +#### D. Conversion Coverage Summary + +Present findings: + +"**━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━** + +**Conversion Coverage Report** + +**Source:** {conversionFrom} +**Target:** {targetWorkflowPath} + +**Overall Coverage:** {percentage}% + +| Category | Total | Covered | Partial | Missing | +|----------|-------|---------|---------|---------| +| Goal | 1 | 1 | 0 | 0 | +| Steps | {count} | {count} | {count} | {count} | +| Instructions | {count} | {count} | {count} | {count} | +| Output | 1 | 1 | 0 | 0 | + +--- + +**Missing Elements:** {count} +{List any gaps found} + +**Improvements Made:** {count} +{List enhancements beyond original} + +**━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━** + +**Does this coverage look complete? Any gaps to address?** + +[C] Continue - Coverage is complete +[F] Fix gaps - Address missing elements +[R] Review details - See full comparison" + +**Menu Handling Logic:** + +- IF C: Proceed to [Completion Handoff](#5-completion-handoff) +- IF F: Return to build steps to address gaps (route to step-09-build-next-step.md) +- IF R: Present detailed step-by-step comparison, then redisplay menu +- IF Any other: help user respond, then redisplay menu + +--- + +### 4. New Workflow Confirmation Path + +**This is a new workflow (not a conversion). Validate all plan requirements were met.** + +"**Verifying all requirements from the plan were implemented...**" + +#### A. Load Plan Requirements + +**From workflowPlanFile, extract ALL requirements:** + +- Discovery: User's vision, who it's for, what it produces +- Classification: Type, structure, mode decisions +- Requirements: Specific features, inputs, outputs +- Design: Step structure, flow, key decisions +- Tools: Data files, templates, references + +#### B. Verify Each Requirement + +**For EACH requirement from the plan:** + +| Requirement Area | Specified | Implemented | Location | Status | +|------------------|-----------|-------------|----------|--------| +| {area} | {what was specified} | {what was built} | {file/step} | ✅/⚠️/❌ | + +#### C. Plan Completion Summary + +Present findings: + +"**━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━** + +**Plan Completion Report** + +**Workflow:** {new_workflow_name} +**Location:** {targetWorkflowPath} + +**Overall Completion:** {percentage}% + +| Requirement Area | Specified | Implemented | Status | +|------------------|-----------|-------------|--------| +| Discovery Vision | {from plan} | {what was built} | ✅/⚠️ | +| Workflow Type | {from plan} | {what was built} | ✅/⚠️ | +| Structure | {from plan} | {what was built} | ✅/⚠️ | +| Key Features | {from plan} | {what was built} | ✅/⚠️ | +| Data/Tools | {from plan} | {what was built} | ✅/⚠️ | + +--- + +**Missing Requirements:** {count} +{List any unmet requirements} + +**Beyond Plan:** {count} +{List any additional features added during build} + +**━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━** + +**Does this implementation match your vision?** + +[C] Continue - Implementation is complete +[F] Fix gaps - Address missing requirements +[R] Review details - See full comparison" + +**Menu Handling Logic:** + +- IF C: Proceed to [Completion Handoff](#5-completion-handoff) +- IF F: Return to build steps to address gaps (route to step-09-build-next-step.md) +- IF R: Present detailed requirement-by-requirement comparison, then redisplay menu +- IF Any other: help user respond, then redisplay menu + +--- + +### 5. Completion Handoff + +**After user confirms coverage/completion:** + +Update `{workflowPlanFile}` frontmatter: + +```yaml +status: CONFIRMED +confirmationDate: {current date} +confirmationType: {conversion / new_workflow} +coverageStatus: {complete / gaps_accepted} +``` + +Proceed to [Validation Offer](#6-validation-offer). + +--- + +### 6. Validation Offer + +"**✅ Workflow build confirmed!** + +**Before using your workflow, I recommend running extensive validation.** + +The validation phase will systematically check: +- File structure & size +- Frontmatter compliance +- Menu handling patterns +- Step type patterns +- Output format standards +- Instruction style +- Overall quality + +**Would you like to run validation?**" + +Display: **Build Confirmed! Select an Option:** [V] Start Validation [S] Skip - Complete Now + +#### Menu Handling Logic: + +- IF V: "Loading validation phase..." → Save confirmation status, update frontmatter, then load, read entire file, then execute {validationWorkflow} +- IF S: "Skipping validation. Proceeding to completion..." → Load, read entire file, then execute {nextStepFile} +- IF Any other: help user respond, then redisplay menu + +## CRITICAL STEP COMPLETION NOTE + +ALWAYS check plan metadata for conversionFrom field. Route to appropriate confirmation path. Only proceed after user confirms coverage/completion is satisfactory. + +--- + +## 🚨 SYSTEM SUCCESS/FAILURE METRICS + +### ✅ SUCCESS: + +- Plan file loaded completely +- ConversionFrom metadata checked +- Appropriate confirmation path executed +- Original workflow reviewed (if conversion) +- Plan requirements verified (if new) +- Coverage/completion report presented clearly +- User confirms and proceeds + +### ❌ SYSTEM FAILURE: + +- Not loading plan file completely +- Not checking conversionFrom metadata +- Skipping original workflow review (conversion) +- Not verifying plan requirements (new) +- Proceeding without user confirmation +- Missing gaps in coverage + +**Master Rule:** Check conversionFrom metadata first. For conversions, REVIEW THE ORIGINAL COMPLETELY. For new workflows, VERIFY ALL PLAN REQUIREMENTS. Only proceed after user confirms. diff --git a/src/modules/bmb/workflows/workflow/steps-c/step-11-completion.md b/src/modules/bmb/workflows/workflow/steps-c/step-11-completion.md new file mode 100644 index 00000000..efa9fdf1 --- /dev/null +++ b/src/modules/bmb/workflows/workflow/steps-c/step-11-completion.md @@ -0,0 +1,191 @@ +--- +name: 'step-11-completion' +description: 'Complete the workflow creation and provide next steps' + +targetWorkflowPath: '{bmb_creations_output_folder}/workflows/{new_workflow_name}' +workflowPlanFile: '{targetWorkflowPath}/workflow-plan-{new_workflow_name}.md' +--- + +# Step 11: Completion + +## STEP GOAL: + +Complete the workflow creation process with a summary of what was built and next steps guidance. + +## MANDATORY EXECUTION RULES (READ FIRST): + +### Universal Rules: + +- 🛑 NEVER modify the completed workflow at this stage +- 📖 CRITICAL: Read the complete step file before taking any action +- 📋 YOU ARE A FACILITATOR, not a content generator +- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` + +### Role Reinforcement: + +- ✅ You are a workflow architect and systems designer +- ✅ If you already have been given communication or persona patterns, continue to use those while playing this new role +- ✅ We engage in collaborative dialogue, not command-response +- ✅ You bring completion expertise +- ✅ User decides next steps + +### Step-Specific Rules: + +- 🎯 Focus ONLY on summary and next steps +- 🚫 FORBIDDEN to modify the built workflow +- 💬 Present options clearly +- 🚪 This is the final step + +## EXECUTION PROTOCOLS: + +- 🎯 Present completion summary +- 💾 Finalize plan document +- 📖 Provide usage guidance +- 🚫 No more modifications at this stage + +## CONTEXT BOUNDARIES: + +- All workflow steps have been built +- Confirmation has been completed +- Validation may or may not have been run +- This is the final step + +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise. + +### 1. Present Completion Summary + +"**━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━** + +# Workflow Creation Complete! + +**Workflow:** {new_workflow_name} +**Location:** {targetWorkflowPath} +**Created:** {current date} + +--- + +## What Was Built + +**Workflow Structure:** +- **Type:** [continuable/single-session] +- **Mode:** [create-only/tri-modal] +- **Steps Created:** [count] + +**Files Created:** +- workflow.md (entry point) +- [count] step files in steps-c/ +- [count] validation files in steps-v/ (if tri-modal) +- [count] edit files in steps-e/ (if tri-modal) +- [count] supporting files in data/ +- [count] templates in templates/ + +--- + +## Your Workflow Is Ready! + +**To use your new workflow:** + +1. Navigate to: {targetWorkflowPath} +2. Load workflow.md to start +3. Follow the step-by-step instructions + +**━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━**" + +### 2. Update Plan with Completion Status + +Update {workflowPlanFile} frontmatter: + +```yaml +--- +workflowName: {new_workflow_name} +creationDate: [original creation date] +completionDate: [current date] +status: COMPLETE +stepsCompleted: ['step-01-discovery' or 'step-00-conversion', 'step-02-classification', 'step-03-requirements', 'step-04-tools', 'step-05-plan-review', 'step-06-design', 'step-07-foundation', 'step-08-build-step-01', 'step-09-build-next-step', 'step-10-confirmation', 'step-11-completion'] +--- +``` + +### 3. Provide Next Steps Guidance + +"**Next Steps:** + +**Test your workflow:** +- Run through it end-to-end +- Try with sample data +- Verify all steps work as expected + +**Get user feedback:** +- If others will use it, have them test +- Gather feedback on facilitation +- Note any friction points + +**Future maintenance:** +- Use validation mode to check compliance +- Use edit mode to make changes +- Validation can be run anytime + +**Resources:** +- **Validate later:** Load {targetWorkflowPath}/workflow.md with -v flag +- **Edit later:** Load {targetWorkflowPath}/workflow.md with -e flag +- **Build more:** Use create workflow mode for new workflows" + +### 4. Conversion-Specific Summary (If Applicable) + +**Check workflowPlanFile frontmatter for `conversionFrom`:** + +**IF this was a conversion:** + +"**Conversion Complete!** + +**Original workflow:** {conversionFrom} +**New location:** {targetWorkflowPath} + +**Preserved:** +- Original goal and purpose +- All {count} steps +- Key instruction patterns +- Output format + +**Improvements made:** +- BMAD compliance +- Better structure +- Enhanced collaboration +- Standards adherence + +**Review the conversion report** in the confirmation step for full details." + +### 5. Final Completion Message + +"**Thank you for using BMAD Workflow Creator!** + +Your workflow **{new_workflow_name}** is complete and ready to use. + +**Workflow location:** {targetWorkflowPath}/workflow.md + +Happy workflowing! ✅" + +## CRITICAL STEP COMPLETION NOTE + +This is the final step. Present completion summary, finalize plan, and provide next steps. No further modifications. + +--- + +## 🚨 SYSTEM SUCCESS/FAILURE METRICS + +### ✅ SUCCESS: + +- Completion summary presented clearly +- Plan finalized with COMPLETE status +- Usage guidance provided +- Conversion specifics noted (if applicable) +- Session ends positively + +### ❌ SYSTEM FAILURE: + +- Not providing clear summary +- Not finalizing plan status +- Missing usage guidance + +**Master Rule:** End on a positive note with clear summary and next steps. The workflow is ready to use. diff --git a/src/modules/bmb/workflows/workflow/steps-e/step-e-01-assess-workflow.md b/src/modules/bmb/workflows/workflow/steps-e/step-e-01-assess-workflow.md new file mode 100644 index 00000000..295b7fa9 --- /dev/null +++ b/src/modules/bmb/workflows/workflow/steps-e/step-e-01-assess-workflow.md @@ -0,0 +1,237 @@ +--- +name: 'step-e-01-assess-workflow' +description: 'Load target workflow, check compliance, check for validation report, offer validation if needed' + +# File References +nextStepFile: './step-e-02-discover-edits.md' +editPlan: '{bmb_creations_output_folder}/edit-plan-{workflow_name}.md' +validationWorkflow: '../steps-v/step-01-validate.md' +conversionStep: '../steps-c/step-00-conversion.md' +--- + +# Edit Step 1: Assess Workflow + +## STEP GOAL: + +Load the target workflow, check if it follows BMAD step-file architecture, check for existing validation report, and offer to run validation if needed. + +## MANDATORY EXECUTION RULES (READ FIRST): + +### Universal Rules: + +- 📖 CRITICAL: Read the complete step file before taking any action +- 📋 YOU ARE A FACILITATOR, not an autonomous editor +- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` + +### Step-Specific Rules: + +- 🎯 Focus ONLY on assessment - no editing yet +- 🚫 FORBIDDEN to proceed without loading workflow completely +- 💬 Explain findings clearly and get user confirmation +- 🚪 ROUTE non-compliant workflows to create flow + +## EXECUTION PROTOCOLS: + +- 🎯 Load and analyze target workflow +- 💾 Create edit plan document +- 📖 Check for validation report +- 🚫 FORBIDDEN to proceed without user confirmation + +## CONTEXT BOUNDARIES: + +- User provides workflow path from workflow.md routing +- Focus: Assessment and routing +- This is NOT about making changes yet + +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip or shortcut. + +### 1. Get Workflow Path + +From the user input provided by workflow.md routing, extract: +- `targetWorkflowPath` - path to workflow.md file +- `workflowName` - derived from path + +**If path was not provided:** + +"Which workflow would you like to edit? Please provide the path to the workflow.md file." + +### 2. Load Workflow Completely + +**Load these files:** + +1. `{targetWorkflowPath}/workflow.md` - Must exist - if the user indicates is something else, ask if this is a conversion to the compliant v6 format +2. Check for step folders: `steps*` +3. Check for `data/` folder +4. Check for `templates/` folder + +### 3. Compliance Check + +**Determine if workflow is BMAD-compliant:** + +**Compliant workflow has:** +- ✅ workflow.md file exists at root +- ✅ At least one step folder exists (steps-c/, steps-v/, or steps-e/) +- ✅ Step files use markdown format (.md) +- ✅ workflow.md has frontmatter (name, description) + +**Non-compliant workflow:** +- ❌ No workflow.md file +- ❌ Has workflow.yaml or instructions.md (legacy format) +- ❌ No step folders +- ❌ Step files are not markdown + +### 4. Route Based on Compliance + +**IF NON-COMPLIANT:** + +"**Workflow Assessment Result: Non-Compliant Format** + +I found that this workflow does not follow BMAD step-file architecture: +- [Describe what was found - e.g., legacy format, missing workflow.md, etc.] + +**Recommendation:** This workflow should be converted using the create workflow process. The create workflow can use your existing workflow as input discovery material to build a new compliant workflow. + +**Would you like to:** + +1. **[C]onvert to Compliant Workflow** - Use existing workflow as input to build compliant version +2. **[E]xplore manual conversion** - I can explain what needs to change +3. **[X] Exit** - Cancel this operation + +#### Menu Handling Logic: + +- IF C: Route to create workflow conversion mode → Load {conversionStep} with sourceWorkflowPath set to {targetWorkflowPath} +- IF E: Explain conversion requirements, then redisplay menu +- IF X: Exit with guidance +- IF Any other: help user, then redisplay menu" + +**IF COMPLIANT:** + +"**Workflow Assessment Result: Compliant Format** + +This workflow follows BMAD step-file architecture: +- ✅ workflow.md found +- ✅ Step folders: [list which ones exist] +- ✅ Data folder: [yes/no] +- ✅ Templates folder: [yes/no]" + +Continue to step 5. + +### 5. Check for Validation Report + +**Look for validation report:** +- Check `{targetWorkflowPath}/validation-report-{workflow_name}.md` +- Check if report exists and read completion status + +**IF NO VALIDATION REPORT EXISTS:** + +"This workflow has not been validated yet. + +**Recommendation:** Running validation first can help identify issues before editing. Would you like to: + +1. **[V]alidate first** - Run comprehensive validation, then proceed with edits +2. **[S]kip validation** - Proceed directly to editing + +#### Menu Handling Logic: + +- IF V: Load, read entirely, then execute {validationWorkflow}. After validation completes, return to this step and proceed to step 6. +- IF S: Proceed directly to step 6 (Discover Edits) +- IF Any other: help user, then redisplay menu" + +**IF VALIDATION REPORT EXISTS:** + +Read the validation report and note: +- Overall status (COMPLETE/INCOMPLETE) +- Critical issues count +- Warning issues count + +"**Existing Validation Report Found:** + +- Status: [status] +- Critical Issues: [count] +- Warnings: [count] + +I'll keep this report in mind during editing." + +Continue to step 6. + +### 6. Create Edit Plan Document + +**Initialize edit plan:** + +```markdown +--- +mode: edit +targetWorkflowPath: '{targetWorkflowPath}' +workflowName: '{workflow_name}' +editSessionDate: '{current-date}' +stepsCompleted: + - step-e-01-assess-workflow.md +hasValidationReport: [true/false] +validationStatus: [from report if exists] +--- + +# Edit Plan: {workflow_name} + +## Workflow Snapshot + +**Path:** {targetWorkflowPath} +**Format:** BMAD Compliant ✅ +**Step Folders:** [list found] + +## Validation Status + +[If report exists: summary of validation status] +[If no report: No validation run yet] + +--- + +## Edit Goals + +*To be populated in next step* + +--- + +## Edits Applied + +*To track changes made* +``` + +Write to `{editPlan}`. + +### 7. Present MENU OPTIONS + +Display: "**Assessment Complete. Select an Option:** [C] Continue to Discovery" + +#### Menu Handling Logic: + +- IF C: Update editPlan, then load, read entire file, then execute {nextStepFile} +- IF Any other: help user respond, then redisplay menu + +## CRITICAL STEP COMPLETION NOTE + +ONLY WHEN user selects [C] and edit plan is created, will you then load and read fully `{nextStepFile}` to execute and begin edit discovery. + +--- + +## 🚨 SYSTEM SUCCESS/FAILURE METRICS + +### ✅ SUCCESS: + +- Workflow loaded completely +- Compliance status determined +- Non-compliant workflows routed to create flow +- Edit plan document created +- Validation report checked +- User confirmed to proceed + +### ❌ SYSTEM FAILURE: + +- Not loading workflow completely +- Misclassifying non-compliant workflow as compliant +- Not routing non-compliant to create flow +- Not checking for validation report +- Not creating edit plan + +**Master Rule:** Assessment must be thorough. Non-compliant workflows MUST be routed to create flow. Always check for validation report before editing. diff --git a/src/modules/bmb/workflows/workflow/steps-e/step-e-02-discover-edits.md b/src/modules/bmb/workflows/workflow/steps-e/step-e-02-discover-edits.md new file mode 100644 index 00000000..d54a9a50 --- /dev/null +++ b/src/modules/bmb/workflows/workflow/steps-e/step-e-02-discover-edits.md @@ -0,0 +1,248 @@ +--- +name: 'step-e-02-discover-edits' +description: 'Discover what user wants to change - fix validation issues, make changes, or both' + +# File References +nextStepFile: './step-e-03-fix-validation.md' +directEditStep: './step-e-04-direct-edit.md' +editPlan: '{bmb_creations_output_folder}/edit-plan-{workflow_name}.md' +targetWorkflowPath: '{targetWorkflowPath}' +validationReport: '{targetWorkflowPath}/validation-report-{workflow_name}.md' +--- + +# Edit Step 2: Discover Edits + +## STEP GOAL: + +Discover what the user wants to do: fix validation issues, make specific changes, or both. Document edit goals in the edit plan. + +## MANDATORY EXECUTION RULES (READ FIRST): + +### Universal Rules: + +- 🛑 NEVER assume what edits are needed +- 📖 CRITICAL: Read the complete step file before taking any action +- 📋 YOU ARE A FACILITATOR, not an autonomous editor +- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` + +### Step-Specific Rules: + +- 🎯 Focus ONLY on understanding edit goals +- 🚫 FORBIDDEN to make any modifications yet +- 💬 Ask clarifying questions +- 🚪 CATEGORIZE edits by type + +## EXECUTION PROTOCOLS: + +- 🎯 Guide discovery conversation +- 💾 Document edit goals in edit plan +- 📖 Determine which next step to load +- 🚫 FORBIDDEN to proceed without user confirmation + +## CONTEXT BOUNDARIES: + +- Edit plan from previous step provides context +- Validation report (if exists) provides issues to fix +- Focus: What does user want to change? +- This is discovery, not implementation + +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip or shortcut. + +### 1. Read Edit Plan Context + +**Load the editPlan file:** +Read `{editPlan}` to understand the workflow context and validation status. + +### 2. Determine Discovery Approach + +**IF validation report exists AND has issues:** + +Present fix-or-change options (step 3a) + +**ELSE (no validation report or no issues):** + +Present direct change options (step 3b) + +--- + +### 3a. Discovery With Validation Issues + +**IF validation report exists with issues:** + +"**I found an existing validation report for this workflow.** + +**Validation Summary:** +- Status: {status from report} +- Critical Issues: {count} +- Warnings: {count} + +**What would you like to do?** + +**[F]ix Validation Issues** - Systematically fix issues found in validation +**[C]hange Something** - Make a specific change (add feature, modify step, etc.) +**[B]oth** - Fix validation issues, then make a change +**[R]eview Report** - See detailed validation findings first + +#### Menu Handling Logic: + +- IF F: Proceed to [Document Fix Goals](#4-document-fix-goals), then route to {nextStepFile} +- IF C: Proceed to [Document Change Goals](#3b-discovery-for-direct-change) +- IF B: Document both fix and change goals, then route to {nextStepFile} for fixes first +- IF R: Present key findings from validation report, then redisplay this menu +- IF Any other: help user, then redisplay menu" + +--- + +### 3b. Discovery For Direct Change + +**IF no validation report or no issues:** + +"**What would you like to change about this workflow?** + +I can help you modify: + +**[W]orkflow.md** - Goal, role, initialization, routing +**[S]tep Files** - Add, remove, or modify steps +**[D]ata Files** - Add or modify reference data in data/ folder +**[T]emplates** - Add or modify output templates +**[M]ultiple** - Changes across multiple areas +**[O]ther** - Something else + +Which areas would you like to edit?" + +#### For Each Selected Category: + +**If Workflow.md selected:** +- "What aspects need change?" + - Goal or description? + - Role definition? + - Architecture principles? + - Initialization/routing? + +**If Step Files selected:** +- "What type of step changes?" + - Add new step? + - Remove existing step? + - Modify step content? + - Reorder steps? + +**If Data Files selected:** +- "What data changes?" + - Add new data file? + - Modify existing data? + - Add/remove data entries? + +**If Templates selected:** +- "What template changes?" + - Add new template? + - Modify template structure? + - Change variable references?" + +**If Multiple selected:** +- Walk through each area systematically + +**If Other selected:** +- "Describe what you'd like to change..." + +--- + +### 4. Document Fix Goals (For Validation Issues) + +**Append to editPlan:** + +```markdown +## Edit Goals + +### Fix Validation Issues + +**Priority: High** - These issues prevent compliance + +**Critical Issues to Fix:** +- [ ] {issue from validation report} +- [ ] {issue from validation report} + +**Warnings to Address:** +- [ ] {warning from validation report} +- [ ] {warning from validation report} +``` + +--- + +### 5. Document Change Goals + +**Append to editPlan:** + +```markdown +### Direct Changes + +**Category:** [workflow.md / step files / data / templates / other] + +**Changes Requested:** +- [ ] {specific change description} +- [ ] {specific change description} + +**Rationale:** +{user's explanation of why this change is needed} +``` + +--- + +### 6. Confirm and Route + +**Present summary for confirmation:** + +"**Here's what I heard you want to do:** + +{Summarize all edit goals clearly} + +**Did I capture everything correctly?** + +- [C] Yes, continue +- [M] Modify the plan +- [X] Cancel" + +#### Menu Handling Logic: + +- IF C: Update editPlan stepsCompleted, then route based on goals: + - **If Fix goals only**: Load, read entirely, then execute {nextStepFile} (fix-validation) + - **If Change goals only**: Load, read entirely, then execute {directEditStep} + - **If Both**: Load, read entirely, then execute {nextStepFile} (fix first, then direct edit after) +- IF M: Return to relevant discovery section +- IF X: Exit with explanation +- IF Any other: help user, then redisplay menu + +### 7. Present MENU OPTIONS (Final) + +Display: "**Edit Goals Confirmed. Select an Option:** [C] Continue to Edits" + +#### Menu Handling Logic: + +- IF C: Save editPlan with confirmed goals, then load appropriate next step based on [Route Based on Goals](#6-confirm-and-route) +- IF Any other: help user respond, then redisplay menu + +## CRITICAL STEP COMPLETION NOTE + +ONLY WHEN user confirms goals and routing is determined, will you then load and read fully the appropriate next step file to execute. + +--- + +## 🚨 SYSTEM SUCCESS/FAILURE METRICS + +### ✅ SUCCESS: + +- Edit goals clearly documented +- User confirmed the plan +- Routing determined (fix vs direct vs both) +- Edit plan updated with goals +- Appropriate next step selected + +### ❌ SYSTEM FAILURE: + +- Not documenting edit goals +- Routing to wrong next step +- Not getting user confirmation +- Missing changes user mentioned + +**Master Rule:** Discovery must be thorough. Document all goals. Route correctly based on whether fixes, changes, or both are needed. diff --git a/src/modules/bmb/workflows/workflow/steps-e/step-e-03-fix-validation.md b/src/modules/bmb/workflows/workflow/steps-e/step-e-03-fix-validation.md new file mode 100644 index 00000000..7d4da1c7 --- /dev/null +++ b/src/modules/bmb/workflows/workflow/steps-e/step-e-03-fix-validation.md @@ -0,0 +1,252 @@ +--- +name: 'step-e-03-fix-validation' +description: 'Systematically fix validation issues from validation report' + +# File References +nextStepFile: './step-e-05-apply-edit.md' +editPlan: '{bmb_creations_output_folder}/edit-plan-{workflow_name}.md' +targetWorkflowPath: '{targetWorkflowPath}' +validationReport: '{targetWorkflowPath}/validation-report-{workflow_name}.md' + +# Standards References +architecture: '../data/architecture.md' +stepFileRules: '../data/step-file-rules.md' +frontmatterStandards: '../data/frontmatter-standards.md' +menuHandlingStandards: '../data/menu-handling-standards.md' +outputFormatStandards: '../data/output-format-standards.md' +stepTypePatterns: '../data/step-type-patterns.md' +--- + +# Edit Step 3: Fix Validation Issues + +## STEP GOAL: + +Systematically fix all issues identified in the validation report, working through each issue with user approval and loading relevant standards. + +## MANDATORY EXECUTION RULES (READ FIRST): + +### Universal Rules: + +- 🛑 NEVER make changes without user approval +- 📖 CRITICAL: Read the complete step file before taking any action +- 📋 YOU ARE A FACILITATOR, not an autonomous editor +- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` + +### Step-Specific Rules: + +- 🎯 Focus on fixing validation issues systematically +- 🚫 FORBIDDEN to skip issues or fix without approval +- 💬 Explain each issue and proposed fix +- 📋 Load relevant standards for each fix type + +## EXECUTION PROTOCOLS: + +- 🎯 Work through issues systematically +- 💾 Document each fix in edit plan +- 📖 Load appropriate standards for each issue type +- 🚫 FORBIDDEN to proceed without user approval for each fix + +## CONTEXT BOUNDARIES: + +- Validation report provides list of issues +- Edit plan documents fix goals +- Focus: Fix each issue with standards adherence +- This is systematic remediation, not creative editing + +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip or shortcut. + +### 1. Read Context Files + +**Load these files first:** +1. `{editPlan}` - Review fix goals +2. `{validationReport}` - Get full list of issues + +### 2. Organize Issues by Type + +**From validation report, categorize issues:** + +| Issue Type | Standard File | Count | +|------------|---------------|-------| +| workflow.md violations | {architecture} | | +| Step file structure | {stepFileRules} | | +| Frontmatter issues | {frontmatterStandards} | | +| Menu handling | {menuHandlingStandards} | | +| Output format | {outputFormatStandards} | | +| Step type issues | {stepTypePatterns} | | + +### 3. Work Through Issues Systematically + +**For EACH issue in order of severity (Critical → Warning):** + +#### A. Load Relevant Standard + +**Before proposing fix, load the relevant standard file:** +- If workflow.md issue → Load {architecture} +- If step file issue → Load {stepFileRules} +- If frontmatter issue → Load {frontmatterStandards} +- If menu issue → Load {menuHandlingStandards} +- If output issue → Load {outputFormatStandards} +- If step type issue → Load {stepTypePatterns} + +#### B. Explain the Issue + +"**Issue: [{issue type}] {file}:{location if applicable}** + +**What the validation found:** +{Quote the validation finding} + +**Why this is a problem:** +{Explain the impact based on the standard} + +**Standard reference:** +{Cite the specific standard from the loaded file}" + +#### C. Propose Fix + +"**Proposed fix:** +{Specific change needed} + +**This will:** +- ✅ Fix the compliance issue +- ✅ Align with: {specific standard} +- ⚠️ Potential impact: {any side effects} + +**Should I apply this fix?**" + +#### D. Get User Approval + +Wait for user response: +- **Yes/Y** - Apply the fix +- **No/N** - Skip this issue (document why) +- **Modify** - User suggests alternative approach +- **Explain** - Provide more detail + +#### E. Apply Fix (If Approved) + +**Load the target file, make the change:** + +```markdown +**Applying fix to: {file}** + +**Before:** +{show relevant section} + +**After:** +{show modified section} + +**Fix applied.** ✅" +``` + +**Update editPlan:** +```markdown +### Fixes Applied + +**[{issue type}]** {file} +- ✅ Fixed: {description} +- Standard: {standard reference} +- User approved: Yes +``` + +### 4. Handle Skip/Modify Responses + +**IF user skips an issue:** + +"**Issue skipped.** + +Documenting in edit plan: +- [{issue type}] {file} - SKIPPED per user request +- Reason: {user's reason if provided} + +**Note:** This issue will remain in the validation report. + +Continue to next issue?" + +**IF user wants to modify the fix:** + +Discuss alternative approach, get agreement, then apply modified fix. + +### 5. After All Issues Complete + +**Present summary:** + +"**Validation Fix Summary:** + +**Total Issues Found:** {count} +**Fixed:** {count} +**Skipped:** {count} +**Modified:** {count} + +**Remaining Issues:** {list any skipped or remaining warnings} + +**Files Modified:** +- {file1} +- {file2} +- etc." + +### 6. Check for Direct Edit Goals + +**Load editPlan and check:** + +**IF edit plan includes direct change goals (beyond validation fixes):** + +"Your edit plan also includes direct changes. After we apply these validation fixes, we'll proceed to those changes." + +Update editPlan frontmatter: +```yaml +validationFixesComplete: true +``` + +Then route to {nextStepFile} for direct edits. + +**ELSE (no direct changes - validation fixes only):** + +"Validation fixes are complete! Would you like to: + +1. **[R]e-run validation** - Verify all fixes are working +2. **[C]omplete** - Finish editing with these fixes +3. **[M]ake additional changes** - Add more edits" + +#### Menu Handling Logic: + +- IF R: Run validation workflow, then return to this step +- IF C: Route to step-e-07-complete.md +- IF M: Route to step-e-02-discover-edits.md +- IF Any other: help user, then redisplay menu + +### 7. Present MENU OPTIONS (If Proceeding) + +Display: "**Validation Fixes Applied. Select an Option:** [C] Continue" + +#### Menu Handling Logic: + +- IF C: Update editPlan stepsCompleted, then load, read entirely, then execute appropriate next step +- IF Any other: help user respond, then redisplay menu + +## CRITICAL STEP COMPLETION NOTE + +ONLY WHEN all validation issues are addressed (fixed, skipped, or documented) and user confirms, will you then route to the appropriate next step. + +--- + +## 🚨 SYSTEM SUCCESS/FAILURE METRICS + +### ✅ SUCCESS: + +- All issues presented to user systematically +- Relevant standards loaded for each issue +- User approval obtained for each fix +- Fixes applied correctly +- Edit plan updated with all changes +- Files properly modified + +### ❌ SYSTEM FAILURE: + +- Skipping issues without user approval +- Not loading relevant standards +- Making changes without user confirmation +- Not documenting fixes in edit plan +- Applying fixes incorrectly + +**Master Rule:** Work through issues systematically. Load standards for each issue type. Get explicit approval before applying any fix. diff --git a/src/modules/bmb/workflows/workflow/steps-e/step-e-04-direct-edit.md b/src/modules/bmb/workflows/workflow/steps-e/step-e-04-direct-edit.md new file mode 100644 index 00000000..96f8d71c --- /dev/null +++ b/src/modules/bmb/workflows/workflow/steps-e/step-e-04-direct-edit.md @@ -0,0 +1,275 @@ +--- +name: 'step-e-04-direct-edit' +description: 'Apply direct user-requested changes to workflow' + +# File References +nextStepFile: './step-e-05-apply-edit.md' +editPlan: '{bmb_creations_output_folder}/edit-plan-{workflow_name}.md' +targetWorkflowPath: '{targetWorkflowPath}' + +# Standards References +architecture: '../data/architecture.md' +stepFileRules: '../data/step-file-rules.md' +frontmatterStandards: '../data/frontmatter-standards.md' +menuHandlingStandards: '../data/menu-handling-standards.md' +outputFormatStandards: '../data/output-format-standards.md' +stepTypePatterns: '../data/step-type-patterns.md' +workflowTypeCriteria: '../data/workflow-type-criteria.md' +inputDiscoveryStandards: '../data/input-discovery-standards.md' +csvDataFileStandards: '../data/csv-data-file-standards.md' +intentVsPrescriptive: '../data/intent-vs-prescriptive-spectrum.md' +--- + +# Edit Step 4: Direct Edit + +## STEP GOAL: + +Apply direct user-requested changes to the workflow, loading relevant standards and checking for non-compliance during editing. + +## MANDATORY EXECUTION RULES (READ FIRST): + +### Universal Rules: + +- 🛑 NEVER make changes without user approval +- 📖 CRITICAL: Read the complete step file before taking any action +- 📋 YOU ARE A FACILITATOR, not an autonomous editor +- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` + +### Step-Specific Rules: + +- 🎯 Focus on user-requested changes +- 🚫 FORBIDDEN to make changes without approval +- 💬 Check for non-compliance while editing +- 📋 Load relevant standards for each change type + +## EXECUTION PROTOCOLS: + +- 🎯 Work through each requested change +- 💾 Document each change in edit plan +- 📖 Load appropriate standards for each change type +- 🚫 IF non-compliance found: offer to fix before proceeding + +## CONTEXT BOUNDARIES: + +- Edit plan contains direct change goals +- Focus: Apply user's requested changes +- Must check for compliance issues during edits + +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip or shortcut. + +### 1. Read Edit Plan + +**Load the editPlan:** +Read `{editPlan}` to review direct change goals from step 2. + +### 2. For Each Direct Change Goal + +**Work through each change systematically:** + +#### A. Identify Change Type and Load Standards + +**For workflow.md changes:** +- Load {architecture} + +**For step file changes:** +- Load {stepFileRules} +- Load {stepTypePatterns} +- Load {intentVsPrescriptive} + +**For frontmatter changes:** +- Load {frontmatterStandards} + +**For menu changes:** +- Load {menuHandlingStandards} + +**For output/template changes:** +- Load {outputFormatStandards} + +**For data file changes:** +- Load {csvDataFileStandards} + +**For workflow type changes:** +- Load {workflowTypeCriteria} + +**For discovery/input changes:** +- Load {inputDiscoveryStandards} + +#### B. Load Target File and Check Compliance + +**Load the file to be edited and review against standards:** + +"**Loading: {filename}** +**Standard: {standard file loaded}** + +**Checking file against standards before making your change...**" + +**IF NON-COMPLIANCE FOUND:** + +"**⚠️ Compliance Issue Detected** + +Before I apply your change, I noticed this file is not fully compliant with {standard}: + +**Issue:** {describe the non-compliance} + +**This could cause:** {explain impact} + +**Should I fix this compliance issue before applying your change?** + +1. **[F]ix first** - Fix compliance, then apply your change +2. **[C]ontinue anyway** - Apply your change without fixing +3. **[E]xplain more** - More details about the issue + +#### Menu Handling Logic: + +- IF F: Fix compliance first, then proceed to apply change +- IF C: Document user accepted risk, proceed with change +- IF E: Provide more details, then redisplay menu +- IF Any other: help user, then redisplay menu" + +**IF COMPLIANT:** + +"**File is compliant.** Proceeding with your change." + +#### C. Present Current State and Proposed Change + +"**Current state of: {filename}** + +{show relevant section} + +**Your requested change:** +{summarize the change from edit plan} + +**Proposed modification:** +{show how the change will be made} + +**Should I apply this change?**" + +Wait for user approval. + +#### D. Apply Change (If Approved) + +**Load the file, make the change:** + +```markdown +**Applying change to: {filename}** + +**Before:** +{show relevant section} + +**After:** +{show modified section} + +**Change applied.** ✅" +``` + +**Update editPlan:** +```markdown +### Direct Changes Applied + +**[{change type}]** {filename} +- ✅ Changed: {description} +- User approved: Yes +- Compliance check: Passed/Fixed/Accepted risk +``` + +### 3. Handle Common Change Patterns + +#### Adding a New Step + +1. Load {stepFileRules}, {stepTypePatterns}, {intentVsPrescriptive} +2. Check existing step numbering +3. Determine appropriate step type +4. Create step file with proper structure +5. Update nextStepFile references in adjacent steps +6. Verify menu handling compliance + +#### Removing a Step + +1. Load {architecture} +2. Check if step is referenced by other steps +3. Update nextStepFile in previous step +4. Confirm with user about impact +5. Remove step file +6. Verify no broken references + +#### Modifying workflow.md + +1. Load {architecture} +2. Check for progressive disclosure compliance (no step listings!) +3. Update goal/role/routing as requested +4. Ensure last section is routing +5. Verify frontmatter completeness + +#### Adding/Modifying Data Files + +1. Load {csvDataFileStandards} +2. Check file size (warn if >500 lines) +3. Verify CSV format if applicable +4. Ensure proper headers +5. Update step frontmatter references + +#### Adding/Modifying Templates + +1. Load {outputFormatStandards} +2. Determine template type +3. Ensure variable consistency +4. Update step frontmatter references + +### 4. After All Changes Complete + +**Present summary:** + +"**Direct Edit Summary:** + +**Total Changes Requested:** {count} +**Applied:** {count} +**Skipped:** {count} +**Modified:** {count} + +**Compliance Issues Found During Editing:** {count} +- Fixed: {count} +- User accepted risk: {count} + +**Files Modified:** +- {file1} +- {file2} +- etc." + +### 5. Present MENU OPTIONS + +Display: "**Direct Edits Applied. Select an Option:** [C] Continue" + +#### Menu Handling Logic: + +- IF C: Update editPlan stepsCompleted, then load, read entirely, then execute {nextStepFile} +- IF Any other: help user respond, then redisplay menu + +## CRITICAL STEP COMPLETION NOTE + +ONLY WHEN all direct changes are applied (or documented) and user confirms, will you then load and read fully `{nextStepFile}` to execute. + +--- + +## 🚨 SYSTEM SUCCESS/FAILURE METRICS + +### ✅ SUCCESS: + +- All requested changes presented to user +- Relevant standards loaded for each change +- Compliance checked before each change +- User approval obtained for each change +- Non-compliance found and offered fix +- Changes applied correctly +- Edit plan updated + +### ❌ SYSTEM FAILURE: + +- Not loading relevant standards +- Not checking compliance before editing +- Making changes without user approval +- Missing non-compliance issues +- Not documenting changes + +**Master Rule:** Load standards for each change type. Check compliance BEFORE applying changes. Offer to fix non-compliance when found. diff --git a/src/modules/bmb/workflows/workflow/steps-e/step-e-05-apply-edit.md b/src/modules/bmb/workflows/workflow/steps-e/step-e-05-apply-edit.md new file mode 100644 index 00000000..00b55fbc --- /dev/null +++ b/src/modules/bmb/workflows/workflow/steps-e/step-e-05-apply-edit.md @@ -0,0 +1,154 @@ +--- +name: 'step-e-05-apply-edit' +description: 'Offer validation after edits, complete or continue editing' + +# File References +nextStepFile: './step-e-06-validate-after.md' +completeStep: './step-e-07-complete.md' +editPlan: '{bmb_creations_output_folder}/edit-plan-{workflow_name}.md' +targetWorkflowPath: '{targetWorkflowPath}' +validationWorkflow: '../steps-v/step-01-validate.md' +--- + +# Edit Step 5: Post-Edit Options + +## STEP GOAL: + +Present options after edits are applied: run validation, make more edits, or complete. + +## MANDATORY EXECUTION RULES (READ FIRST): + +### Universal Rules: + +- 📖 CRITICAL: Read the complete step file before taking any action +- 📋 YOU ARE A FACILITATOR, not an autonomous editor +- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` + +### Step-Specific Rules: + +- 🎯 Focus on next steps after edits +- 💬 Present clear options +- 🚪 Route based on user choice + +## EXECUTION PROTOCOLS: + +- 🎯 Present post-edit options +- 💾 Update edit plan if needed +- 📖 Route to appropriate next step + +## CONTEXT BOUNDARIES: + +- Edits have been applied (validation fixes, direct changes, or both) +- Focus: What's next? +- This is a routing step + +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip or shortcut. + +### 1. Read Edit Plan + +**Load the editPlan:** +Read `{editPlan}` to understand what edits were applied. + +### 2. Present Edit Summary + +"**Edit Session Summary:** + +**Workflow:** {workflow_name} +**Path:** {targetWorkflowPath} + +**Edits Applied:** +{Summarize from edit plan} + +**Files Modified:** +{List files changed} + +**Compliance Status:** +{Any compliance issues found and fixed} + +--- + +**What would you like to do next?** + +**[V]alidate** - Run comprehensive validation to verify all changes +**[M]ore edits** - Make additional changes +**[C]omplete** - Finish editing (without validation) +**[R]eview changes** - See detailed change log" + +### 3. Menu Handling Logic + +- **IF V:** Load, read entirely, then execute {validationWorkflow}. After validation completes, return to this step. +- **IF M:** Route to step-e-02-discover-edits.md for more changes +- **IF C:** Load, read entirely, then execute {completeStep} +- **IF R:** Present detailed edit log from editPlan, then redisplay this menu +- **IF Any other:** help user respond, then redisplay menu + +### 4. Update Edit Plan (If Completing Without Validation) + +**IF user selects [C] Complete:** + +Update editPlan frontmatter: +```yaml +completionDate: '{current-date}' +validationAfterEdit: skipped +completionStatus: complete_without_validation +``` + +Document in editPlan: +```markdown +## Completion + +**Completed:** {current-date} +**Validation:** Skipped per user request +**Recommendation:** Run validation before using workflow in production +``` + +### 5. Handle Validation Return + +**IF validation was run and completed:** + +Load and review validation report. Present findings: + +"**Validation Complete:** + +**Overall Status:** {status} +**New Issues:** {count} +**Remaining Issues:** {count} + +**Would you like to:** + +1. **[F]ix new issues** - Return to fix-validation step +2. **[M]ore edits** - Make additional changes +3. **[C]omplete** - Finish with current validation status" + +#### Menu Handling Logic: + +- IF F: Route to step-e-03-fix-validation.md +- IF M: Route to step-e-02-discover-edits.md +- IF C: Load, read entirely, then execute {completeStep} +- IF Any other: help user, then redisplay menu + +## CRITICAL STEP COMPLETION NOTE + +This is a routing step. Route user to appropriate next step based on their choice. Always offer validation before completing. + +--- + +## 🚨 SYSTEM SUCCESS/FAILURE METRICS + +### ✅ SUCCESS: + +- Edit summary presented clearly +- All options explained +- User routed to appropriate next step +- Validation offered before completion +- Edit plan updated if completing + +### ❌ SYSTEM FAILURE: + +- Not offering validation +- Routing to wrong step +- Not updating edit plan when completing + +**Master Rule:** Always offer validation after edits. Route correctly based on user choice. diff --git a/src/modules/bmb/workflows/workflow/steps-e/step-e-06-validate-after.md b/src/modules/bmb/workflows/workflow/steps-e/step-e-06-validate-after.md new file mode 100644 index 00000000..b3912f0b --- /dev/null +++ b/src/modules/bmb/workflows/workflow/steps-e/step-e-06-validate-after.md @@ -0,0 +1,190 @@ +--- +name: 'step-e-06-validate-after' +description: 'Run validation after edits and present results' + +# File References +nextStepFile: './step-e-07-complete.md' +fixStep: './step-e-03-fix-validation.md' +editPlan: '{bmb_creations_output_folder}/edit-plan-{workflow_name}.md' +targetWorkflowPath: '{targetWorkflowPath}' +validationWorkflow: '../steps-v/step-01-validate.md' +validationReport: '{targetWorkflowPath}/validation-report-{workflow_name}.md' +--- + +# Edit Step 6: Validate After Edit + +## STEP GOAL: + +Run validation workflow after edits are complete, present results, and offer next steps. + +## MANDATORY EXECUTION RULES (READ FIRST): + +### Universal Rules: + +- 📖 CRITICAL: Read the complete step file before taking any action +- 📋 YOU ARE A FACILITATOR, not an autonomous editor +- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` + +### Step-Specific Rules: + +- 🎯 Focus on running validation and presenting results +- 💬 Explain validation outcomes clearly +- 🚪 Route based on validation results + +## EXECUTION PROTOCOLS: + +- 🎯 Execute validation workflow +- 💾 Present results to user +- 📖 Offer next steps based on findings + +## CONTEXT BOUNDARIES: + +- Edits have been applied +- Focus: Verify quality after edits +- This is quality assurance step + +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip or shortcut. + +### 1. Read Edit Plan + +**Load the editPlan:** +Read `{editPlan}` to understand what edits were applied. + +### 2. Execute Validation Workflow + +"**Running comprehensive validation on your edited workflow...** + +**Target:** {targetWorkflowPath} +**Validation scope:** Full workflow compliance check + +This may take a few moments..." + +**Load, read entirely, then execute:** {validationWorkflow} + +### 3. Review Validation Results + +**After validation completes, load the validation report:** + +Read `{validationReport}` and extract: +- Overall status +- Critical issues count +- Warning issues count +- New issues vs pre-existing issues + +### 4. Present Validation Results + +"**Validation Complete!** + +**Overall Assessment:** [PASS/PARTIAL/FAIL] + +**Summary:** +| Category | Before Edits | After Edits | Change | +|----------|--------------|-------------|--------| +| Critical Issues | {count} | {count} | {delta} | +| Warnings | {count} | {count} | {delta} | +| Compliance Score | {score} | {score} | {delta} | + +--- + +**New Issues Found:** {count} +**Issues Fixed:** {count} +**Remaining Issues:** {count} + +--- + +**What would you like to do?**" + +### 5. Menu Options Based on Results + +**IF NEW CRITICAL ISSUES FOUND:** + +"**[F]ix new issues** - Return to fix-validation step to address new critical issues +**[R]eview report** - See detailed validation findings +**[C]omplete anyway** - Finish editing with remaining issues (not recommended)" + +#### Menu Handling Logic: + +- IF F: Load, read entirely, then execute {fixStep} +- IF R: Present detailed findings from validation report, then redisplay this menu +- IF C: Warn user, then if confirmed, load, read entirely, then execute {nextStepFile} +- IF Any other: help user, then redisplay menu + +**IF NO NEW CRITICAL ISSUES (warnings OK):** + +"**[R]eview report** - See detailed validation findings +**[C]omplete** - Finish editing - workflow looks good! +**[M]ore edits** - Make additional changes" + +#### Menu Handling Logic (Issues Found): + +- IF R: Present detailed findings from validation report, then redisplay this menu +- IF C: Load, read entirely, then execute {nextStepFile} +- IF M: Route to step-e-02-discover-edits.md +- IF Any other: help user, then redisplay menu + +**IF FULL PASS (no issues):** + +"**🎉 Excellent! Your workflow is fully compliant!** + +**[C]omplete** - Finish editing +**[R]eview report** - See validation details +**[M]ore edits** - Make additional changes" + +#### Menu Handling Logic (Full Pass): + +- IF C: Load, read entirely, then execute {nextStepFile} +- IF R: Present validation summary, then redisplay this menu +- IF M: Route to step-e-02-discover-edits.md +- IF Any other: help user, then redisplay menu + +### 6. Update Edit Plan + +**Before routing to complete:** + +Update editPlan frontmatter: +```yaml +completionDate: '{current-date}' +validationAfterEdit: complete +finalValidationStatus: {status from validation report} +remainingCriticalIssues: {count} +remainingWarnings: {count} +``` + +Document in editPlan: +```markdown +## Final Validation + +**Validation Date:** {current-date} +**Status:** {status} +**Issues After Editing:** +- Critical: {count} +- Warnings: {count} + +**Recommendation:** {if issues remain, suggest next steps} +``` + +## CRITICAL STEP COMPLETION NOTE + +ALWAYS present validation results clearly. Route based on severity of findings. Update edit plan with final validation status before completing. + +--- + +## 🚨 SYSTEM SUCCESS/FAILURE METRICS + +### ✅ SUCCESS: + +- Validation workflow executed +- Results presented clearly with before/after comparison +- User routed appropriately based on findings +- Edit plan updated with final status + +### ❌ SYSTEM FAILURE: + +- Not running validation +- Not presenting results clearly +- Routing to complete with critical issues without warning +- Not updating edit plan + +**Master Rule:** Always run validation after edits. Present clear before/after comparison. Warn user about remaining issues. diff --git a/src/modules/bmb/workflows/workflow/steps-e/step-e-07-complete.md b/src/modules/bmb/workflows/workflow/steps-e/step-e-07-complete.md new file mode 100644 index 00000000..56ad0552 --- /dev/null +++ b/src/modules/bmb/workflows/workflow/steps-e/step-e-07-complete.md @@ -0,0 +1,206 @@ +--- +name: 'step-e-07-complete' +description: 'Complete the edit session with summary and next steps' + +# File References +editPlan: '{bmb_creations_output_folder}/edit-plan-{workflow_name}.md' +targetWorkflowPath: '{targetWorkflowPath}' +validationReport: '{targetWorkflowPath}/validation-report-{workflow_name}.md' +--- + +# Edit Step 7: Complete + +## STEP GOAL: + +Complete the edit session with a comprehensive summary of changes made and provide next steps guidance. + +## MANDATORY EXECUTION RULES (READ FIRST): + +### Universal Rules: + +- 📖 CRITICAL: Read the complete step file before taking any action +- 📋 YOU ARE A FACILITATOR, not an autonomous editor +- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` + +### Step-Specific Rules: + +- 🎯 Focus on summary and completion +- 💬 Present clear change summary +- 🚫 No more edits at this stage + +## EXECUTION PROTOCOLS: + +- 🎯 Generate comprehensive summary +- 💾 Finalize edit plan document +- 📖 Provide next steps guidance + +## CONTEXT BOUNDARIES: + +- All edits are complete +- Focus: Summary and closure +- This is the final step + +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip or shortcut. + +### 1. Read Edit Plan and Validation Report + +**Load both files:** +1. `{editPlan}` - Full edit session history +2. `{validationReport}` - Final validation status (if exists) + +### 2. Generate Completion Summary + +"**━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━** + +# Edit Session Complete + +**Workflow:** {workflow_name} +**Path:** {targetWorkflowPath} +**Session Date:** {editSessionDate} + +--- + +## Changes Made + +**Validation Fixes Applied:** {count} +{list from edit plan} + +**Direct Changes Applied:** {count} +{list from edit plan} + +**Files Modified:** +{List all files that were changed} + +--- + +## Final Validation Status + +**Status:** {status from report or 'Not run'} + +**Issues:** +- Critical: {count} +- Warnings: {count} + +--- + +## Edit Session Summary + +Your workflow has been successfully edited. Here's what was accomplished: + +{Summarize the transformation in 2-3 sentences} + +**━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━**" + +### 3. Update Edit Plan with Completion + +**Append final completion section to editPlan:** + +```markdown +## Completion Summary + +**Completed:** {current-date} +**Session Duration:** {from start to end} + +**Total Edits:** {count} +- Validation Fixes: {count} +- Direct Changes: {count} + +**Files Modified:** {count} +**Final Validation Status:** {status} + +**Workflow is ready for:** {use/testing/production with caveats} +``` + +### 4. Provide Next Steps Guidance + +"**Next Steps for Your Workflow:** + +1. **Test the workflow** - Run through the workflow end-to-end to verify changes +2. **Get user feedback** - If this is for others, have them test it +3. **Monitor for issues** - Watch for any problems in actual use +4. **Re-validate periodically** - Run validation again after future changes + +**Resources:** +- Edit this workflow again: Edit workflow mode +- Run validation: Validate workflow mode +- Build new workflow: Create workflow mode + +--- + +**Thank you for using BMAD Workflow Creator!** + +Your edit session for **{workflow_name}** is complete. ✅" + +### 5. Final Confirmation + +"**Edit Session Complete.** + +**[F]inish** - End the edit session +**[S]ave summary** - Save a copy of the edit summary to your output folder +**[R]eview** - Review the full edit plan one more time" + +#### Menu Handling Logic: + +- IF F: End the session +- IF S: Save edit summary to output folder, then end +- IF R: Display full edit plan, then redisplay this menu +- IF Any other: help user, then redisplay menu + +### 6. Save Summary (If Requested) + +**IF user selects [S]ave summary:** + +Create summary file at `{output_folder}/workflow-edit-summary-{workflow_name}-{date}.md`: + +```markdown +# Workflow Edit Summary + +**Workflow:** {workflow_name} +**Path:** {targetWorkflowPath} +**Edit Date:** {current-date} + +## Changes Made + +{All changes from edit plan} + +## Files Modified + +{List with paths} + +## Validation Status + +{Final validation results} + +## Next Steps + +{Recommendations} +``` + +"**Summary saved to:** {output_folder}/workflow-edit-summary-{workflow_name}-{date}.md" + +## CRITICAL STEP COMPLETION NOTE + +This is the final step. Ensure edit plan is complete, summary is presented, and user has all information needed. End session gracefully. + +--- + +## 🚨 SYSTEM SUCCESS/FAILURE METRICS + +### ✅ SUCCESS: + +- Comprehensive summary presented +- All changes documented clearly +- Edit plan finalized +- Next steps guidance provided +- Session ended gracefully + +### ❌ SYSTEM FAILURE: + +- Not summarizing all changes +- Missing files from change list +- Not providing next steps +- Ending without user confirmation + +**Master Rule:** Provide complete summary of all changes. Document everything. Give clear next steps. End on a positive note. diff --git a/src/modules/bmb/workflows/workflow/steps-v/step-01-validate.md b/src/modules/bmb/workflows/workflow/steps-v/step-01-validate.md new file mode 100644 index 00000000..f605f15a --- /dev/null +++ b/src/modules/bmb/workflows/workflow/steps-v/step-01-validate.md @@ -0,0 +1,245 @@ +--- +name: 'step-01-validate' +description: 'Initialize validation: create report and check file structure & size' + +nextStepFile: './step-02-frontmatter-validation.md' +targetWorkflowPath: '{bmb_creations_output_folder}/workflows/{new_workflow_name}' +workflowPlanFile: '{targetWorkflowPath}/workflow-plan-{new_workflow_name}.md' +validationReportFile: '{targetWorkflowPath}/validation-report-{new_workflow_name}.md' +stepFileRules: '../data/step-file-rules.md' +--- + +# Validation Step 1: File Structure & Size + +## STEP GOAL: + +To create the validation report and check that the workflow has correct file structure and all step files are within size limits. + +## MANDATORY EXECUTION RULES (READ FIRST): + +### Universal Rules: + +- 🛑 DO NOT BE LAZY - LOAD AND REVIEW EVERY FILE +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next step, ensure entire file is read +- ✅ Validation does NOT stop for user input - auto-proceed through all validation steps + +### Step-Specific Rules: + +- 🎯 Create validation report with header structure +- 🚫 DO NOT skip checking any file +- 💬 Append findings to report, then auto-load next step +- 🚪 This is validation - systematic and thorough + +## EXECUTION PROTOCOLS: + +- 🎯 Load and check EVERY file in the workflow +- 💾 Append findings to validation report +- 📖 Save report before loading next validation step +- 🚫 DO NOT halt for user input - validation runs to completion + +## CONTEXT BOUNDARIES: + +- Workflow has been built in steps-c/ +- Check the entire folder structure +- Verify all required files exist +- Check file sizes against limits + +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip or shortcut. + +### 1. Create Validation Report + +Create {validationReportFile} with header structure: + +```markdown +--- +validationDate: [current date] +workflowName: {new_workflow_name} +workflowPath: {targetWorkflowPath} +validationStatus: IN_PROGRESS +--- + +# Validation Report: {new_workflow_name} + +**Validation Started:** [current date] +**Validator:** BMAD Workflow Validation System +**Standards Version:** BMAD Workflow Standards + +--- + +## File Structure & Size + +*Validation in progress...* + +## Frontmatter Validation +*Pending...* + +## Menu Handling Validation +*Pending...* + +## Step Type Validation +*Pending...* + +## Output Format Validation +*Pending...* + +## Validation Design Check +*Pending...* + +## Instruction Style Check +*Pending...* + +## Collaborative Experience Check +*Pending...* + +## Cohesive Review +*Pending...* + +## Summary +*Pending...* +``` + +### 2. Load File Structure Standards + +Load {stepFileRules} to understand: +- File size limits (<200 recommended, 250 max) +- Required folder structure +- Required files + +### 3. Check Folder Structure + +**DO NOT BE LAZY - List EVERY folder and file:** + +Use bash commands to list the entire structure: +``` +{targetWorkflowPath}/ +├── workflow.md +├── steps-c/ +│ ├── step-01-init.md +│ ├── step-01b-continue.md (if continuable) +│ ├── step-02-*.md +│ └── ... +├── steps-v/ +│ └── [this validation] +├── data/ +│ └── [as needed] +└── templates/ + └── [as needed] +``` + +**Check:** +- ✅ workflow.md exists +- ✅ steps-c/ folder exists with all step files +- ✅ data/ folder exists (may be empty) +- ✅ templates/ folder exists (may be empty) +- ✅ No unexpected files +- ✅ Folder names follow conventions + +### 4. Check File Sizes + +**DO NOT BE LAZY - Check EVERY step file:** + +For each file in `steps-c/`: +1. Read the file +2. Count lines +3. Check against limits: + - < 200 lines: ✅ Good + - 200-250 lines: ⚠️ Approaching limit + - > 250 lines: ❌ Exceeds limit + +**Check for Large Data Files:** + +For each file in `data/` folder: +1. Check file size in lines +2. If > 500 lines: ⚠️ WARNING - Large data file detected +3. If > 1000 lines: ❌ ERROR - Data file too large for direct loading + +**For large data files, recommend:** +- Create an index/csv/yaml so LLM knows what's available and can load specific sections +- Use sharding technique (core module has sharding tool) to split large files +- Consider if all data is needed or if lookup/reference pattern would work better + +**Report format:** +```markdown +### File Size Check + +| File | Lines | Status | +|------|-------|--------| +| step-01-init.md | 180 | ✅ Good | +| step-02-*.md | 245 | ⚠️ Approaching limit | +| step-03-*.md | 267 | ❌ Exceeds limit - should split | + +### Data File Size Check + +| Data File | Lines | Status | +|-----------|-------|--------| +| reference-data.csv | 150 | ✅ Good | +| large-data.md | 2500 | ❌ Too large - use sharding or create index | +``` + +### 5. Verify File Presence + +From the design in {workflowPlanFile}, verify: +- Every step from design has a corresponding file +- Step files are numbered sequentially +- No gaps in numbering +- Final step exists + +### 6. Append Findings to Report + +Replace the "## File Structure & Size" section in {validationReportFile} with actual findings: + +```markdown +## File Structure & Size + +### Folder Structure +[Report findings - is structure correct?] + +### Files Present +[Report findings - are all required files present?] + +### File Size Check +[Table as shown above] + +### Issues Found +[List any issues: +- Missing files +- Extra files +- Size violations +- Naming convention violations] + +### Status +✅ PASS / ❌ FAIL / ⚠️ WARNINGS +``` + +### 7. Save Report and Auto-Proceed + +**CRITICAL:** Save the validation report BEFORE loading next step. + +Then immediately load, read entire file, then execute {nextStepFile}. + +**Display:** +"**File Structure & Size validation complete.** Proceeding to Frontmatter Validation..." + +--- + +## 🚨 SYSTEM SUCCESS/FAILURE METRICS + +### ✅ SUCCESS: + +- Validation report created with header structure +- EVERY file checked for structure and size +- Findings appended to report +- Report saved before proceeding +- Next validation step loaded + +### ❌ SYSTEM FAILURE: + +- Not checking every file +- Skipping size checks +- Not saving report before proceeding +- Halting for user input + +**Master Rule:** Validation is systematic and thorough. DO NOT BE LAZY. Check EVERY file. Auto-proceed through all validation steps. diff --git a/src/modules/bmb/workflows/workflow/steps-v/step-02-frontmatter-validation.md b/src/modules/bmb/workflows/workflow/steps-v/step-02-frontmatter-validation.md new file mode 100644 index 00000000..a5e5b1f0 --- /dev/null +++ b/src/modules/bmb/workflows/workflow/steps-v/step-02-frontmatter-validation.md @@ -0,0 +1,153 @@ +--- +name: 'step-02-frontmatter-validation' +description: 'Validate frontmatter compliance across all step files' + +nextStepFile: './step-03-menu-validation.md' +targetWorkflowPath: '{bmb_creations_output_folder}/workflows/{new_workflow_name}' +validationReportFile: '{targetWorkflowPath}/validation-report-{new_workflow_name}.md' +frontmatterStandards: '../data/frontmatter-standards.md' +--- + +# Validation Step 2: Frontmatter Validation + +## STEP GOAL: + +To validate that EVERY step file's frontmatter follows the frontmatter standards - correct variables, proper path formatting, no unused variables. + +## MANDATORY EXECUTION RULES (READ FIRST): + +### Universal Rules: + +- 🛑 DO NOT BE LAZY - LOAD AND REVIEW EVERY FILE +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next step, ensure entire file is read +- ✅ Validation does NOT stop for user input - auto-proceed through all validation steps + +### Step-Specific Rules: + +- 🎯 Load and validate EVERY step file's frontmatter +- 🚫 DO NOT skip any files or checks +- 💬 Append findings to report, then auto-load next step +- 🚪 This is validation - systematic and thorough + +## EXECUTION PROTOCOLS: + +- 🎯 Load frontmatter standards first +- 💾 Check EVERY file against standards +- 📖 Append findings to validation report +- 🚫 DO NOT halt for user input - validation runs to completion + +## CONTEXT BOUNDARIES: + +- All step files in steps-c/ must be validated +- Load {frontmatterStandards} for validation criteria +- Check for: unused variables, hardcoded paths, missing required fields + +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip or shortcut. + +### 1. Load Frontmatter Standards + +Load {frontmatterStandards} to understand validation criteria: + +**Golden Rules:** +1. Only variables USED in the step may be in frontmatter +2. All file references MUST use `{variable}` format +3. Paths within workflow folder MUST be relative + +**Required Fields:** +- `name` - must be present, kebab-case +- `description` - must be present + +### 2. Check EVERY Step File + +**DO NOT BE LAZY - For EACH file in steps-c/:** + +1. Load the file +2. Extract frontmatter +3. Validate against each rule: + +**Check 1: Required Fields** +- ✅ `name` exists and is kebab-case +- ✅ `description` exists + +**Check 2: All Frontmatter Variables Are Used** +- For each variable in frontmatter, check if it appears in step body +- ❌ If not used: mark as violation + +**Check 3: No Hardcoded Paths** +- Check all file references use `{variable}` format +- ❌ If absolute path found: mark as violation + +**Check 4: Relative Paths Within Workflow** +- Paths to same workflow should be relative (`../data/`) +- ❌ If absolute path for same-folder: mark as violation + +**Check 5: External References Use Full Variable Paths** +- `{project-root}` variables for external references +- ✅ Correct: `advancedElicitationTask: '{project-root}/_bmad/core/...'` + +### 3. Document Findings + +Create report table: + +```markdown +### Frontmatter Validation Results + +| File | Required Fields | Variables Used | Relative Paths | Status | +|------|----------------|----------------|----------------|--------| +| step-01-init.md | ✅ | ✅ | ✅ | ✅ PASS | +| step-02-*.md | ✅ | ❌ Unused: partyModeWorkflow | ✅ | ❌ FAIL | +| step-03-*.md | ❌ Missing description | ✅ | ❌ Hardcoded path | ❌ FAIL | +``` + +### 4. List Violations + +```markdown +### Violations Found + +**step-02-[name].md:** +- Unused variable in frontmatter: `partyModeWorkflow` (not used in step body) + +**step-03-[name].md:** +- Missing required field: `description` +- Hardcoded path: `someTemplate: '/absolute/path/template.md'` should use relative or variable + +**step-05-[name].md:** +- All checks passed ✅ +``` + +### 5. Append to Report + +Update {validationReportFile} - replace "## Frontmatter Validation *Pending...*" with actual findings. + +### 6. Save Report and Auto-Proceed + +**CRITICAL:** Save the validation report BEFORE loading next step. + +Then immediately load, read entire file, then execute {nextStepFile}. + +**Display:** +"**Frontmatter validation complete.** Proceeding to Menu Handling Validation..." + +--- + +## 🚨 SYSTEM SUCCESS/FAILURE METRICS + +### ✅ SUCCESS: + +- EVERY step file's frontmatter validated +- All violations documented +- Findings appended to report +- Report saved before proceeding +- Next validation step loaded + +### ❌ SYSTEM FAILURE: + +- Not checking every file +- Skipping frontmatter checks +- Not documenting violations +- Not saving report before proceeding + +**Master Rule:** Validation is systematic and thorough. DO NOT BE LAZY. Check EVERY file's frontmatter. Auto-proceed through all validation steps. diff --git a/src/modules/bmb/workflows/workflow/steps-v/step-03-menu-validation.md b/src/modules/bmb/workflows/workflow/steps-v/step-03-menu-validation.md new file mode 100644 index 00000000..77242856 --- /dev/null +++ b/src/modules/bmb/workflows/workflow/steps-v/step-03-menu-validation.md @@ -0,0 +1,161 @@ +--- +name: 'step-03-menu-validation' +description: 'Validate menu handling compliance across all step files' + +nextStepFile: './step-04-step-type-validation.md' +targetWorkflowPath: '{bmb_creations_output_folder}/workflows/{new_workflow_name}' +validationReportFile: '{targetWorkflowPath}/validation-report-{new_workflow_name}.md' +menuHandlingStandards: '../data/menu-handling-standards.md' +--- + +# Validation Step 3: Menu Handling Validation + +## STEP GOAL: + +To validate that EVERY step file's menus follow the menu handling standards - proper handlers, execution rules, appropriate menu types. + +## MANDATORY EXECUTION RULES (READ FIRST): + +### Universal Rules: + +- 🛑 DO NOT BE LAZY - LOAD AND REVIEW EVERY FILE +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next step, ensure entire file is read +- ✅ Validation does NOT stop for user input - auto-proceed through all validation steps + +### Step-Specific Rules: + +- 🎯 Load and validate EVERY step file's menus +- 🚫 DO NOT skip any files or checks +- 💬 Append findings to report, then auto-load next step +- 🚪 This is validation - systematic and thorough + +## EXECUTION PROTOCOLS: + +- 🎯 Load menu standards first +- 💾 Check EVERY file's menu structure +- 📖 Append findings to validation report +- 🚫 DO NOT halt for user input - validation runs to completion + +## CONTEXT BOUNDARIES: + +- All step files in steps-c/ must be validated +- Load {menuHandlingStandards} for validation criteria +- Check for: handler section, execution rules, reserved letters, inappropriate A/P + +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip or shortcut. + +### 1. Load Menu Standards + +Load {menuHandlingStandards} to understand validation criteria: + +**Reserved Letters:** A (Advanced Elicitation), P (Party Mode), C (Continue/Accept), X (Exit/Cancel) + +**Required Structure:** +1. Display section +2. Handler section (MANDATORY) +3. Execution Rules section + +**When To Include A/P:** +- DON'T: Step 1 (init), validation sequences, simple data gathering +- DO: Collaborative content creation, user might want alternatives, quality gates + +### 2. Check EVERY Step File + +**DO NOT BE LAZY - For EACH file in steps-c/:** + +1. Load the file +2. Find the menu section (if present) +3. Validate against each rule: + +**Check 1: Handler Section Exists** +- ✅ Handler section immediately follows Display +- ❌ If missing: mark as violation + +**Check 2: Execution Rules Section Exists** +- ✅ "EXECUTION RULES" section present +- ✅ Contains "halt and wait" instruction +- ❌ If missing: mark as violation + +**Check 3: Non-C Options Redisplay Menu** +- ✅ A/P options specify "redisplay menu" +- ❌ If missing: mark as violation + +**Check 4: C Option Sequence** +- ✅ C option: save → update frontmatter → load next step +- ❌ If sequence wrong: mark as violation + +**Check 5: A/P Only Where Appropriate** +- Step 01 should NOT have A/P (inappropriate for init) +- Validation sequences should auto-proceed, not have menus +- ❌ If A/P in wrong place: mark as violation + +### 3. Document Findings + +Create report table: + +```markdown +### Menu Handling Validation Results + +| File | Has Menu | Handler Section | Exec Rules | A/P Appropriate | Status | +|------|----------|----------------|------------|-----------------|--------| +| step-01-init.md | ✅ (C-only) | ✅ | ✅ | N/A | ✅ PASS | +| step-02-*.md | ✅ (A/P/C) | ✅ | ✅ | ✅ | ✅ PASS | +| step-03-*.md | ✅ (C-only) | ❌ Missing | ⚠️ Incomplete | N/A | ❌ FAIL | +| step-04-*.md | ❌ No menu | N/A | N/A | Should have A/P/C | ⚠️ WARN | +``` + +### 4. List Violations + +```markdown +### Menu Violations Found + +**step-03-[name].md:** +- Missing handler section after menu display +- EXECUTION RULES section incomplete + +**step-04-[name].md:** +- No menu found - this is a collaborative content step, should have A/P/C menu + +**step-05-[name].md:** +- A/P options don't specify "redisplay menu" after execution + +**step-06-[name].md:** +- All checks passed ✅ +``` + +### 5. Append to Report + +Update {validationReportFile} - replace "## Menu Handling Validation *Pending...*" with actual findings. + +### 6. Save Report and Auto-Proceed + +**CRITICAL:** Save the validation report BEFORE loading next step. + +Then immediately load, read entire file, then execute {nextStepFile}. + +**Display:** +"**Menu Handling validation complete.** Proceeding to Step Type Validation..." + +--- + +## 🚨 SYSTEM SUCCESS/FAILURE METRICS + +### ✅ SUCCESS: + +- EVERY step file's menus validated +- All violations documented +- Findings appended to report +- Report saved before proceeding +- Next validation step loaded + +### ❌ SYSTEM FAILURE: + +- Not checking every file's menus +- Skipping menu structure checks +- Not documenting violations +- Not saving report before proceeding + +**Master Rule:** Validation is systematic and thorough. DO NOT BE LAZY. Check EVERY file's menus. Auto-proceed through all validation steps. diff --git a/src/modules/bmb/workflows/workflow/steps-v/step-04-step-type-validation.md b/src/modules/bmb/workflows/workflow/steps-v/step-04-step-type-validation.md new file mode 100644 index 00000000..cccc58be --- /dev/null +++ b/src/modules/bmb/workflows/workflow/steps-v/step-04-step-type-validation.md @@ -0,0 +1,186 @@ +--- +name: 'step-04-step-type-validation' +description: 'Validate that each step follows its correct step type pattern' + +nextStepFile: './step-05-output-format-validation.md' +targetWorkflowPath: '{bmb_creations_output_folder}/workflows/{new_workflow_name}' +validationReportFile: '{targetWorkflowPath}/validation-report-{new_workflow_name}.md' +stepTypePatterns: '../data/step-type-patterns.md' +workflowPlanFile: '{targetWorkflowPath}/workflow-plan-{new_workflow_name}.md' +--- + +# Validation Step 4: Step Type Validation + +## STEP GOAL: + +To validate that each step file follows the correct pattern for its step type - init, continuation, middle, branch, validation, final polish, or final. + +## MANDATORY EXECUTION RULES (READ FIRST): + +### Universal Rules: + +- 🛑 DO NOT BE LAZY - LOAD AND REVIEW EVERY FILE +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next step, ensure entire file is read +- ✅ Validation does NOT stop for user input - auto-proceed through all validation steps + +### Step-Specific Rules: + +- 🎯 Load and validate EVERY step against its type pattern +- 🚫 DO NOT skip any files or checks +- 💬 Append findings to report, then auto-load next step +- 🚪 This is validation - systematic and thorough + +## EXECUTION PROTOCOLS: + +- 🎯 Load step type patterns first +- 💾 Check EACH file follows its designated type pattern +- 📖 Append findings to validation report +- 🚫 DO NOT halt for user input - validation runs to completion + +## CONTEXT BOUNDARIES: + +- All step files in steps-c/ must be validated +- Load {stepTypePatterns} for pattern definitions +- The design in {workflowPlanFile} specifies what each step should be + +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip or shortcut. + +### 1. Load Step Type Patterns + +Load {stepTypePatterns} to understand the pattern for each type: + +**Step Types:** +1. **Init (Non-Continuable)** - Auto-proceed, no continuation logic +2. **Init (Continuable)** - Has continueFile reference, continuation detection +3. **Continuation (01b)** - Paired with continuable init, routes based on stepsCompleted +4. **Middle (Standard)** - A/P/C menu, collaborative content +5. **Middle (Simple)** - C only menu, no A/P +6. **Branch** - Custom menu with routing to different steps +7. **Validation Sequence** - Auto-proceed through checks, no menu +8. **Init (With Input Discovery)** - Has inputDocuments array, discovery logic +9. **Final Polish** - Loads entire doc, optimizes flow +10. **Final** - No next step, completion message + +### 2. Check EACH Step Against Its Type + +**DO NOT BE LAZY - For EACH file in steps-c/:** + +1. Determine what type this step SHOULD be from: + - Step number (01 = init, 01b = continuation, last = final) + - Design in {workflowPlanFile} + - Step name pattern + +2. Load the step file + +3. Validate it follows the pattern for its type: + +**For Init Steps:** +- ✅ Creates output from template (if document-producing) +- ✅ No A/P menu (or C-only) +- ✅ If continuable: has continueFile reference + +**For Continuation (01b):** +- ✅ Has nextStepOptions in frontmatter +- ✅ Reads stepsCompleted from output +- ✅ Routes to appropriate step + +**For Middle (Standard):** +- ✅ Has A/P/C menu +- ✅ Outputs to document (if applicable) +- ✅ Has mandatory execution rules + +**For Middle (Simple):** +- ✅ Has C-only menu +- ✅ No A/P options + +**For Branch:** +- ✅ Has custom menu letters +- ✅ Handler routes to different steps + +**For Validation Sequence:** +- ✅ Auto-proceeds (no user choice) +- ✅ Proceeds to next validation + +**For Final Polish:** +- ✅ Loads entire document +- ✅ Optimizes flow, removes duplication +- ✅ Uses ## Level 2 headers + +**For Final:** +- ✅ No nextStepFile in frontmatter +- ✅ Completion message +- ✅ No next step to load + +### 3. Document Findings + +Create report table: + +```markdown +### Step Type Validation Results + +| File | Should Be Type | Follows Pattern | Issues | Status | +|------|----------------|-----------------|--------|--------| +| step-01-init.md | Init (Continuable) | ✅ | None | ✅ PASS | +| step-01b-continue.md | Continuation | ✅ | None | ✅ PASS | +| step-02-*.md | Middle (Standard) | ✅ | None | ✅ PASS | +| step-03-*.md | Middle (Simple) | ❌ | Has A/P (should be C-only) | ❌ FAIL | +| step-04-*.md | Branch | ⚠️ | Missing custom menu letters | ⚠️ WARN | +| step-N-final.md | Final | ✅ | None | ✅ PASS | +``` + +### 4. List Violations + +```markdown +### Step Type Violations Found + +**step-03-[name].md:** +- Designated as Middle (Simple) but has A/P menu +- Should have C-only menu + +**step-04-[name].md:** +- Designated as Branch but missing custom menu letters +- Handler doesn't route to different steps + +**step-05-[name].md:** +- Designated as Validation Sequence but has user menu +- Should auto-proceed + +**All other steps:** ✅ Follow their type patterns correctly +``` + +### 5. Append to Report + +Update {validationReportFile} - replace "## Step Type Validation *Pending...*" with actual findings. + +### 6. Save Report and Auto-Proceed + +**CRITICAL:** Save the validation report BEFORE loading next step. + +Then immediately load, read entire file, then execute {nextStepFile}. + +**Display:** +"**Step Type validation complete.** Proceeding to Output Format Validation..." + +--- + +## 🚨 SYSTEM SUCCESS/FAILURE METRICS + +### ✅ SUCCESS: + +- EVERY step validated against its type pattern +- All violations documented +- Findings appended to report +- Report saved before proceeding +- Next validation step loaded + +### ❌ SYSTEM FAILURE: + +- Not checking every file's type pattern +- Skipping type-specific checks +- Not documenting violations +- Not saving report before proceeding + +**Master Rule:** Validation is systematic and thorough. DO NOT BE LAZY. Check EVERY file's type pattern. Auto-proceed through all validation steps. diff --git a/src/modules/bmb/workflows/workflow/steps-v/step-05-output-format-validation.md b/src/modules/bmb/workflows/workflow/steps-v/step-05-output-format-validation.md new file mode 100644 index 00000000..d5da8dad --- /dev/null +++ b/src/modules/bmb/workflows/workflow/steps-v/step-05-output-format-validation.md @@ -0,0 +1,195 @@ +--- +name: 'step-05-output-format-validation' +description: 'Validate output format compliance - template type, final polish, step-to-output mapping' + +nextStepFile: './step-06-validation-design-check.md' +targetWorkflowPath: '{bmb_creations_output_folder}/workflows/{new_workflow_name}' +validationReportFile: '{targetWorkflowPath}/validation-report-{new_workflow_name}.md' +outputFormatStandards: '../data/output-format-standards.md' +workflowPlanFile: '{targetWorkflowPath}/workflow-plan-{new_workflow_name}.md' +--- + +# Validation Step 5: Output Format Validation + +## STEP GOAL: + +To validate that the workflow's output format matches the design - correct template type, proper final polish step if needed, and step-to-output mapping is correct. + +## MANDATORY EXECUTION RULES (READ FIRST): + +### Universal Rules: + +- 🛑 DO NOT BE LAZY - LOAD AND REVIEW EVERY FILE +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next step, ensure entire file is read +- ✅ Validation does NOT stop for user input - auto-proceed through all validation steps + +### Step-Specific Rules: + +- 🎯 Validate output format against design specifications +- 🚫 DO NOT skip any checks +- 💬 Append findings to report, then auto-load next step +- 🚪 This is validation - systematic and thorough + +## EXECUTION PROTOCOLS: + +- 🎯 Load output format standards first +- 💾 Check template type matches design +- 📖 Check for final polish step if needed +- 🚫 DO NOT halt for user input - validation runs to completion + +## CONTEXT BOUNDARIES: + +- Check template file in templates/ folder +- Review design in {workflowPlanFile} for output format specification +- Validate step-to-output mapping +- Check if final polish step is present (if needed) + +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip or shortcut. + +### 1. Load Output Format Standards + +Load {outputFormatStandards} to understand: + +**Golden Rule:** Every step MUST output to document BEFORE loading next step. + +**Four Template Types:** +1. **Free-form** (Recommended) - Minimal structure, progressive append +2. **Structured** - Required sections, flexible within each +3. **Semi-structured** - Core sections plus optional additions +4. **Strict** - Exact format, specific fields (rare) + +**Final Polish Step:** +- For free-form workflows, include a polish step that optimizes the entire document +- Loads entire document, reviews for flow, removes duplication + +### 2. Check Design Specification + +From {workflowPlanFile}, identify: +- Does this workflow produce a document? +- If yes, what template type was designed? +- Is a final polish step needed? + +### 3. Validate Template File + +**If workflow produces documents:** + +1. Load the template file from `templates/` folder +2. Check it matches the designed type: + +**For Free-form (most common):** +- ✅ Has frontmatter with `stepsCompleted: []` +- ✅ Has `lastStep: ''` +- ✅ Has `date: ''` +- ✅ Has `user_name: ''` +- ✅ Document title header +- ✅ No rigid section structure (progressive append) + +**For Structured:** +- ✅ Has clear section headers +- ✅ Section placeholders with {{variable}} syntax +- ✅ Consistent structure + +**For Semi-structured:** +- ✅ Has core required sections +- ✅ Has optional section placeholders + +**For Strict:** +- ✅ Has exact field definitions +- ✅ Validation rules specified + +### 4. Check for Final Polish Step + +**If free-form template:** +- ✅ A final polish step should exist in the design +- ✅ The step loads entire document +- ✅ The step optimizes flow and coherence +- ✅ The step removes duplication +- ✅ The step ensures ## Level 2 headers + +**If no final polish step for free-form:** +- ⚠️ WARNING - Free-form workflows typically need final polish + +### 5. Validate Step-to-Output Mapping + +**For EACH step that outputs to document:** + +1. Check the step has `outputFile` in frontmatter +2. Check the step appends/writes to output before loading next +3. Check the menu C option saves to output before proceeding + +**Steps should be in ORDER of document appearance:** +- Step 1 creates doc +- Step 2 → ## Section 1 +- Step 3 → ## Section 2 +- Step N → Polish step + +### 6. Document Findings + +```markdown +### Output Format Validation Results + +**Workflow Produces Documents:** [Yes/No] + +**Template Type:** [Free-form/Structured/Semi-structured/Strict] + +**Template File Check:** +- Template exists: ✅/❌ +- Matches designed type: ✅/❌ +- Proper frontmatter: ✅/❌ + +**Final Polish Step:** +- Required: [Yes/No - based on template type] +- Present: ✅/❌ +- Loads entire document: ✅/❌ +- Optimizes flow: ✅/❌ + +**Step-to-Output Mapping:** +| Step | Has Output Variable | Saves Before Next | Status | +|------|-------------------|-------------------|--------| +| step-01-init.md | ✅ | ✅ | ✅ | +| step-02-*.md | ✅ | ✅ | ✅ | +| step-03-*.md | ❌ | N/A | ❌ FAIL | + +**Issues Found:** +[List any issues with template, polish step, or mapping] + +**Status:** ✅ PASS / ❌ FAIL / ⚠️ WARNINGS +``` + +### 7. Append to Report + +Update {validationReportFile} - replace "## Output Format Validation *Pending...*" with actual findings. + +### 8. Save Report and Auto-Proceed + +**CRITICAL:** Save the validation report BEFORE loading next step. + +Then immediately load, read entire file, then execute {nextStepFile}. + +**Display:** +"**Output Format validation complete.** Proceeding to Validation Design Check..." + +--- + +## 🚨 SYSTEM SUCCESS/FAILURE METRICS + +### ✅ SUCCESS: + +- Template type matches design +- Final polish step present if needed +- Step-to-output mapping validated +- All findings documented +- Report saved before proceeding +- Next validation step loaded + +### ❌ SYSTEM FAILURE: + +- Not checking template file +- Missing final polish step for free-form +- Not documenting mapping issues +- Not saving report before proceeding + +**Master Rule:** Validation is systematic and thorough. DO NOT BE LAZY. Check template, polish step, and mapping. Auto-proceed through all validation steps. diff --git a/src/modules/bmb/workflows/workflow/steps-v/step-06-validation-design-check.md b/src/modules/bmb/workflows/workflow/steps-v/step-06-validation-design-check.md new file mode 100644 index 00000000..f0f0cf32 --- /dev/null +++ b/src/modules/bmb/workflows/workflow/steps-v/step-06-validation-design-check.md @@ -0,0 +1,186 @@ +--- +name: 'step-06-validation-design-check' +description: 'Check if workflow has proper validation steps that load validation data (if validation is critical)' + +nextStepFile: './step-07-instruction-style-check.md' +targetWorkflowPath: '{bmb_creations_output_folder}/workflows/{new_workflow_name}' +validationReportFile: '{targetWorkflowPath}/validation-report-{new_workflow_name}.md' +workflowPlanFile: '{targetWorkflowPath}/workflow-plan-{new_workflow_name}.md' +trimodalWorkflowStructure: '../data/trimodal-workflow-structure.md' +--- + +# Validation Step 6: Validation Design Check + +## STEP GOAL: + +To check if the workflow has proper validation steps when validation is critical - validation steps should load from validation data and perform systematic checks. + +## MANDATORY EXECUTION RULES (READ FIRST): + +### Universal Rules: + +- 🛑 DO NOT BE LAZY - LOAD AND REVIEW EVERY FILE +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next step, ensure entire file is read +- ✅ Validation does NOT stop for user input - auto-proceed through all validation steps + +### Step-Specific Rules: + +- 🎯 Check if workflow needs validation steps +- 🚫 DO NOT skip any validation step reviews +- 💬 Append findings to report, then auto-load next step +- 🚪 This is validation - systematic and thorough + +## EXECUTION PROTOCOLS: + +- 🎯 Determine if validation is critical for this workflow +- 💾 Check validation steps exist and are well-designed +- 📖 Append findings to validation report +- 🚫 DO NOT halt for user input - validation runs to completion + +## CONTEXT BOUNDARIES: + +- Some workflows need validation (compliance, safety, quality gates) +- Others don't (creative, exploratory) +- Check the design to determine if validation steps are needed + +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip or shortcut. + +### 1. Determine If Validation Is Critical + +From {workflowPlanFile}, check: + +**Does this workflow NEED validation?** + +**YES - Validation Critical If:** +- Compliance/regulatory requirements (tax, legal, medical) +- Safety-critical outputs +- Quality gates required +- User explicitly requested validation steps + +**NO - Validation Not Critical If:** +- Creative/exploratory workflow +- User-driven without formal requirements +- Output is user's responsibility to validate + +### 2. If Validation Is Critical, Check Validation Steps + +**DO NOT BE LAZY - For EACH validation step in the workflow:** + +1. Find the step (usually named with "validate", "check", "review") +2. Load the step file +3. Check for: + +**Proper Validation Step Design:** +- ✅ Loads validation data/standards from `data/` folder +- ✅ Has systematic check sequence (not hand-wavy) +- ✅ Auto-proceeds through checks (not stopping for each) +- ✅ Clear pass/fail criteria +- ✅ Reports findings to user + +**"DO NOT BE LAZY" Language Check:** +- ✅ Step includes "DO NOT BE LAZY - LOAD AND REVIEW EVERY FILE" or similar mandate +- ✅ Step instructs to "Load and review EVERY file" not "sample files" +- ✅ Step has "DO NOT SKIP" or "DO NOT SHORTCUT" language +- ⚠️ WARNING if validation step lacks anti-lazy language + +**Critical Flow Check:** +- ✅ For critical flows (compliance, safety, quality gates): validation steps are in steps-v/ folder (tri-modal) +- ✅ Validation steps are segregated from create flow +- ✅ Validation can be run independently +- ⚠️ For non-critical flows (entertainment, therapy, casual): validation may be inline +- ❌ ERROR if critical validation is mixed into create steps + +### 3. Check Validation Data Files + +**If workflow has validation steps:** + +1. Check `data/` folder for validation data +2. Verify data files exist and are properly structured: + - CSV files have headers + - Markdown files have clear criteria + - Data is referenced in step frontmatter + +### 4. Document Findings + +```markdown +### Validation Design Check Results + +**Workflow Requires Validation:** [Yes/No] + +**Workflow Domain Type:** [Critical/Compliance/Creative/Entertainment/Therapy/Casual] + +**If Yes:** + +**Validation Steps Found:** +- [List each validation step] + +**Validation Step Quality:** +| Step | Loads Data | Systematic | Auto-proceed | DO NOT BE LAZY | Criteria | Status | +|------|-----------|------------|--------------|----------------|----------|--------| +| step-04-validate.md | ✅ | ✅ | ✅ | ✅ | ✅ Clear | ✅ PASS | +| step-07-check.md | ❌ | ⚠️ Vague | ❌ User choice each | ❌ | ❌ Unclear | ❌ FAIL | + +**"DO NOT BE LAZY" Language Check:** +| Step | Has Anti-Lazy Language | Status | +|------|----------------------|--------| +| step-04-validate.md | ✅ "DO NOT BE LAZY - LOAD AND REVIEW EVERY FILE" | ✅ PASS | +| step-07-check.md | ❌ No anti-lazy language found | ⚠️ WARN | + +**Critical Flow Check:** +- Workflow domain: [Critical/Creative/Therapy/etc.] +- Validation location: [steps-v/ folder / inline with create] +- For [critical] workflows: Validation is in steps-v/ ✅ / ❌ mixed in create +- Status: ✅ Properly segregated / ⚠️ Consider segregation / ❌ Should be in steps-v/ + +**Validation Data Files:** +- [List data files found, or note if missing] + +**Issues Found:** +[List issues with validation design] + +**If No (Validation Not Required):** +- Workflow is [creative/exploratory/type] +- Validation is user's responsibility +- No validation steps needed ✅ + +**Status:** ✅ PASS / ❌ FAIL / ⚠️ WARNINGS / N/A (not applicable) +``` + +### 5. Append to Report + +Update {validationReportFile} - replace "## Validation Design Check *Pending...*" with actual findings. + +### 6. Save Report and Auto-Proceed + +**CRITICAL:** Save the validation report BEFORE loading next step. + +Then immediately load, read entire file, then execute {nextStepFile}. + +**Display:** +"**Validation Design check complete.** Proceeding to Instruction Style Check..." + +--- + +## 🚨 SYSTEM SUCCESS/FAILURE METRICS + +### ✅ SUCCESS: + +- Determined if validation is critical +- If critical: checked all validation steps +- Validated validation step quality +- Checked validation data files +- Findings documented +- Report saved before proceeding +- Next validation step loaded + +### ❌ SYSTEM FAILURE: + +- Not checking validation steps when critical +- Missing validation data files +- Not documenting validation design issues +- Not saving report before proceeding + +**Master Rule:** Validation is systematic and thorough. DO NOT BE LAZY. Check validation steps thoroughly. Auto-proceed through all validation steps. diff --git a/src/modules/bmb/workflows/workflow/steps-v/step-07-instruction-style-check.md b/src/modules/bmb/workflows/workflow/steps-v/step-07-instruction-style-check.md new file mode 100644 index 00000000..fe604633 --- /dev/null +++ b/src/modules/bmb/workflows/workflow/steps-v/step-07-instruction-style-check.md @@ -0,0 +1,192 @@ +--- +name: 'step-07-instruction-style-check' +description: 'Check instruction style - intent-based vs prescriptive, appropriate for domain' + +nextStepFile: './step-08-collaborative-experience-check.md' +targetWorkflowPath: '{bmb_creations_output_folder}/workflows/{new_workflow_name}' +validationReportFile: '{targetWorkflowPath}/validation-report-{new_workflow_name}.md' +intentVsPrescriptive: '../data/intent-vs-prescriptive-spectrum.md' +workflowPlanFile: '{targetWorkflowPath}/workflow-plan-{new_workflow_name}.md' +--- + +# Validation Step 7: Instruction Style Check + +## STEP GOAL: + +To validate that workflow instructions use appropriate style - intent-based for creative/facilitative workflows, prescriptive only where absolutely required (compliance, legal). + +## MANDATORY EXECUTION RULES (READ FIRST): + +### Universal Rules: + +- 🛑 DO NOT BE LAZY - LOAD AND REVIEW EVERY FILE +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next step, ensure entire file is read +- ✅ Validation does NOT stop for user input - auto-proceed through all validation steps + +### Step-Specific Rules: + +- 🎯 Review EVERY step's instruction style +- 🚫 DO NOT skip any files or style checks +- 💬 Append findings to report, then auto-load next step +- 🚪 This is validation - systematic and thorough + +## EXECUTION PROTOCOLS: + +- 🎯 Load intent vs prescriptive standards +- 💾 Check EACH step's instruction style +- 📖 Validate style is appropriate for domain +- 🚫 DO NOT halt for user input - validation runs to completion + +## CONTEXT BOUNDARIES: + +- Instruction style should match domain +- Creative/facilitative → Intent-based (default) +- Compliance/legal → Prescriptive (exception) +- Check EVERY step for style consistency + +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip or shortcut. + +### 1. Load Instruction Style Standards + +Load {intentVsPrescriptive} to understand: + +**Intent-Based (Default):** +- Use for: Most workflows - creative, exploratory, collaborative +- Step instruction describes goals and principles +- AI adapts conversation naturally +- More flexible and responsive +- Example: "Guide user to define requirements through open-ended discussion" + +**Prescriptive (Exception):** +- Use for: Compliance, safety, legal, medical, regulated industries +- Step provides exact instructions +- More controlled and predictable +- Example: "Ask exactly: 'Do you currently experience fever, cough, or fatigue?'" + +### 2. Determine Domain Type + +From {workflowPlanFile}, identify the workflow domain: + +**Intent-Based Domains (Default):** +- Creative work (writing, design, brainstorming) +- Personal development (planning, goals, reflection) +- Exploration (research, discovery) +- Collaboration (facilitation, coaching) + +**Prescriptive Domains (Exception):** +- Legal/Compliance (contracts, regulations) +- Medical (health assessments, triage) +- Financial (tax, regulatory compliance) +- Safety (risk assessments, safety checks) + +### 3. Check EACH Step's Instruction Style + +**DO NOT BE LAZY - For EACH step file:** + +1. Load the step +2. Read the instruction sections (MANDATORY SEQUENCE) +3. Classify style: + +**Intent-Based Indicators:** +- ✅ Describes goals/outcomes, not exact wording +- ✅ Uses "think about" language +- ✅ Multi-turn conversation encouraged +- ✅ "Ask 1-2 questions at a time, not a laundry list" +- ✅ "Probe to understand deeper" +- ✅ Flexible: "guide user through..." not "say exactly..." + +**Prescriptive Indicators:** +- Exact questions specified +- Specific wording required +- Sequence that must be followed precisely +- "Say exactly:" or "Ask precisely:" + +**Mixed Style:** +- Some steps prescriptive (critical/required) +- Others intent-based (creative/facilitative) + +### 4. Validate Appropriateness + +**For Intent-Based Domains:** +- ✅ Instructions should be intent-based +- ❌ Prescriptive instructions inappropriate (unless specific section requires it) + +**For Prescriptive Domains:** +- ✅ Instructions should be prescriptive where compliance matters +- ⚠️ May have intent-based sections for creative elements + +### 5. Document Findings + +```markdown +### Instruction Style Check Results + +**Domain Type:** [Creative/Personal/Exploratory OR Legal/Medical/Compliance] + +**Appropriate Style:** [Intent-based/Prescriptive/Mixed] + +**Step Instruction Style Analysis:** +| Step | Style Type | Appropriate | Notes | Status | +|------|-----------|-------------|-------|--------| +| step-01-init.md | Intent-based | ✅ | Goals described, flexible | ✅ PASS | +| step-02-*.md | Intent-based | ✅ | "Think about response" | ✅ PASS | +| step-03-*.md | Prescriptive | ❌ | Domain is creative, too rigid | ⚠️ WARN | +| step-04-*.md | Intent-based | ✅ | Good facilitation language | ✅ PASS | +| step-05-*.md | Mixed | ✅ | Prescriptive for compliance, intent elsewhere | ✅ PASS | + +**Issues Found:** + +**Overly Prescriptive Steps:** +- [List steps that are too prescriptive for their domain] +- Example: "step-03-*.md says 'Ask exactly: X, Y, Z' but this is a creative workflow" + +**Overly Flexible Steps (if prescriptive domain):** +- [List steps that should be more prescriptive] +- Example: "step-04-*.md is vague but this is a compliance workflow" + +**Style Inconsistencies:** +- [List steps where style doesn't match domain] + +**Good Examples Found:** +- [Highlight steps with excellent intent-based instructions] +- [Highlight steps with appropriate prescriptive language] + +**Status:** ✅ PASS / ❌ FAIL / ⚠️ WARNINGS +``` + +### 6. Append to Report + +Update {validationReportFile} - replace "## Instruction Style Check *Pending...*" with actual findings. + +### 7. Save Report and Auto-Proceed + +**CRITICAL:** Save the validation report BEFORE loading next step. + +Then immediately load, read entire file, then execute {nextStepFile}. + +**Display:** +"**Instruction Style check complete.** Proceeding to Collaborative Experience Check..." + +--- + +## 🚨 SYSTEM SUCCESS/FAILURE METRICS + +### ✅ SUCCESS: + +- EVERY step's instruction style reviewed +- Style validated against domain appropriateness +- Issues documented with specific examples +- Findings appended to report +- Report saved before proceeding +- Next validation step loaded + +### ❌ SYSTEM FAILURE: + +- Not checking every step's style +- Not validating against domain +- Not documenting style issues +- Not saving report before proceeding + +**Master Rule:** Validation is systematic and thorough. DO NOT BE LAZY. Check EVERY step's instruction style. Auto-proceed through all validation steps. diff --git a/src/modules/bmb/workflows/workflow/steps-v/step-08-collaborative-experience-check.md b/src/modules/bmb/workflows/workflow/steps-v/step-08-collaborative-experience-check.md new file mode 100644 index 00000000..b5aacfcc --- /dev/null +++ b/src/modules/bmb/workflows/workflow/steps-v/step-08-collaborative-experience-check.md @@ -0,0 +1,199 @@ +--- +name: 'step-08-collaborative-experience-check' +description: 'Check collaborative quality - does this workflow facilitate well or just interrogate?' + +nextStepFile: './step-09-cohesive-review.md' +targetWorkflowPath: '{bmb_creations_output_folder}/workflows/{new_workflow_name}' +validationReportFile: '{targetWorkflowPath}/validation-report-{new_workflow_name}.md' +workflowPlanFile: '{targetWorkflowPath}/workflow-plan-{new_workflow_name}.md' +--- + +# Validation Step 8: Collaborative Experience Check + +## STEP GOAL: + +To validate that the workflow actually facilitates well - natural conversation, not interrogation. Questions asked progressively, not in laundry lists. + +## MANDATORY EXECUTION RULES (READ FIRST): + +### Universal Rules: + +- 🛑 DO NOT BE LAZY - LOAD AND REVIEW EVERY FILE +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next step, ensure entire file is read +- ✅ Validation does NOT stop for user input - auto-proceed through all validation steps + +### Step-Specific Rules: + +- 🎯 Review EVERY step for collaborative quality +- 🚫 DO NOT skip any files or experience checks +- 💬 Append findings to report, then auto-load next step +- 🚪 This is validation - systematic and thorough + +## EXECUTION PROTOCOLS: + +- 🎯 Walk through the workflow as a user would +- 💾 Check conversation flow in each step +- 📖 Validate facilitation quality +- 🚫 DO NOT halt for user input - validation runs to completion + +## CONTEXT BOUNDARIES: + +- Good workflows facilitate, don't interrogate +- Questions should be 1-2 at a time +- Conversation should feel natural +- Check EVERY step for collaborative patterns + +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip or shortcut. + +### 1. Load the Workflow Design + +From {workflowPlanFile}, understand: +- What is the workflow's goal? +- Who is the user? +- What interaction style was designed? + +### 2. Review EACH Step for Collaborative Quality + +**DO NOT BE LAZY - For EACH step file:** + +1. Load the step +2. Read the MANDATORY SEQUENCE section +3. Evaluate against collaborative quality criteria: + +**Good Facilitation Indicators:** +- ✅ "Ask 1-2 questions at a time" +- ✅ "Think about their response before continuing" +- ✅ "Use conversation, not interrogation" +- ✅ "Probe to understand deeper" +- ✅ Natural language in instructions +- ✅ Allows for back-and-forth + +**Bad Interrogation Indicators:** +- ❌ Laundry lists of questions +- ❌ "Ask the following: 1, 2, 3, 4, 5, 6..." +- ❌ Form-filling approach +- ❌ No space for conversation +- ❌ Rigid sequences without flexibility + +**Role Reinforcement Check:** +- ✅ "You are a [role], we engage in collaborative dialogue" +- ✅ "Together we produce something better" +- ❌ "You are a form filler" (obviously bad, but check for patterns) + +### 3. Check Progression and Arc + +**Does the workflow have:** +- ✅ Clear progression from step to step? +- ✅ Each step builds on previous work? +- ✅ User knows where they are in the process? +- ✅ Satisfying completion at the end? + +**Or does it:** +- ❌ Feel disjointed? +- ❌ Lack clear progression? +- ❌ Leave user unsure of status? + +### 4. Check Error Handling + +**Do steps handle:** +- ✅ Invalid input gracefully? +- ✅ User uncertainty with guidance? +- ✅ Off-track conversation with redirection? +- ✅ Edge cases with helpful messages? + +### 5. Document Findings + +```markdown +### Collaborative Experience Check Results + +**Overall Facilitation Quality:** [Excellent/Good/Fair/Poor] + +**Step-by-Step Analysis:** + +**step-01-init.md:** +- Question style: [Progressive/Laundry list] +- Conversation flow: [Natural/Rigid] +- Role clarity: ✅/❌ +- Status: ✅ PASS / ❌ FAIL + +**step-02-*.md:** +- Question style: [Progressive/laundry list - "Ask 1-2 at a time" / Lists 5+ questions] +- Allows conversation: ✅/❌ +- Thinks before continuing: ✅/❌ +- Status: ✅ PASS / ❌ FAIL + +[Continue for ALL steps...] + +**Collaborative Strengths Found:** +- [List examples of good facilitation] +- [Highlight steps that excel at collaboration] + +**Collaborative Issues Found:** + +**Laundry List Questions:** +- [List steps with question dumps] +- Example: "step-03-*.md asks 7 questions at once" + +**Rigid Sequences:** +- [List steps that don't allow conversation] +- Example: "step-04-*.md has no space for back-and-forth" + +**Form-Filling Patterns:** +- [List steps that feel like form filling] +- Example: "step-05-*.md collects data without facilitation" + +**Progression Issues:** +- [List problems with flow/arc] +- Example: "step-06-*.md doesn't connect to previous step" + +**User Experience Assessment:** + +**Would this workflow feel like:** +- [ ] A collaborative partner working WITH the user +- [ ] A form collecting data FROM the user +- [ ] An interrogation extracting information +- [ ] A mix - depends on step + +**Overall Collaborative Rating:** ⭐⭐⭐⭐⭐ [1-5 stars] + +**Status:** ✅ EXCELLENT / ✅ GOOD / ⚠️ NEEDS IMPROVEMENT / ❌ POOR +``` + +### 6. Append to Report + +Update {validationReportFile} - replace "## Collaborative Experience Check *Pending...*" with actual findings. + +### 7. Save Report and Auto-Proceed + +**CRITICAL:** Save the validation report BEFORE loading next step. + +Then immediately load, read entire file, then execute {nextStepFile}. + +**Display:** +"**Collaborative Experience check complete.** Proceeding to Cohesive Review..." + +--- + +## 🚨 SYSTEM SUCCESS/FAILURE METRICS + +### ✅ SUCCESS: + +- EVERY step reviewed for collaborative quality +- Question patterns analyzed (progressive vs laundry list) +- Conversation flow validated +- Issues documented with specific examples +- Findings appended to report +- Report saved before proceeding +- Next validation step loaded + +### ❌ SYSTEM FAILURE: + +- Not checking every step's collaborative quality +- Missing question pattern analysis +- Not documenting experience issues +- Not saving report before proceeding + +**Master Rule:** Validation is systematic and thorough. DO NOT BE LAZY. Check EVERY step's collaborative quality. Auto-proceed through all validation steps. diff --git a/src/modules/bmb/workflows/workflow/steps-v/step-09-cohesive-review.md b/src/modules/bmb/workflows/workflow/steps-v/step-09-cohesive-review.md new file mode 100644 index 00000000..0453ab93 --- /dev/null +++ b/src/modules/bmb/workflows/workflow/steps-v/step-09-cohesive-review.md @@ -0,0 +1,235 @@ +--- +name: 'step-09-cohesive-review' +description: 'Cohesive ultra-think review - overall quality, does this workflow actually facilitate well?' + +nextStepFile: './step-10-report-complete.md' +targetWorkflowPath: '{bmb_creations_output_folder}/workflows/{new_workflow_name}' +validationReportFile: '{targetWorkflowPath}/validation-report-{new_workflow_name}.md' +workflowPlanFile: '{targetWorkflowPath}/workflow-plan-{new_workflow_name}.md' +--- + +# Validation Step 9: Cohesive Review + +## STEP GOAL: + +To perform a cohesive "ultra-think" review of the entire workflow - walk through it as a whole, assess overall quality, does it actually facilitate well? + +## MANDATORY EXECUTION RULES (READ FIRST): + +### Universal Rules: + +- 🛑 DO NOT BE LAZY - LOAD AND REVIEW EVERY FILE +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next step, ensure entire file is read +- ✅ Validation does NOT stop for user input - auto-proceed through all validation steps + +### Step-Specific Rules: + +- 🎯 Review the workflow as a cohesive whole +- 🚫 DO NOT skip any aspect of the review +- 💬 Think deeply about quality and facilitation +- 🚪 This is the meta-review - overall assessment + +## EXECUTION PROTOCOLS: + +- 🎯 Walk through the ENTIRE workflow end-to-end +- 💾 Assess overall quality, not just individual components +- 📖 Think deeply: would this actually work well? +- 🚫 DO NOT halt for user input - validation runs to completion + +## CONTEXT BOUNDARIES: + +- This is the cohesive review - look at the workflow as a whole +- Consider user experience from start to finish +- Assess whether the workflow achieves its goal +- Be thorough and thoughtful + +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip or shortcut. + +### 1. Load the Entire Workflow + +**DO NOT BE LAZY - Load EVERY step file:** + +1. Load workflow.md +2. Load EVERY step file in steps-c/ in order +3. Read through each step +4. Understand the complete flow + +### 2. Walk Through the Workflow Mentally + +**Imagine you are a user running this workflow:** + +- Starting from workflow.md +- Going through step-01 +- Progressing through each step +- Experiencing the interactions +- Reaching the end + +**Ask yourself:** +- Does this make sense? +- Is the flow logical? +- Would I feel guided or confused? +- Does it achieve its goal? + +### 3. Assess Cohesiveness + +**Check for:** + +**✅ Cohesive Indicators:** +- Each step builds on previous work +- Clear progression toward goal +- Consistent voice and approach throughout +- User always knows where they are +- Satisfying completion + +**❌ Incohesive Indicators:** +- Steps feel disconnected +- Jumps in logic or flow +- Inconsistent patterns +- User might be confused +- Abrupt or unclear ending + +### 4. Assess Overall Quality + +**Rate the workflow on:** + +| Aspect | Rating (1-5) | Notes | +|--------|-------------|-------| +| Clear Goal | ⭐⭐⭐⭐⭐ | Is the purpose clear? | +| Logical Flow | ⭐⭐⭐⭐⭐ | Do steps progress logically? | +| Facilitation Quality | ⭐⭐⭐⭐⭐ | Does it facilitate well? | +| User Experience | ⭐⭐⭐⭐⭐ | Would users enjoy this? | +| Goal Achievement | ⭐⭐⭐⭐⭐ | Does it accomplish what it set out to? | +| Overall Quality | ⭐⭐⭐⭐⭐ | Total assessment | + +### 5. Identify Strengths and Weaknesses + +**Strengths:** +- What does this workflow do well? +- What makes it excellent? +- What should other workflows emulate? + +**Weaknesses:** +- What could be improved? +- What doesn't work well? +- What would confuse users? + +**Critical Issues:** +- Are there any show-stopper problems? +- Would this workflow fail in practice? + +### 6. Provide Recommendation + +**Overall Assessment:** +- ✅ **EXCELLENT** - Ready to use, exemplifies best practices +- ✅ **GOOD** - Solid workflow, minor improvements possible +- ⚠️ **NEEDS WORK** - Has issues that should be addressed +- ❌ **PROBLEMATIC** - Major issues, needs significant revision + +**Recommendation:** +- [Ready for use / Ready with minor tweaks / Needs revision / Major rework needed] + +### 7. Document Findings + +```markdown +### Cohesive Review Results + +**Overall Assessment:** [EXCELLENT/GOOD/NEEDS WORK/PROBLEMATIC] + +**Quality Ratings:** +| Aspect | Rating | Notes | +|--------|--------|-------| +| Clear Goal | ⭐⭐⭐⭐⭐ | [Notes] | +| Logical Flow | ⭐⭐⭐⭐⭐ | [Notes] | +| Facilitation Quality | ⭐⭐⭐⭐⭐ | [Notes] | +| User Experience | ⭐⭐⭐⭐⭐ | [Notes] | +| Goal Achievement | ⭐⭐⭐⭐⭐ | [Notes] | +| **Overall Quality** | **⭐⭐⭐⭐⭐** | [Total assessment] | + +**Cohesiveness Analysis:** + +**Flow Assessment:** +- [Describe the overall flow - does it work?] +- [Are there any jarring transitions?] +- [Does each step connect to the next?] + +**Progression Assessment:** +- [Does the workflow build toward its goal?] +- [Is there a clear arc?] +- [Would a user feel they're making progress?] + +**Voice and Tone:** +- [Is the voice consistent throughout?] +- [Does the AI persona work well?] +- [Is the collaboration style appropriate?] + +**Strengths:** +1. [Major strength #1] +2. [Major strength #2] +3. [What makes this workflow excellent] + +**Weaknesses:** +1. [Issue #1 that could be improved] +2. [Issue #2 that could be improved] +3. [What doesn't work as well] + +**Critical Issues (if any):** +- [List any show-stopper problems] +- [Or note: No critical issues] + +**What Makes This Work Well:** +- [Describe the excellent elements] +- [What should other workflows learn from this?] + +**What Could Be Improved:** +- [Specific actionable improvements] +- [Priority: High/Medium/Low] + +**User Experience Forecast:** +- [How would a user experience this workflow?] +- [Would they feel: guided/confused/satisfied/frustrated?] + +**Recommendation:** +- [Ready for use / Ready with minor tweaks / Needs revision / Major rework needed] + +**Status:** ✅ EXCELLENT / ✅ GOOD / ⚠️ NEEDS WORK / ❌ PROBLEMATIC +``` + +### 8. Append to Report + +Update {validationReportFile} - replace "## Cohesive Review *Pending...*" with actual findings. + +### 9. Save Report and Auto-Proceed + +**CRITICAL:** Save the validation report BEFORE loading next step. + +Then immediately load, read entire file, then execute {nextStepFile}. + +**Display:** +"**Cohesive Review complete.** Proceeding to finalize validation report..." + +--- + +## 🚨 SYSTEM SUCCESS/FAILURE METRICS + +### ✅ SUCCESS: + +- ENTIRE workflow reviewed end-to-end +- Quality assessed across multiple dimensions +- Strengths and weaknesses documented +- Thoughtful recommendation provided +- Findings appended to report +- Report saved before proceeding +- Next validation step loaded + +### ❌ SYSTEM FAILURE: + +- Not reviewing the entire workflow +- Superficial or lazy assessment +- Not documenting strengths/weaknesses +- Not providing clear recommendation +- Not saving report before proceeding + +**Master Rule:** Validation is systematic and thorough. DO NOT BE LAZY. Review the ENTIRE workflow cohesively. Think deeply about quality. Auto-proceed through all validation steps. diff --git a/src/modules/bmb/workflows/workflow/steps-v/step-10-report-complete.md b/src/modules/bmb/workflows/workflow/steps-v/step-10-report-complete.md new file mode 100644 index 00000000..c011bc33 --- /dev/null +++ b/src/modules/bmb/workflows/workflow/steps-v/step-10-report-complete.md @@ -0,0 +1,234 @@ +--- +name: 'step-10-report-complete' +description: 'Finalize validation report - check for plan file, summarize all findings, present to user' + +targetWorkflowPath: '{bmb_creations_output_folder}/workflows/{new_workflow_name}' +validationReportFile: '{targetWorkflowPath}/validation-report-{new_workflow_name}.md' +workflowPlanFile: '{targetWorkflowPath}/workflow-plan-{new_workflow_name}.md' +planValidationStep: './step-11-plan-validation.md' +--- + +# Validation Step 10: Report Complete + +## STEP GOAL: + +To check if a plan file exists (and run plan validation if it does), then summarize all validation findings and present to the user. + +## MANDATORY EXECUTION RULES (READ FIRST): + +### Universal Rules: + +- 📖 CRITICAL: Read the complete step file before taking any action +- 📋 YOU ARE A FACILITATOR, not a content generator +- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` + +### Step-Specific Rules: + +- 🎯 This is the final validation step - present findings +- 🚫 DO NOT modify the workflow without user request +- 💬 Present summary and ask what changes are needed +- 🚪 This ends validation - user decides next steps + +## EXECUTION PROTOCOLS: + +- 🎯 Load the complete validation report +- 💾 Summarize ALL findings +- 📖 Update report status to COMPLETE +- 🚫 DO NOT proceed without user review + +## CONTEXT BOUNDARIES: + +- All 9 previous validation steps have completed +- Report contains findings from all checks +- User needs to see summary and decide on changes +- This step DOES NOT auto-proceed + +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip or shortcut. + +### 1. Check for Plan File + +Before finalizing the report, check if a plan file exists: + +**Check if {workflowPlanFile} exists:** +- **IF YES:** Run plan validation first + - Load, read entire file, then execute {planValidationStep} + - The plan validation will append its findings to the report + - Then return to this step to finalize the report +- **IF NO:** Proceed to finalize the report (no plan to validate) + +### 2. Load Complete Validation Report + +After plan validation (if applicable), load {validationReportFile} and read ALL findings from every validation step. + +### 3. Create Summary Section + +At the end of {validationReportFile}, replace "## Summary *Pending...*" with: + +```markdown +## Summary + +**Validation Completed:** [current date] + +**Overall Status:** +[Based on all validation steps, determine overall status] + +**Validation Steps Completed:** +1. ✅ File Structure & Size - [PASS/FAIL/WARN] +2. ✅ Frontmatter Validation - [PASS/FAIL/WARN] +3. ✅ Menu Handling Validation - [PASS/FAIL/WARN] +4. ✅ Step Type Validation - [PASS/FAIL/WARN] +5. ✅ Output Format Validation - [PASS/FAIL/WARN] +6. ✅ Validation Design Check - [PASS/FAIL/WARN/N/A] +7. ✅ Instruction Style Check - [PASS/FAIL/WARN] +8. ✅ Collaborative Experience Check - [PASS/FAIL/WARN] +9. ✅ Cohesive Review - [EXCELLENT/GOOD/NEEDS WORK/PROBLEMATIC] +10. ✅ Plan Quality Validation - [FULLY IMPLEMENTED/PARTIALLY/MISSING/N/A] + +**Issues Summary:** + +**Critical Issues (Must Fix):** +- [List any critical issues from all validation steps] +- [If none, state: No critical issues found] + +**Warnings (Should Fix):** +- [List any warnings from all validation steps] +- [If none, state: No warnings found] + +**Strengths:** +- [List key strengths identified in validation] + +**Overall Assessment:** +[Summarize the overall quality of the workflow] + +**Recommendation:** +- [Ready to use / Ready with minor tweaks / Needs revision / Major rework needed] + +**Next Steps:** +- Review the detailed findings above +- Decide what changes to make +- Either fix issues directly or use edit workflow (if tri-modal) +``` + +### 3. Update Report Status + +Update frontmatter of {validationReportFile}: + +```yaml +--- +validationDate: [original date] +completionDate: [current date] +workflowName: {new_workflow_name} +workflowPath: {targetWorkflowPath} +validationStatus: COMPLETE +--- +``` + +### 4. Present Summary to User + +"**✅ Validation Complete!** + +I've completed extensive validation of your workflow. Here's the summary:" + +**Overall Status:** [Overall status from summary] + +**Quick Results:** +| Validation Step | Result | +|-----------------|--------| +| File Structure & Size | [emoji] [result] | +| Frontmatter | [emoji] [result] | +| Menu Handling | [emoji] [result] | +| Step Types | [emoji] [result] | +| Output Format | [emoji] [result] | +| Validation Design | [emoji] [result or N/A] | +| Instruction Style | [emoji] [result] | +| Collaborative Experience | [emoji] [result] | +| Cohesive Review | [emoji] [result] | +| Plan Quality | [emoji] [result or N/A] | + +**Issues Found:** +- **Critical:** [count or "none"] +- **Warnings:** [count or "none"] + +**Recommendation:** [Ready to use / Needs tweaks / Needs revision] + +"**The full validation report is available at:** +`{validationReportFile}` + +**Would you like me to:** +1. Review the detailed findings with you +2. Make specific changes to address issues +3. Explain any validation result in detail +4. Something else" + +### 5. Present MENU OPTIONS + +Display: **Validation Complete! Select an Option:** [R] Review Detailed Findings [F] Fix Issues [X] Exit Validation + +#### EXECUTION RULES: + +- ALWAYS halt and wait for user input after presenting menu +- User chooses their next action + +#### Menu Handling Logic: + +- IF R: Walk through the validation report section by section, explaining findings, then redisplay menu +- IF F: "What issues would you like to fix?" → Discuss specific changes needed → User can make edits manually OR you can help edit files +- IF X: "Validation complete. Your workflow is at: {targetWorkflowPath}. You can make changes and re-run validation anytime." +- IF Any other comments or queries: help user respond then [Redisplay Menu Options](#5-present-menu-options) + +### 6. If User Wants to Fix Issues + +**Options for fixing:** + +**Option A: Manual Edits** +- User edits files directly +- Re-run validation to check fixes + +**Option B: Guided Edits** +- User specifies what to fix +- Help create specific edits for user approval +- User applies edits + +**Option C: Edit Workflow (if tri-modal)** +- If workflow has steps-e/, use edit workflow +- Edit workflow can make systematic changes + +### 7. Update Plan with Validation Status + +Update {workflowPlanFile} frontmatter: + +```yaml +--- +validationStatus: COMPLETE +validationDate: [current date] +validationReport: {validationReportFile} +--- +``` + +## CRITICAL STEP COMPLETION NOTE + +This is the final validation step. User reviews findings and decides whether to make changes. Validation workflow ends here. + +--- + +## 🚨 SYSTEM SUCCESS/FAILURE METRICS + +### ✅ SUCCESS: + +- All validation findings summarized +- Complete report presented to user +- Summary section added to report +- Report status updated to COMPLETE +- User can review findings and decide on changes +- Plan updated with validation status + +### ❌ SYSTEM FAILURE: + +- Not summarizing all findings +- Not presenting complete report to user +- Not updating report status +- Not giving user clear options for next steps + +**Master Rule:** Validation is complete. User reviews findings and decides what changes to make. Provide clear summary and options. diff --git a/src/modules/bmb/workflows/workflow/steps-v/step-11-plan-validation.md b/src/modules/bmb/workflows/workflow/steps-v/step-11-plan-validation.md new file mode 100644 index 00000000..83f55cae --- /dev/null +++ b/src/modules/bmb/workflows/workflow/steps-v/step-11-plan-validation.md @@ -0,0 +1,209 @@ +--- +name: 'step-11-plan-validation' +description: 'Validate plan quality - ensure all user intent and requirements are implemented' + +targetWorkflowPath: '{bmb_creations_output_folder}/workflows/{new_workflow_name}' +validationReportFile: '{targetWorkflowPath}/validation-report-{new_workflow_name}.md' +workflowPlanFile: '{targetWorkflowPath}/workflow-plan-{new_workflow_name}.md' +--- + +# Validation Step 11: Plan Quality Validation + +## STEP GOAL: + +To validate that a workflow plan (if it exists) has been fully implemented - all user intent captured, all requirements met with high quality. + +## MANDATORY EXECUTION RULES (READ FIRST): + +### Universal Rules: + +- 🛑 DO NOT BE LAZY - LOAD AND REVIEW EVERY FILE +- 📖 CRITICAL: Read the complete step file before taking any action +- ✅ This validation step only runs if a plan file exists + +### Step-Specific Rules: + +- 🎯 Load the complete plan file +- 🚫 DO NOT skip checking any requirement from the plan +- 💬 Validate that built workflow matches plan specifications +- 🚪 This ensures the build actually delivered what was planned + +## EXECUTION PROTOCOLS: + +- 🎯 Load plan and extract all requirements/intent +- 💾 Check built workflow against plan +- 📖 Document gaps and quality issues +- 🚫 Only run this step if workflowPlanFile exists + +## CONTEXT BOUNDARIES: + +- This step runs AFTER the workflow is built +- Compares what was planned vs what was implemented +- Checks for: missing features, quality gaps, unmet user intent + +## MANDATORY SEQUENCE + +**CRITICAL:** Only run this step if {workflowPlanFile} exists. If it doesn't exist, skip to final summary. + +### 1. Check if Plan Exists + +First, check if {workflowPlanFile} exists: + +**IF plan file does NOT exist:** +- Skip this validation step +- Proceed to summary with note: "No plan file found - workflow may have been built without BMAD create-workflow process" + +**IF plan file exists:** +- Load the complete plan file +- Proceed with validation + +### 2. Extract Plan Requirements + +**DO NOT BE LAZY - Extract EVERY requirement from the plan:** + +From {workflowPlanFile}, extract: + +**From Discovery Section:** +- User's original idea/vision +- Core problem being solved + +**From Classification Section:** +- 4 key decisions (document output, module, continuable, tri-modal) +- Target path +- Workflow name + +**From Requirements Section:** +- Flow structure (linear/looping/branching) +- User interaction style +- Inputs required +- Output specifications +- Success criteria + +**From Design Section:** +- Step outline with names and purposes +- Flow diagram +- Interaction patterns +- File structure requirements + +**From Tools Section:** +- Tools configured +- Data files specified + +### 3. Validate Each Requirement Against Built Workflow + +**For EACH requirement extracted:** + +Check the built workflow to see if it was implemented: + +**Discovery Validation:** +- ✅ Built workflow addresses the original problem? +- ✅ Vision from discovery is reflected in final workflow? + +**Classification Validation:** +- ✅ Document output matches plan (yes/no)? +- ✅ Module affiliation correct? +- ✅ Continuable support as specified? +- ✅ Tri-modal structure as specified? + +**Requirements Validation:** +- ✅ Flow structure matches plan? +- ✅ User interaction style as specified? +- ✅ All required inputs configured? +- ✅ Output format matches specification? +- ✅ Success criteria achievable? + +**Design Validation:** +- ✅ All steps from design present in workflow? +- ✅ Step purposes match design? +- ✅ Flow follows design diagram? +- ✅ Interaction patterns as specified? + +**Tools Validation:** +- ✅ Specified tools configured in workflow? +- ✅ Data files created as specified? + +### 4. Check Implementation Quality + +For each implemented requirement, assess quality: + +**Quality Questions:** +- Is the implementation high quality or minimal/barely working? +- Would this actually facilitate well? +- Are there obvious gaps or issues? + +**Example:** +- Plan: "Highly collaborative, intent-based facilitation" +- Implementation: Has A/P menus, uses intent-based language ✅ + +- Plan: "Continuable workflow with session resume" +- Implementation: Has step-01b-continue.md, tracks stepsCompleted ✅ + +### 5. Document Findings + +```markdown +### Plan Quality Validation Results + +**Plan File:** {workflowPlanFile} +**Plan Exists:** ✅ Yes + +**Requirements Extracted:** [number] requirements from plan sections + +**Implementation Coverage:** + +| Requirement Area | Specified | Implemented | Quality | Status | +|------------------|-----------|--------------|---------|--------| +| Discovery/Vision | [summary] | ✅/❌ | High/Med/Low | ✅/❌ | +| Document Output | [yes/no] | ✅/❌ | High/Med/Low | ✅/❌ | +| Continuable | [yes/no] | ✅/❌ | High/Med/Low | ✅/❌ | +| Tri-Modal | [yes/no] | ✅/❌ | High/Med/Low | ✅/❌ | +| Flow Structure | [type] | ✅/❌ | High/Med/Low | ✅/❌ | +| Interaction Style | [style] | ✅/❌ | High/Med/Low | ✅/❌ | +| [Step 01] | [purpose] | ✅/❌ | High/Med/Low | ✅/❌ | +| [Step 02] | [purpose] | ✅/❌ | High/Med/Low | ✅/❌ | +| ... | ... | ... | ... | ... | + +**Missing Implementations:** +- [List any requirements from plan that are NOT in the built workflow] + +**Quality Issues:** +- [List any requirements that are implemented but with poor quality] + +**Gaps Between Plan and Reality:** +- [List where the built workflow doesn't match the plan] + +**Plan Implementation Score:** [X]% + +**Status:** ✅ FULLY IMPLEMENTED / ⚠️ PARTIALLY IMPLEMENTED / ❌ POORLY IMPLEMENTED / ❌ MISSING CRITICAL ITEMS +``` + +### 6. Append to Report + +Append findings to {validationReportFile} after the "## Cohesive Review" section. + +### 7. Save and Complete + +Save the validation report. This is the final validation step. + +**Display:** +"**Plan Quality validation complete.** Validation report finalized." + +--- + +## 🚨 SYSTEM SUCCESS/FAILURE METRICS + +### ✅ SUCCESS: + +- Plan file loaded completely +- Every requirement extracted and validated +- Implementation gaps documented +- Quality assessed for each requirement +- Findings appended to report + +### ❌ SYSTEM FAILURE: + +- Not loading complete plan +- Skipping requirement checks +- Not documenting implementation gaps +- Not assessing quality + +**Master Rule:** Validation is systematic and thorough. DO NOT BE LAZY. Check EVERY requirement from the plan. Document all gaps. diff --git a/src/modules/bmb/workflows/workflow/templates/minimal-output-template.md b/src/modules/bmb/workflows/workflow/templates/minimal-output-template.md new file mode 100644 index 00000000..ecb1fb97 --- /dev/null +++ b/src/modules/bmb/workflows/workflow/templates/minimal-output-template.md @@ -0,0 +1,11 @@ +--- +stepsCompleted: [] +lastStep: '' +date: '' +user_name: '' +project_name: '' +--- + +# {{document_title}} + +[Content will be progressively appended by workflow steps] diff --git a/src/modules/bmb/docs/workflows/templates/step-01-init-continuable-template.md b/src/modules/bmb/workflows/workflow/templates/step-01-init-continuable-template.md similarity index 100% rename from src/modules/bmb/docs/workflows/templates/step-01-init-continuable-template.md rename to src/modules/bmb/workflows/workflow/templates/step-01-init-continuable-template.md diff --git a/src/modules/bmb/docs/workflows/templates/step-1b-template.md b/src/modules/bmb/workflows/workflow/templates/step-1b-template.md similarity index 100% rename from src/modules/bmb/docs/workflows/templates/step-1b-template.md rename to src/modules/bmb/workflows/workflow/templates/step-1b-template.md diff --git a/src/modules/bmb/docs/workflows/templates/step-template.md b/src/modules/bmb/workflows/workflow/templates/step-template.md similarity index 98% rename from src/modules/bmb/docs/workflows/templates/step-template.md rename to src/modules/bmb/workflows/workflow/templates/step-template.md index 38b447e4..a6758603 100644 --- a/src/modules/bmb/docs/workflows/templates/step-template.md +++ b/src/modules/bmb/workflows/workflow/templates/step-template.md @@ -74,7 +74,7 @@ Example: "To analyze user requirements and document functional specifications th ## EXECUTION PROTOCOLS: -- 🎯 [Step-specific protocol 1] +- 🎯 Follow the MANDATORY SEQUENCE exactly - 💾 [Step-specific protocol 2 - e.g., document updates] - 📖 [Step-specific protocol 3 - e.g., tracking requirements] - 🚫 [Step-specific restriction] @@ -86,9 +86,9 @@ Example: "To analyze user requirements and document functional specifications th - Limits: [what not to assume or do] - Dependencies: [what this step depends on] -## Sequence of Instructions (Do not deviate, skip, or optimize) +## MANDATORY SEQUENCE -[Detailed instructions for the step's work] +**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change. ### 1. Title diff --git a/src/modules/bmb/docs/workflows/templates/workflow-template.md b/src/modules/bmb/workflows/workflow/templates/workflow-template.md similarity index 100% rename from src/modules/bmb/docs/workflows/templates/workflow-template.md rename to src/modules/bmb/workflows/workflow/templates/workflow-template.md diff --git a/src/modules/bmb/workflows/create-workflow/workflow.md b/src/modules/bmb/workflows/workflow/workflow.md similarity index 54% rename from src/modules/bmb/workflows/create-workflow/workflow.md rename to src/modules/bmb/workflows/workflow/workflow.md index 568edc88..47feff81 100644 --- a/src/modules/bmb/workflows/create-workflow/workflow.md +++ b/src/modules/bmb/workflows/workflow/workflow.md @@ -1,6 +1,6 @@ --- name: create-workflow -description: Create structured standalone workflows using markdown-based step architecture +description: Create structured standalone workflows using markdown-based step architecture (tri-modal: create, validate, edit) web_bundle: true --- @@ -10,6 +10,8 @@ web_bundle: true **Your Role:** In addition to your name, communication_style, and persona, you are also a workflow architect and systems designer collaborating with a workflow creator. This is a partnership, not a client-vendor relationship. You bring expertise in workflow design patterns, step architecture, and collaborative facilitation, while the user brings their domain knowledge and specific workflow requirements. Work together as equals. +**Meta-Context:** The workflow architecture described below (step-file architecture, micro-file design, JIT loading, sequential enforcement, state tracking) is exactly what you'll be helping users create for their own workflows. You're demonstrating the pattern while building it with them. + --- ## WORKFLOW ARCHITECTURE @@ -23,6 +25,7 @@ This uses **step-file architecture** for disciplined execution: - **Sequential Enforcement**: Sequence within the step files must be completed in order, no skipping or optimization allowed - **State Tracking**: Document progress in output file frontmatter using `stepsCompleted` array when a workflow produces a document - **Append-Only Building**: Build documents by appending content as directed to the output file +- **Tri-Modal Structure**: Separate step folders for Create (steps-c/), Validate (steps-v/), and Edit (steps-e/) modes ### Step Processing Rules @@ -53,7 +56,48 @@ This uses **step-file architecture** for disciplined execution: Load and read full config from {project-root}/_bmad/bmb/config.yaml and resolve: - `project_name`, `output_folder`, `user_name`, `communication_language`, `document_output_language`, `bmb_creations_output_folder` +- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` -### 2. First Step EXECUTION +### 2. Mode Determination -Load, read the full file and then execute `{workflow_path}/steps/step-01-init.md` to begin the workflow. +**Check if mode was specified in the command invocation:** + +- If user invoked with "create workflow" or "new workflow" or "build workflow" → Set mode to **create** +- If user invoked with "validate workflow" or "review workflow" or "-v" or "--validate" → Set mode to **validate** +- If user invoked with "edit workflow" or "modify workflow" or "-e" or "--edit" → Set mode to **edit** + +**If mode is still unclear, ask user:** + +"Welcome to the BMAD Workflow Creator! What would you like to do? + +**[C]reate** - Build a new workflow from scratch +**[V]alidate** - Review an existing workflow and generate validation report +**[E]dit** - Modify an existing workflow + +Please select: [C]reate / [V]alidate / [E]dit" + +### 3. Route to First Step + +**IF mode == create:** + +"**Creating a new workflow. How would you like to start?** + +**[F]rom scratch** - Start with a blank slate - I'll help you discover your idea +**[C]onvert existing** - Convert an existing workflow to BMAD compliant format + +Please select: [F]rom scratch / [C]onvert existing" + +#### Create Mode Routing: + +- **IF F:** Load, read completely, then execute `steps-c/step-01-discovery.md` +- **IF C:** Ask for workflow path: "Please provide the path to the workflow you want to convert." + Then load, read completely, then execute `steps-c/step-00-conversion.md` +- **IF Any other:** help user respond, then redisplay create mode menu + +**IF mode == validate:** +Prompt for workflow path: "Which workflow would you like to validate? Please provide the path to the workflow.md file." +Then load, read completely, and execute `steps-v/step-01-validate.md` + +**IF mode == edit:** +Prompt for workflow path: "Which workflow would you like to edit? Please provide the path to the workflow.md file." +Then load, read completely, and execute `steps-e/step-e-01-assess-workflow.md` From 35ae4fd024e0fac525e0033b361b960a73014469 Mon Sep 17 00:00:00 2001 From: Brian Madison Date: Sat, 3 Jan 2026 00:32:56 +0800 Subject: [PATCH 08/19] quadrivariate module workflow --- .../bmb/agents/module-builder.agent.yaml | 12 +- .../workflows-legacy/edit-module/README.md | 171 ------- .../workflows-legacy/edit-module/checklist.md | 163 ------ .../edit-module/instructions.md | 340 ------------- .../edit-module/workflow.yaml | 34 -- .../workflows-legacy/module-brief/README.md | 264 ---------- .../module-brief/checklist.md | 116 ----- .../module-brief/instructions.md | 268 ---------- .../workflows-legacy/module-brief/template.md | 275 ----------- .../module-brief/workflow.yaml | 36 -- .../workflows/agent/data/critical-actions.md | 4 +- .../agent/data/expert-agent-architecture.md | 2 +- .../agent/steps-c/step-03-type-metadata.md | 6 +- .../agent/steps-c/step-04-persona.md | 2 +- .../agent/steps-c/step-05-commands-menu.md | 2 +- .../agent/steps-c/step-06-activation.md | 14 +- .../agent/steps-c/step-07a-build-simple.md | 8 +- .../agent/steps-c/step-07b-build-expert.md | 32 +- .../agent/steps-c/step-07c-build-module.md | 4 +- ...p-09-celebrate.md => step-08-celebrate.md} | 19 +- .../steps-c/step-08a-plan-traceability.md | 205 -------- .../steps-c/step-08b-metadata-validation.md | 130 ----- .../steps-c/step-08c-persona-validation.md | 161 ------ .../agent/steps-c/step-08d-menu-validation.md | 175 ------- .../steps-c/step-08e-structure-validation.md | 308 ------------ .../steps-c/step-08f-sidecar-validation.md | 464 ------------------ .../agent/steps-e/e-01-load-existing.md | 5 +- .../agent/steps-e/e-07-activation.md | 19 +- .../agent/steps-e/e-08a-edit-simple.md | 9 +- .../agent/steps-e/e-08b-edit-expert.md | 8 +- .../agent/steps-e/e-08c-edit-module.md | 7 +- .../{e-10-celebrate.md => e-09-celebrate.md} | 17 +- .../agent/steps-e/e-09a-validate-metadata.md | 128 ----- .../agent/steps-e/e-09b-validate-persona.md | 138 ------ .../agent/steps-e/e-09c-validate-menu.md | 163 ------ .../agent/steps-e/e-09d-validate-structure.md | 154 ------ .../agent/steps-e/e-09e-validate-sidecar.md | 160 ------ .../agent/steps-e/e-09f-validation-summary.md | 113 ----- .../agent/steps-v/v-01-load-review.md | 7 +- .../agent/steps-v/v-02e-validate-sidecar.md | 6 +- .../module/data/agent-architecture.md | 179 +++++++ .../module/data/agent-spec-template.md | 79 +++ .../module/data/module-installer-standards.md | 348 +++++++++++++ .../workflows/module/data/module-standards.md | 280 +++++++++++ .../module/data/module-yaml-conventions.md | 392 +++++++++++++++ .../module/steps-b/step-01-welcome.md | 147 ++++++ .../workflows/module/steps-b/step-02-spark.md | 140 ++++++ .../module/steps-b/step-03-module-type.md | 148 ++++++ .../module/steps-b/step-04-vision.md | 82 ++++ .../module/steps-b/step-05-identity.md | 96 ++++ .../workflows/module/steps-b/step-06-users.md | 85 ++++ .../workflows/module/steps-b/step-07-value.md | 75 +++ .../module/steps-b/step-08-agents.md | 96 ++++ .../module/steps-b/step-09-workflows.md | 82 ++++ .../workflows/module/steps-b/step-10-tools.md | 90 ++++ .../module/steps-b/step-11-scenarios.md | 83 ++++ .../module/steps-b/step-12-creative.md | 94 ++++ .../module/steps-b/step-13-review.md | 104 ++++ .../module/steps-b/step-14-finalize.md | 117 +++++ .../module/steps-c/step-01-load-brief.md | 178 +++++++ .../module/steps-c/step-01b-continue.md | 83 ++++ .../module/steps-c/step-02-structure.md | 109 ++++ .../module/steps-c/step-03-config.md | 118 +++++ .../module/steps-c/step-04-installer.md | 160 ++++++ .../module/steps-c/step-05-agents.md | 167 +++++++ .../module/steps-c/step-06-workflows.md | 183 +++++++ .../workflows/module/steps-c/step-07-docs.md | 402 +++++++++++++++ .../module/steps-c/step-08-complete.md | 123 +++++ .../module/steps-e/step-01-load-target.md | 81 +++ .../module/steps-e/step-02-select-edit.md | 77 +++ .../module/steps-e/step-03-apply-edit.md | 77 +++ .../module/steps-e/step-04-review.md | 80 +++ .../module/steps-e/step-05-confirm.md | 75 +++ .../module/steps-v/step-01-load-target.md | 96 ++++ .../module/steps-v/step-02-file-structure.md | 94 ++++ .../module/steps-v/step-03-module-yaml.md | 99 ++++ .../module/steps-v/step-04-agent-specs.md | 152 ++++++ .../module/steps-v/step-05-workflow-specs.md | 152 ++++++ .../module/steps-v/step-06-documentation.md | 143 ++++++ .../module/steps-v/step-07-installation.md | 113 +++++ .../module/steps-v/step-08-report.md | 197 ++++++++ .../module/templates/brief-template.md | 154 ++++++ .../templates/workflow-spec-template.md | 96 ++++ src/modules/bmb/workflows/module/workflow.md | 100 ++++ 84 files changed, 6121 insertions(+), 4054 deletions(-) delete mode 100644 src/modules/bmb/workflows-legacy/edit-module/README.md delete mode 100644 src/modules/bmb/workflows-legacy/edit-module/checklist.md delete mode 100644 src/modules/bmb/workflows-legacy/edit-module/instructions.md delete mode 100644 src/modules/bmb/workflows-legacy/edit-module/workflow.yaml delete mode 100644 src/modules/bmb/workflows-legacy/module-brief/README.md delete mode 100644 src/modules/bmb/workflows-legacy/module-brief/checklist.md delete mode 100644 src/modules/bmb/workflows-legacy/module-brief/instructions.md delete mode 100644 src/modules/bmb/workflows-legacy/module-brief/template.md delete mode 100644 src/modules/bmb/workflows-legacy/module-brief/workflow.yaml rename src/modules/bmb/workflows/agent/steps-c/{step-09-celebrate.md => step-08-celebrate.md} (89%) delete mode 100644 src/modules/bmb/workflows/agent/steps-c/step-08a-plan-traceability.md delete mode 100644 src/modules/bmb/workflows/agent/steps-c/step-08b-metadata-validation.md delete mode 100644 src/modules/bmb/workflows/agent/steps-c/step-08c-persona-validation.md delete mode 100644 src/modules/bmb/workflows/agent/steps-c/step-08d-menu-validation.md delete mode 100644 src/modules/bmb/workflows/agent/steps-c/step-08e-structure-validation.md delete mode 100644 src/modules/bmb/workflows/agent/steps-c/step-08f-sidecar-validation.md rename src/modules/bmb/workflows/agent/steps-e/{e-10-celebrate.md => e-09-celebrate.md} (81%) delete mode 100644 src/modules/bmb/workflows/agent/steps-e/e-09a-validate-metadata.md delete mode 100644 src/modules/bmb/workflows/agent/steps-e/e-09b-validate-persona.md delete mode 100644 src/modules/bmb/workflows/agent/steps-e/e-09c-validate-menu.md delete mode 100644 src/modules/bmb/workflows/agent/steps-e/e-09d-validate-structure.md delete mode 100644 src/modules/bmb/workflows/agent/steps-e/e-09e-validate-sidecar.md delete mode 100644 src/modules/bmb/workflows/agent/steps-e/e-09f-validation-summary.md create mode 100644 src/modules/bmb/workflows/module/data/agent-architecture.md create mode 100644 src/modules/bmb/workflows/module/data/agent-spec-template.md create mode 100644 src/modules/bmb/workflows/module/data/module-installer-standards.md create mode 100644 src/modules/bmb/workflows/module/data/module-standards.md create mode 100644 src/modules/bmb/workflows/module/data/module-yaml-conventions.md create mode 100644 src/modules/bmb/workflows/module/steps-b/step-01-welcome.md create mode 100644 src/modules/bmb/workflows/module/steps-b/step-02-spark.md create mode 100644 src/modules/bmb/workflows/module/steps-b/step-03-module-type.md create mode 100644 src/modules/bmb/workflows/module/steps-b/step-04-vision.md create mode 100644 src/modules/bmb/workflows/module/steps-b/step-05-identity.md create mode 100644 src/modules/bmb/workflows/module/steps-b/step-06-users.md create mode 100644 src/modules/bmb/workflows/module/steps-b/step-07-value.md create mode 100644 src/modules/bmb/workflows/module/steps-b/step-08-agents.md create mode 100644 src/modules/bmb/workflows/module/steps-b/step-09-workflows.md create mode 100644 src/modules/bmb/workflows/module/steps-b/step-10-tools.md create mode 100644 src/modules/bmb/workflows/module/steps-b/step-11-scenarios.md create mode 100644 src/modules/bmb/workflows/module/steps-b/step-12-creative.md create mode 100644 src/modules/bmb/workflows/module/steps-b/step-13-review.md create mode 100644 src/modules/bmb/workflows/module/steps-b/step-14-finalize.md create mode 100644 src/modules/bmb/workflows/module/steps-c/step-01-load-brief.md create mode 100644 src/modules/bmb/workflows/module/steps-c/step-01b-continue.md create mode 100644 src/modules/bmb/workflows/module/steps-c/step-02-structure.md create mode 100644 src/modules/bmb/workflows/module/steps-c/step-03-config.md create mode 100644 src/modules/bmb/workflows/module/steps-c/step-04-installer.md create mode 100644 src/modules/bmb/workflows/module/steps-c/step-05-agents.md create mode 100644 src/modules/bmb/workflows/module/steps-c/step-06-workflows.md create mode 100644 src/modules/bmb/workflows/module/steps-c/step-07-docs.md create mode 100644 src/modules/bmb/workflows/module/steps-c/step-08-complete.md create mode 100644 src/modules/bmb/workflows/module/steps-e/step-01-load-target.md create mode 100644 src/modules/bmb/workflows/module/steps-e/step-02-select-edit.md create mode 100644 src/modules/bmb/workflows/module/steps-e/step-03-apply-edit.md create mode 100644 src/modules/bmb/workflows/module/steps-e/step-04-review.md create mode 100644 src/modules/bmb/workflows/module/steps-e/step-05-confirm.md create mode 100644 src/modules/bmb/workflows/module/steps-v/step-01-load-target.md create mode 100644 src/modules/bmb/workflows/module/steps-v/step-02-file-structure.md create mode 100644 src/modules/bmb/workflows/module/steps-v/step-03-module-yaml.md create mode 100644 src/modules/bmb/workflows/module/steps-v/step-04-agent-specs.md create mode 100644 src/modules/bmb/workflows/module/steps-v/step-05-workflow-specs.md create mode 100644 src/modules/bmb/workflows/module/steps-v/step-06-documentation.md create mode 100644 src/modules/bmb/workflows/module/steps-v/step-07-installation.md create mode 100644 src/modules/bmb/workflows/module/steps-v/step-08-report.md create mode 100644 src/modules/bmb/workflows/module/templates/brief-template.md create mode 100644 src/modules/bmb/workflows/module/templates/workflow-spec-template.md create mode 100644 src/modules/bmb/workflows/module/workflow.md diff --git a/src/modules/bmb/agents/module-builder.agent.yaml b/src/modules/bmb/agents/module-builder.agent.yaml index 9ccad18f..5a6fc9b9 100644 --- a/src/modules/bmb/agents/module-builder.agent.yaml +++ b/src/modules/bmb/agents/module-builder.agent.yaml @@ -28,22 +28,18 @@ agent: - modules: "{project-root}/_bmad/bmb/docs/modules/kb.csv" menu: - - trigger: BM or fuzzy match on brainstorm-module - exec: "{project-root}/_bmad/bmb/workflows/brainstorm-module/workflow.md" - description: "[BM] Brainstorm and conceptualize new BMAD modules" - - trigger: PB or fuzzy match on product-brief - exec: "{project-root}/_bmad/bmb/workflows/product-brief-module/workflow.md" + exec: "{project-root}/_bmad/bmb/workflows/module/workflow.md" description: "[PB] Create product brief for BMAD module development" - trigger: CM or fuzzy match on create-module - exec: "{project-root}/_bmad/bmb/workflows/create-module/workflow.md" + exec: "{project-root}/_bmad/bmb/workflows/module/workflow.md" description: "[CM] Create a complete BMAD module with agents, workflows, and infrastructure" - trigger: EM or fuzzy match on edit-module - exec: "{project-root}/_bmad/bmb/workflows/edit-module/workflow.md" + exec: "{project-root}/_bmad/bmb/workflows/module/workflow.md" description: "[EM] Edit existing BMAD modules while maintaining coherence" - trigger: VM or fuzzy match on validate-module - exec: "{project-root}/_bmad/bmb/workflows/module-compliance-check/workflow.md" + exec: "{project-root}/_bmad/bmb/workflows/module/workflow.md" description: "[VM] Run compliance check on BMAD modules against best practices" diff --git a/src/modules/bmb/workflows-legacy/edit-module/README.md b/src/modules/bmb/workflows-legacy/edit-module/README.md deleted file mode 100644 index d14308cb..00000000 --- a/src/modules/bmb/workflows-legacy/edit-module/README.md +++ /dev/null @@ -1,171 +0,0 @@ -# Edit Module Workflow - -Interactive workflow for editing existing BMAD modules, including structure, agents, workflows, configuration, and documentation. - -## Purpose - -This workflow helps you improve and maintain BMAD modules by: - -- Analyzing module structure against best practices -- Managing agents and workflows within the module -- Updating configuration and documentation -- Ensuring cross-module integration works correctly -- Maintaining installer configuration (for source modules) - -## When to Use - -Use this workflow when you need to: - -- Add new agents or workflows to a module -- Update module configuration -- Improve module documentation -- Reorganize module structure -- Set up cross-module workflow sharing -- Fix issues in module organization -- Update installer configuration - -## What You'll Need - -- Path to the module directory you want to edit -- Understanding of what changes you want to make -- Access to module documentation (loaded automatically) - -## Workflow Steps - -1. **Load and analyze target module** - Provide path to module directory -2. **Analyze against best practices** - Automatic audit of module structure -3. **Select editing focus** - Choose what aspect to edit -4. **Load relevant documentation and tools** - Auto-loads guides and workflows -5. **Perform edits** - Review and approve changes iteratively -6. **Validate all changes** - Comprehensive validation checklist -7. **Generate change summary** - Summary of improvements made - -## Editing Options - -The workflow provides 12 focused editing options: - -1. **Fix critical issues** - Address missing files, broken references -2. **Update module config** - Edit config.yaml fields -3. **Manage agents** - Add, edit, or remove agents -4. **Manage workflows** - Add, edit, or remove workflows -5. **Update documentation** - Improve README files and guides -6. **Reorganize structure** - Fix directory organization -7. **Add new agent** - Create and integrate new agent -8. **Add new workflow** - Create and integrate new workflow -9. **Update installer** - Modify installer configuration (source only) -10. **Cross-module integration** - Set up workflow sharing with other modules -11. **Remove deprecated items** - Delete unused agents, workflows, or files -12. **Full module review** - Comprehensive analysis and improvements - -## Integration with Other Workflows - -This workflow integrates with: - -- **edit-agent** - For editing individual agents -- **edit-workflow** - For editing individual workflows -- **create-agent** - For adding new agents -- **create-workflow** - For adding new workflows - -When you select options to manage agents or workflows, the appropriate specialized workflow is invoked automatically. - -## Module Structure - -A proper BMAD module has: - -``` -module-code/ -├── agents/ # Agent definitions -│ └── *.agent.yaml -├── workflows/ # Workflow definitions -│ └── workflow-name/ -│ ├── workflow.yaml -│ ├── instructions.md -│ ├── checklist.md -│ └── README.md -├── config.yaml # Module configuration -└── README.md # Module documentation -``` - -## Standard Module Config - -Every module config.yaml should have: - -```yaml -module_name: 'Full Module Name' -module_code: 'xyz' -user_name: 'User Name' -communication_language: 'english' -output_folder: 'path/to/output' -``` - -Optional fields may be added for module-specific needs. - -## Cross-Module Integration - -Modules can share workflows: - -```yaml -# In agent menu item: -workflow: '{project-root}/_bmad/other-module/workflows/shared-workflow/workflow.yaml' -``` - -Common patterns: - -- BMM uses CIS brainstorming workflows -- All modules can use core workflows -- Modules can invoke each other's workflows - -## Output - -The workflow modifies module files in place, including: - -- config.yaml -- Agent files -- Workflow files -- README and documentation files -- Directory structure (if reorganizing) - -Changes are reviewed and approved by you before being applied. - -## Best Practices - -- **Start with analysis** - Let the workflow audit your module first -- **Use specialized workflows** - Let edit-agent and edit-workflow handle detailed edits -- **Update documentation** - Keep README files current with changes -- **Validate thoroughly** - Use the validation step to catch structural issues -- **Test after editing** - Invoke agents and workflows to verify they work - -## Tips - -- For adding agents/workflows, use options 7-8 to create and integrate in one step -- For quick config changes, use option 2 (update module config) -- Cross-module integration (option 10) helps set up workflow sharing -- Full module review (option 12) is great for inherited or legacy modules -- The workflow handles path updates when you reorganize structure - -## Example Usage - -``` -User: I want to add a new workflow to BMM for API design -Workflow: Analyzes BMM → You choose option 8 (add new workflow) - → Invokes create-workflow → Creates workflow - → Integrates it into module → Updates README → Done -``` - -## Activation - -Invoke via BMad Builder agent: - -``` -/bmad:bmb:agents:bmad-builder -Then select: *edit-module -``` - -Or directly via workflow.xml with this workflow config. - -## Related Resources - -- **Module Structure Guide** - Comprehensive module architecture documentation -- **BMM Module** - Example of full-featured module -- **BMB Module** - Example of builder/tooling module -- **CIS Module** - Example of workflow library module diff --git a/src/modules/bmb/workflows-legacy/edit-module/checklist.md b/src/modules/bmb/workflows-legacy/edit-module/checklist.md deleted file mode 100644 index 779ec5c4..00000000 --- a/src/modules/bmb/workflows-legacy/edit-module/checklist.md +++ /dev/null @@ -1,163 +0,0 @@ -# Edit Module - Validation Checklist - -Use this checklist to validate module edits meet BMAD Core standards. - -## Module Structure Validation - -- [ ] Module has clear abbreviation code (bmm, bmb, cis, etc.) -- [ ] agents/ directory exists -- [ ] workflows/ directory exists -- [ ] config.yaml exists in module root -- [ ] README.md exists in module root -- [ ] Directory structure follows BMAD conventions - -## Configuration Validation - -### Required Fields - -- [ ] module_name is descriptive and clear -- [ ] module_code is 3-letter code matching directory name -- [ ] user_name field present -- [ ] communication_language field present -- [ ] output_folder field present - -### Optional Fields (if used) - -- [ ] bmb_creations_output_folder documented -- [ ] Module-specific fields documented in README - -### File Quality - -- [ ] config.yaml is valid YAML syntax -- [ ] No duplicate keys -- [ ] Values are appropriate types (strings, paths, etc.) -- [ ] Comments explain non-obvious fields - -## Agent Validation - -### Agent Files - -- [ ] All agents in agents/ directory -- [ ] Agent files follow naming: {agent-name}.agent.yaml or .md -- [ ] Agent filenames use kebab-case -- [ ] No orphaned or temporary agent files - -### Agent Content - -- [ ] Each agent has clear role and purpose -- [ ] Agents reference workflows correctly -- [ ] Agent workflow paths are valid -- [ ] Agents load module config correctly (if needed) -- [ ] Agent menu items reference existing workflows - -### Agent Integration - -- [ ] All agents listed in module README -- [ ] Agent relationships documented (if applicable) -- [ ] Cross-agent workflows properly linked - -## Workflow Validation - -### Workflow Structure - -- [ ] All workflows in workflows/ directory -- [ ] Each workflow directory has workflow.yaml -- [ ] Each workflow directory has instructions.md -- [ ] Workflow directories use kebab-case naming -- [ ] No orphaned or incomplete workflow directories - -### Workflow Content - -- [ ] workflow.yaml is valid YAML -- [ ] workflow.yaml has name field -- [ ] workflow.yaml has description field -- [ ] workflow.yaml has author field -- [ ] instructions.md has proper structure -- [ ] Workflow steps are numbered and logical - -### Workflow Integration - -- [ ] All workflows listed in module README -- [ ] Workflow paths in agents are correct -- [ ] Cross-module workflow references are valid -- [ ] Sub-workflow references exist - -## Documentation Validation - -### Module README - -- [ ] Module README describes purpose clearly -- [ ] README lists all agents with descriptions -- [ ] README lists all workflows with descriptions -- [ ] README includes installation instructions (if applicable) -- [ ] README explains module's role in BMAD ecosystem - -### Workflow READMEs - -- [ ] Each workflow has its own README.md -- [ ] Workflow READMEs explain purpose -- [ ] Workflow READMEs list inputs/outputs -- [ ] Workflow READMEs include usage examples - -### Other Documentation - -- [ ] Usage guides present (if needed) -- [ ] Architecture docs present (if complex module) -- [ ] Examples provided (if applicable) - -## Cross-References Validation - -- [ ] Agent workflow references point to existing workflows -- [ ] Workflow sub-workflow references are valid -- [ ] Cross-module references use correct paths -- [ ] Config file paths use {project-root} correctly -- [ ] No hardcoded absolute paths - -## Installer Validation (Source Modules Only) - -- [ ] Installer script exists in tools/cli/installers/ -- [ ] Installer script name: install-{module-code}.js -- [ ] Module metadata in installer is correct -- [ ] Web bundle configuration valid (if applicable) -- [ ] Installation paths are correct -- [ ] Dependencies documented in installer - -## Web Bundle Validation (If Applicable) - -- [ ] Web bundles configured in workflow.yaml files -- [ ] All referenced files included in web_bundle_files -- [ ] Paths are _bmad/-relative (not project-root) -- [ ] No config_source references in web bundles -- [ ] Invoked workflows included in dependencies - -## Quality Checks - -- [ ] No placeholder text remains ({MODULE_NAME}, {CODE}, etc.) -- [ ] No broken file references -- [ ] No duplicate content across files -- [ ] Consistent naming conventions throughout -- [ ] Module purpose is clear from README alone - -## Integration Checks - -- [ ] Module doesn't conflict with other modules -- [ ] Shared resources properly documented -- [ ] Dependencies on other modules explicit -- [ ] Module can be installed independently (if designed that way) - -## User Experience - -- [ ] Module purpose is immediately clear -- [ ] Agents have intuitive names -- [ ] Workflows have descriptive names -- [ ] Menu items are logically organized -- [ ] Error messages are helpful -- [ ] Success messages confirm actions - -## Final Checks - -- [ ] All files have been saved -- [ ] File permissions are correct -- [ ] Git status shows expected changes -- [ ] Module is ready for testing -- [ ] Documentation accurately reflects changes diff --git a/src/modules/bmb/workflows-legacy/edit-module/instructions.md b/src/modules/bmb/workflows-legacy/edit-module/instructions.md deleted file mode 100644 index 6f3e2b8b..00000000 --- a/src/modules/bmb/workflows-legacy/edit-module/instructions.md +++ /dev/null @@ -1,340 +0,0 @@ -# Edit Module - Module Editor Instructions - -The workflow execution engine is governed by: {project-root}/_bmad/core/tasks/workflow.xml -You MUST have already loaded and processed: {project-root}/_bmad/bmb/workflows/edit-module/workflow.yaml -This workflow uses ADAPTIVE FACILITATION - adjust your communication based on context and user needs -The goal is COLLABORATIVE IMPROVEMENT - work WITH the user, not FOR them -Communicate all responses in {communication_language} - - - - -What is the path to the module source you want to edit? - -Load the module directory structure completely: - -- Scan all directories and files -- Load config.yaml -- Load README.md -- List all agents in agents/ directory -- List all workflows in workflows/ directory -- Identify any custom structure or patterns - - -Load ALL module documentation to inform understanding: - -- Module structure guide: {module_structure_guide} -- Study reference modules: BMM, BMB, CIS -- Understand BMAD module patterns and conventions - - -Analyze the module deeply: - -- Identify module purpose and role in BMAD ecosystem -- Understand agent organization and relationships -- Map workflow organization and dependencies -- Evaluate config structure and completeness -- Check documentation quality and currency -- Assess installer configuration (if source module) -- Identify cross-module integrations -- Evaluate against best practices from loaded guides - - -Reflect understanding back to {user_name}: - -Present a warm, conversational summary adapted to the module's complexity: - -- What this module provides (its purpose and value in BMAD) -- How it's organized (agents, workflows, structure) -- What you notice (strengths, potential improvements, issues) -- How it fits in the larger BMAD ecosystem -- Your initial assessment based on best practices - -Be conversational and insightful. Help {user_name} see their module through your eyes. - - -Does this match your understanding of what this module should provide? -module_understanding - - - -Understand WHAT the user wants to improve and WHY before diving into edits - -Engage in collaborative discovery: - -Ask open-ended questions to understand their goals: - -- What prompted you to want to edit this module? -- What feedback have you gotten from users of this module? -- Are there specific agents or workflows that need attention? -- Is the module fulfilling its intended purpose? -- Are there new capabilities you want to add? -- How well does it integrate with other modules? -- Is the documentation helping users understand and use the module? - -Listen for clues about: - -- Structural issues (poor organization, hard to navigate) -- Agent/workflow issues (outdated, broken, missing functionality) -- Configuration issues (missing fields, incorrect setup) -- Documentation issues (outdated, incomplete, unclear) -- Integration issues (doesn't work well with other modules) -- Installer issues (installation problems, missing files) -- User experience issues (confusing, hard to use) - - -Based on their responses and your analysis from step 1, identify improvement opportunities: - -Organize by priority and user goals: - -- CRITICAL issues blocking module functionality -- IMPORTANT improvements enhancing user experience -- NICE-TO-HAVE enhancements for polish - -Present these conversationally, explaining WHY each matters and HOW it would help. - - -Collaborate on priorities: - -Don't just list options - discuss them: - -- "I noticed {{issue}} - this could make it hard for users to {{problem}}. Want to address this?" -- "The module could be more {{improvement}} which would help when {{use_case}}. Worth exploring?" -- "Based on what you said about {{user_goal}}, we might want to {{suggestion}}. Thoughts?" - -Let the conversation flow naturally. Build a shared vision of what "better" looks like. - - -improvement_goals - - - -Work iteratively - improve, review, refine. Never dump all changes at once. -For agent and workflow edits, invoke specialized workflows rather than doing inline - -For each improvement area, facilitate collaboratively: - -1. **Explain the current state and why it matters** - - Show relevant sections of the module - - Explain how it works now and implications - - Connect to user's goals from step 2 - -2. **Propose improvements with rationale** - - Suggest specific changes that align with best practices - - Explain WHY each change helps - - Provide examples from reference modules: {bmm_module_dir}, {bmb_module_dir}, {cis_module_dir} - - Reference agents from: {existing_agents_dir} - - Reference workflows from: {existing_workflows_dir} - - Reference the structure guide's patterns naturally - -3. **Collaborate on the approach** - - Ask if the proposed change addresses their need - - Invite modifications or alternative approaches - - Explain tradeoffs when relevant - - Adapt based on their feedback - -4. **Apply changes appropriately** - - For agent edits: Invoke edit-agent workflow - - For workflow edits: Invoke edit-workflow workflow - - For module-level changes: Make directly and iteratively - - Show updates and confirm satisfaction - - -Common improvement patterns to facilitate: - -**If improving module organization:** - -- Discuss how the current structure serves (or doesn't serve) users -- Propose reorganization that aligns with mental models -- Consider feature-based vs type-based organization -- Plan the reorganization steps -- Update all references after moving files - -**If updating module configuration:** - -- Review current config.yaml fields -- Check for missing standard fields (user_name, communication_language, output_folder) -- Add module-specific fields as needed -- Remove unused or outdated fields -- Ensure config is properly documented - -**If managing agents:** - -- Ask which agent needs attention and why -- For editing existing agent: -- For adding new agent: Guide creation and integration -- For removing agent: Confirm, remove, update references -- Ensure all agent references in workflows remain valid - -**If managing workflows:** - -- Ask which workflow needs attention and why -- For editing existing workflow: -- For adding new workflow: Guide creation and integration -- For removing workflow: Confirm, remove, update agent references -- Ensure all workflow files are properly organized - -**If improving documentation:** - -- Review current README and identify gaps -- Discuss what users need to know -- Update module overview and purpose -- List agents and workflows with clear descriptions -- Add usage examples if helpful -- Ensure installation/setup instructions are clear - -**If setting up cross-module integration:** - -- Identify which workflows from other modules are needed -- Show how to reference workflows properly: {project-root}/_bmad/{{module}}/workflows/{{workflow}}/workflow.yaml -- Document the integration in README -- Ensure dependencies are clear -- Consider adding example usage - -**If updating installer (source modules only):** - -- Review installer script for correctness -- Check web bundle configurations -- Verify all files are included -- Test installation paths -- Update module metadata - - -When invoking specialized workflows: - -Explain why you're handing off: - -- "This agent needs detailed attention. Let me invoke the edit-agent workflow to give it proper focus." -- "The workflow editor can handle this more thoroughly. I'll pass control there." - -After the specialized workflow completes, return and continue: - -- "Great! That agent/workflow is updated. Want to work on anything else in the module?" - - -Throughout improvements, educate when helpful: - -Share insights from the guides naturally: - -- "The module structure guide recommends {{pattern}} for this scenario" -- "Looking at how BMM organized this, we could use {{approach}}" -- "The BMAD convention is to {{pattern}} which helps with {{benefit}}" - -Connect improvements to broader BMAD principles without being preachy. - - -After each significant change: - -- "Does this organization feel more intuitive?" -- "Want to refine this further, or move to the next improvement?" -- "How does this change affect users of the module?" - - -improvement_implementation - - - -Run comprehensive validation conversationally: - -Don't just check boxes - explain what you're validating and why it matters: - -- "Let me verify the module structure is solid..." -- "Checking that all agent workflow references are valid..." -- "Making sure config.yaml has all necessary fields..." -- "Validating documentation is complete and accurate..." -- "Ensuring cross-module references work correctly..." - - -Load validation checklist: {installed_path}/checklist.md -Check all items from checklist systematically - - - Present issues conversationally: - -Explain what's wrong and implications: - -- "I found {{issue}} which could cause {{problem}} for users" -- "The {{component}} needs {{fix}} because {{reason}}" - -Propose fixes immediately: - -- "I can fix this by {{solution}}. Should I?" -- "We have a couple options here: {{option1}} or {{option2}}. Thoughts?" - - -Fix approved issues and re-validate - - - - Confirm success warmly: - -"Excellent! Everything validates cleanly: - -- Module structure is well-organized -- All agent and workflow references are valid -- Configuration is complete -- Documentation is thorough and current -- Cross-module integrations work properly -- Installer is correct (if applicable) - -Your module is in great shape." - - - -validation_results - - - -Create a conversational summary of what improved: - -Tell the story of the transformation: - -- "We started with {{initial_state}}" -- "You wanted to {{user_goals}}" -- "We made these key improvements: {{changes_list}}" -- "Now your module {{improved_capabilities}}" - -Highlight the impact: - -- "This means users will experience {{benefit}}" -- "The module is now more {{quality}}" -- "It follows best practices for {{patterns}}" - - -Guide next steps based on changes made: - -If structure changed significantly: - -- "Since we reorganized the structure, you should update any external references to this module" - -If agents or workflows were updated: - -- "The updated agents/workflows should be tested with real user interactions" - -If cross-module integration was added: - -- "Test the integration with {{other_module}} to ensure it works smoothly" - -If installer was updated: - -- "Test the installation process to verify all files are included correctly" - -If this is part of larger BMAD work: - -- "Consider if patterns from this module could benefit other modules" - -Be a helpful guide to what comes next, not just a task completer. - - -Would you like to: - -- Test the edited module by invoking one of its agents -- Edit a specific agent or workflow in more detail -- Make additional refinements to the module -- Work on a different module - - -completion_summary - - - diff --git a/src/modules/bmb/workflows-legacy/edit-module/workflow.yaml b/src/modules/bmb/workflows-legacy/edit-module/workflow.yaml deleted file mode 100644 index d66ef667..00000000 --- a/src/modules/bmb/workflows-legacy/edit-module/workflow.yaml +++ /dev/null @@ -1,34 +0,0 @@ -# Edit Module - Module Editor Configuration -name: "edit-module" -description: "Edit existing BMAD modules (structure, agents, workflows, documentation) while following all best practices" -author: "BMad" - -# Critical variables load from config_source -config_source: "{project-root}/_bmad/bmb/config.yaml" -communication_language: "{config_source}:communication_language" -user_name: "{config_source}:user_name" - -# Required Data Files - Critical for understanding module conventions -module_structure_guide: "{project-root}/_bmad/bmb/workflows/create-module/module-structure.md" - -# Related workflow editors -agent_editor: "{project-root}/_bmad/bmb/workflows/edit-agent/workflow.yaml" -workflow_editor: "{project-root}/_bmad/bmb/workflows/edit-workflow/workflow.yaml" - -# Reference examples - for learning patterns -bmm_module_dir: "{project-root}/_bmad/bmm/" -bmb_module_dir: "{project-root}/_bmad/bmb/" -cis_module_dir: "{project-root}/_bmad/cis/" -existing_agents_dir: "{project-root}/_bmad/*/agents/" -existing_workflows_dir: "{project-root}/_bmad/*/workflows/" - -# Module path and component files -installed_path: "{project-root}/_bmad/bmb/workflows/edit-module" -template: false # This is an action workflow - no template needed -instructions: "{installed_path}/instructions.md" -validation: "{installed_path}/checklist.md" - -standalone: true - -# Web bundle configuration -web_bundle: false # BMB workflows run locally in BMAD-METHOD project diff --git a/src/modules/bmb/workflows-legacy/module-brief/README.md b/src/modules/bmb/workflows-legacy/module-brief/README.md deleted file mode 100644 index ccf6173c..00000000 --- a/src/modules/bmb/workflows-legacy/module-brief/README.md +++ /dev/null @@ -1,264 +0,0 @@ -# Module Brief Workflow - -## Overview - -The Module Brief workflow creates comprehensive blueprints for building new BMAD modules using strategic analysis and creative vision. It serves as the essential planning phase that transforms initial ideas into detailed, actionable specifications ready for implementation with the create-module workflow. - -## Key Features - -- **Strategic Module Planning** - Comprehensive analysis from concept to implementation roadmap -- **Multi-Mode Operation** - Interactive, Express, and YOLO modes for different planning needs -- **Creative Vision Development** - Guided process for innovative module concepts and unique value propositions -- **Architecture Design** - Detailed agent and workflow ecosystem planning with interaction models -- **User Journey Mapping** - Scenario-based validation ensuring practical usability -- **Technical Planning** - Infrastructure requirements, dependencies, and complexity assessment -- **Risk Assessment** - Proactive identification of challenges with mitigation strategies -- **Implementation Roadmap** - Phased development plan with clear deliverables and timelines - -## Usage - -### Basic Invocation - -```bash -workflow module-brief -``` - -### With Brainstorming Input - -```bash -# If you have brainstorming results from previous sessions -workflow module-brief --input brainstorming-session-2024-09-26.md -``` - -### Express Mode - -```bash -# For quick essential planning only -workflow module-brief --mode express -``` - -### Configuration - -The workflow uses standard BMB configuration: - -- **output_folder**: Where the module brief will be saved -- **user_name**: Brief author information -- **communication_language**: Language for brief generation -- **date**: Automatic timestamp for versioning - -## Workflow Structure - -### Files Included - -``` -module-brief/ -├── workflow.yaml # Configuration and metadata -├── instructions.md # Step-by-step execution guide -├── template.md # Module brief document structure -├── checklist.md # Validation criteria -└── README.md # This file -``` - -## Workflow Process - -### Phase 1: Foundation and Context (Steps 1-3) - -**Mode Selection and Input Gathering** - -- Choose operational mode (Interactive, Express, YOLO) -- Check for and optionally load existing brainstorming results -- Gather background context and inspiration sources - -**Module Vision Development** - -- Define core problem the module solves -- Identify target user audience and use cases -- Establish unique value proposition and differentiators -- Explore creative themes and personality concepts - -**Module Identity Establishment** - -- Generate module code (kebab-case) with multiple options -- Create compelling, memorable module name -- Select appropriate category (Domain-Specific, Creative, Technical, Business, Personal) -- Define optional personality theme for consistent agent character - -### Phase 2: Architecture Planning (Steps 4-5) - -**Agent Architecture Design** - -- Plan agent team composition and roles -- Define agent archetypes (Orchestrator, Specialist, Helper, Creator, Analyzer) -- Specify personality traits and communication styles -- Map key capabilities and signature commands - -**Workflow Ecosystem Design** - -- Categorize workflows by purpose and complexity: - - **Core Workflows**: Essential value-delivery functions (2-3) - - **Feature Workflows**: Specialized capabilities (3-5) - - **Utility Workflows**: Supporting operations (1-3) -- Define input-process-output flows for each workflow -- Assess complexity levels and implementation priorities - -### Phase 3: Validation and User Experience (Steps 6-7) - -**User Journey Mapping** - -- Create detailed user scenarios and stories -- Map step-by-step usage flows through the module -- Validate end-to-end functionality and value delivery -- Identify potential friction points and optimization opportunities - -**Technical Planning and Requirements** - -- Assess data requirements and storage needs -- Map integration points with other modules and external systems -- Evaluate technical complexity and resource requirements -- Document dependencies and infrastructure needs - -### Phase 4: Success Planning (Steps 8-9) - -**Success Metrics Definition** - -- Establish module success criteria and performance indicators -- Define quality standards and reliability requirements -- Create user experience goals and feedback mechanisms -- Set measurable outcomes for module effectiveness - -**Development Roadmap Creation** - -- Design phased approach with MVP, Enhancement, and Polish phases -- Define deliverables and timelines for each phase -- Prioritize features and capabilities by value and complexity -- Create clear milestones and success checkpoints - -### Phase 5: Enhancement and Risk Management (Steps 10-12) - -**Creative Features and Special Touches** (Optional) - -- Design easter eggs and delightful user interactions -- Plan module lore and thematic consistency -- Add personality quirks and creative responses -- Develop backstories and universe building - -**Risk Assessment and Mitigation** - -- Identify technical, usability, and scope risks -- Develop mitigation strategies for each risk category -- Plan contingency approaches for potential challenges -- Document decision points and alternative paths - -**Final Review and Export Preparation** - -- Comprehensive review of all brief sections -- Validation against quality and completeness criteria -- Preparation for seamless handoff to create-module workflow -- Export readiness confirmation with actionable specifications - -## Output - -### Generated Files - -- **Module Brief Document**: Comprehensive planning document at `{output_folder}/module-brief-{module_code}-{date}.md` -- **Strategic Specifications**: Ready-to-implement blueprint for create-module workflow - -### Output Structure - -The module brief contains detailed specifications across multiple sections: - -1. **Executive Summary** - Vision, category, complexity, target users -2. **Module Identity** - Core concept, value proposition, personality theme -3. **Agent Architecture** - Agent roster, roles, interaction models -4. **Workflow Ecosystem** - Core, feature, and utility workflow specifications -5. **User Scenarios** - Primary use cases, secondary scenarios, user journey -6. **Technical Planning** - Data requirements, integrations, dependencies -7. **Success Metrics** - Success criteria, quality standards, performance targets -8. **Development Roadmap** - Phased implementation plan with deliverables -9. **Creative Features** - Special touches, easter eggs, module lore -10. **Risk Assessment** - Technical, usability, scope risks with mitigation -11. **Implementation Notes** - Priority order, design decisions, open questions -12. **Resources and References** - Inspiration sources, similar modules, technical references - -## Requirements - -- **Creative Vision** - Initial module concept or problem domain -- **Strategic Thinking** - Ability to plan architecture and user experience -- **Brainstorming Results** (optional) - Previous ideation sessions enhance planning quality - -## Best Practices - -### Before Starting - -1. **Gather Inspiration** - Research similar tools, modules, and solutions in your domain -2. **Run Brainstorming Session** - Use ideation techniques to generate initial concepts -3. **Define Success Criteria** - Know what "successful module" means for your context - -### During Execution - -1. **Think User-First** - Always consider the end user experience and value delivery -2. **Be Specific** - Provide concrete examples and detailed specifications rather than abstractions -3. **Validate Early** - Use user scenarios to test if the module concept actually works -4. **Plan Iteratively** - Start with MVP and build complexity through phases - -### After Completion - -1. **Use as Blueprint** - Feed the brief directly into create-module workflow for implementation -2. **Review with Stakeholders** - Validate assumptions and gather feedback before building -3. **Update as Needed** - Treat as living document that evolves with implementation learnings -4. **Reference During Development** - Use as north star for design decisions and scope management - -## Troubleshooting - -### Common Issues - -**Issue**: Stuck on module concept or vision - -- **Solution**: Use creative prompts provided in the workflow -- **Check**: Review existing modules for inspiration and patterns - -**Issue**: Agent or workflow architecture too complex - -- **Solution**: Focus on MVP first, plan enhancement phases for additional complexity -- **Check**: Validate each component against user scenarios - -**Issue**: Technical requirements unclear - -- **Solution**: Research similar modules and their implementation approaches -- **Check**: Consult with technical stakeholders early in planning - -**Issue**: Scope creep during planning - -- **Solution**: Use phased roadmap to defer non-essential features -- **Check**: Regularly validate against core user scenarios and success criteria - -## Customization - -To customize this workflow: - -1. **Modify Template Structure** - Update template.md to add new sections or reorganize content -2. **Extend Creative Prompts** - Add domain-specific ideation techniques in instructions.md -3. **Add Planning Tools** - Integrate additional analysis frameworks or planning methodologies -4. **Customize Validation** - Enhance checklist.md with specific quality criteria for your context - -## Version History - -- **v1.0.0** - Initial release - - Comprehensive strategic module planning - - Multi-mode operation (Interactive, Express, YOLO) - - Creative vision and architecture design tools - - User journey mapping and validation - - Risk assessment and mitigation planning - -## Support - -For issues or questions: - -- Review the workflow creation guide at `/_bmad/bmb/workflows/create-workflow/workflow-creation-guide.md` -- Study existing module examples in `/_bmad/` for patterns and inspiration -- Validate output using `checklist.md` -- Consult module structure guide at `create-module/module-structure.md` - ---- - -_Part of the BMad Method v6 - BMB (Builder) Module_ diff --git a/src/modules/bmb/workflows-legacy/module-brief/checklist.md b/src/modules/bmb/workflows-legacy/module-brief/checklist.md deleted file mode 100644 index 80c23962..00000000 --- a/src/modules/bmb/workflows-legacy/module-brief/checklist.md +++ /dev/null @@ -1,116 +0,0 @@ -# Module Brief Validation Checklist - -## Core Identity - -- [ ] Module code follows kebab-case convention -- [ ] Module name is clear and memorable -- [ ] Module category is identified -- [ ] Target users are clearly defined -- [ ] Unique value proposition is articulated - -## Vision and Concept - -- [ ] Problem being solved is clearly stated -- [ ] Solution approach is explained -- [ ] Module scope is well-defined -- [ ] Success criteria are measurable - -## Agent Architecture - -- [ ] At least one agent is defined -- [ ] Each agent has a clear role and purpose -- [ ] Agent personalities are defined (if using personality themes) -- [ ] Agent interactions are mapped (for multi-agent modules) -- [ ] Key commands for each agent are listed - -## Workflow Ecosystem - -- [ ] Core workflows (2-3) are identified -- [ ] Each workflow has clear purpose -- [ ] Workflow complexity is assessed -- [ ] Input/output for workflows is defined -- [ ] Workflow categories are logical - -## User Experience - -- [ ] Primary use case is documented -- [ ] User scenarios demonstrate value -- [ ] User journey is realistic -- [ ] Learning curve is considered -- [ ] User feedback mechanism planned - -## Technical Planning - -- [ ] Data requirements are identified -- [ ] Integration points are mapped -- [ ] Dependencies are listed -- [ ] Technical complexity is assessed -- [ ] Performance requirements stated - -## Development Roadmap - -- [ ] Phase 1 MVP is clearly scoped -- [ ] Phase 2 enhancements are outlined -- [ ] Phase 3 polish items listed -- [ ] Timeline estimates provided -- [ ] Deliverables are specific - -## Risk Management - -- [ ] Technical risks identified -- [ ] Usability risks considered -- [ ] Scope risks acknowledged -- [ ] Mitigation strategies provided -- [ ] Open questions documented - -## Creative Elements (Optional) - -- [ ] Personality theme is consistent (if used) -- [ ] Special features add value -- [ ] Module feels cohesive -- [ ] Fun elements don't compromise functionality - -## Documentation Quality - -- [ ] All sections have content (no empty placeholders) -- [ ] Writing is clear and concise -- [ ] Technical terms are explained -- [ ] Examples are provided where helpful -- [ ] Next steps are actionable - -## Implementation Readiness - -- [ ] Brief provides enough detail for create-module workflow -- [ ] Agent specifications sufficient for create-agent workflow -- [ ] Workflow descriptions ready for create-workflow -- [ ] Resource requirements are clear -- [ ] Success metrics are measurable - -## Final Validation - -- [ ] Module concept is viable -- [ ] Scope is achievable -- [ ] Value is clear -- [ ] Brief is complete -- [ ] Ready for development - -## Issues Found - -### Critical Issues - - - -### Recommendations - - - -### Nice-to-Haves - - - ---- - -**Validation Complete:** ⬜ Yes / ⬜ With Issues / ⬜ Needs Revision - -**Validated By:** {name} -**Date:** {date} diff --git a/src/modules/bmb/workflows-legacy/module-brief/instructions.md b/src/modules/bmb/workflows-legacy/module-brief/instructions.md deleted file mode 100644 index 1693c3c5..00000000 --- a/src/modules/bmb/workflows-legacy/module-brief/instructions.md +++ /dev/null @@ -1,268 +0,0 @@ -# Module Brief Instructions - -The workflow execution engine is governed by: {project-root}/_bmad/core/tasks/workflow.xml -You MUST have already loaded and processed: {project-root}/_bmad/bmb/workflows/module-brief/workflow.yaml -Communicate in {communication_language} throughout the module brief creation process -⚠️ ABSOLUTELY NO TIME ESTIMATES - NEVER mention hours, days, weeks, months, or ANY time-based predictions. AI has fundamentally changed development speed - what once took teams weeks/months can now be done by one person in hours. DO NOT give ANY time estimates whatsoever. - - - - -Ask the user which mode they prefer: -1. **Interactive Mode** - Work through each section collaboratively with detailed questions -2. **Express Mode** - Quick essential questions only -3. **YOLO Mode** (#yolo) - Generate complete draft based on minimal input - -Check for available inputs: - -- Brainstorming results from previous sessions -- Existing module ideas or notes -- Similar modules for inspiration - -If brainstorming results exist, offer to load and incorporate them - - - -Ask the user to describe their module idea. Probe for: -- What problem does this module solve? -- Who would use this module? -- What makes this module exciting or unique? -- Any inspiring examples or similar tools? - -If they're stuck, offer creative prompts: - -- "Imagine you're a [role], what tools would make your life easier?" -- "What repetitive tasks could be automated with agents?" -- "What domain expertise could be captured in workflows?" - -module_vision - - - -Based on the vision, work with user to define: - -**Module Code** (kebab-case): - -- Suggest 2-3 options based on their description -- Ensure it's memorable and descriptive - -**Module Name** (friendly): - -- Creative, engaging name that captures the essence - -**Module Category:** - -- Domain-Specific (legal, medical, finance) -- Creative (writing, gaming, music) -- Technical (devops, testing, architecture) -- Business (project management, marketing) -- Personal (productivity, learning) - -**Personality Theme** (optional but fun!): - -- Should the module have a consistent personality across agents? -- Star Trek crew? Fantasy party? Corporate team? Reality show cast? - -module_identity - - - -Help user envision their agent team - -For each agent, capture: - -- **Role**: What's their specialty? -- **Personality**: How do they communicate? (reference communication styles) -- **Key Capabilities**: What can they do? -- **Signature Commands**: 2-3 main commands - -Suggest agent archetypes based on module type: - -- The Orchestrator (manages other agents) -- The Specialist (deep expertise) -- The Helper (utility functions) -- The Creator (generates content) -- The Analyzer (processes and evaluates) - -agent_architecture - - - -Map out the workflow landscape - -Categorize workflows: - -**Core Workflows** (2-3 essential ones): - -- The primary value-delivery workflows -- What users will use most often - -**Feature Workflows** (3-5 specialized): - -- Specific capabilities -- Advanced features - -**Utility Workflows** (1-3 supporting): - -- Setup, configuration -- Maintenance, cleanup - -For each workflow, define: - -- Purpose (one sentence) -- Input → Process → Output -- Complexity (simple/standard/complex) - -workflow_ecosystem - - - -Create usage scenarios to validate the design - -Write 2-3 user stories: -"As a [user type], I want to [goal], so that [outcome]" - -Then walk through how they'd use the module: - -1. They load [agent] -2. They run [command/workflow] -3. They get [result] -4. This helps them [achievement] - -This validates the module makes sense end-to-end. - -user_scenarios - - - -Assess technical requirements: - -**Data Requirements:** - -- What data/files does the module need? -- Any external APIs or services? -- Storage or state management needs? - -**Integration Points:** - -- Other BMAD modules it might use -- External tools or platforms -- Import/export formats - -**Complexity Assessment:** - -- Simple (standalone, no dependencies) -- Standard (some integrations, moderate complexity) -- Complex (multiple systems, advanced features) - -technical_planning - - - -Define what success looks like: - -**Module Success Criteria:** - -- What indicates the module is working well? -- How will users measure value? -- What feedback mechanisms? - -**Quality Standards:** - -- Performance expectations -- Reliability requirements -- User experience goals - -success_metrics - - - -Create a phased approach: - -**Phase 1 - MVP (Minimum Viable Module):** - -- 1 primary agent -- 2-3 core workflows -- Basic functionality - -**Phase 2 - Enhancement:** - -- Additional agents -- More workflows -- Refined features - -**Phase 3 - Polish:** - -- Advanced features -- Optimizations -- Nice-to-haves - -development_roadmap - - - -If user wants to add special touches: - -**Easter Eggs:** - -- Hidden commands or responses -- Fun interactions between agents - -**Delighters:** - -- Unexpected helpful features -- Personality quirks -- Creative responses - -**Module Lore:** - -- Backstory for agents -- Thematic elements -- Consistent universe - -creative_features - - - -Identify potential challenges: - -**Technical Risks:** - -- Complex integrations -- Performance concerns -- Dependency issues - -**Usability Risks:** - -- Learning curve -- Complexity creep -- User confusion - -**Scope Risks:** - -- Feature bloat -- Timeline expansion -- Resource constraints - -For each risk, note mitigation strategy. - -risk_assessment - - - -Review all sections with {user_name} -Ensure module brief is ready for create-module workflow - -Would {user_name} like to: - -1. Proceed directly to create-module workflow -2. Save and refine later -3. Generate additional planning documents - - -Inform {user_name} in {communication_language} that this brief can be fed directly into create-module workflow - -final_brief - - - diff --git a/src/modules/bmb/workflows-legacy/module-brief/template.md b/src/modules/bmb/workflows-legacy/module-brief/template.md deleted file mode 100644 index 0738fe02..00000000 --- a/src/modules/bmb/workflows-legacy/module-brief/template.md +++ /dev/null @@ -1,275 +0,0 @@ -# Module Brief: {{module_name}} - -**Date:** {{date}} -**Author:** {{user_name}} -**Module Code:** {{module_code}} -**Status:** Ready for Development - ---- - -## Executive Summary - -{{module_vision}} - -**Module Category:** {{module_category}} -**Complexity Level:** {{complexity_level}} -**Target Users:** {{target_users}} - ---- - -## Module Identity - -### Core Concept - -{{module_identity}} - -### Unique Value Proposition - -What makes this module special: -{{unique_value}} - -### Personality Theme - -{{personality_theme}} - ---- - -## Agent Architecture - -{{agent_architecture}} - -### Agent Roster - -{{agent_roster}} - -### Agent Interaction Model - -How agents work together: -{{agent_interactions}} - ---- - -## Workflow Ecosystem - -{{workflow_ecosystem}} - -### Core Workflows - -Essential functionality that delivers primary value: -{{core_workflows}} - -### Feature Workflows - -Specialized capabilities that enhance the module: -{{feature_workflows}} - -### Utility Workflows - -Supporting operations and maintenance: -{{utility_workflows}} - ---- - -## User Scenarios - -### Primary Use Case - -{{primary_scenario}} - -### Secondary Use Cases - -{{secondary_scenarios}} - -### User Journey - -Step-by-step walkthrough of typical usage: -{{user_journey}} - ---- - -## Technical Planning - -### Data Requirements - -{{data_requirements}} - -### Integration Points - -{{integration_points}} - -### Dependencies - -{{dependencies}} - -### Technical Complexity Assessment - -{{technical_planning}} - ---- - -## Success Metrics - -### Module Success Criteria - -How we'll know the module is successful: -{{success_criteria}} - -### Quality Standards - -{{quality_standards}} - -### Performance Targets - -{{performance_targets}} - ---- - -## Development Roadmap - -### Phase 1: MVP (Minimum Viable Module) - -**Timeline:** {{phase1_timeline}} - -{{phase1_components}} - -**Deliverables:** -{{phase1_deliverables}} - -### Phase 2: Enhancement - -**Timeline:** {{phase2_timeline}} - -{{phase2_components}} - -**Deliverables:** -{{phase2_deliverables}} - -### Phase 3: Polish and Optimization - -**Timeline:** {{phase3_timeline}} - -{{phase3_components}} - -**Deliverables:** -{{phase3_deliverables}} - ---- - -## Creative Features - -### Special Touches - -{{creative_features}} - -### Easter Eggs and Delighters - -{{easter_eggs}} - -### Module Lore and Theming - -{{module_lore}} - ---- - -## Risk Assessment - -### Technical Risks - -{{technical_risks}} - -### Usability Risks - -{{usability_risks}} - -### Scope Risks - -{{scope_risks}} - -### Mitigation Strategies - -{{risk_mitigation}} - ---- - -## Implementation Notes - -### Priority Order - -1. {{priority_1}} -2. {{priority_2}} -3. {{priority_3}} - -### Key Design Decisions - -{{design_decisions}} - -### Open Questions - -{{open_questions}} - ---- - -## Resources and References - -### Inspiration Sources - -{{inspiration_sources}} - -### Similar Modules - -{{similar_modules}} - -### Technical References - -{{technical_references}} - ---- - -## Appendices - -### A. Detailed Agent Specifications - -{{detailed_agent_specs}} - -### B. Workflow Detailed Designs - -{{detailed_workflow_specs}} - -### C. Data Structures and Schemas - -{{data_schemas}} - -### D. Integration Specifications - -{{integration_specs}} - ---- - -## Next Steps - -1. **Review this brief** with stakeholders -2. **Run create-module workflow** using this brief as input -3. **Create first agent** using create-agent workflow -4. **Develop initial workflows** using create-workflow -5. **Test MVP** with target users - ---- - -_This Module Brief is ready to be fed directly into the create-module workflow for scaffolding and implementation._ - -**Module Viability Score:** {{viability_score}}/10 -**Estimated Development Effort:** {{effort_estimate}} -**Confidence Level:** {{confidence_level}} - ---- - -**Approval for Development:** - -- [ ] Concept Approved -- [ ] Scope Defined -- [ ] Resources Available -- [ ] Ready to Build - ---- - -_Generated on {{date}} by {{user_name}} using the BMAD Method Module Brief workflow_ diff --git a/src/modules/bmb/workflows-legacy/module-brief/workflow.yaml b/src/modules/bmb/workflows-legacy/module-brief/workflow.yaml deleted file mode 100644 index 772f6801..00000000 --- a/src/modules/bmb/workflows-legacy/module-brief/workflow.yaml +++ /dev/null @@ -1,36 +0,0 @@ -# Module Brief Workflow Configuration -name: module-brief -description: "Create a comprehensive Module Brief that serves as the blueprint for building new BMAD modules using strategic analysis and creative vision" -author: "BMad Builder" - -# Critical variables -config_source: "{project-root}/_bmad/bmb/config.yaml" -output_folder: "{config_source}:output_folder" -user_name: "{config_source}:user_name" -communication_language: "{config_source}:communication_language" -date: system-generated - -# Reference examples and documentation -existing_modules_dir: "{project-root}/_bmad/" -module_structure_guide: "{project-root}/_bmad/bmb/workflows/create-module/module-structure.md" - -# Optional user inputs - discovered if they exist -input_file_patterns: - brainstorming: - description: "Brainstorming session outputs (optional)" - whole: "{output_folder}/brainstorming-*.md" - load_strategy: "FULL_LOAD" - -# Module path and component files -installed_path: "{project-root}/_bmad/bmb/workflows/module-brief" -template: "{installed_path}/template.md" -instructions: "{installed_path}/instructions.md" -validation: "{installed_path}/checklist.md" - -# Output configuration -default_output_file: "{output_folder}/module-brief-{{module_code}}-{{date}}.md" - -standalone: true - -# Web bundle configuration -web_bundle: false # BMB workflows run locally in BMAD-METHOD project diff --git a/src/modules/bmb/workflows/agent/data/critical-actions.md b/src/modules/bmb/workflows/agent/data/critical-actions.md index ddb99eb1..5b8de8e6 100644 --- a/src/modules/bmb/workflows/agent/data/critical-actions.md +++ b/src/modules/bmb/workflows/agent/data/critical-actions.md @@ -31,8 +31,8 @@ critical_actions: **CRITICAL Path Format:** - `{project-root}` = literal text (not replaced) -- Sidecar copied to `_memory/` at build time -- Use `{project-root}/_bmad/_memory/{sidecar-folder}/` format +- Sidecar created next to agent.yaml during BUILD, then copied to `_memory/` during BMAD INSTALLATION +- Use `{project-root}/_bmad/_memory/{sidecar-folder}/` format for RUNTIME paths in agent YAML --- diff --git a/src/modules/bmb/workflows/agent/data/expert-agent-architecture.md b/src/modules/bmb/workflows/agent/data/expert-agent-architecture.md index b442a0e6..936b4022 100644 --- a/src/modules/bmb/workflows/agent/data/expert-agent-architecture.md +++ b/src/modules/bmb/workflows/agent/data/expert-agent-architecture.md @@ -39,7 +39,7 @@ Agents with a sidecar folder for persistent memory, custom workflows, and restri ## CRITICAL: Sidecar Path Format -At build/install, sidecar is copied to `{project-root}/_bmad/_memory/{sidecar-folder}/` +During BMAD INSTALLATION, sidecar folder is copied from the agent location to `{project-root}/_bmad/_memory/{sidecar-folder}/` **ALL agent YAML references MUST use:** diff --git a/src/modules/bmb/workflows/agent/steps-c/step-03-type-metadata.md b/src/modules/bmb/workflows/agent/steps-c/step-03-type-metadata.md index b9ddd416..c0da3974 100644 --- a/src/modules/bmb/workflows/agent/steps-c/step-03-type-metadata.md +++ b/src/modules/bmb/workflows/agent/steps-c/step-03-type-metadata.md @@ -1,5 +1,5 @@ --- -name: 'step-02-type-metadata' +name: 'step-03-type-metadata' description: 'Determine agent type and define metadata' # File References @@ -27,7 +27,7 @@ Determine the agent's classification (Simple/Expert/Module) and define all manda # MANDATORY EXECUTION RULES ## Universal Rules -- ALWAYS use `{agent-language}` for all conversational text +- ALWAYS use `{communication_language}` for all conversational text - MAINTAIN step boundaries - complete THIS step only - DOCUMENT all decisions to agent plan file - HONOR user's creative control throughout @@ -136,7 +136,7 @@ Read and internalize: - Keep examples accessible for reference ## 2. Purpose Discovery Conversation -Engage user with questions in `{agent-language}`: +Engage user with questions in `{communication_language}`: - "What is the primary function this agent will perform?" - "How complex are the tasks this agent will handle?" - "Will this agent need to manage workflows or other agents?" diff --git a/src/modules/bmb/workflows/agent/steps-c/step-04-persona.md b/src/modules/bmb/workflows/agent/steps-c/step-04-persona.md index 0e45d060..4e88a030 100644 --- a/src/modules/bmb/workflows/agent/steps-c/step-04-persona.md +++ b/src/modules/bmb/workflows/agent/steps-c/step-04-persona.md @@ -1,5 +1,5 @@ --- -name: 'step-03-persona' +name: 'step-04-persona' description: 'Shape the agent personality through four-field persona system' # File References diff --git a/src/modules/bmb/workflows/agent/steps-c/step-05-commands-menu.md b/src/modules/bmb/workflows/agent/steps-c/step-05-commands-menu.md index 7d4c8c81..78629503 100644 --- a/src/modules/bmb/workflows/agent/steps-c/step-05-commands-menu.md +++ b/src/modules/bmb/workflows/agent/steps-c/step-05-commands-menu.md @@ -1,5 +1,5 @@ --- -name: 'step-04-commands-menu' +name: 'step-05-commands-menu' description: 'Build capabilities and command structure' # File References diff --git a/src/modules/bmb/workflows/agent/steps-c/step-06-activation.md b/src/modules/bmb/workflows/agent/steps-c/step-06-activation.md index 864b7d54..001d83ad 100644 --- a/src/modules/bmb/workflows/agent/steps-c/step-06-activation.md +++ b/src/modules/bmb/workflows/agent/steps-c/step-06-activation.md @@ -1,5 +1,5 @@ --- -name: 'step-05-activation' +name: 'step-06-activation' description: 'Plan activation behavior and route to build' # File References @@ -30,7 +30,7 @@ Define activation behavior through critical_actions and route to the appropriate - These are non-negotiable prerequisites 2. **MUST Determine Route Before Activation Discussion** - - Check hasSidecar from plan metadata + - Check `module` and `hasSidecar` from plan metadata - Determine destination build step FIRST - Inform user of routing decision @@ -41,10 +41,12 @@ Define activation behavior through critical_actions and route to the appropriate 4. **MUST Follow Routing Logic Exactly** ```yaml - # Route determination based on hasSidecar and module - hasSidecar: false → step-06-build-simple.md - hasSidecar: true + module: "stand-alone" → step-06-build-expert.md - hasSidecar: true + module: ≠ "stand-alone" → step-06-build-module.md + # Route determination based on module and hasSidecar + # Module agents: any module value other than "stand-alone" + module ≠ "stand-alone" → step-07c-build-module.md + # Stand-alone agents: determined by hasSidecar + module = "stand-alone" + hasSidecar: true → step-07b-build-expert.md + module = "stand-alone" + hasSidecar: false → step-07a-build-simple.md ``` 5. **NEVER Skip Documentation** diff --git a/src/modules/bmb/workflows/agent/steps-c/step-07a-build-simple.md b/src/modules/bmb/workflows/agent/steps-c/step-07a-build-simple.md index 5957a67e..c76cef4f 100644 --- a/src/modules/bmb/workflows/agent/steps-c/step-07a-build-simple.md +++ b/src/modules/bmb/workflows/agent/steps-c/step-07a-build-simple.md @@ -1,9 +1,9 @@ --- -name: 'step-06-build-simple' +name: 'step-07a-build-simple' description: 'Generate Simple agent YAML from plan' # File References -nextStepFile: './step-08a-plan-traceability.md' +nextStepFile: './step-08-celebrate.md' agentPlan: '{bmb_creations_output_folder}/agent-plan-{agent_name}.md' agentBuildOutput: '{bmb_creations_output_folder}/{agent-name}.agent.yaml' @@ -143,7 +143,7 @@ Display: "**Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Cont ### 6. Route Based on User Choice **If user chooses "one-at-a-time":** -- Proceed to `nextStepFile` (step-07a-plan-traceability.md) +- Proceed to `nextStepFile` (step-08-celebrate.md) - Continue through each validation step sequentially - Allow review between each validation @@ -155,7 +155,7 @@ Display: "**Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Cont ## CRITICAL STEP COMPLETION NOTE -ONLY WHEN [C continue option] is selected and [complete YAML generated and written to output], will you then load and read fully `{nextStepFile}` to execute and begin validation. +ONLY WHEN [C continue option] is selected and [complete YAML generated and written to output], will you then load and read fully `{nextStepFile}` to execute and celebrate completion. ## SUCCESS METRICS diff --git a/src/modules/bmb/workflows/agent/steps-c/step-07b-build-expert.md b/src/modules/bmb/workflows/agent/steps-c/step-07b-build-expert.md index fe8df2e0..a0c16005 100644 --- a/src/modules/bmb/workflows/agent/steps-c/step-07b-build-expert.md +++ b/src/modules/bmb/workflows/agent/steps-c/step-07b-build-expert.md @@ -3,7 +3,7 @@ name: 'step-06-build-expert' description: 'Generate Expert agent YAML with sidecar from plan' # File References -nextStepFile: './step-08a-plan-traceability.md' +nextStepFile: './step-08-celebrate.md' agentPlan: '{bmb_creations_output_folder}/agent-plan-{agent_name}.md' agentBuildOutput: '{bmb_creations_output_folder}/{agent-name}/' agentYamlOutput: '{bmb_creations_output_folder}/{agent-name}/{agent-name}.agent.yaml' @@ -21,12 +21,12 @@ partyModeWorkflow: '{project-root}/_bmad/core/workflows/party-mode/workflow.md' # STEP GOAL -Assemble the agent plan content into a complete Expert agent YAML file with sidecar folder structure. Expert agents require persistent memory storage for specialized operations, accessed via `{project-root}/_bmad/_memory/{sidecar-folder}/` paths in critical_actions. +Assemble the agent plan content into a complete Expert agent YAML file with sidecar folder structure. Expert agents require persistent memory storage, so the build creates a sidecar folder next to the agent.yaml (which gets installed to `_bmad/_memory/` during BMAD installation). ## MANDATORY EXECUTION RULES -1. **EXPERT AGENT = SIDECAR REQUIRED**: Every Expert agent MUST have a sidecar folder created under `_bmad/_memory/` -2. **CRITICAL_ACTIONS FORMAT**: All critical_actions MUST use `{project-root}/_bmad/_memory/{sidecar-folder}/` for file operations +1. **EXPERT AGENT = SIDECAR REQUIRED**: Every Expert agent MUST have a sidecar folder created next to agent.yaml (build location), which will be installed to `_bmad/_memory/` during BMAD installation +2. **CRITICAL_ACTIONS FORMAT**: All critical_actions MUST use `{project-root}/_bmad/_memory/{sidecar-folder}/` for file operations (runtime path) 3. **TEMPLATE COMPLIANCE**: Follow expert-agent-template.md structure exactly 4. **YAML VALIDATION**: Ensure valid YAML syntax with proper indentation (2-space) 5. **EXISTING CHECK**: If agentYamlOutput exists, ask user before overwriting @@ -55,8 +55,6 @@ Using expertTemplate as structure: ```yaml name: '{agent-name}' description: '{short-description}' -type: 'expert' -version: '1.0.0' author: name: '{author}' @@ -109,19 +107,20 @@ metadata: ### Phase 4: Create Sidecar Structure -1. **Create Sidecar Directory**: - - Path: `{project-root}/_bmad/_memory/{sidecar-folder}/` +1. **Create Sidecar Directory** (NEXT TO agent.yaml): + - Path: `{agentBuildOutput}/{agent-name}-sidecar/` - Use `mkdir -p` to create full path + - Note: This folder gets installed to `_bmad/_memory/` during BMAD installation 2. **Create Starter Files** (if specified in critical_actions): ```bash - touch _bmad/_memory/{sidecar-folder}/{file1}.md - touch _bmad/_memory/{sidecar-folder}/{file2}.md + touch {agentBuildOutput}/{agent-name}-sidecar/{file1}.md + touch {agentBuildOutput}/{agent-name}-sidecar/{file2}.md ``` 3. **Add README to Sidecar**: ```markdown - # {sidecar-folder} Memory + # {sidecar-folder} Sidecar This folder stores persistent memory for the **{agent-name}** Expert agent. @@ -132,8 +131,9 @@ metadata: - {file1}.md: {description} - {file2}.md: {description} - ## Access Pattern - Agent accesses these files via: `{project-root}/_bmad/_memory/{sidecar-folder}/{filename}.md` + ## Runtime Access + After BMAD installation, this folder will be accessible at: + `{project-root}/_bmad/_memory/{sidecar-folder}/{filename}.md` ``` ### Phase 5: Write Agent YAML @@ -171,11 +171,11 @@ Display: "**Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Cont ## CRITICAL STEP COMPLETION NOTE -ONLY WHEN [C continue option] is selected and [complete YAML generated and written to output], will you then load and read fully `{nextStepFile}` to execute and begin validation. +ONLY WHEN [C continue option] is selected and [complete YAML generated and written to output], will you then load and read fully `{nextStepFile}` to execute and celebrate completion. This step produces TWO artifacts: 1. **Agent YAML**: Complete expert agent definition at `{agentYamlOutput}` -2. **Sidecar Structure**: Folder and files at `{project-root}/_bmad/_memory/{sidecar-folder}/` +2. **Sidecar Structure**: Folder and files at `{agentBuildOutput}/{agent-name}-sidecar/` (build location, installs to `_bmad/_memory/` during BMAD installation) Both must exist before proceeding to validation. @@ -184,7 +184,7 @@ Both must exist before proceeding to validation. ✅ Agent YAML file created at expected location ✅ Valid YAML syntax (no parse errors) ✅ All template fields populated -✅ Sidecar folder created under `_bmad/_memory/` +✅ Sidecar folder created at `{agentBuildOutput}/{agent-name}-sidecar/` (build location) ✅ Sidecar folder contains starter files from critical_actions ✅ critical_actions reference `{project-root}/_bmad/_memory/{sidecar-folder}/` paths ✅ metadata.sidecar-folder populated diff --git a/src/modules/bmb/workflows/agent/steps-c/step-07c-build-module.md b/src/modules/bmb/workflows/agent/steps-c/step-07c-build-module.md index baab0380..eb246b0e 100644 --- a/src/modules/bmb/workflows/agent/steps-c/step-07c-build-module.md +++ b/src/modules/bmb/workflows/agent/steps-c/step-07c-build-module.md @@ -3,7 +3,7 @@ name: 'step-06-build-module' description: 'Generate Module agent YAML from plan' # File References -nextStepFile: './step-08a-plan-traceability.md' +nextStepFile: './step-08-celebrate.md' agentPlan: '{bmb_creations_output_folder}/agent-plan-{agent_name}.md' agentBuildOutput: '{bmb_creations_output_folder}/{agent-name}/' agentYamlOutput: '{bmb_creations_output_folder}/{agent-name}/{agent-name}.agent.yaml' @@ -205,7 +205,7 @@ Display: "**Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Cont # CRITICAL STEP COMPLETION NOTE -ONLY WHEN [C continue option] is selected and [complete YAML generated and written to output], will you then load and read fully `{nextStepFile}` to execute and begin validation. +ONLY WHEN [C continue option] is selected and [complete YAML generated and written to output], will you then load and read fully `{nextStepFile}` to execute and celebrate completion. **THIS STEP IS COMPLETE WHEN:** 1. Module agent YAML file exists at agentYamlOutput path diff --git a/src/modules/bmb/workflows/agent/steps-c/step-09-celebrate.md b/src/modules/bmb/workflows/agent/steps-c/step-08-celebrate.md similarity index 89% rename from src/modules/bmb/workflows/agent/steps-c/step-09-celebrate.md rename to src/modules/bmb/workflows/agent/steps-c/step-08-celebrate.md index 25541e72..51b898cd 100644 --- a/src/modules/bmb/workflows/agent/steps-c/step-09-celebrate.md +++ b/src/modules/bmb/workflows/agent/steps-c/step-08-celebrate.md @@ -1,9 +1,9 @@ --- -name: 'step-09-celebrate' +name: 'step-08-celebrate' description: 'Celebrate completion and guide next steps for using the agent' # File References -thisStepFile: ./step-09-celebrate.md +thisStepFile: ./step-08-celebrate.md workflowFile: ../workflow.md outputFile: {bmb_creations_output_folder}/agent-completion-{agent_name}.md @@ -11,9 +11,10 @@ outputFile: {bmb_creations_output_folder}/agent-completion-{agent_name}.md advancedElicitationTask: '{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml' partyModeWorkflow: '{project-root}/_bmad/core/workflows/party-mode/workflow.md' installationDocs: 'https://github.com/bmad-code-org/BMAD-METHOD/blob/main/docs/modules/bmb-bmad-builder/custom-content-installation.md#standalone-content-agents-workflows-tasks-tools-templates-prompts' +validationWorkflow: '{project-root}/src/modules/bmb/workflows/agent/steps-v/v-01-load-review.md' --- -# Step 9: Celebration and Installation Guidance +# Step 8: Celebration and Installation Guidance ## STEP GOAL: @@ -198,25 +199,27 @@ Save this content to `{outputFile}` for reference. ### 7. Present MENU OPTIONS -Display: "**Select an Option:** [A] Advanced Elicitation [P] Party Mode [X] Exit Workflow" +Display: "**✅ Agent Build Complete! Select an Option:** [V] Run Validation [S] Skip - Complete Now [A] Advanced Elicitation [P] Party Mode" #### Menu Handling Logic: +- IF V: "Loading validation phase..." → Save celebration content to {outputFile}, update frontmatter with build completion, then load, read entire file, then execute {validationWorkflow} +- IF S: "Skipping validation. Completing workflow..." → Save content to {outputFile}, update frontmatter with workflow completion, then end workflow gracefully - IF A: Execute {advancedElicitationTask}, and when finished redisplay the menu - IF P: Execute {partyModeWorkflow}, and when finished redisplay the menu -- IF X: Save content to {outputFile}, update frontmatter with workflow completion, then end workflow gracefully - IF Any other comments or queries: help user respond then [Redisplay Menu Options](#7-present-menu-options) #### EXECUTION RULES: - ALWAYS halt and wait for user input after presenting menu -- ONLY complete workflow when user selects 'X' -- After other menu items execution, return to this menu +- User can choose validation (V), skip to complete (S), or use advanced elicitation (A) or party mode (P) +- After other menu items execution (A/P), return to this menu - User can chat or ask questions - always respond and then end with display again of the menu options ## CRITICAL STEP COMPLETION NOTE -ONLY WHEN [X exit option] is selected and [workflow completion marked in frontmatter], will the workflow end gracefully with agent ready for installation. +ONLY WHEN [S skip option] is selected and [workflow completion marked in frontmatter], will the workflow end gracefully with agent ready for installation. +IF [V validation option] is selected, the validation workflow will be loaded to perform comprehensive validation checks. --- diff --git a/src/modules/bmb/workflows/agent/steps-c/step-08a-plan-traceability.md b/src/modules/bmb/workflows/agent/steps-c/step-08a-plan-traceability.md deleted file mode 100644 index 15c98272..00000000 --- a/src/modules/bmb/workflows/agent/steps-c/step-08a-plan-traceability.md +++ /dev/null @@ -1,205 +0,0 @@ ---- -name: 'step-07a-plan-traceability' -description: 'Verify build matches original plan' - -# File References -nextStepFile: './step-08b-metadata-validation.md' -agentPlan: '{bmb_creations_output_folder}/agent-plan-{agent_name}.md' -builtYaml: '{bmb_creations_output_folder}/{agent-name}/{agent-name}.agent.yaml' - -# Task References -advancedElicitationTask: '{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml' -partyModeWorkflow: '{project-root}/_bmad/core/workflows/party-mode/workflow.md' ---- - -# STEP GOAL -Verify that the built agent YAML file contains all elements specified in the original agent plan. This step ensures plan traceability - confirming that what we planned is what we actually built. - -# MANDATORY EXECUTION RULES -- MUST load both agentPlan and builtYaml files before comparison -- MUST compare ALL planned elements against built implementation -- MUST report specific missing items, not just "something is missing" -- MUST offer fix option before proceeding to next validation -- MUST handle missing files gracefully (report clearly, don't crash) -- MUST respect YOLO mode behavior (part of combined validation report) - -# EXECUTION PROTOCOLS - -## File Loading Protocol -1. Load agentPlan from `{bmb_creations_output_folder}/agent-plan-{agent_name}.md` -2. Load builtYaml from `{bmb_creations_output_folder}/{agent-name}/{agent-name}.agent.yaml` -3. If either file is missing, report the specific missing file and stop comparison -4. Use Read tool to access both files with absolute paths - -## Comparison Protocol -Compare the following categories systematically: - -### 1. Metadata Comparison -- Agent name -- Description -- Version -- Author/creator information -- Location/module path -- Language settings (if specified in plan) - -### 2. Persona Field Comparison -For each field in persona section: -- Check presence in built YAML -- Verify field content matches planned intent -- Note any significant deviations (minor wording differences ok) - -### 3. Commands Comparison -- Verify all planned commands are present -- Check command names match -- Verify command descriptions are present -- Confirm critical actions are referenced - -### 4. Critical Actions Comparison -- Verify all planned critical_actions are present -- Check action names match exactly -- Verify action descriptions are present -- Confirm each action has required fields - -### 5. Additional Elements -- Dependencies (if planned) -- Configuration (if planned) -- Installation instructions (if planned) - -## Reporting Protocol -Present findings in clear, structured format: - -``` -PLAN TRACEABILITY REPORT -======================== - -Agent: {agent_name} -Plan File: {path to agent plan} -Build File: {path to built YAML} - -COMPARISON RESULTS: -------------------- - -✅ Metadata: All present / Missing: {list} -✅ Persona Fields: All present / Missing: {list} -✅ Commands: All present / Missing: {list} -✅ Critical Actions: All present / Missing: {list} -✅ Other Elements: All present / Missing: {list} - -OVERALL STATUS: [PASS / FAIL] - -``` - -If ANY elements are missing: -- List each missing element with category -- Provide specific location reference (what was planned) -- Ask if user wants to fix items or continue anyway - -## Menu Protocol - -### 8. Present MENU OPTIONS - -Display: "**Select an Option:** [A] Advanced Elicitation [F] Fix Findings [P] Party Mode [C] Continue" - -#### Menu Handling Logic: - -- IF A: Execute {advancedElicitationTask}, and when finished redisplay the menu -- IF F: Apply auto-fixes to {builtYaml} for identified missing elements, then redisplay the menu -- IF P: Execute {partyModeWorkflow}, and when finished redisplay the menu -- IF C: Proceed to next validation step, update frontmatter, then only then load, read entire file, then execute {nextStepFile} -- IF Any other comments or queries: help user respond then [Redisplay Menu Options](#8-present-menu-options) - -#### EXECUTION RULES: - -- ALWAYS halt and wait for user input after presenting menu -- ONLY proceed to next step when user selects 'C' -- After other menu items execution, return to this menu -- User can chat or ask questions - always respond and then end with display again of the menu options - -If YOLO mode: -- Include this report in combined validation report -- Auto-select [C] Continue if all elements present -- Auto-select [F] Fix if missing critical elements (name, commands) -- Flag non-critical missing items in summary - -# CONTEXT BOUNDARIES -- ONLY compare plan vs build - do NOT evaluate quality or correctness -- Do NOT suggest improvements or changes beyond planned elements -- Do NOT re-open persona/commands discovery - this is verification only -- Fix option should return to step-06-build, not earlier steps -- If plan file is ambiguous, note ambiguity but use reasonable interpretation - -## MANDATORY SEQUENCE - -**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change. - -## 1. Load Required Files -```yaml -action: read -target: - - agentPlan - - builtYaml -on_failure: report which file is missing and suggest resolution -``` - -## 2. Perform Structured Comparison -```yaml -action: compare -categories: - - metadata - - persona_fields - - commands - - critical_actions - - other_elements -method: systematic category-by-category check -``` - -## 3. Generate Comparison Report -```yaml -action: report -format: structured pass/fail with specific missing items -output: console display + optional save to validation log -``` - -## 4. Present Menu Options -```yaml -action: menu -options: - - F: Fix missing items - - C: Continue to metadata validation - - V: View detailed comparison (optional) -default: C if pass, F if fail -``` - -## 5. Handle User Choice -- **[F] Fix Findings**: Apply auto-fixes to {builtYaml} for identified missing elements, then re-present menu -- **[C] Continue**: Proceed to step-07b-metadata-validation -- **[A] Advanced Elicitation**: Execute advanced elicitation workflow, then re-present menu -- **[P] Party Mode**: Execute party mode workflow, then re-present menu - -## CRITICAL STEP COMPLETION NOTE - -ONLY WHEN [C continue option] is selected and [validation complete with any findings addressed], will you then load and read fully `{nextStepFile}` to execute and begin [metadata validation]. - -# SUCCESS/FAILURE METRICS - -## Success Criteria -- All planned elements present in built YAML: **COMPLETE PASS** -- Minor deviations (wording, formatting) but all core elements present: **PASS** -- Missing elements identified and user chooses to continue: **PASS WITH NOTED DEFICIENCIES** - -## Failure Criteria -- Unable to load plan or build file: **BLOCKING FAILURE** -- Critical elements missing (name, commands, or critical_actions): **FAIL** -- Comparison cannot be completed due to file corruption: **BLOCKING FAILURE** - -## Next Step Triggers -- **PASS → step-07b-metadata-validation** -- **PASS WITH DEFICIENCIES → step-07b-metadata-validation** (user choice) -- **FAIL → step-06-build** (with specific fix instructions) -- **BLOCKING FAILURE → STOP** (resolve file access issues first) - -## YOLO Mode Behavior -- Auto-fix missing critical elements by returning to build step -- Log non-critical missing items for review but continue validation -- Include traceability report in final YOLO summary -- Do NOT stop for user confirmation unless plan file is completely missing diff --git a/src/modules/bmb/workflows/agent/steps-c/step-08b-metadata-validation.md b/src/modules/bmb/workflows/agent/steps-c/step-08b-metadata-validation.md deleted file mode 100644 index a52fc41b..00000000 --- a/src/modules/bmb/workflows/agent/steps-c/step-08b-metadata-validation.md +++ /dev/null @@ -1,130 +0,0 @@ ---- -name: 'step-07b-metadata-validation' -description: 'Validate agent metadata properties' - -# File References -nextStepFile: './step-08c-persona-validation.md' -agentMetadata: ../data/agent-metadata.md -builtYaml: '{bmb_creations_output_folder}/{agent-name}/{agent-name}.agent.yaml' - -# Task References -advancedElicitationTask: '{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml' -partyModeWorkflow: '{project-root}/_bmad/core/workflows/party-mode/workflow.md' ---- - -# STEP GOAL - -Validate that the agent's metadata properties (name, description, version, tags, category, etc.) are properly formatted, complete, and follow BMAD standards. - -## MANDATORY EXECUTION RULES - -- **NEVER skip validation checks** - All metadata fields must be verified -- **ALWAYS load both reference documents** - agentMetadata.md AND the builtYaml -- **NEVER modify files without user approval** - Report findings first, await menu selection -- **ALWAYS use absolute paths** when referencing files -- **CRITICAL:** This is a validation step, not an editing step - -## EXECUTION PROTOCOLS - -### Protocol 1: Load and Compare -1. Read the metadata validation reference from `{agentMetadata}` -2. Read the built agent YAML from `{builtYaml}` -3. Extract the metadata section from the builtYaml -4. Compare actual metadata against validation rules - -### Protocol 2: Validation Checks -Perform these checks systematically: - -1. **Required Fields Existence** - - [ ] name: Present and non-empty - - [ ] description: Present and non-empty - - [ ] category: Present and matches valid category - - [ ] tags: Present as array, not empty - -2. **Format Validation** - - [ ] name: Uses kebab-case, no spaces - - [ ] description: 50-200 characters (unless intentionally brief) - - [ ] tags: Array of lowercase strings with hyphens - - [ ] category: Matches one of the allowed categories - -3. **Content Quality** - - [ ] description: Clear and concise, explains what the agent does - - [ ] tags: Relevant to agent's purpose (3-7 tags recommended) - - [ ] category: Most appropriate classification - -4. **Standards Compliance** - - [ ] No prohibited characters in fields - - [ ] No redundant or conflicting information - - [ ] Consistent formatting with other agents - -### Protocol 3: Report Findings -Organize your report into three sections: - -**PASSING CHECKS** (List what passed) -``` -✓ Required fields present -✓ Name follows kebab-case convention -``` - -**WARNINGS** (Non-blocking issues) -``` -⚠ Description is brief (45 chars, recommended 50-200) -⚠ Only 2 tags provided, 3-7 recommended -``` - -**FAILURES** (Blocking issues that must be fixed) -``` -✗ Category "custom-type" not in allowed list -``` - -### Protocol 4: Menu System - -#### 5. Present MENU OPTIONS - -Display: "**Select an Option:** [A] Advanced Elicitation [F] Fix Findings [P] Party Mode [C] Continue" - -#### Menu Handling Logic: - -- IF A: Execute {advancedElicitationTask}, and when finished redisplay the menu -- IF F: Apply auto-fixes to {builtYaml} for identified issues, then redisplay the menu -- IF P: Execute {partyModeWorkflow}, and when finished redisplay the menu -- IF C: Proceed to next validation step, update frontmatter, then only then load, read entire file, then execute {nextStepFile} -- IF Any other comments or queries: help user respond then [Redisplay Menu Options](#5-present-menu-options) - -#### EXECUTION RULES: - -- ALWAYS halt and wait for user input after presenting menu -- ONLY proceed to next step when user selects 'C' -- After other menu items execution, return to this menu -- User can chat or ask questions - always respond and then end with display again of the menu options - -## CONTEXT BOUNDARIES - -**IN SCOPE:** -- Metadata section of agent.yaml (name, description, version, tags, category, author, license, etc.) -- Referencing the agentMetadata.md validation rules -- Comparing against BMAD standards - -**OUT OF SCOPE:** -- Persona fields (handled in step-07c) -- Menu items (handled in step-07d) -- System architecture (handled in step-07e) -- Capability implementation (handled in step-07f) - -**DO NOT:** -- Validate persona properties in this step -- Suggest major feature additions -- Question the agent's core purpose -- Modify fields beyond metadata - -## CRITICAL STEP COMPLETION NOTE - -ONLY WHEN [C continue option] is selected and [validation complete with any findings addressed], will you then load and read fully `{nextStepFile}` to execute and begin [persona validation]. - -## SUCCESS METRICS - -✓ **Complete Success:** All checks pass, no failures, warnings are optional -✓ **Partial Success:** Failures fixed via [F] option, warnings acknowledged -✓ **Failure:** Blocking failures remain when user selects [C] - -**CRITICAL:** Never proceed to next step if blocking failures exist and user hasn't acknowledged them. diff --git a/src/modules/bmb/workflows/agent/steps-c/step-08c-persona-validation.md b/src/modules/bmb/workflows/agent/steps-c/step-08c-persona-validation.md deleted file mode 100644 index 7b21c4f1..00000000 --- a/src/modules/bmb/workflows/agent/steps-c/step-08c-persona-validation.md +++ /dev/null @@ -1,161 +0,0 @@ ---- -name: 'step-07c-persona-validation' -description: 'Validate persona fields and principles' - -# File References -nextStepFile: './step-08d-menu-validation.md' -personaProperties: ../data/persona-properties.md -principlesCrafting: ../data/principles-crafting.md -builtYaml: '{bmb_creations_output_folder}/{agent-name}/{agent-name}.agent.yaml' - -# Task References -advancedElicitationTask: '{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml' -partyModeWorkflow: '{project-root}/_bmad/core/workflows/party-mode/workflow.md' ---- - -# STEP GOAL - -Validate that the agent's persona (role, tone, expertise, principles, constraints) is well-defined, consistent, and aligned with its purpose. - -## MANDATORY EXECUTION RULES - -- **NEVER skip validation checks** - All persona fields must be verified -- **ALWAYS load both reference documents** - personaProperties.md AND principlesCrafting.md -- **NEVER modify files without user approval** - Report findings first, await menu selection -- **ALWAYS use absolute paths** when referencing files -- **CRITICAL:** This is a validation step, not an editing step - -## EXECUTION PROTOCOLS - -### Protocol 1: Load and Compare -1. Read the persona validation reference from `{personaProperties}` -2. Read the principles crafting guide from `{principlesCrafting}` -3. Read the built agent YAML from `{builtYaml}` -4. Extract the persona section from the builtYaml -5. Compare actual persona against validation rules - -### Protocol 2: Validation Checks -Perform these checks systematically: - -1. **Required Fields Existence** - - [ ] role: Present, clear, and specific - - [ ] tone: Present and appropriate to role - - [ ] expertise: Present and relevant to agent's purpose - - [ ] principles: Present as array, not empty (if applicable) - - [ ] constraints: Present as array, not empty (if applicable) - -2. **Content Quality - Role** - - [ ] Role is specific (not generic like "assistant") - - [ ] Role aligns with agent's purpose and menu items - - [ ] Role is achievable within LLM capabilities - - [ ] Role scope is appropriate (not too broad/narrow) - -3. **Content Quality - Tone** - - [ ] Tone is clearly defined (professional, friendly, authoritative, etc.) - - [ ] Tone matches the role and target users - - [ ] Tone is consistent throughout the definition - - [ ] Tone examples or guidance provided if nuanced - -4. **Content Quality - Expertise** - - [ ] Expertise areas are relevant to role - - [ ] Expertise claims are realistic for LLM - - [ ] Expertise domains are specific (not just "knowledgeable") - - [ ] Expertise supports the menu capabilities - -5. **Content Quality - Principles** - - [ ] Principles are actionable (not vague platitudes) - - [ ] Principles guide behavior and decisions - - [ ] Principles are consistent with role - - [ ] 3-7 principles recommended (not overwhelming) - - [ ] Each principle is clear and specific - -6. **Content Quality - Constraints** - - [ ] Constraints define boundaries clearly - - [ ] Constraints are enforceable (measurable/observable) - - [ ] Constraints prevent undesirable behaviors - - [ ] Constraints don't contradict principles - -7. **Consistency Checks** - - [ ] Role, tone, expertise, principles all align - - [ ] No contradictions between principles and constraints - - [ ] Persona supports the menu items defined - - [ ] Language and terminology consistent - -### Protocol 3: Report Findings -Organize your report into three sections: - -**PASSING CHECKS** (List what passed) -``` -✓ Role is specific and well-defined -✓ Tone clearly articulated and appropriate -✓ Expertise aligns with agent purpose -✓ Principles are actionable and clear -``` - -**WARNINGS** (Non-blocking issues) -``` -⚠ Only 2 principles provided, 3-7 recommended for richer guidance -⚠ No constraints defined - consider adding boundaries -⚠ Expertise areas are broad, could be more specific -``` - -**FAILURES** (Blocking issues that must be fixed) -``` -✗ Role is generic ("assistant") - needs specificity -✗ Tone undefined - creates inconsistent behavior -✗ Principles are vague ("be helpful" - not actionable) -✗ Contradiction: Principle says "be creative", constraint says "follow strict rules" -``` - -### Protocol 4: Menu System - -#### 5. Present MENU OPTIONS - -Display: "**Select an Option:** [A] Advanced Elicitation [F] Fix Findings [P] Party Mode [C] Continue" - -#### Menu Handling Logic: - -- IF A: Execute {advancedElicitationTask}, and when finished redisplay the menu -- IF F: Apply auto-fixes to {builtYaml} for identified issues, then redisplay the menu -- IF P: Execute {partyModeWorkflow}, and when finished redisplay the menu -- IF C: Proceed to next validation step, update frontmatter, then only then load, read entire file, then execute {nextStepFile} -- IF Any other comments or queries: help user respond then [Redisplay Menu Options](#5-present-menu-options) - -#### EXECUTION RULES: - -- ALWAYS halt and wait for user input after presenting menu -- ONLY proceed to next step when user selects 'C' -- After other menu items execution, return to this menu -- User can chat or ask questions - always respond and then end with display again of the menu options - -## CONTEXT BOUNDARIES - -**IN SCOPE:** -- Persona section of agent.yaml (role, tone, expertise, principles, constraints) -- Referencing personaProperties.md and principlesCrafting.md -- Evaluating persona clarity, specificity, and consistency -- Checking alignment between persona elements - -**OUT OF SCOPE:** -- Metadata fields (handled in step-07b) -- Menu items (handled in step-07d) -- System architecture (handled in step-07e) -- Technical implementation details - -**DO NOT:** -- Validate metadata properties in this step -- Question the agent's core purpose (that's for earlier steps) -- Suggest additional menu items -- Modify fields beyond persona - -## CRITICAL STEP COMPLETION NOTE - -ONLY WHEN [C continue option] is selected and [validation complete with any findings addressed], will you then load and read fully `{nextStepFile}` to execute and begin [menu validation]. - -## SUCCESS METRICS - -✓ **Complete Success:** All checks pass, persona is well-defined and consistent -✓ **Partial Success:** Failures fixed via [F] option, warnings acknowledged -✓ **Failure:** Blocking failures remain when user selects [C] - -**CRITICAL:** A weak or generic persona is a blocking issue that should be fixed before proceeding. diff --git a/src/modules/bmb/workflows/agent/steps-c/step-08d-menu-validation.md b/src/modules/bmb/workflows/agent/steps-c/step-08d-menu-validation.md deleted file mode 100644 index 0284cea9..00000000 --- a/src/modules/bmb/workflows/agent/steps-c/step-08d-menu-validation.md +++ /dev/null @@ -1,175 +0,0 @@ ---- -name: 'step-07d-menu-validation' -description: 'Validate menu items and patterns' - -# File References -nextStepFile: './step-08e-structure-validation.md' -agentMenuPatterns: ../data/agent-menu-patterns.md -builtYaml: '{bmb_creations_output_folder}/{agent-name}/{agent-name}.agent.yaml' - -# Task References -advancedElicitationTask: '{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml' -partyModeWorkflow: '{project-root}/_bmad/core/workflows/party-mode/workflow.md' ---- - -# STEP GOAL - -Validate that the agent's menu (commands/tools) follows BMAD patterns, is well-structured, properly documented, and aligns with the agent's persona and purpose. - -## MANDATORY EXECUTION RULES - -- **NEVER skip validation checks** - All menu items must be verified -- **ALWAYS load the reference document** - agentMenuPatterns.md -- **NEVER modify files without user approval** - Report findings first, await menu selection -- **ALWAYS use absolute paths** when referencing files -- **CRITICAL:** This is a validation step, not an editing step - -## EXECUTION PROTOCOLS - -### Protocol 1: Load and Compare -1. Read the menu patterns reference from `{agentMenuPatterns}` -2. Read the built agent YAML from `{builtYaml}` -3. Extract the menu/commands section from the builtYaml -4. Compare actual menu against validation rules - -### Protocol 2: Validation Checks -Perform these checks systematically: - -1. **Menu Structure** - - [ ] Menu section exists and is properly formatted - - [ ] At least one menu item defined (unless intentionally tool-less) - - [ ] Menu items follow proper YAML structure - - [ ] Each item has required fields (name, description, pattern) - -2. **Menu Item Requirements** - For each menu item: - - [ ] name: Present, unique, uses kebab-case - - [ ] description: Clear and concise - - [ ] pattern: Valid regex pattern or tool reference - - [ ] scope: Appropriate scope defined (if applicable) - -3. **Pattern Quality** - - [ ] Patterns are valid and testable - - [ ] Patterns are specific enough to match intended inputs - - [ ] Patterns are not overly restrictive - - [ ] Patterns use appropriate regex syntax - -4. **Description Quality** - - [ ] Each item has clear description - - [ ] Descriptions explain what the item does - - [ ] Descriptions are consistent in style - - [ ] Descriptions help users understand when to use - -5. **Alignment Checks** - - [ ] Menu items align with agent's role/purpose - - [ ] Menu items are supported by agent's expertise - - [ ] Menu items fit within agent's constraints - - [ ] Menu items are appropriate for target users - -6. **Completeness** - - [ ] Core capabilities for this role are covered - - [ ] No obvious missing functionality - - [ ] Menu scope is appropriate (not too sparse/overloaded) - - [ ] Related functionality is grouped logically - -7. **Standards Compliance** - - [ ] No prohibited patterns or commands - - [ ] No security vulnerabilities in patterns - - [ ] No ambiguous or conflicting items - - [ ] Consistent naming conventions - -8. **Menu Link Validation (Agent Type Specific)** - - [ ] Determine agent type: Simple (no sidecar), Expert (hasSidecar: true), or Module agent - - [ ] For Expert agents (hasSidecar: true): - - Menu handlers SHOULD reference external sidecar files (e.g., `./{agent-name}-sidecar/...`) - - OR have inline prompts defined directly in the handler - - [ ] For Module agents (module property is a code like 'bmm', 'bmb', etc.): - - Menu handlers SHOULD reference external module files under the module path - - Exec paths must start with `{project-root}/_bmad/{module}/...` - - Referenced files must exist under the module directory - - [ ] For Simple agents (stand-alone module, no sidecar): - - Menu handlers MUST NOT have external file links - - Menu handlers SHOULD only use relative links within the same file (e.g., `#section-name`) - - OR have inline prompts defined directly in the handler - -### Protocol 3: Report Findings -Organize your report into three sections: - -**PASSING CHECKS** (List what passed) -``` -✓ Menu structure properly formatted -✓ 5 menu items defined, all with required fields -✓ All patterns are valid regex -✓ Menu items align with agent role -``` - -**WARNINGS** (Non-blocking issues) -``` -⚠ Item "analyze-data" description is vague -⚠ No menu item for [common capability X] -⚠ Pattern for "custom-command" very broad, may over-match -``` - -**FAILURES** (Blocking issues that must be fixed) -``` -✗ Duplicate menu item name: "process" appears twice -✗ Invalid regex pattern: "[unclosed bracket" -✗ Menu item "system-admin" violates security guidelines -✗ No menu items defined for agent type that requires tools -✗ Simple agent has external link in menu handler (should be relative # or inline) -✗ Expert agent with sidecar has no external file links or inline prompts defined -✗ Module agent exec path doesn't start with {project-root}/_bmad/{module}/... -``` - -### Protocol 4: Menu System - -#### 5. Present MENU OPTIONS - -Display: "**Select an Option:** [A] Advanced Elicitation [F] Fix Findings [P] Party Mode [C] Continue" - -#### Menu Handling Logic: - -- IF A: Execute {advancedElicitationTask}, and when finished redisplay the menu -- IF F: Apply auto-fixes to {builtYaml} for identified issues, then redisplay the menu -- IF P: Execute {partyModeWorkflow}, and when finished redisplay the menu -- IF C: Proceed to next validation step, update frontmatter, then only then load, read entire file, then execute {nextStepFile} -- IF Any other comments or queries: help user respond then [Redisplay Menu Options](#5-present-menu-options) - -#### EXECUTION RULES: - -- ALWAYS halt and wait for user input after presenting menu -- ONLY proceed to next step when user selects 'C' -- After other menu items execution, return to this menu -- User can chat or ask questions - always respond and then end with display again of the menu options - -## CONTEXT BOUNDARIES - -**IN SCOPE:** -- Menu/commands section of agent.yaml -- Referencing agentMenuPatterns.md -- Menu structure, patterns, and alignment -- Individual menu item validation - -**OUT OF SCOPE:** -- Metadata fields (handled in step-07b) -- Persona fields (handled in step-07c) -- System architecture (handled in step-07e) -- Workflow/capability implementation (handled in step-07f) - -**DO NOT:** -- Validate metadata or persona in this step -- Suggest entirely new capabilities (that's for earlier steps) -- Question whether menu items are "good enough" qualitatively beyond standards -- Modify fields beyond menu - -## CRITICAL STEP COMPLETION NOTE - -ONLY WHEN [C continue option] is selected and [validation complete with any findings addressed], will you then load and read fully `{nextStepFile}` to execute and begin [structure validation]. - -## SUCCESS METRICS - -✓ **Complete Success:** All checks pass, menu is well-structured and aligned -✓ **Partial Success:** Failures fixed via [F] option, warnings acknowledged -✓ **Failure:** Blocking failures remain when user selects [C] - -**CRITICAL:** Invalid regex patterns or security vulnerabilities in menu items are blocking issues. diff --git a/src/modules/bmb/workflows/agent/steps-c/step-08e-structure-validation.md b/src/modules/bmb/workflows/agent/steps-c/step-08e-structure-validation.md deleted file mode 100644 index 94ff4d45..00000000 --- a/src/modules/bmb/workflows/agent/steps-c/step-08e-structure-validation.md +++ /dev/null @@ -1,308 +0,0 @@ ---- -name: 'step-07e-structure-validation' -description: 'Validate YAML structure and completeness' - -# File References -# Routes to 8F if Expert, else to 9 -nextStepFileExpert: './step-08f-sidecar-validation.md' -nextStepFileSimple: './step-09-celebrate.md' -simpleValidation: ../data/simple-agent-validation.md -expertValidation: ../data/expert-agent-validation.md -agentCompilation: ../data/agent-compilation.md -builtYaml: '{bmb_creations_output_folder}/{agent-name}/{agent-name}.agent.yaml' - -# Task References -advancedElicitationTask: '{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml' -partyModeWorkflow: '{project-root}/_bmad/core/workflows/party-mode/workflow.md' ---- - -# STEP GOAL - -Validate the built agent YAML file for structural completeness and correctness against the appropriate validation checklist (simple or expert), then route to sidecar validation if needed or proceed to celebration. - -# MANDATORY EXECUTION RULES - -1. **NEVER skip validation** - All agents must pass structural validation before completion -2. **ALWAYS use the correct validation checklist** based on agent type (simple vs expert) -3. **NEVER auto-fix without user consent** - Report issues and ask for permission -4. **ALWAYS check hasSidecar flag** before determining next step routing -5. **MUST load and parse the actual built YAML** - Not just show it, but validate it -6. **ALWAYS provide clear, actionable feedback** for any validation failures - -# EXECUTION PROTOCOLS - -## Context Awareness - -- User is in the final validation phase -- Agent has been built and written to disk -- This is the "quality gate" before completion -- User expects thorough but fair validation -- Route depends on agent type (expert vs simple) - -## User Expectations - -- Clear validation results with specific issues identified -- Line-number references for YAML problems -- Option to fix issues or continue (if minor) -- Logical routing based on agent type -- Professional, constructive feedback tone - -## Tone and Style - -- Professional and thorough -- Constructive, not pedantic -- Clear prioritization of issues (critical vs optional) -- Encouraging when validation passes -- Actionable when issues are found - -# CONTEXT BOUNDARIES - -## What to Validate - -- YAML syntax and structure -- Required frontmatter fields presence -- Required sections completeness -- Field format correctness -- Path validity (for references) -- Agent type consistency (simple vs expert requirements) - -## What NOT to Validate - -- Artistic choices in descriptions -- Persona writing style -- Command naming creativity -- Feature scope decisions - -## When to Escalate - -- Critical structural errors that break agent loading -- Missing required fields -- YAML syntax errors preventing file parsing -- Path references that don't exist - -## MANDATORY SEQUENCE - -**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change. - -## 1. Load Validation Context - -```bash -# Load the appropriate validation checklist based on agent type -if agentType == "expert": - validationFile = expertValidation -else: - validationFile = simpleValidation - -# Load the built agent YAML -builtAgent = read(builtYaml) - -# Load compilation rules for reference -compilationRules = read(agentCompilation) -``` - -**Action:** Present a brief status message: -``` -🔍 LOADING VALIDATION FRAMEWORK - Agent Type: {detected type} - Validation Standard: {simple|expert} - Built File: {builtYaml path} -``` - -## 2. Execute Structural Validation - -Run systematic checks against the validation checklist: - -### A. YAML Syntax Validation -- Parse YAML without errors -- Check indentation consistency -- Validate proper escaping of special characters -- Verify no duplicate keys - -### B. Frontmatter Validation -- All required fields present -- Field values correct type (string, boolean, array) -- No empty required fields -- Proper array formatting - -### C. Section Completeness -- All required sections present (based on agent type) -- Sections not empty unless explicitly optional -- Proper markdown heading hierarchy - -### D. Field-Level Validation -- Path references exist and are valid -- Boolean fields are actual booleans (not strings) -- Array fields properly formatted -- No malformed YAML structures - -### E. Agent Type Specific Checks - -**For Simple Agents:** -- No sidecar requirements -- Basic fields complete -- No advanced configuration - -**For Expert Agents:** -- Sidecar flag set correctly -- Sidecar folder path specified -- All expert fields present -- Advanced features properly configured - -## 3. Generate Validation Report - -Present findings in structured format: - -```markdown -# 🎯 STRUCTURAL VALIDATION REPORT - -## Agent: {agent-name} -Type: {simple|expert} -File: {builtYaml} - ---- - -## ✅ PASSED CHECKS ({count}) -{List of all validations that passed} - -## ⚠️ ISSUES FOUND ({count}) -{If any issues, list each with:} -### Issue #{number}: {type} -**Severity:** [CRITICAL|MODERATE|MINOR] -**Location:** Line {line} or Section {section} -**Problem:** {clear description} -**Impact:** {what this breaks} -**Suggested Fix:** {specific action} - ---- - -## 📊 VALIDATION SUMMARY -**Overall Status:** [PASSED|FAILED|CONDITIONAL] -**Critical Issues:** {count} -**Moderate Issues:** {count} -**Minor Issues:** {count} -**Can Load Safely:** [YES|NO] - ---- - -{If PASSED} -## 🎉 VALIDATION SUCCESSFUL -Your agent YAML is structurally sound and ready for use! -All required fields present and correctly formatted. - -{If ISSUES FOUND} -## 🔧 RECOMMENDED ACTIONS -1. Address critical issues first -2. Review moderate issues -3. Minor issues can be deferred -``` - -## 4. Present MENU OPTIONS - -Display: "**Select an Option:** [A] Advanced Elicitation [F] Fix Findings [P] Party Mode [C] Continue" - -### Menu Handling Logic: - -- IF A: Execute {advancedElicitationTask}, and when finished redisplay the menu -- IF F: Apply auto-fixes to {builtYaml} for identified issues, then redisplay the menu -- IF P: Execute {partyModeWorkflow}, and when finished redisplay the menu -- IF C: Proceed to next validation step, update frontmatter, then only then load, read entire file, then execute {nextStepFileExpert} or {nextStepFileSimple} -- IF Any other comments or queries: help user respond then [Redisplay Menu Options](#4-present-menu-options) - -### EXECUTION RULES: - -- ALWAYS halt and wait for user input after presenting menu -- ONLY proceed to next step when user selects 'C' -- After other menu items execution, return to this menu -- User can chat or ask questions - always respond and then end with display again of the menu options - -If [F] selected: Work through issues systematically -- Load specific section needing fix -- Present current state -- Apply auto-fixes or guide user through corrections -- Re-validate after each fix -- Confirm resolution and re-present menu - -If [C] selected: -- Warn about implications if issues exist -- Get explicit confirmation if critical issues -- Document acceptance of issues -- Proceed to routing - -## 5. Route to Next Step - -After validation passes or user chooses to continue: - -### Check Agent Type and Route - -```yaml -# Check for sidecar requirement -hasSidecar = checkBuiltYamlForSidecarFlag() - -if hasSidecar == true: - # Expert agent with sidecar - nextStep = nextStepFileExpert - routeMessage = """ - 📦 Expert agent detected with sidecar configuration. - → Proceeding to sidecar validation (Step 7F) - """ -else: - # Simple agent or expert without sidecar - nextStep = nextStepFileSimple - routeMessage = """ - ✅ Simple agent validation complete. - → Proceeding to celebration (Step 8) - """ -``` - -**Action:** Present routing decision and transition: -```markdown -# 🚀 VALIDATION COMPLETE - ROUTING DECISION - -{routeMessage} - -**Next Step:** {nextStep filename} -**Reason:** Agent type {simple|expert} with sidecar={hasSidecar} - -Press [Enter] to continue to {next step description}... -``` - -# CRITICAL STEP COMPLETION NOTE - -ONLY WHEN [C continue option] is selected and [validation complete with any findings addressed], will you then load and read fully `{nextStepFileExpert}` or `{nextStepFileSimple}` to execute and begin [sidecar validation or celebration]. - -**BEFORE proceeding to next step:** - -1. ✅ Validation checklist executed completely -2. ✅ All critical issues resolved or explicitly accepted -3. ✅ User informed of routing decision -4. ✅ Next step file path determined correctly -5. ⚠️ **CRITICAL:** For expert agents, verify hasSidecar is TRUE before routing to 7F -6. ⚠️ **CRITICAL:** For simple agents, verify hasSidecar is FALSE before routing to 8 - -**DO NOT PROCEED IF:** -- YAML has critical syntax errors preventing loading -- User has not acknowledged validation results -- Routing logic is unclear or conflicting - -# SUCCESS METRICS - -## Step Complete When: -- [ ] Validation report generated and presented -- [ ] User has reviewed findings -- [ ] Critical issues resolved or accepted -- [ ] Routing decision communicated and confirmed -- [ ] Next step path verified and ready - -## Quality Indicators: -- Validation thoroughness (all checklist items covered) -- Issue identification clarity and specificity -- User satisfaction with resolution process -- Correct routing logic applied -- Clear transition to next step - -## Failure Modes: -- Skipping validation checks -- Auto-fixing without permission -- Incorrect routing (simple→7F or expert→8 with sidecar) -- Unclear or missing validation report -- Proceeding with critical YAML errors diff --git a/src/modules/bmb/workflows/agent/steps-c/step-08f-sidecar-validation.md b/src/modules/bmb/workflows/agent/steps-c/step-08f-sidecar-validation.md deleted file mode 100644 index 30ab330c..00000000 --- a/src/modules/bmb/workflows/agent/steps-c/step-08f-sidecar-validation.md +++ /dev/null @@ -1,464 +0,0 @@ ---- -name: 'step-07f-sidecar-validation' -description: 'Validate sidecar structure and paths' - -# File References -nextStepFile: './step-09-celebrate.md' -criticalActions: ../data/critical-actions.md -builtYaml: '{bmb_creations_output_folder}/{agent-name}/{agent-name}.agent.yaml' -sidecarFolder: '{bmb_creations_output_folder}/{agent-name}/{agent-name}-sidecar/' - -# Task References -advancedElicitationTask: '{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml' -partyModeWorkflow: '{project-root}/_bmad/core/workflows/party-mode/workflow.md' ---- -# STEP GOAL - -Validate the sidecar folder structure and referenced paths for Expert agents to ensure all sidecar files exist, are properly structured, and paths in the main agent YAML correctly reference them. - -# MANDATORY EXECUTION RULES - -1. **ONLY runs for Expert agents** - Simple agents should never reach this step -2. **MUST verify sidecar folder exists** before proceeding -3. **ALWAYS cross-reference YAML paths** with actual files -4. **NEVER create missing sidecar files** - Report issues, don't auto-fix -5. **MUST validate sidecar file structure** for completeness -6. **ALWAYS check critical actions file** if referenced -7. **PROVIDE clear remediation steps** for any missing or malformed files - -# EXECUTION PROTOCOLS - -## Context Awareness - -- User has an Expert agent with sidecar configuration -- Structural validation (7E) already passed -- Sidecar folder should have been created during build -- This is the final validation before celebration -- Missing sidecar components may break agent functionality - -## User Expectations - -- Comprehensive sidecar structure validation -- Clear identification of missing files -- Path reference verification -- Actionable remediation guidance -- Professional but approachable tone - -## Tone and Style - -- Thorough and systematic -- Clear and specific about issues -- Solution-oriented (focus on how to fix) -- Encouraging when sidecar is complete -- Not pedantic about minor formatting issues - -# CONTEXT BOUNDARIES - -## What to Validate - -- Sidecar folder existence and location -- All referenced files exist in sidecar -- Sidecar file structure completeness -- Path references in main YAML accuracy -- Critical actions file if referenced -- File naming conventions -- File content completeness (not empty) - -## What NOT to Validate - -- Content quality of sidecar files -- Artistic choices in sidecar documentation -- Optional sidecar components -- File formatting preferences - -## When to Escalate - -- Sidecar folder completely missing -- Critical files missing (actions, core modules) -- Path references pointing to non-existent files -- Empty sidecar files that should have content - -## MANDATORY SEQUENCE - -**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change. - -## 1. Load Sidecar Context - -```bash -# Verify main agent YAML exists -agentYaml = read(builtYaml) - -# Extract sidecar path from YAML or use template default -sidecarPath = extractSidecarPath(agentYaml) or sidecarFolder - -# Check if sidecar folder exists -sidecarExists = directoryExists(sidecarPath) - -# Load critical actions reference if needed -criticalActionsRef = read(criticalActions) -``` - -**Action:** Present discovery status: -```markdown -🔍 SIDECAR VALIDATION INITIALIZED - -Agent: {agent-name} -Type: Expert (requires sidecar) - -Main YAML: {builtYaml} -Sidecar Path: {sidecarPath} - -Status: {✅ Folder Found | ❌ Folder Missing} -``` - -## 2. Validate Sidecar Structure - -### A. Folder Existence Check - -```markdown -## 📁 FOLDER STRUCTURE VALIDATION - -**Sidecar Location:** {sidecarPath} -**Status:** [EXISTS | MISSING | WRONG LOCATION] -``` - -If missing: -```markdown -❌ **CRITICAL ISSUE:** Sidecar folder not found! - -**Expected Location:** {sidecarPath} - -**Possible Causes:** -1. Build process didn't create sidecar -2. Sidecar path misconfigured in agent YAML -3. Folder moved or deleted after build - -**Required Action:** -[ ] Re-run build process with sidecar enabled -[ ] Verify sidecar configuration in agent YAML -[ ] Check folder was created in correct location -``` - -### B. Sidecar File Inventory - -If folder exists, list all files: -```bash -sidecarFiles = listFiles(sidecarPath) -``` - -```markdown -## 📄 SIDECAR FILE INVENTORY - -Found {count} files in sidecar: - -{For each file:} -- {filename} ({size} bytes) -``` - -### C. Cross-Reference Validation - -Extract all sidecar path references from agent YAML: -```yaml -# Common sidecar reference patterns -sidecar: - critical-actions: './{agent-name}-sidecar/critical-actions.md' - modules: - - path: './{agent-name}-sidecar/modules/module-01.md' -``` - -Validate each reference: -```markdown -## 🔗 PATH REFERENCE VALIDATION - -**Checked {count} references from agent YAML:** - -{For each reference:} -**Source:** {field in agent YAML} -**Expected Path:** {referenced path} -**Status:** [✅ Found | ❌ Missing | ⚠️ Wrong Location] -``` - -## 3. Validate Sidecar File Contents - -For each sidecar file found, check: - -### A. File Completeness -```markdown -## 📋 FILE CONTENT VALIDATION - -{For each file:} -### {filename} -**Size:** {bytes} -**Status:** [✅ Complete | ⚠️ Empty | ❌ Too Small] -**Last Modified:** {timestamp} -``` - -### B. Critical Actions File (if present) - -Special validation for critical-actions.md: -```markdown -## 🎯 CRITICAL ACTIONS VALIDATION - -**File:** {sidecarPath}/critical-actions.md -**Status:** [PRESENT | MISSING | EMPTY] - -{If Present:} -**Sections Found:** -{List sections detected} - -**Completeness:** -[ ] Header/metadata present -[ ] Actions defined -[ ] No critical sections missing -``` - -### C. Module Files (if present) - -If sidecar contains modules: -```markdown -## 📚 MODULE VALIDATION - -**Modules Found:** {count} - -{For each module:} -### {module-filename} -**Status:** [✅ Valid | ⚠️ Issues Found] -**Checks:** -[ ] Frontmatter complete -[ ] Content present -[ ] References valid -``` - -## 4. Generate Validation Report - -```markdown -# 🎯 SIDECAR VALIDATION REPORT - -## Agent: {agent-name} -Sidecar Path: {sidecarPath} -Validation Date: {timestamp} - ---- - -## ✅ VALIDATION CHECKS PASSED - -**Folder Structure:** -- [x] Sidecar folder exists -- [x] Located at expected path -- [x] Accessible and readable - -**File Completeness:** -- [x] All referenced files present -- [x] No broken path references -- [x] Files have content (not empty) - -**Content Quality:** -- [x] Critical actions complete -- [x] Module files structured -- [x] No obvious corruption - ---- - -## ⚠️ ISSUES IDENTIFIED ({count}) - -{If issues:} -### Issue #{number}: {issue type} -**Severity:** [CRITICAL|MODERATE|MINOR] -**Component:** {file or folder} -**Problem:** {clear description} -**Impact:** {what this breaks} -**Remediation:** -1. {specific step 1} -2. {specific step 2} -3. {specific step 3} - -{If no issues:} -### 🎉 NO ISSUES FOUND -Your agent's sidecar is complete and properly structured! -All path references are valid and files are in place. - ---- - -## 📊 SUMMARY - -**Overall Status:** [PASSED|FAILED|CONDITIONAL] -**Files Validated:** {count} -**Issues Found:** {count} -**Critical Issues:** {count} -**Sidecar Ready:** [YES|NO] - ---- - -## 5. Present MENU OPTIONS - -Display: "**Select an Option:** [A] Advanced Elicitation [F] Fix Findings [P] Party Mode [C] Continue" - -### Menu Handling Logic: - -- IF A: Execute {advancedElicitationTask}, and when finished redisplay the menu -- IF F: Apply auto-fixes to {builtYaml} or sidecar files for identified issues, then redisplay the menu -- IF P: Execute {partyModeWorkflow}, and when finished redisplay the menu -- IF C: Proceed to celebration step, update frontmatter, then only then load, read entire file, then execute {nextStepFile} -- IF Any other comments or queries: help user respond then [Redisplay Menu Options](#5-present-menu-options) - -### EXECUTION RULES: - -- ALWAYS halt and wait for user input after presenting menu -- ONLY proceed to next step when user selects 'C' -- After other menu items execution, return to this menu -- User can chat or ask questions - always respond and then end with display again of the menu options - -## 6. Issue Resolution (if [F] selected) - -Work through each issue systematically: - -**For Missing Files:** -```markdown -### 🔧 FIXING: Missing {filename} - -**Required File:** {path} -**Purpose:** {why it's needed} - -**Option 1:** Re-run Build -- Sidecar may not have been created completely -- Return to build step and re-execute - -**Option 2:** Manual Creation -- Create file at: {full path} -- Use template from: {template reference} -- Minimum required content: {specification} - -**Option 3:** Update References -- Remove reference from agent YAML if not truly needed -- Update path if file exists in different location - -Which option? [1/2/3]: -``` - -**For Broken Path References:** -```markdown -### 🔧 FIXING: Invalid Path Reference - -**Reference Location:** {agent YAML field} -**Current Path:** {incorrect path} -**Expected File:** {filename} -**Actual Location:** {where file actually is} - -**Fix Options:** -1. Update path in agent YAML to: {correct path} -2. Move file to expected location: {expected path} -3. Remove reference if file not needed - -Which option? [1/2/3]: -``` - -**For Empty/Malformed Files:** -```markdown -### 🔧 FIXING: {filename} - {Issue} - -**Problem:** {empty/too small/malformed} -**Location:** {full path} - -**Remediation:** -- View current content -- Compare to template/standard -- Add missing sections -- Correct formatting - -Ready to view and fix? [Y/N]: -``` - -After each fix: -- Re-validate the specific component -- Confirm resolution -- Move to next issue -- Final re-validation when all complete - -## 6. Route to Celebration - -When validation passes or user chooses to continue: - -```markdown -# 🚀 SIDECAR VALIDATION COMPLETE - -## Expert Agent: {agent-name} - -✅ **Sidecar Structure:** Validated -✅ **Path References:** All correct -✅ **File Contents:** Complete - ---- - -## 🎯 READY FOR CELEBRATION - -Your Expert agent with sidecar is fully validated and ready! - -**Next Step:** Celebration (Step 8) -**Final Status:** All checks passed - -Press [Enter] to proceed to celebration... -``` - -# CRITICAL STEP COMPLETION NOTE - -ONLY WHEN [C continue option] is selected and [validation complete with any findings addressed], will you then load and read fully `{nextStepFile}` to execute and begin [celebration]. - -**BEFORE proceeding to Step 8:** - -1. ✅ Sidecar folder exists and is accessible -2. ✅ All referenced files present -3. ✅ Path references validated -4. ✅ File contents checked for completeness -5. ✅ User informed of validation status -6. ✅ Issues resolved or explicitly accepted -7. ⚠️ **CRITICAL:** Only Expert agents should reach this step -8. ⚠️ **CRITICAL:** Sidecar must be complete for agent to function - -**DO NOT PROCEED IF:** -- Sidecar folder completely missing -- Critical files absent (actions, core modules) -- User unaware of sidecar issues -- Validation not completed - -# SUCCESS METRICS - -## Step Complete When: -- [ ] Sidecar folder validated -- [ ] All path references checked -- [ ] File contents verified -- [ ] Validation report presented -- [ ] Issues resolved or accepted -- [ ] User ready to proceed - -## Quality Indicators: -- Thoroughness of file inventory -- Accuracy of path reference validation -- Clarity of issue identification -- Actionability of remediation steps -- User confidence in sidecar completeness - -## Failure Modes: -- Missing sidecar folder completely -- Skipping file existence checks -- Not validating path references -- Proceeding with critical files missing -- Unclear validation report -- Not providing remediation guidance - ---- - -## 🎓 NOTE: Expert Agent Sidecars - -Sidecars are what make Expert agents powerful. They enable: -- Modular architecture -- Separation of concerns -- Easier updates and maintenance -- Shared components across agents - -A validated sidecar ensures your Expert agent will: -- Load correctly at runtime -- Find all referenced resources -- Execute critical actions as defined -- Provide the advanced capabilities designed - -Take the time to validate thoroughly - it pays off in agent reliability! diff --git a/src/modules/bmb/workflows/agent/steps-e/e-01-load-existing.md b/src/modules/bmb/workflows/agent/steps-e/e-01-load-existing.md index ae4b4227..15444a2c 100644 --- a/src/modules/bmb/workflows/agent/steps-e/e-01-load-existing.md +++ b/src/modules/bmb/workflows/agent/steps-e/e-01-load-existing.md @@ -88,9 +88,8 @@ If a module agent also hasSidecar: true - this means it is a modules expert agen # Basic Metadata - name: {agent-name} - description: {agent-description} -- type: {simple|expert|module} +- module: {stand-alone|bmm|cis|bmgd|custom} - hasSidecar: {true|false} -- version: {version} # Persona - persona: {full persona text} @@ -113,7 +112,7 @@ If a module agent also hasSidecar: true - this means it is a modules expert agen ```markdown ## Agent Analysis: {agent-name} -**Type:** {simple|expert|module} +**Type:** {simple|expert|module} (derived from module + hasSidecar) **Status:** ready-for-edit ### Current Structure: diff --git a/src/modules/bmb/workflows/agent/steps-e/e-07-activation.md b/src/modules/bmb/workflows/agent/steps-e/e-07-activation.md index 71b0b1d9..c731d00c 100644 --- a/src/modules/bmb/workflows/agent/steps-e/e-07-activation.md +++ b/src/modules/bmb/workflows/agent/steps-e/e-07-activation.md @@ -58,12 +58,13 @@ If user wants to add/modify critical_actions: ### 3. Determine Routing -Check `{editPlan}` metadataEdits.typeConversion.to or current agentType: +Check `{editPlan}` for agent metadata (module and hasSidecar): ```yaml -agentType: simple → route to e-08a-edit-simple.md -agentType: expert → route to e-08b-edit-expert.md -agentType: module → route to e-08c-edit-module.md +# Determine agent type from module + hasSidecar combination +module ≠ "stand-alone" → route to e-08c-edit-module.md +module = "stand-alone" + hasSidecar: true → route to e-08b-edit-expert.md +module = "stand-alone" + hasSidecar: false → route to e-08a-edit-simple.md ``` ### 4. Document to Edit Plan @@ -77,7 +78,7 @@ activationEdits: modifications: [] routing: destinationEdit: {e-08a|e-08b|e-08c} - targetType: {simple|expert|module} + sourceType: {simple|expert|module} # Derived from module + hasSidecar ``` ### 5. Present MENU OPTIONS @@ -88,7 +89,7 @@ Display: "**Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Cont - IF A: Execute {advancedElicitationTask}, and when finished redisplay the menu - IF P: Execute {partyModeWorkflow}, and when finished redisplay the menu -- IF C: Save to {editPlan}, determine routing based on targetType, then only then load and execute the appropriate type-specific edit step +- IF C: Save to {editPlan}, determine routing based on module + hasSidecar, then only then load and execute the appropriate type-specific edit step - IF Any other comments or queries: help user respond then [Redisplay Menu Options](#5-present-menu-options) #### EXECUTION RULES: @@ -101,9 +102,9 @@ Display: "**Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Cont This is the **ROUTING HUB** for edit flow. ONLY WHEN [C continue option] is selected and [routing determined], load and execute the appropriate type-specific edit step: -- targetType: simple → e-08a-edit-simple.md -- targetType: expert → e-08b-edit-expert.md -- targetType: module → e-08c-edit-module.md +- module ≠ "stand-alone" → e-08c-edit-module.md (Module agent) +- module = "stand-alone" + hasSidecar: true → e-08b-edit-expert.md (Expert agent) +- module = "stand-alone" + hasSidecar: false → e-08a-edit-simple.md (Simple agent) --- diff --git a/src/modules/bmb/workflows/agent/steps-e/e-08a-edit-simple.md b/src/modules/bmb/workflows/agent/steps-e/e-08a-edit-simple.md index c7e66868..6b0ac608 100644 --- a/src/modules/bmb/workflows/agent/steps-e/e-08a-edit-simple.md +++ b/src/modules/bmb/workflows/agent/steps-e/e-08a-edit-simple.md @@ -2,7 +2,7 @@ name: 'e-08a-edit-simple' description: 'Apply edits to Simple agent' -nextStepFile: './e-09a-validate-metadata.md' +nextStepFile: './e-09-celebrate.md' editPlan: '{bmb_creations_output_folder}/edit-plan-{agent-name}.md' agentFile: '{original-agent-path}' agentBackup: '{original-agent-path}.backup' @@ -76,9 +76,10 @@ Confirm: "Backup created at: `{agentBackup}`" For each planned edit: -**Type Conversion:** -- Update `type:` field if converting -- Add/remove type-specific fields +**Type Conversion (Simple ← Expert/Module):** +- Converting TO Simple: Remove `metadata.sidecar-folder`, remove all sidecar references +- Set `module: stand-alone` and `hasSidecar: false` +- Remove type-specific fields from source type **Metadata Edits:** - Apply each field change from metadataEdits diff --git a/src/modules/bmb/workflows/agent/steps-e/e-08b-edit-expert.md b/src/modules/bmb/workflows/agent/steps-e/e-08b-edit-expert.md index 662a1f2f..2888b16a 100644 --- a/src/modules/bmb/workflows/agent/steps-e/e-08b-edit-expert.md +++ b/src/modules/bmb/workflows/agent/steps-e/e-08b-edit-expert.md @@ -2,7 +2,7 @@ name: 'e-08b-edit-expert' description: 'Apply edits to Expert agent' -nextStepFile: './e-09a-validate-metadata.md' +nextStepFile: './e-09-celebrate.md' editPlan: '{bmb_creations_output_folder}/edit-plan-{agent-name}.md' agentFile: '{original-agent-path}' agentBackup: '{original-agent-path}.backup' @@ -72,10 +72,10 @@ ALWAYS backup before editing: ### 4. Apply Edits in Sequence -**Type Conversion to Expert:** -- Update `type: expert` +**Type Conversion TO Expert:** +- Set `module: stand-alone` and `hasSidecar: true` - Add `metadata.sidecar-folder` if not present -- Create sidecar directory: `mkdir -p {project-root}/_bmad/_memory/{sidecar-folder}/` +- Create sidecar directory next to agent.yaml: `{agent-folder}/{agent-name}-sidecar/` **Sidecar Management:** - If changing sidecar-folder: update all critical_actions references diff --git a/src/modules/bmb/workflows/agent/steps-e/e-08c-edit-module.md b/src/modules/bmb/workflows/agent/steps-e/e-08c-edit-module.md index 25317322..87f1ef48 100644 --- a/src/modules/bmb/workflows/agent/steps-e/e-08c-edit-module.md +++ b/src/modules/bmb/workflows/agent/steps-e/e-08c-edit-module.md @@ -2,7 +2,7 @@ name: 'e-08c-edit-module' description: 'Apply edits to Module agent' -nextStepFile: './e-09a-validate-metadata.md' +nextStepFile: './e-09-celebrate.md' editPlan: '{bmb_creations_output_folder}/edit-plan-{agent-name}.md' agentFile: '{original-agent-path}' agentBackup: '{original-agent-path}.backup' @@ -72,9 +72,10 @@ ALWAYS backup before editing: ### 4. Apply Edits in Sequence -**Type Conversion to Module:** -- Update `type: module` +**Type Conversion TO Module:** +- Set `module` to module code (e.g., `bmm`, `cis`, `bmgd`, or custom) - Add workflow integration paths +- Optionally set `hasSidecar: true` if complex multi-workflow module **Workflow Path Management:** - Add: `skills: - workflow: {path}` diff --git a/src/modules/bmb/workflows/agent/steps-e/e-10-celebrate.md b/src/modules/bmb/workflows/agent/steps-e/e-09-celebrate.md similarity index 81% rename from src/modules/bmb/workflows/agent/steps-e/e-10-celebrate.md rename to src/modules/bmb/workflows/agent/steps-e/e-09-celebrate.md index 0ef0b983..e7e935cd 100644 --- a/src/modules/bmb/workflows/agent/steps-e/e-10-celebrate.md +++ b/src/modules/bmb/workflows/agent/steps-e/e-09-celebrate.md @@ -1,14 +1,15 @@ --- -name: 'e-10-celebrate' +name: 'e-09-celebrate' description: 'Celebrate successful agent edit completion' editPlan: '{bmb_creations_output_folder}/edit-plan-{agent-name}.md' advancedElicitationTask: '{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml' partyModeWorkflow: '{project-root}/_bmad/core/workflows/party-mode/workflow.md' +validationWorkflow: '{project-root}/src/modules/bmb/workflows/agent/steps-v/v-01-load-review.md' --- -# Edit Step 10: Celebration +# Edit Step 9: Celebration ## STEP GOAL: @@ -112,24 +113,26 @@ Append to editPlan: ### 6. Present MENU OPTIONS -Display: "**Select an Option:** [A] Advanced Elicitation [P] Party Mode [X] Exit Workflow" +Display: "**✅ Agent Edit Complete! Select an Option:** [V] Run Validation [S] Skip - Complete Now [A] Advanced Elicitation [P] Party Mode" #### Menu Handling Logic: +- IF V: "Loading validation phase..." → Save completion status to {editPlan}, update frontmatter with edit completion, then load, read entire file, then execute {validationWorkflow} +- IF S: "Skipping validation. Completing workflow..." → Save completion status to {editPlan} and end workflow gracefully - IF A: Execute {advancedElicitationTask}, and when finished redisplay the menu - IF P: Execute {partyModeWorkflow}, and when finished redisplay the menu -- IF X: Save completion status to {editPlan} and end workflow gracefully - IF Any other comments or queries: help user respond then [Redisplay Menu Options](#6-present-menu-options) #### EXECUTION RULES: - ALWAYS halt and wait for user input after presenting menu -- ONLY complete workflow when user selects 'X' -- After other menu items execution, return to this menu +- User can choose validation (V), skip to complete (S), or use advanced elicitation (A) or party mode (P) +- After other menu items execution (A/P), return to this menu ## CRITICAL STEP COMPLETION NOTE -ONLY WHEN [X exit option] is selected and [completion documented], will the workflow end gracefully with agent edit complete. +ONLY WHEN [S skip option] is selected and [completion documented], will the workflow end gracefully with agent edit complete. +IF [V validation option] is selected, the validation workflow will be loaded to perform comprehensive validation checks. --- diff --git a/src/modules/bmb/workflows/agent/steps-e/e-09a-validate-metadata.md b/src/modules/bmb/workflows/agent/steps-e/e-09a-validate-metadata.md deleted file mode 100644 index bf7bd6eb..00000000 --- a/src/modules/bmb/workflows/agent/steps-e/e-09a-validate-metadata.md +++ /dev/null @@ -1,128 +0,0 @@ ---- -name: 'e-09a-validate-metadata' -description: 'Validate metadata (after edit) - no menu, auto-advance' - -nextStepFile: './e-09b-validate-persona.md' -editPlan: '{bmb_creations_output_folder}/edit-plan-{agent-name}.md' -agentMetadata: ../data/agent-metadata.md -builtYaml: '{bmb_creations_output_folder}/{agent-name}/{agent-name}.agent.yaml' - -advancedElicitationTask: '{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml' -partyModeWorkflow: '{project-root}/_bmad/core/workflows/party-mode/workflow.md' ---- - -# Edit Step 9a: Validate Metadata (After Edit) - -## STEP GOAL - -Validate that the agent's metadata properties (id, name, title, icon, module, hasSidecar, etc.) are properly formatted, complete, and follow BMAD standards as defined in agentMetadata.md. Record findings to editPlan and auto-advance. - -## MANDATORY EXECUTION RULES - -- **NEVER skip validation checks** - All metadata fields must be verified -- **ALWAYS load both reference documents** - agentMetadata.md AND the builtYaml -- **ALWAYS use absolute paths** when referencing files -- **CRITICAL:** Load and validate EVERYTHING specified in the agentMetadata.md file -- **🚫 NO MENU in this step** - record findings and auto-advance -- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` - -## MANDATORY SEQUENCE - -**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change. -1. Read the metadata validation reference from `{agentMetadata}` -2. Read the built agent YAML from `{builtYaml}` -3. Read the edit plan from `{editPlan}` -4. Extract the metadata section from the builtYaml -5. Compare actual metadata against ALL validation rules in agentMetadata.md - -### Protocol 2: Validation Checks - -Perform these checks systematically - validate EVERY rule specified in agentMetadata.md: - -1. **Required Fields Existence** - - [ ] id: Present and non-empty - - [ ] name: Present and non-empty (display name) - - [ ] title: Present and non-empty - - [ ] icon: Present (emoji or symbol) - - [ ] module: Present and valid format - - [ ] hasSidecar: Present (boolean, if applicable) - -2. **Format Validation** - - [ ] id: Uses kebab-case, no spaces, unique identifier - - [ ] name: Clear display name for UI - - [ ] title: Concise functional description - - [ ] icon: Appropriate emoji or unicode symbol - - [ ] module: Either a 3-4 letter module code (e.g., 'bmm', 'bmb') OR 'stand-alone' - - [ ] hasSidecar: Boolean value, matches actual agent structure - -3. **Content Quality** - - [ ] id: Unique and descriptive - - [ ] name: Clear and user-friendly - - [ ] title: Accurately describes agent's function - - [ ] icon: Visually representative of agent's purpose - - [ ] module: Correctly identifies module membership - - [ ] hasSidecar: Correctly indicates if agent uses sidecar files - -4. **Agent Type Consistency** - - [ ] If hasSidecar: true, sidecar folder path must be specified - - [ ] If module is a module code, agent is a module agent - - [ ] If module is 'stand-alone', agent is not part of a module - - [ ] No conflicting type indicators - -5. **Standards Compliance** - - [ ] No prohibited characters in fields - - [ ] No redundant or conflicting information - - [ ] Consistent formatting with other agents - - [ ] All required BMAD metadata fields present - -### Protocol 3: Record Findings - -Organize findings into three sections and append to editPlan frontmatter under `validationAfter.metadata`: - -```yaml -validationAfter: - metadata: - status: [pass|fail|warning] - passing: - - "{check description}" - - "{check description}" - warnings: - - "{non-blocking issue}" - failures: - - "{blocking issue that must be fixed}" -``` - -**PASSING CHECKS** (List what passed) -``` -✓ All required fields present -✓ id follows kebab-case convention -✓ module value is valid -``` - -**WARNINGS** (Non-blocking issues) -``` -⚠ Description is brief -⚠ Only 2 tags provided, 3-7 recommended -``` - -**FAILURES** (Blocking issues that must be fixed) -``` -✗ id field is empty -✗ module value is invalid -✗ hasSidecar is true but no sidecar-folder specified -``` - -### Protocol 4: Auto-Advance - -**🚫 NO MENU PRESENTED** - After recording findings, immediately load and execute `{nextStepFile}` - ---- - -**Auto-advancing to persona validation...** - -## SUCCESS METRICS - -✅ All metadata checks from agentMetadata.md performed -✅ All checks validated against the actual builtYaml -✅ Findings saved to editPlan with detailed status -✅ Auto-advanced to next step diff --git a/src/modules/bmb/workflows/agent/steps-e/e-09b-validate-persona.md b/src/modules/bmb/workflows/agent/steps-e/e-09b-validate-persona.md deleted file mode 100644 index 531f434a..00000000 --- a/src/modules/bmb/workflows/agent/steps-e/e-09b-validate-persona.md +++ /dev/null @@ -1,138 +0,0 @@ ---- -name: 'e-09b-validate-persona' -description: 'Validate persona (after edit) - no menu, auto-advance' - -nextStepFile: './e-09c-validate-menu.md' -editPlan: '{bmb_creations_output_folder}/edit-plan-{agent-name}.md' -personaProperties: ../data/persona-properties.md -principlesCrafting: ../data/principles-crafting.md -builtYaml: '{bmb_creations_output_folder}/{agent-name}/{agent-name}.agent.yaml' - -advancedElicitationTask: '{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml' -partyModeWorkflow: '{project-root}/_bmad/core/workflows/party-mode/workflow.md' ---- - -# Edit Step 9b: Validate Persona (After Edit) - -## STEP GOAL - -Validate that the agent's persona (role, identity, communication_style, principles) is well-defined, consistent, and aligned with its purpose as defined in personaProperties.md and principlesCrafting.md. Record findings to editPlan and auto-advance. - -## MANDATORY EXECUTION RULES - -- **NEVER skip validation checks** - All persona fields must be verified -- **ALWAYS load both reference documents** - personaProperties.md AND principlesCrafting.md -- **ALWAYS load the builtYaml** for actual persona content validation -- **ALWAYS use absolute paths** when referencing files -- **CRITICAL:** Load and validate EVERYTHING specified in the personaProperties.md file -- **🚫 NO MENU in this step** - record findings and auto-advance -- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` - -## MANDATORY SEQUENCE - -**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change. -1. Read the persona validation reference from `{personaProperties}` -2. Read the principles crafting guide from `{principlesCrafting}` -3. Read the built agent YAML from `{builtYaml}` -4. Read the edit plan from `{editPlan}` -5. Extract the persona section from the builtYaml -6. Compare actual persona against ALL validation rules - -### Protocol 2: Validation Checks - -Perform these checks systematically - validate EVERY rule specified in personaProperties.md: - -1. **Required Fields Existence** - - [ ] role: Present, clear, and specific - - [ ] identity: Present and defines who the agent is - - [ ] communication_style: Present and appropriate to role - - [ ] principles: Present as array, not empty (if applicable) - -2. **Content Quality - Role** - - [ ] Role is specific (not generic like "assistant") - - [ ] Role aligns with agent's purpose and menu items - - [ ] Role is achievable within LLM capabilities - - [ ] Role scope is appropriate (not too broad/narrow) - -3. **Content Quality - Identity** - - [ ] Identity clearly defines the agent's character - - [ ] Identity is consistent with the role - - [ ] Identity provides context for behavior - - [ ] Identity is not generic or cliché - -4. **Content Quality - Communication Style** - - [ ] Communication style is clearly defined - - [ ] Style matches the role and target users - - [ ] Style is consistent throughout the definition - - [ ] Style examples or guidance provided if nuanced - - [ ] Style focuses on speech patterns only (not behavior) - -5. **Content Quality - Principles** - - [ ] Principles are actionable (not vague platitudes) - - [ ] Principles guide behavior and decisions - - [ ] Principles are consistent with role - - [ ] 3-7 principles recommended (not overwhelming) - - [ ] Each principle is clear and specific - - [ ] First principle activates expert knowledge domain - -6. **Consistency Checks** - - [ ] Role, identity, communication_style, principles all align - - [ ] No contradictions between principles - - [ ] Persona supports the menu items defined - - [ ] Language and terminology consistent - -### Protocol 3: Record Findings - -Organize findings into three sections and append to editPlan frontmatter under `validationAfter.persona`: - -```yaml -validationAfter: - persona: - status: [pass|fail|warning] - passing: - - "{check description}" - - "{check description}" - warnings: - - "{non-blocking issue}" - failures: - - "{blocking issue that must be fixed}" -``` - -**PASSING CHECKS** (List what passed) -``` -✓ Role is specific and well-defined -✓ Identity clearly articulated and appropriate -✓ Communication style clearly defined -✓ Principles are actionable and clear -✓ First principle activates expert knowledge -``` - -**WARNINGS** (Non-blocking issues) -``` -⚠ Only 2 principles provided, 3-7 recommended for richer guidance -⚠ Communication style could be more specific -⚠ Expertise areas are broad, could be more specific -``` - -**FAILURES** (Blocking issues that must be fixed) -``` -✗ Role is generic ("assistant") - needs specificity -✗ Communication style undefined - creates inconsistent behavior -✗ Principles are vague ("be helpful" - not actionable) -✗ First principle doesn't activate expert knowledge -``` - -### Protocol 4: Auto-Advance - -**🚫 NO MENU PRESENTED** - After recording findings, immediately load and execute `{nextStepFile}` - ---- - -**Auto-advancing to menu validation...** - -## SUCCESS METRICS - -✅ All persona checks from personaProperties.md performed -✅ All checks validated against the actual builtYaml -✅ Findings saved to editPlan with detailed status -✅ Auto-advanced to next step diff --git a/src/modules/bmb/workflows/agent/steps-e/e-09c-validate-menu.md b/src/modules/bmb/workflows/agent/steps-e/e-09c-validate-menu.md deleted file mode 100644 index f46863b1..00000000 --- a/src/modules/bmb/workflows/agent/steps-e/e-09c-validate-menu.md +++ /dev/null @@ -1,163 +0,0 @@ ---- -name: 'e-09c-validate-menu' -description: 'Validate menu structure (after edit) - no menu, auto-advance' - -nextStepFile: './e-09d-validate-structure.md' -editPlan: '{bmb_creations_output_folder}/edit-plan-{agent-name}.md' -agentMenuPatterns: ../data/agent-menu-patterns.md -builtYaml: '{bmb_creations_output_folder}/{agent-name}/{agent-name}.agent.yaml' - -advancedElicitationTask: '{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml' -partyModeWorkflow: '{project-root}/_bmad/core/workflows/party-mode/workflow.md' ---- - -# Edit Step 9c: Validate Menu (After Edit) - -## STEP GOAL - -Validate that the agent's menu (commands/tools) follows BMAD patterns as defined in agentMenuPatterns.md, is well-structured, properly documented, and aligns with the agent's persona and purpose. Record findings to editPlan and auto-advance. - -## MANDATORY EXECUTION RULES - -- **NEVER skip validation checks** - All menu items must be verified -- **ALWAYS load the reference document** - agentMenuPatterns.md -- **ALWAYS load the builtYaml** for actual menu content validation -- **ALWAYS use absolute paths** when referencing files -- **CRITICAL:** Load and validate EVERYTHING specified in the agentMenuPatterns.md file -- **🚫 NO MENU in this step** - record findings and auto-advance -- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` - -## MANDATORY SEQUENCE - -**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change. -1. Read the menu patterns reference from `{agentMenuPatterns}` -2. Read the built agent YAML from `{builtYaml}` -3. Read the edit plan from `{editPlan}` -4. Extract the menu/commands section from the builtYaml -5. Determine agent type (Simple, Expert, or Module) from metadata -6. Compare actual menu against ALL validation rules - -### Protocol 2: Validation Checks - -Perform these checks systematically - validate EVERY rule specified in agentMenuPatterns.md: - -1. **Menu Structure** - - [ ] Menu section exists and is properly formatted - - [ ] At least one menu item defined (unless intentionally tool-less) - - [ ] Menu items follow proper YAML structure - - [ ] Each item has required fields (name, description, pattern) - -2. **Menu Item Requirements** - For each menu item: - - [ ] name: Present, unique, uses kebab-case - - [ ] description: Clear and concise - - [ ] pattern: Valid regex pattern or tool reference - - [ ] scope: Appropriate scope defined (if applicable) - -3. **Pattern Quality** - - [ ] Patterns are valid and testable - - [ ] Patterns are specific enough to match intended inputs - - [ ] Patterns are not overly restrictive - - [ ] Patterns use appropriate regex syntax - -4. **Description Quality** - - [ ] Each item has clear description - - [ ] Descriptions explain what the item does - - [ ] Descriptions are consistent in style - - [ ] Descriptions help users understand when to use - -5. **Alignment Checks** - - [ ] Menu items align with agent's role/purpose - - [ ] Menu items are supported by agent's expertise - - [ ] Menu items fit within agent's constraints - - [ ] Menu items are appropriate for target users - -6. **Completeness** - - [ ] Core capabilities for this role are covered - - [ ] No obvious missing functionality - - [ ] Menu scope is appropriate (not too sparse/overloaded) - - [ ] Related functionality is grouped logically - -7. **Standards Compliance** - - [ ] No prohibited patterns or commands - - [ ] No security vulnerabilities in patterns - - [ ] No ambiguous or conflicting items - - [ ] Consistent naming conventions - -8. **Menu Link Validation (Agent Type Specific)** - - [ ] Determine agent type from metadata: - - Simple: module property is 'stand-alone' AND hasSidecar is false/absent - - Expert: hasSidecar is true - - Module: module property is a module code (e.g., 'bmm', 'bmb', 'bmgd', 'bmad') - - [ ] For Expert agents (hasSidecar: true): - - Menu handlers SHOULD reference external sidecar files (e.g., `./{agent-name}-sidecar/...`) - - OR have inline prompts defined directly in the handler - - [ ] For Module agents (module property is a module code): - - Menu handlers SHOULD reference external module files under the module path - - Exec paths must start with `{project-root}/_bmad/{module}/...` - - Verify referenced files exist under the module directory - - [ ] For Simple agents (stand-alone, no sidecar): - - Menu handlers MUST NOT have external file links - - Menu handlers SHOULD only use relative links within the same file (e.g., `#section-name`) - - OR have inline prompts defined directly in the handler - -### Protocol 3: Record Findings - -Organize findings into three sections and append to editPlan frontmatter under `validationAfter.menu`: - -```yaml -validationAfter: - menu: - status: [pass|fail|warning] - passing: - - "{check description}" - - "{check description}" - warnings: - - "{non-blocking issue}" - failures: - - "{blocking issue that must be fixed}" -``` - -**PASSING CHECKS** (List what passed) -``` -✓ Menu structure properly formatted -✓ 5 menu items defined, all with required fields -✓ All patterns are valid regex -✓ Menu items align with agent role -✓ Agent type appropriate menu links verified -``` - -**WARNINGS** (Non-blocking issues) -``` -⚠ Item "analyze-data" description is vague -⚠ No menu item for [common capability X] -⚠ Pattern for "custom-command" very broad, may over-match -``` - -**FAILURES** (Blocking issues that must be fixed) -``` -✗ Duplicate menu item name: "process" appears twice -✗ Invalid regex pattern: "[unclosed bracket" -✗ Menu item "system-admin" violates security guidelines -✗ No menu items defined for agent type that requires tools -✗ Simple agent has external link in menu handler (should be relative # or inline) -✗ Expert agent with sidecar has no external file links or inline prompts defined -✗ Module agent exec path doesn't start with {project-root}/_bmad/{module}/... -✗ Module agent references file that doesn't exist in module directory -``` - -### Protocol 4: Auto-Advance - -**🚫 NO MENU PRESENTED** - After recording findings, immediately load and execute `{nextStepFile}` - ---- - -**Auto-advancing to structure validation...** - -## SUCCESS METRICS - -✅ All menu checks from agentMenuPatterns.md performed -✅ All checks validated against the actual builtYaml -✅ Agent type-specific link validation performed -✅ Findings saved to editPlan with detailed status -✅ Auto-advanced to next step diff --git a/src/modules/bmb/workflows/agent/steps-e/e-09d-validate-structure.md b/src/modules/bmb/workflows/agent/steps-e/e-09d-validate-structure.md deleted file mode 100644 index bdb7757e..00000000 --- a/src/modules/bmb/workflows/agent/steps-e/e-09d-validate-structure.md +++ /dev/null @@ -1,154 +0,0 @@ ---- -name: 'e-09d-validate-structure' -description: 'Validate YAML structure (after edit) - no menu, auto-advance' - -nextStepFile: './e-09e-validate-sidecar.md' -editPlan: '{bmb_creations_output_folder}/edit-plan-{agent-name}.md' -simpleValidation: ../data/simple-agent-validation.md -expertValidation: ../data/expert-agent-validation.md -agentCompilation: ../data/agent-compilation.md -builtYaml: '{bmb_creations_output_folder}/{agent-name}/{agent-name}.agent.yaml' - -advancedElicitationTask: '{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml' -partyModeWorkflow: '{project-root}/_bmad/core/workflows/party-mode/workflow.md' ---- - -# Edit Step 9d: Validate Structure (After Edit) - -## STEP GOAL - -Validate the built agent YAML file for structural completeness and correctness against the appropriate validation checklist (simple or expert) from agentCompilation.md. Record findings to editPlan and auto-advance. - -## MANDATORY EXECUTION RULES - -- **NEVER skip validation** - All agents must pass structural validation -- **ALWAYS use the correct validation checklist** based on agent type (simple vs expert) -- **ALWAYS load the builtYaml** for actual structure validation -- **ALWAYS use absolute paths** when referencing files -- **CRITICAL:** Load and validate EVERYTHING specified in the agentCompilation.md file -- **MUST check hasSidecar flag** to determine correct validation standard -- **🚫 NO MENU in this step** - record findings and auto-advance -- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` - -## MANDATORY SEQUENCE - -**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change. -1. Read the agent compilation reference from `{agentCompilation}` -2. Read the simple validation checklist from `{simpleValidation}` -3. Read the expert validation checklist from `{expertValidation}` -4. Read the built agent YAML from `{builtYaml}` -5. Read the edit plan from `{editPlan}` -6. Determine agent type (simple vs expert) to select correct checklist - -### Protocol 2: Validation Checks - -Perform these checks systematically - validate EVERY rule specified in agentCompilation.md: - -#### A. YAML Syntax Validation -- [ ] Parse YAML without errors -- [ ] Check indentation consistency (2-space standard) -- [ ] Validate proper escaping of special characters -- [ ] Verify no duplicate keys in any section - -#### B. Frontmatter Validation -- [ ] All required fields present (name, description, version, etc.) -- [ ] Field values are correct type (string, boolean, array) -- [ ] No empty required fields -- [ ] Proper array formatting with dashes -- [ ] Boolean fields are actual booleans (not strings) - -#### C. Section Completeness -- [ ] All required sections present based on agent type -- [ ] Sections not empty unless explicitly optional -- [ ] Proper markdown heading hierarchy (##, ###) -- [ ] No orphaned content without section headers - -#### D. Field-Level Validation -- [ ] Path references exist and are valid -- [ ] Array fields properly formatted -- [ ] No malformed YAML structures -- [ ] File references use correct path format - -#### E. Agent Type Specific Checks - -**For Simple Agents (hasSidecar is false/absent, module is 'stand-alone'):** -- [ ] No sidecar requirements -- [ ] No sidecar-folder path in metadata -- [ ] Basic fields complete -- [ ] No expert-only configuration present -- [ ] Menu handlers use only internal references (#) or inline prompts - -**For Expert Agents (hasSidecar is true):** -- [ ] Sidecar flag set correctly in metadata -- [ ] Sidecar folder path specified in metadata -- [ ] All expert fields present -- [ ] Advanced features properly configured -- [ ] Menu handlers reference sidecar files or have inline prompts - -**For Module Agents (module is a module code like 'bmm', 'bmb', etc.):** -- [ ] Module property is valid module code -- [ ] Exec paths for menu handlers start with `{project-root}/_bmad/{module}/...` -- [ ] Referenced files exist under the module directory -- [ ] If also hasSidecar: true, sidecar configuration is valid - -### Protocol 3: Record Findings - -Organize findings into three sections and append to editPlan frontmatter under `validationAfter.structure`: - -```yaml -validationAfter: - structure: - agentType: [simple|expert|module] - status: [pass|fail|warning] - passing: - - "{check description}" - - "{check description}" - warnings: - - "{non-blocking issue}" - failures: - - "{blocking issue that must be fixed}" -``` - -**PASSING CHECKS** (List what passed) -``` -✓ Valid YAML syntax, no parse errors -✓ All required frontmatter fields present -✓ Proper 2-space indentation throughout -✓ All required sections complete for agent type -✓ Path references are valid -``` - -**WARNINGS** (Non-blocking issues) -``` -⚠ Some optional sections are empty -⚠ Minor formatting inconsistencies -⚠ Some descriptions are brief -``` - -**FAILURES** (Blocking issues that must be fixed) -``` -✗ YAML syntax error preventing parsing -✗ Duplicate key 'name' in metadata -✗ Required field 'description' is empty -✗ Invalid boolean value 'yes' (should be true/false) -✗ Path reference points to non-existent file -✗ Simple agent has sidecar-folder specified -✗ Expert agent missing sidecar-folder path -``` - -### Protocol 4: Auto-Advance - -**🚫 NO MENU PRESENTED** - After recording findings, immediately load and execute `{nextStepFile}` - ---- - -**Auto-advancing to sidecar validation...** - -## SUCCESS METRICS - -✅ All structure checks from agentCompilation.md performed -✅ Correct validation checklist used based on agent type -✅ All checks validated against the actual builtYaml -✅ Findings saved to editPlan with detailed status -✅ Agent type correctly identified and validated -✅ Auto-advanced to next step diff --git a/src/modules/bmb/workflows/agent/steps-e/e-09e-validate-sidecar.md b/src/modules/bmb/workflows/agent/steps-e/e-09e-validate-sidecar.md deleted file mode 100644 index 37c015bf..00000000 --- a/src/modules/bmb/workflows/agent/steps-e/e-09e-validate-sidecar.md +++ /dev/null @@ -1,160 +0,0 @@ ---- -name: 'e-09e-validate-sidecar' -description: 'Validate sidecar structure (after edit) - no menu, auto-advance' - -nextStepFile: './e-09f-validation-summary.md' -editPlan: '{bmb_creations_output_folder}/edit-plan-{agent-name}.md' -expertValidation: ../data/expert-agent-validation.md -criticalActions: ../data/critical-actions.md -builtYaml: '{bmb_creations_output_folder}/{agent-name}/{agent-name}.agent.yaml' -sidecarFolder: '{bmb_creations_output_folder}/{agent-name}/{agent-name}-sidecar/' - -advancedElicitationTask: '{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml' -partyModeWorkflow: '{project-root}/_bmad/core/workflows/party-mode/workflow.md' ---- - -# Edit Step 9e: Validate Sidecar (After Edit) - -## STEP GOAL - -Validate the sidecar folder structure and referenced paths for Expert agents to ensure all sidecar files exist, are properly structured, and paths in the main agent YAML correctly reference them. Record findings to editPlan and auto-advance. For Simple agents without sidecar, mark as N/A. - -## MANDATORY EXECUTION RULES - -- **ONLY validates for Expert agents** - Simple agents should have no sidecar -- **MUST verify sidecar folder exists** before validating contents -- **ALWAYS cross-reference YAML paths** with actual files -- **ALWAYS load the builtYaml** to get sidecar configuration -- **ALWAYS use absolute paths** when referencing files -- **CRITICAL:** Load and validate EVERYTHING specified in the expertValidation.md file -- **PROVIDE clear remediation steps** for any missing or malformed files -- **🚫 NO MENU in this step** - record findings and auto-advance -- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` - -## MANDATORY SEQUENCE - -**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change. -1. Read the expert validation reference from `{expertValidation}` -2. Read the critical actions reference from `{criticalActions}` -3. Read the built agent YAML from `{builtYaml}` -4. Read the edit plan from `{editPlan}` -5. Determine if agent has sidecar from metadata - -### Protocol 2: Conditional Validation - -**IF agent has hasSidecar: false OR agent is Simple:** -- [ ] Mark sidecar validation as N/A -- [ ] Confirm no sidecar-folder path in metadata -- [ ] Confirm no sidecar references in menu handlers - -**IF agent has hasSidecar: true OR agent is Expert/Module with sidecar:** -- [ ] Proceed with full sidecar validation - -### Protocol 3: Sidecar Validation Checks (For Expert Agents) - -Perform these checks systematically - validate EVERY rule specified in expertValidation.md: - -#### A. Sidecar Folder Validation -- [ ] Sidecar folder exists at specified path -- [ ] Sidecar folder is accessible and readable -- [ ] Sidecar folder path in metadata matches actual location -- [ ] Folder naming follows convention: `{agent-name}-sidecar` - -#### B. Sidecar File Inventory -- [ ] List all files in sidecar folder -- [ ] Verify expected files are present -- [ ] Check for unexpected files -- [ ] Validate file names follow conventions - -#### C. Path Reference Validation -For each sidecar path reference in agent YAML: -- [ ] Extract path from YAML reference -- [ ] Verify file exists at referenced path -- [ ] Check path format is correct (relative/absolute as expected) -- [ ] Validate no broken path references - -#### D. Critical Actions File Validation (if present) -- [ ] critical-actions.md file exists -- [ ] File has proper frontmatter -- [ ] Actions section is present and not empty -- [ ] No critical sections missing -- [ ] File content is complete (not just placeholder) - -#### E. Module Files Validation (if present) -- [ ] Module files exist at referenced paths -- [ ] Each module file has proper frontmatter -- [ ] Module file content is complete -- [ ] No empty or placeholder module files - -#### F. Sidecar Structure Completeness -- [ ] All referenced sidecar files present -- [ ] No orphaned references (files referenced but not present) -- [ ] No unreferenced files (files present but not referenced) -- [ ] File structure matches expert agent requirements - -### Protocol 4: Record Findings - -Organize findings into three sections and append to editPlan frontmatter under `validationAfter.sidecar`: - -```yaml -validationAfter: - sidecar: - hasSidecar: [true|false] - status: [pass|fail|warning|n/a] - passing: - - "{check description}" - - "{check description}" - warnings: - - "{non-blocking issue}" - failures: - - "{blocking issue that must be fixed}" -``` - -**PASSING CHECKS** (List what passed - for Expert agents)** -``` -✓ Sidecar folder exists at expected path -✓ All referenced files present -✓ No broken path references -✓ Critical actions file complete -✓ Module files properly structured -✓ File structure matches expert requirements -``` - -**WARNINGS** (Non-blocking issues) -``` -⚠ Additional files in sidecar not referenced -⚠ Some module files are minimal -⚠ Sidecar has no modules (may be intentional) -``` - -**FAILURES** (Blocking issues that must be fixed) -``` -✗ Sidecar folder completely missing -✗ Sidecar folder path in metadata doesn't match actual location -✗ Critical file missing: critical-actions.md -✗ Broken path reference: {path} not found -✗ Referenced file is empty or placeholder -✗ Module file missing frontmatter -✗ Simple agent has sidecar configuration (should not) -``` - -**N/A FOR SIMPLE AGENTS:** -``` -N/A - Agent is Simple type (hasSidecar: false, no sidecar required) -``` - -### Protocol 5: Auto-Advance - -**🚫 NO MENU PRESENTED** - After recording findings, immediately load and execute `{nextStepFile}` - ---- - -**Auto-advancing to validation summary...** - -## SUCCESS METRICS - -✅ All sidecar checks from expertValidation.md performed (or N/A for Simple) -✅ All checks validated against the actual builtYaml and file system -✅ Findings saved to editPlan with detailed status -✅ Agent type correctly identified (sidecar vs non-sidecar) -✅ Auto-advanced to next step diff --git a/src/modules/bmb/workflows/agent/steps-e/e-09f-validation-summary.md b/src/modules/bmb/workflows/agent/steps-e/e-09f-validation-summary.md deleted file mode 100644 index 223040b7..00000000 --- a/src/modules/bmb/workflows/agent/steps-e/e-09f-validation-summary.md +++ /dev/null @@ -1,113 +0,0 @@ ---- -name: 'e-09f-validation-summary' -description: 'Display all validation findings after edit' - -nextStepFile: './e-10-celebrate.md' -editPlan: '{bmb_creations_output_folder}/edit-plan-{agent-name}.md' - -advancedElicitationTask: '{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml' -partyModeWorkflow: '{project-root}/_bmad/core/workflows/party-mode/workflow.md' ---- - -# Edit Step 9f: Validation Summary (After Edit) - -## STEP GOAL: - -Display all post-edit validation findings and compare with pre-edit state. Present findings and await confirmation to proceed to celebration. - -## MANDATORY EXECUTION RULES: - -- 📖 CRITICAL: Read the complete step file before taking any action -- 🔄 CRITICAL: Read editPlan to collect all validation findings -- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` - -### Step-Specific Rules: - -- 🎯 Display all validation findings clearly organized -- 📊 Compare before/after states -- 💬 Present options for handling any remaining issues - -## EXECUTION PROTOCOLS: - -- 🎯 Read editPlan to get validation findings -- 📊 Display organized summary with before/after comparison -- 💾 Allow user to decide how to proceed - -## MANDATORY SEQUENCE - -**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise unless user explicitly requests a change. - -### 1. Load Validation Findings - -Read `{editPlan}` frontmatter to collect validationBefore and validationAfter findings. - -### 2. Display Validation Summary - -```markdown -## Post-Edit Validation Report for {agent-name} - -### Before vs After Comparison - -| Component | Before | After | Status | -|-----------|--------|-------|--------| -| Metadata | {status} | {status} | {Δ} | -| Persona | {status} | {status} | {Δ} | -| Menu | {status} | {status} | {Δ} | -| Structure | {status} | {status} | {Δ} | -| Sidecar | {status} | {status} | {Δ} | - -### Detailed Findings (After Edit) - -**Metadata:** {summary} -**Persona:** {summary} -**Menu:** {summary} -**Structure:** {summary} -**Sidecar:** {summary} -``` - -### 3. Present Options - -"How do the edits look? - -**[R]eview** - Show detailed before/after for any component -**[F]ix** - Address any remaining issues -**[A]ccept** - Proceed to celebration" - -### 4. Present MENU OPTIONS - -Display: "**Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Continue to Celebration" - -#### Menu Handling Logic: - -- IF A: Execute {advancedElicitationTask}, and when finished redisplay the menu -- IF P: Execute {partyModeWorkflow}, and when finished redisplay the menu -- IF R: Show detailed before/after comparison, then redisplay menu -- IF C: Save validation summary to {editPlan}, then only then load, read entire file, then execute {nextStepFile} -- IF Any other comments or queries: help user respond then [Redisplay Menu Options](#4-present-menu-options) - -#### EXECUTION RULES: - -- ALWAYS halt and wait for user input after presenting menu -- ONLY proceed to next step when user selects 'C' -- After other menu items execution, return to this menu - -## CRITICAL STEP COMPLETION NOTE - -ONLY WHEN [C continue option] is selected and [validation summary displayed], will you then load and read fully `{nextStepFile}` to execute and celebrate completion. - ---- - -## 🚨 SYSTEM SUCCESS/FAILURE METRICS - -### ✅ SUCCESS: - -- All validation findings displayed clearly -- Before/after comparison shown -- User given options for handling issues - -### ❌ SYSTEM FAILURE: - -- Findings not displayed to user -- Proceeding without user acknowledgment - -**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. diff --git a/src/modules/bmb/workflows/agent/steps-v/v-01-load-review.md b/src/modules/bmb/workflows/agent/steps-v/v-01-load-review.md index 2dc6e33a..3a4b259e 100644 --- a/src/modules/bmb/workflows/agent/steps-v/v-01-load-review.md +++ b/src/modules/bmb/workflows/agent/steps-v/v-01-load-review.md @@ -70,7 +70,7 @@ Initialize the validation report: ```markdown --- agentName: '{agent-name}' -agentType: '{simple|expert|module}' +agentType: '{simple|expert|module}' # Derived from module + hasSidecar agentFile: '{agent-file-path}' validationDate: '{YYYY-MM-DD}' stepsCompleted: @@ -82,8 +82,9 @@ stepsCompleted: ## Agent Overview **Name:** {agent-name} -**Type:** {simple|expert|module} -**Version:** {version} +**Type:** {simple|expert|module} # Derived from: module + hasSidecar +**module:** {module-value} +**hasSidecar:** {true|false} **File:** {agent-file-path} --- diff --git a/src/modules/bmb/workflows/agent/steps-v/v-02e-validate-sidecar.md b/src/modules/bmb/workflows/agent/steps-v/v-02e-validate-sidecar.md index 5f74ce2a..0b9054c6 100644 --- a/src/modules/bmb/workflows/agent/steps-v/v-02e-validate-sidecar.md +++ b/src/modules/bmb/workflows/agent/steps-v/v-02e-validate-sidecar.md @@ -48,7 +48,7 @@ Read `{expertValidation}`, `{criticalActions}`, `{validationReport}`, and `{agen ### 2. Conditional Validation -**IF agentType == expert OR (agentType == module AND hasSidecar == true):** +**IF (module = "stand-alone" AND hasSidecar = true) OR (module ≠ "stand-alone" AND hasSidecar = true):** Perform these checks systematically - validate EVERY rule specified in expertValidation.md: #### A. Sidecar Folder Validation @@ -89,7 +89,7 @@ For each sidecar path reference in agent YAML: - [ ] No unreferenced files (files present but not referenced) - [ ] File structure matches expert agent requirements -**IF agentType is Simple (no sidecar):** +**IF (module = "stand-alone" AND hasSidecar = false):** - [ ] Mark sidecar validation as N/A - [ ] Confirm no sidecar-folder path in metadata - [ ] Confirm no sidecar references in menu handlers @@ -124,7 +124,7 @@ Append to `{validationReport}`: {List of blocking issues that must be fixed} *N/A (for Simple agents):* -N/A - Agent is Simple type (hasSidecar: false, no sidecar required) +N/A - Agent is Simple type (module = "stand-alone" + hasSidecar: false, no sidecar required) ``` ### 4. Auto-Advance diff --git a/src/modules/bmb/workflows/module/data/agent-architecture.md b/src/modules/bmb/workflows/module/data/agent-architecture.md new file mode 100644 index 00000000..7cfac331 --- /dev/null +++ b/src/modules/bmb/workflows/module/data/agent-architecture.md @@ -0,0 +1,179 @@ +# Agent Architecture for Modules + +**Purpose:** High-level guidance for planning agents in your module — not implementation details (that's what the agent-builder workflow is for). + +--- + +## Single Agent vs. Multi-Agent Module + +### Single Agent Module + +**Use when:** One persona can handle the module's purpose. + +**Characteristics:** +- Simpler, focused +- Clear single point of contact +- Good for narrow domains + +**Question:** Could one expert agent with a sidecar handle this entire module? + +--- + +### Multi-Agent Module + +**Use when:** Different expertise areas justify specialized personas. + +**Characteristics:** +- Each agent has a distinct role and expertise +- Agents form a cohesive team around the module's theme +- Menus coordinate to guide users to the right agent + +**Why multi-agent?** +- Different workflows need different expert perspectives +- Users expect to talk to "the right expert" for each task +- The module covers a domain too broad for one persona + +--- + +## Flagship Example: BMM Agent Team + +BMM demonstrates a multi-agent module with **9 specialized agents** forming a complete software development team. + +### The BMM Theme + +**"Agile software delivery, AI-driven"** + +Every agent serves this theme — they're a complete team working together. + +### BMM Agent Overview + +| Agent | Name | Role | Responsible For | +|-------|------|------|-----------------| +| PM | John | Product Manager | PRDs, requirements, user stories | +| Architect | Winston | System Architect | Technical design, architecture | +| UX | | UX Designer | User research, UX design | +| Dev | | Developer | Implementation, coding | +| TEA | | Test Engineer Architect | Test architecture, QA | +| SM | | Scrum Master | Sprint planning, workflow status | +| Tech Writer | | Technical Writer | Documentation | +| Analyst | | Business Analyst | Analysis, metrics | +| Quick Flow | | Solo Developer | Quick standalone work | + +### Key Patterns + +1. **Shared commands** — All agents have `[WS]` Workflow Status +2. **Specialty commands** — Each agent has unique commands (PM→PRD, Architect→Architecture) +3. **No overlap** — Each command has one clear owner +4. **Collaboration** — Agents reference each other's work (PRD → Architecture → Implementation) + +--- + +## Planning Your Agents + +### For Each Agent, Document: + +1. **Role** — What is this agent responsible for? +2. **Workflows** — Which workflows will this agent trigger/own? +3. **Human Name** — What's their persona name? (e.g., "John", "Winston") +4. **Communication Style** — How do they talk? (e.g., "Direct and data-sharp", "Calm and pragmatic") +5. **Skills/Expertise** — What knowledge does this agent bring? +6. **Memory/Learning** — Does this agent need to remember things over time? (hasSidecar) + +That's it! The agent-builder workflow will handle the detailed implementation. + +--- + +## Agent Memory & Learning + +### Sidecar Agents (hasSidecar: true) + +**Use when:** The agent needs to remember context across sessions. + +**Characteristics:** +- Has a sidecar file that persists between conversations +- Learns from user interactions +- Remembers project details, preferences, past work + +**Examples:** +- An agent that tracks project decisions over time +- An agent that learns user preferences +- An agent that maintains ongoing project context + +### Stateless Agents (hasSidecar: false) + +**Use when:** The agent doesn't need persistent memory. + +**Characteristics:** +- Each conversation starts fresh +- Relies on shared context files (like project-context.md) +- Simpler, more predictable + +**Most module agents are stateless** — they reference shared project context rather than maintaining their own memory. + +--- + +## Agent-Workflow Coordination + +### Menu Triggers + +Each agent has menu items that trigger workflows: + +| Trigger Type | Pattern | Example | +|--------------|---------|---------| +| Shared | Same across all agents | `[WS]` Workflow Status | +| Specialty | Unique to this agent | `[PR]` Create PRD (PM only) | +| Cross-reference | Points to another agent's workflow | "See architecture" | + +### Simple Planning Format + +For each agent, just document: + +``` +Agent: PM (John) +Role: Product Manager, requirements, PRDs +Triggers: + - WS → Workflow Status (shared) + - PR → Create PRD (specialty) + - ES → Epics and Stories (specialty) +Memory: No (uses shared project-context) +``` + +The agent-builder workflow will convert this into the proper format. + +--- + +## When to Use Multiple Agents + +**Consider multiple agents when:** +- Different workflows require different expertise +- The domain has clear specialization areas +- Users would expect to talk to different "experts" +- The module covers a broad process (like software development) + +**Use a single agent when:** +- The domain is focused and narrow +- One expertise area covers all workflows +- Simplicity is preferred +- The agent could reasonably handle everything with a sidecar + +--- + +## Quick Agent Planning Checklist + +For each agent in your module: + +- [ ] Role defined (what they're responsible for) +- [ ] Workflows assigned (which workflows they trigger) +- [ ] Human name chosen (persona) +- [ ] Communication style described +- [ ] Skills/expertise identified +- [ ] Memory decision (hasSidecar: true/false) + +--- + +## Notes + +- **Don't worry about the exact YAML format** — agent-builder handles that +- **Focus on the planning** — who does what, how they work together +- **Keep it high-level** — this is about the module's agent architecture, not implementation details +- **BMM is the reference** — look at how their agents form a cohesive team diff --git a/src/modules/bmb/workflows/module/data/agent-spec-template.md b/src/modules/bmb/workflows/module/data/agent-spec-template.md new file mode 100644 index 00000000..5452abb6 --- /dev/null +++ b/src/modules/bmb/workflows/module/data/agent-spec-template.md @@ -0,0 +1,79 @@ +# Agent Specification: {agent_name} + +**Module:** {module_code} +**Status:** Placeholder — To be created via create-agent workflow +**Created:** {date} + +--- + +## Agent Metadata + +```yaml +agent: + metadata: + id: "_bmad/{module_code}/agents/{agent_file_name}.md" + name: {agent_human_name} + title: {agent_title} + icon: {agent_icon} + module: {module_code} + hasSidecar: false +``` + +--- + +## Agent Persona + +### Role + +{agent_role} + +### Identity + +{agent_identity} + +### Communication Style + +{agent_communication_style} + +### Principles + +{agent_principles} + +--- + +## Agent Menu + +### Planned Commands + +| Trigger | Command | Description | Workflow | +|---------|---------|-------------|----------| +{agent_menu_table} + +--- + +## Agent Integration + +### Shared Context + +- References: `{shared_context_files}` +- Collaboration with: {collaborating_agents} + +### Workflow References + +{workflow_references} + +--- + +## Implementation Notes + +**Use the create-agent workflow to build this agent.** + +Inputs needed: +- Agent name and human name +- Role and expertise area +- Communication style preferences +- Menu commands and workflow mappings + +--- + +_Spec created on {date} via BMAD Module workflow_ diff --git a/src/modules/bmb/workflows/module/data/module-installer-standards.md b/src/modules/bmb/workflows/module/data/module-installer-standards.md new file mode 100644 index 00000000..c95746a6 --- /dev/null +++ b/src/modules/bmb/workflows/module/data/module-installer-standards.md @@ -0,0 +1,348 @@ +# Module Installer Standards + +**Purpose:** How the `_module-installer` folder works, including installer.js patterns and platform-specific configuration. + +--- + +## Overview + +The `_module-installer` folder contains optional installation logic for your module. It runs AFTER the IDE installations and can: +- Create directories specified in module.yaml +- Copy assets or templates +- Configure IDE-specific settings +- Set up platform-specific integrations + +--- + +## When Do You Need an Installer? + +### Use an Installer When: + +- Creating directories based on user configuration +- Copying template files to the user's project +- IDE-specific setup (Claude Code, Windsurf, Cursor, etc.) +- Platform-specific integrations + +### Skip the Installer When: + +- Module only provides agents and workflows +- No file operations needed +- No IDE-specific configuration + +--- + +## Folder Structure + +``` +_module-installer/ +├── installer.js # Main installer (REQUIRED if folder exists) +└── platform-specifics/ # IDE-specific handlers (optional) + ├── claude-code.js + ├── windsurf.js + ├── cursor.js + └── ... +``` + +--- + +## installer.js Pattern + +### Function Signature + +```javascript +/** + * Module Installer + * + * @param {Object} options - Installation options + * @param {string} options.projectRoot - The root directory of the target project + * @param {Object} options.config - Module configuration from module.yaml (resolved variables) + * @param {Array} options.installedIDEs - Array of IDE codes that were installed + * @param {Object} options.logger - Logger instance for output + * @returns {Promise} - Success status (true = success, false = failure) + */ +async function install(options) { + const { projectRoot, config, installedIDEs, logger } = options; + + try { + // Installation logic here + logger.log(chalk.blue('Installing {Module Name}...')); + + // ... your logic ... + + logger.log(chalk.green('✓ {Module Name} installation complete')); + return true; + } catch (error) { + logger.error(chalk.red(`Error installing module: ${error.message}`)); + return false; + } +} + +module.exports = { install }; +``` + +--- + +### What You Receive + +| Parameter | Type | Description | +|-----------|------|-------------| +| `projectRoot` | string | Absolute path to the user's project root | +| `config` | object | Resolved module.yaml variables | +| `installedIDEs` | array | List of IDE codes installed (e.g., `['claude-code', 'windsurf']`) | +| `logger` | object | Logger with `.log()`, `.warn()`, `.error()` methods | + +The `config` object contains your module.yaml variables **after** user input: + +```javascript +// If module.yaml defined: +// project_name: +// prompt: "What is your project name?" +// result: "{value}" + +config.project_name // = user's input +config.planning_artifacts // = resolved path +``` + +--- + +## Common Installation Tasks + +### 1. Create Directories + +```javascript +const fs = require('fs-extra'); +const path = require('node:path'); + +// Create directory from config +if (config['planning_artifacts']) { + const dirConfig = config['planning_artifacts'].replace('{project-root}/', ''); + const dirPath = path.join(projectRoot, dirConfig); + + if (!(await fs.pathExists(dirPath))) { + logger.log(chalk.yellow(`Creating directory: ${dirConfig}`)); + await fs.ensureDir(dirPath); + } +} +``` + +### 2. Copy Assets + +```javascript +const assetsSource = path.join(__dirname, 'assets'); +const assetsDest = path.join(projectRoot, 'docs'); + +if (await fs.pathExists(assetsSource)) { + await fs.copy(assetsSource, assetsDest); + logger.log(chalk.green('✓ Copied assets to docs/')); +} +``` + +### 3. IDE-Specific Configuration + +```javascript +// Handle IDE-specific configurations +if (installedIDEs && installedIDEs.length > 0) { + logger.log(chalk.cyan(`Configuring for IDEs: ${installedIDEs.join(', ')}`)); + + for (const ide of installedIDEs) { + await configureForIDE(ide, projectRoot, config, logger); + } +} +``` + +--- + +## Platform-Specific Handlers + +### Pattern + +Create files in `platform-specifics/{ide-code}.js`: + +```javascript +// platform-specifics/claude-code.js + +/** + * Configure module for Claude Code + */ +async function install(options) { + const { projectRoot, config, logger, platformInfo } = options; + + try { + // Claude Code specific configuration + logger.log(chalk.dim(' Configuring Claude Code integration...')); + + // Your logic here + + return true; + } catch (error) { + logger.warn(chalk.yellow(` Warning: ${error.message}`)); + return false; + } +} + +module.exports = { install }; +``` + +### Load from Main Installer + +```javascript +// installer.js +const platformCodes = require(path.join(__dirname, '../../../../tools/cli/lib/platform-codes')); + +async function configureForIDE(ide, projectRoot, config, logger) { + // Validate platform code + if (!platformCodes.isValidPlatform(ide)) { + logger.warn(chalk.yellow(` Unknown platform: '${ide}'. Skipping.`)); + return; + } + + const platformName = platformCodes.getDisplayName(ide); + const platformSpecificPath = path.join(__dirname, 'platform-specifics', `${ide}.js`); + + try { + if (await fs.pathExists(platformSpecificPath)) { + const platformHandler = require(platformSpecificPath); + + if (typeof platformHandler.install === 'function') { + await platformHandler.install({ projectRoot, config, logger }); + logger.log(chalk.green(` ✓ Configured for ${platformName}`)); + } + } + } catch (error) { + logger.warn(chalk.yellow(` Warning: Could not configure ${platformName}: ${error.message}`)); + } +} +``` + +--- + +## Complete Example: BMM Installer + +```javascript +const fs = require('fs-extra'); +const path = require('node:path'); +const chalk = require('chalk'); +const platformCodes = require(path.join(__dirname, '../../../../tools/cli/lib/platform-codes')); + +/** + * BMM Module Installer + */ +async function install(options) { + const { projectRoot, config, installedIDEs, logger } = options; + + try { + logger.log(chalk.blue('🚀 Installing BMM Module...')); + + // Create output directory + if (config['output_folder']) { + const outputConfig = config['output_folder'].replace('{project-root}/', ''); + const outputPath = path.join(projectRoot, outputConfig); + if (!(await fs.pathExists(outputPath))) { + logger.log(chalk.yellow(`Creating output directory: ${outputConfig}`)); + await fs.ensureDir(outputPath); + } + } + + // Create implementation artifacts directory + if (config['implementation_artifacts']) { + const storyConfig = config['implementation_artifacts'].replace('{project-root}/', ''); + const storyPath = path.join(projectRoot, storyConfig); + if (!(await fs.pathExists(storyPath))) { + logger.log(chalk.yellow(`Creating story directory: ${storyConfig}`)); + await fs.ensureDir(storyPath); + } + } + + // IDE-specific configuration + if (installedIDEs && installedIDEs.length > 0) { + logger.log(chalk.cyan(`Configuring BMM for IDEs: ${installedIDEs.join(', ')}`)); + + for (const ide of installedIDEs) { + await configureForIDE(ide, projectRoot, config, logger); + } + } + + logger.log(chalk.green('✓ BMM Module installation complete')); + return true; + } catch (error) { + logger.error(chalk.red(`Error installing BMM: ${error.message}`)); + return false; + } +} + +async function configureForIDE(ide, projectRoot, config, logger) { + if (!platformCodes.isValidPlatform(ide)) { + logger.warn(chalk.yellow(` Warning: Unknown platform '${ide}'. Skipping.`)); + return; + } + + const platformSpecificPath = path.join(__dirname, 'platform-specifics', `${ide}.js`); + + try { + if (await fs.pathExists(platformSpecificPath)) { + const platformHandler = require(platformSpecificPath); + + if (typeof platformHandler.install === 'function') { + await platformHandler.install({ projectRoot, config, logger }); + } + } + } catch (error) { + logger.warn(chalk.yellow(` Warning: Could not load handler for ${ide}: ${error.message}`)); + } +} + +module.exports = { install }; +``` + +--- + +## Best Practices + +### DO: +- Return `true` for success, `false` for failure +- Use chalk for colored output +- Log what you're doing (create, copy, configure) +- Handle errors gracefully with try/catch +- Validate paths before creating directories + +### DON'T: +- Assume paths exist — check with `fs.pathExists()` +- Overwrite user files without asking +- Fail silently — log errors +- Use absolute paths — build from `projectRoot` + +--- + +## Available Platform Codes + +Common IDE codes: +- `claude-code` — Anthropic's Claude Code +- `windsurf` — Windsurf IDE +- `cursor` — Cursor AI IDE +- `vscode` — Visual Studio Code + +Use `platformCodes.isValidPlatform(ide)` to validate. + +--- + +## Testing Your Installer + +1. Create a test project +2. Run `bmad install {your-module}` +3. Verify directories are created +4. Check that config variables are resolved correctly +5. Test platform-specific handlers + +--- + +## Quick Reference + +| Task | Code Pattern | +|------|--------------| +| Create directory | `await fs.ensureDir(path)` | +| Check if exists | `await fs.pathExists(path)` | +| Copy files | `await fs.copy(src, dest)` | +| Log info | `logger.log(chalk.blue('message'))` | +| Log success | `logger.log(chalk.green('✓ message'))` | +| Log warning | `logger.warn(chalk.yellow('warning'))` | +| Log error | `logger.error(chalk.red('error'))` | diff --git a/src/modules/bmb/workflows/module/data/module-standards.md b/src/modules/bmb/workflows/module/data/module-standards.md new file mode 100644 index 00000000..b56ca060 --- /dev/null +++ b/src/modules/bmb/workflows/module/data/module-standards.md @@ -0,0 +1,280 @@ +# Module Standards + +**Purpose:** Defines what a BMAD module is, its structure, and the three types of modules. + +--- + +## What is a BMAD Module? + +A **BMAD module** is a self-contained package of functionality that extends the BMAD framework. Modules provide: +- **Agents** — AI personas with specialized expertise and menu-driven commands +- **Workflows** — Structured processes for accomplishing complex tasks +- **Configuration** — module.yaml for user customization +- **Installation** — Optional installer.js for setup logic + +--- + +## Module Types + +### 1. Standalone Module + +A new, independent module focused on a specific domain. + +**Characteristics:** +- Own module code (e.g., `healthcare-ai`, `legal-assist`) +- Independent of other modules +- Can be installed alongside any other modules +- Has its own agents, workflows, configuration + +**Location:** `src/modules/{module-code}/` + +**Example:** CIS (Creative Innovation Suite) — a standalone module for innovation workflows + +--- + +### 2. Extension Module + +Extends an existing BMAD module with additional functionality. + +**Characteristics:** +- Builds upon an existing module's agents and workflows +- May add new agents or workflows that complement the base module +- Shares configuration context with the extended module +- Typically installed alongside the module it extends + +**Location:** `src/modules/{base-module}/extensions/{extension-code}/` + +**Example:** An extension to BMM that adds specialized security review workflows + +--- + +### Extension Module: Override & Merge Pattern + +When an extension module is installed, its files merge with the base module following these rules: + +#### Code Matching + +The extension's `module.yaml` `code:` field matches the base module's code: + +```yaml +# Base module: src/modules/bmm/module.yaml +code: bmm + +# Extension: src/modules/bmm/extensions/security/module.yaml +code: bmm # SAME CODE — extends BMM +``` + +The **folder name** is unique (e.g., `bmm-security`) but the `code:` matches the base module. + +#### File Merge Rules + +| File Type | Same Name | Different Name | +|-----------|-----------|----------------| +| Agent file | **OVERRIDE** — replaces the base agent | **ADD** — new agent added | +| Workflow folder | **OVERRIDE** — replaces the base workflow | **ADD** — new workflow added | +| Other files | **OVERRIDE** — replaces base file | **ADD** — new file added | + +#### Examples + +**Override scenario:** +``` +Base module (BMM): +├── agents/ +│ └── pm.agent.yaml # Original PM agent + +Extension (bmm-security): +├── agents/ +│ └── pm.agent.yaml # Security-focused PM — REPLACES original + +Result after installation: +├── agents/ +│ └── pm.agent.yaml # Now the security version +``` + +**Add scenario:** +``` +Base module (BMM): +├── agents/ +│ ├── pm.agent.yaml +│ └── architect.agent.yaml + +Extension (bmm-security): +├── agents/ +│ └── security-auditor.agent.yaml # NEW agent + +Result after installation: +├── agents/ +│ ├── pm.agent.yaml +│ ├── architect.agent.yaml +│ └── security-auditor.agent.yaml # ADDED +``` + +**Mixed scenario:** +``` +Extension contains both overrides and new files — applies rules per file +``` + +--- + +### 3. Global Module + +Affects the entire BMAD framework and all modules. + +**Characteristics:** +- Core functionality that impacts all modules +- Often provides foundational services or utilities +- Installed at the framework level +- Use sparingly — only for truly global concerns + +**Location:** `src/modules/{module-code}/` with `global: true` in module.yaml + +**Example:** A module that provides universal logging or telemetry across BMAD + +--- + +## Required Module Structure + +``` +{module-code}/ +├── module.yaml # Module configuration (REQUIRED) +├── README.md # Module documentation (REQUIRED) +├── agents/ # Agent definitions (if any) +│ └── {agent-name}.agent.yaml +├── workflows/ # Workflow definitions (if any) +│ └── {workflow-name}/ +│ └── workflow.md +├── _module-installer/ # Installation logic (optional) +│ ├── installer.js +│ └── platform-specifics/ +│ ├── claude-code.js +│ ├── windsurf.js +│ └── ... +└── {other folders} # Tasks, templates, data as needed +``` + +--- + +## Required Files + +### module.yaml (REQUIRED) + +Every module MUST have a `module.yaml` file with at minimum: + +```yaml +code: {module-code} +name: "Module Display Name" +header: "Brief module description" +subheader: "Additional context" +default_selected: false +``` + +See: `module-yaml-conventions.md` for full specification. + +--- + +### README.md (REQUIRED) + +Every module MUST have a README.md with: +- Module name and purpose +- Installation instructions +- Components section (agents, workflows) +- Quick start guide +- Module structure diagram +- Configuration section +- Usage examples +- Author information + +--- + +## Optional Components + +### Agents + +Agents are AI personas with: +- Metadata (id, name, title, icon, module) +- Persona (role, identity, communication_style, principles) +- Menu (trigger → workflow/exec mappings) + +See: `agent-architecture.md` for design guidance. + +--- + +### Workflows + +Workflows are structured processes with: +- workflow.md (entry point) +- steps/ folder with step files +- data/ folder with shared reference +- templates/ folder if needed + +--- + +### _module-installer/ + +Optional installation logic for: +- Creating directories +- Copying assets +- IDE-specific configuration +- Platform-specific setup + +See: `module-installer-standards.md` for patterns. + +--- + +## Module Type Decision Tree + +``` +START: Creating a module +│ +├─ Is this a brand new independent domain? +│ └─ YES → Standalone Module +│ +├─ Does this extend an existing module? +│ └─ YES → Extension Module +│ +└─ Does this affect all modules globally? + └─ YES → Global Module (use sparingly) +``` + +--- + +## Naming Conventions + +### Module Code + +- **kebab-case** (e.g., `bmm`, `cis`, `bmgd`, `healthcare-ai`) +- Short, memorable, descriptive +- 2-20 characters +- Lowercase letters, numbers, hyphens only + +### Agent Files + +- Format: `{role-name}.agent.yaml` +- Example: `pm.agent.yaml`, `architect.agent.yaml` + +### Workflow Folders + +- Format: `{workflow-name}/` +- Example: `prd/`, `create-architecture/` + +--- + +## Module Dependencies + +Modules can depend on: +- **Core BMAD** — Always available +- **Other modules** — Specify in module.yaml as `dependencies:` +- **External tools** — Document in README, handle in installer + +--- + +## Quick Reference + +| Question | Answer | +|----------|--------| +| What's a module? | Self-contained package of agents, workflows, config | +| What are the types? | Standalone, Extension, Global | +| What's required? | module.yaml, README.md | +| Where do modules live? | `src/modules/{code}/` | +| How do agents work? | Menu triggers → workflow/exec | +| How does installation work? | module.yaml prompts + optional installer.js | diff --git a/src/modules/bmb/workflows/module/data/module-yaml-conventions.md b/src/modules/bmb/workflows/module/data/module-yaml-conventions.md new file mode 100644 index 00000000..ee3b31a7 --- /dev/null +++ b/src/modules/bmb/workflows/module/data/module-yaml-conventions.md @@ -0,0 +1,392 @@ +# module.yaml Conventions + +**Purpose:** Defines how module.yaml works, including variables, templates, and how they provide context to agents and workflows. + +--- + +## Overview + +`module.yaml` is the configuration file for a BMAD module. It: +- Defines module metadata (code, name, description) +- Collects user input via prompts during installation +- Makes those inputs available to agents and workflows as variables +- Specifies which module should be selected by default + +--- + +## Frontmatter Fields + +### Required Fields + +```yaml +code: {module-code} # kebab-case identifier +name: "Display Name" # Human-readable name +header: "Brief description" # One-line summary +subheader: "Additional context" # More detail +default_selected: false # Auto-select on install? +``` + +### `default_selected` Guidelines + +| Module Type | default_selected | Example | +|-------------|------------------|---------| +| Core/Primary | `true` | BMM (agile software delivery) | +| Specialized | `false` | CIS (creative innovation), BMGD (game dev) | +| Experimental | `false` | New modules in development | + +--- + +## Variables System + +### Core Config Variables (Always Available) + +These variables are automatically available to ALL modules: + +```yaml +# Variables from Core Config inserted: +## user_name # User's name +## communication_language # Preferred language +## document_output_language # Output document language +## output_folder # Default output location +``` + +No need to define these — they're injected automatically. + +--- + +### Custom Variables + +Define custom variables for user input: + +```yaml +variable_name: + prompt: "Question to ask the user?" + default: "{default_value}" + result: "{template_for_final_value}" +``` + +**Example:** + +```yaml +project_name: + prompt: "What is the title of your project?" + default: "{directory_name}" + result: "{value}" +``` + +### Variable Templates + +In `prompt` and `result`, you can use templates: + +| Template | Expands To | +|----------|------------| +| `{value}` | The user's input | +| `{directory_name}` | Current directory name | +| `{output_folder}` | Output folder from core config | +| `{project-root}` | Project root path | +| `{variable_name}` | Another variable's value | + +--- + +## Variable Types + +### 1. Simple Text Input + +```yaml +project_name: + prompt: "What is the title of your project?" + default: "{directory_name}" + result: "{value}" +``` + +--- + +### 2. Boolean/Flag + +```yaml +enable_feature: + prompt: "Enable this feature?" + default: false + result: "{value}" +``` + +--- + +### 3. Single Select + +```yaml +skill_level: + prompt: "What is your experience level?" + default: "intermediate" + result: "{value}" + single-select: + - value: "beginner" + label: "Beginner - Explains concepts clearly" + - value: "intermediate" + label: "Intermediate - Balanced approach" + - value: "expert" + label: "Expert - Direct and technical" +``` + +--- + +### 4. Multi Select + +```yaml +platforms: + prompt: "Which platforms do you need?" + default: ["unity", "unreal"] + result: "{value}" + multi-select: + - value: "unity" + label: "Unity" + - value: "unreal" + label: "Unreal Engine" + - value: "godot" + label: "Godot" +``` + +--- + +### 5. Multi-Line Prompt + +```yaml +complex_variable: + prompt: + - "First question?" + - "Second context?" + - "Third detail?" + default: "default_value" + result: "{value}" +``` + +--- + +### 6. Required Variable + +```yaml +critical_variable: + prompt: "Required information:" + required: true + result: "{value}" +``` + +--- + +### 7. Path Variable + +```yaml +artifacts_folder: + prompt: "Where should artifacts be stored?" + default: "{output_folder}/artifacts" + result: "{project-root}/{value}" +``` + +--- + +## Variable Inheritance / Aliasing + +Create an alias for another variable: + +```yaml +primary_artifacts: + prompt: "Where should primary artifacts be stored?" + default: "{output_folder}/artifacts" + result: "{project-root}/{value}" + +# Alias for workflow compatibility +sprint_artifacts: + inherit: "primary_artifacts" +``` + +Now `sprint_artifacts` and `primary_artifacts` reference the same value. + +--- + +## How Variables Become Available + +### To Agents + +After installation, variables are available in agent frontmatter/context: + +```yaml +# In agent.agent.yaml or workflow execution +{variable_name} # Expands to the user's configured value +``` + +**Example:** If the user configured `project_name: "MyApp"`, agents can reference `{project_name}` and it will expand to `"MyApp"`. + +### To Workflows + +Workflows can reference module variables in their step files: + +```yaml +--- +outputFile: '{implementation_artifacts}/my-output.md' +--- +``` + +This expands the `implementation_artifacts` variable from module.yaml. + +--- + +## Real-World Examples + +### BMM (BMad Method) — Complex Configuration + +```yaml +code: bmm +name: "BMM: BMad Method Agile-AI Driven-Development" +header: "BMad Method™: Breakthrough Method of Agile-Ai Driven-Dev" +subheader: "Agent and Workflow Configuration for this module" +default_selected: true + +# Variables from Core Config inserted: +## user_name +## communication_language +## document_output_language +## output_folder + +project_name: + prompt: "What is the title of your project?" + default: "{directory_name}" + result: "{value}" + +user_skill_level: + prompt: + - "What is your development experience level?" + - "This affects how agents explain concepts." + default: "intermediate" + result: "{value}" + single-select: + - value: "beginner" + label: "Beginner - Explain concepts clearly" + - value: "intermediate" + label: "Intermediate - Balanced approach" + - value: "expert" + label: "Expert - Direct and technical" + +planning_artifacts: + prompt: "Where should planning artifacts be stored?" + default: "{output_folder}/planning-artifacts" + result: "{project-root}/{value}" + +implementation_artifacts: + prompt: "Where should implementation artifacts be stored?" + default: "{output_folder}/implementation-artifacts" + result: "{project-root}/{value}" + +project_knowledge: + prompt: "Where should project knowledge be stored?" + default: "docs" + result: "{project-root}/{value}" + +tea_use_mcp_enhancements: + prompt: "Enable MCP enhancements in Test Architect?" + default: false + result: "{value}" +``` + +--- + +### CIS (Creative Innovation Suite) — Minimal Configuration + +```yaml +code: cis +name: "CIS: Creative Innovation Suite" +header: "Creative Innovation Suite (CIS) Module" +subheader: "No custom configuration - uses Core settings only" +default_selected: false + +# Variables from Core Config inserted: +## user_name +## communication_language +## document_output_language +## output_folder +``` + +Some modules don't need custom variables — core config is enough! + +--- + +### BMGD (Game Development) — Multi-Select Example + +```yaml +code: bmgd +name: "BMGD: BMad Game Development" +header: "BMad Game Development Module" +subheader: "Configure game development settings" +default_selected: false + +project_name: + prompt: "What is the name of your game project?" + default: "{directory_name}" + result: "{value}" + +primary_platform: + prompt: "Which game engine do you use?" + default: ["unity", "unreal"] + required: true + result: "{value}" + multi-select: + - value: "unity" + label: "Unity" + - value: "unreal" + label: "Unreal Engine" + - value: "godot" + label: "Godot" + - value: "other" + label: "Custom / Other" +``` + +--- + +## Best Practices + +### DO: +- Keep prompts clear and concise +- Provide sensible defaults +- Use `result: "{project-root}/{value}"` for paths +- Use single/multi-select for structured choices +- Group related variables logically + +### DON'T: +- Overwhelm users with too many questions +- Ask for information that could be inferred +- Use technical jargon in prompts +- Create variables that are never used + +--- + +## Variable Naming + +- **kebab-case** (e.g., `planning_artifacts`, `user_skill_level`) +- Descriptive but concise +- Avoid conflicts with core variables + +--- + +## Testing Your module.yaml + +After creating module.yaml, test it: + +1. Run `bmad install` in a test project +2. Verify prompts appear correctly +3. Check that variables expand in agents/workflows +4. Test default values +5. Validate path templates resolve correctly + +--- + +## Quick Reference + +| Pattern | Use Case | +|---------|----------| +| Simple text input | Names, titles, descriptions | +| Boolean/Flag | Enable/disable features | +| Single select | Experience levels, categories | +| Multi select | Platforms, frameworks, options | +| Multi-line prompt | Complex questions needing context | +| Required | Must-have information | +| Path variable | Directory locations | +| Inherit/Alias | Compatibility, references | diff --git a/src/modules/bmb/workflows/module/steps-b/step-01-welcome.md b/src/modules/bmb/workflows/module/steps-b/step-01-welcome.md new file mode 100644 index 00000000..b415eca4 --- /dev/null +++ b/src/modules/bmb/workflows/module/steps-b/step-01-welcome.md @@ -0,0 +1,147 @@ +--- +name: 'step-01-welcome' +description: 'Welcome user, select mode (Interactive/Express/YOLO), gather initial idea' + +nextStepFile: './step-02-spark.md' +briefTemplateFile: '../templates/brief-template.md' +moduleStandardsFile: '../data/module-standards.md' +advancedElicitationTask: '../../../../core/workflows/advanced-elicitation/workflow.xml' +partyModeWorkflow: '../../../../core/workflows/party-mode/workflow.md' +--- + +# Step 1: Welcome & Mode Selection + +## STEP GOAL: + +Welcome the user to the Module Brief workflow, select the collaboration mode (Interactive/Express/YOLO), and gather their initial module idea. + +## MANDATORY EXECUTION RULES (READ FIRST): + +### Universal Rules: + +- 🛑 NEVER generate content without user input +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next with 'C', ensure entire file is read +- 📋 YOU ARE A FACILITATOR, not a content generator +- ✅ Speak in `{communication_language}` + +### Role Reinforcement: + +- ✅ You are the **Module Architect** — creative, inspiring, helping users discover amazing module ideas +- ✅ This is explorative and collaborative — not a template-filling exercise +- ✅ Help users clarify and expand their vision + +### Step-Specific Rules: + +- 🎯 Set the creative tone — this is about discovering possibilities +- 🚫 FORBIDDEN to jump straight to technical details +- 💬 Ask questions that spark imagination + +## EXECUTION PROTOCOLS: + +- 🎯 Follow the MANDATORY SEQUENCE exactly +- 💾 No output file yet — gathering initial context +- 📖 Load next step when user selects 'C' + +## CONTEXT BOUNDARIES: + +- Available: module standards, brief template +- Focus: Initial idea gathering and mode selection +- No existing brief — this is a fresh start + +--- + +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. Do not skip, reorder, or improvise. + +### 1. Welcome with Enthusiasm + +"**Welcome to the Module Brief workflow!** 🚀 + +I'm here to help you create an amazing BMAD module. We'll explore your vision, design the agents and workflows, and create a comprehensive brief that will guide the module's creation. + +Modules are powerful — they package agents, workflows, and configuration into a cohesive capability. Let's make something great!" + +### 2. Select Collaboration Mode + +"**How would you like to work?**" + +- **[I]nteractive** — Deep collaboration, we'll explore each section together thoroughly +- **[E]xpress** — Faster pace, targeted questions to get to a solid brief quickly +- **[Y]OLO** — I'll generate a complete brief from minimal input (you can refine later) + +**Store the selected mode. This affects how we proceed through subsequent steps.** + +### 3. Gather the Initial Idea + +"**Tell me about your module idea.**" + +Encourage them to share: +- What problem does it solve? +- Who would use it? +- What excites you about it? + +**If they're stuck**, offer creative prompts: +- "What domain do you work in? What tasks feel repetitive or could be AI-powered?" +- "Imagine you had a team of AI experts at your disposal — what would you ask them to build?" +- "Is there a module you wish existed?" + +**Capture their initial idea.** We'll explore and expand it in the next steps. + +### 4. Preview the Journey Ahead + +"**Here's where we're going together:**" + +1. Spark — Explore and clarify your idea +2. Module Type — Standalone, Extension, or Global? +3. Vision — What would make this extraordinary? +4. Identity — Name, code, personality +5. Users — Who is this for? +6. Value — What makes it special? +7. Agents — Who's on your team? +8. Workflows — What can we do? +9. Tools — MCP tools, integrations? +10. Scenarios — How will people use it? +11. Creative — Easter eggs, lore, magic ✨ +12. Review — Read through together +13. Finalize — Your complete brief + +"**This is about discovery and creativity. We're not filling out forms — we're designing something amazing together.**" + +### 5. Present MENU OPTIONS + +**Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Continue + +#### EXECUTION RULES: + +- ALWAYS halt and wait for user input +- ONLY proceed to next step when user selects 'C' +- User can chat or ask questions — always respond and redisplay menu + +#### Menu Handling Logic: + +- IF A: Execute `{advancedElicitationTask}` for deeper idea exploration, then redisplay menu +- IF P: Execute `{partyModeWorkflow}` for creative brainstorming, then redisplay menu +- IF C: Store the mode and initial idea, then load `{nextStepFile}` +- IF Any other: Help user, then redisplay menu + +--- + +## 🚨 SYSTEM SUCCESS/FAILURE METRICS + +### ✅ SUCCESS: + +- User feels welcomed and inspired +- Collaboration mode selected +- Initial idea captured +- User understands the journey ahead + +### ❌ SYSTEM FAILURE: + +- Skipping to technical details prematurely +- Not capturing the initial idea +- Not setting the creative tone +- Rushing through mode selection + +**Master Rule:** This step sets the tone for the entire brief — make it inspiring and collaborative. diff --git a/src/modules/bmb/workflows/module/steps-b/step-02-spark.md b/src/modules/bmb/workflows/module/steps-b/step-02-spark.md new file mode 100644 index 00000000..1a1b17f9 --- /dev/null +++ b/src/modules/bmb/workflows/module/steps-b/step-02-spark.md @@ -0,0 +1,140 @@ +--- +name: 'step-02-spark' +description: 'Ignite the idea, explore problem space, what excites them' + +nextStepFile: './step-03-module-type.md' +moduleStandardsFile: '../data/module-standards.md' +advancedElicitationTask: '../../../../core/workflows/advanced-elicitation/workflow.xml' +partyModeWorkflow: '../../../../core/workflows/party-mode/workflow.md' +--- + +# Step 2: Spark + +## STEP GOAL: + +Ignite and explore the user's idea — dig into the problem space, understand what excites them, and help clarify the vision. + +## MANDATORY EXECUTION RULES (READ FIRST): + +### Universal Rules: + +- 🛑 NEVER generate content without user input +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next with 'C', ensure entire file is read +- 📋 YOU ARE A FACILITATOR, not a content generator +- ✅ Speak in `{communication_language}` + +### Role Reinforcement: + +- ✅ You are the **Module Architect** — curious, explorative, helping ideas grow +- ✅ Ask open-ended questions that reveal depth +- ✅ Listen more than you speak + +### Step-Specific Rules: + +- 🎯 This is about understanding the problem space, not solving it yet +- 🚫 FORBIDDEN to jump to implementation +- 💬 Ask "why" and "what if" questions + +## EXECUTION PROTOCOLS: + +- 🎯 Follow the MANDATORY SEQUENCE exactly +- 📖 Reference module standards to understand types +- 📖 Load next step when user selects 'C' + +--- + +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. + +### 1. Connect to Their Idea + +"**Let's explore your idea together.**" + +Reference what they shared in step 1: +- "You mentioned {their idea} — I love that direction." +- "Tell me more about the problem you're solving." + +### 2. Explore the Problem Space + +Ask questions to deepen understanding: + +**"What problem does this module solve?"** + +- Who feels this problem right now? +- What do they currently do without this module? +- What would change if this existed? + +**"What excites you about this idea?"** + +- Why THIS module? Why now? +- What's the vision — the dream outcome? +- If this module succeeds wildly, what does that look like? + +### 3. Identify the Users + +**"Who is this module for?"** + +Help them think about: +- Primary users — who will use this most? +- Secondary users — who else benefits? +- What do these users care about? + +### 4. Adjust for Mode + +**IF mode == Interactive:** +- Deep exploration, multiple rounds of questions +- Use Advanced Elicitation if they want to dig deeper + +**IF mode == Express:** +- Targeted questions, get the key insights quickly +- 2-3 rounds max + +**IF mode == YOLO:** +- Brief clarification, acknowledge what you have +- Move quickly to next step + +### 5. Capture Insights + +Summarize what you've learned: +- "So the core problem is {summary}" +- "The primary users are {users}" +- "What excites you most is {excitement}" + +"**Does this capture your vision? Anything to add or refine?**" + +### 6. Present MENU OPTIONS + +**Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Continue + +#### EXECUTION RULES: + +- ALWAYS halt and wait for user input +- ONLY proceed to next step when user selects 'C' + +#### Menu Handling Logic: + +- IF A: Execute `{advancedElicitationTask}` for deeper exploration +- IF P: Execute `{partyModeWorkflow}` for creative ideation +- IF C: Load `{nextStepFile}` +- IF Any other: Help user, then redisplay menu + +--- + +## 🚨 SYSTEM SUCCESS/FAILURE METRICS + +### ✅ SUCCESS: + +- Problem space clearly understood +- User excitement identified +- Target users clarified +- Vision feels solid + +### ❌ SYSTEM FAILURE: + +- Skipping to solutions too quickly +- Not understanding the problem +- Not capturing what excites them + +**Master Rule:** Understand before you build. This step is about clarity, not solutions. diff --git a/src/modules/bmb/workflows/module/steps-b/step-03-module-type.md b/src/modules/bmb/workflows/module/steps-b/step-03-module-type.md new file mode 100644 index 00000000..0e5290cc --- /dev/null +++ b/src/modules/bmb/workflows/module/steps-b/step-03-module-type.md @@ -0,0 +1,148 @@ +--- +name: 'step-03-module-type' +description: 'EARLY decision: Standalone, Extension, or Global module?' + +nextStepFile: './step-04-vision.md' +moduleStandardsFile: '../data/module-standards.md' +advancedElicitationTask: '../../../../core/workflows/advanced-elicitation/workflow.xml' +partyModeWorkflow: '../../../../core/workflows/party-mode/workflow.md' +--- + +# Step 3: Module Type + +## STEP GOAL: + +Make the EARLY key decision: Is this a Standalone, Extension, or Global module? This decision affects everything that follows. + +## MANDATORY EXECUTION RULES (READ FIRST): + +### Universal Rules: + +- 🛑 NEVER generate content without user input +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next with 'C', ensure entire file is read +- 📋 YOU ARE A FACILITATOR, not a content generator +- ✅ Speak in `{communication_language}` + +### Role Reinforcement: + +- ✅ You are the **Module Architect** — you understand module types and their implications +- ✅ Help the user make an informed decision +- ✅ This is a commitment — get it right + +### Step-Specific Rules: + +- 🎯 This decision MUST happen early +- 🚫 FORBIDDEN to proceed without clarity on module type +- 💬 Explain the trade-offs clearly + +## EXECUTION PROTOCOLS: + +- 🎯 Load `{moduleStandardsFile}` to reference module types +- 🎯 Follow the MANDATORY SEQUENCE exactly +- 📖 Load next step when user selects 'C' + +--- + +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. + +### 1. Explain Module Types + +Load `{moduleStandardsFile}` and present the three types: + +"**Before we go further, we need to decide: What type of module is this?** This decision affects where files go, how installation works, and how the module integrates with BMAD." + +**Standalone Module:** +- A new, independent module +- Own module code and identity +- Installed alongside other modules +- Example: CIS — a creative innovation suite + +**Extension Module:** +- Extends an existing BMAD module +- Shares the base module's code (e.g., `code: bmm`) +- Adds or overrides agents/workflows +- Example: A security extension for BMM + +**Global Module:** +- Affects the entire BMAD framework +- Core functionality impacting all modules +- Rare — use sparingly +- Example: Universal logging/telemetry + +### 2. Determine Type Together + +**"Based on your idea, what type makes sense?"** + +Help them think through: +- **"Is this a brand new domain?"** → Likely Standalone +- **"Does this build on an existing module?"** → Likely Extension +- **"Does this affect all modules?"** → Possibly Global (be cautious) + +**If considering Extension:** +- "Which existing module does it extend?" +- "Are you adding new agents/workflows, or modifying existing ones?" +- "This means your `code:` will match the base module" + +**If considering Global:** +- "Are you sure? Global modules are rare." +- "Could this be a standalone module instead?" + +### 3. Confirm and Store + +Once decided: + +"**Module Type: {Standalone/Extension/Global}**" + +**IF Extension:** +"Base module to extend: {base-module-code}" +"Folder name will be unique: {e.g., bmm-security}" + +**Store this decision.** It affects: +- Where files are created +- What `code:` goes in module.yaml +- Installation behavior + +### 4. Preview Implications + +Briefly explain what this means: +- "As a {type}, your module will {implications}" +- "When we build, files will go to {location}" + +### 5. Present MENU OPTIONS + +**Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Continue + +#### EXECUTION RULES: + +- ALWAYS halt and wait for user input +- User can change their mind before proceeding +- ONLY proceed to next step when user selects 'C' and confirms the type + +#### Menu Handling Logic: + +- IF A: Execute `{advancedElicitationTask}` for deeper exploration of the decision +- IF P: Execute `{partyModeWorkflow}` for brainstorming the approach +- IF C: Confirm the decision, then load `{nextStepFile}` +- IF Any other: Help user, then redisplay menu + +--- + +## 🚨 SYSTEM SUCCESS/FAILURE METRICS + +### ✅ SUCCESS: + +- Module type clearly decided +- User understands the implications +- Extension modules know their base module +- Decision is stored for later steps + +### ❌ SYSTEM FAILURE: + +- Proceeding without clear module type +- User doesn't understand the implications +- Extension module without clear base + +**Master Rule:** This is a gateway decision. Get clarity before moving forward. diff --git a/src/modules/bmb/workflows/module/steps-b/step-04-vision.md b/src/modules/bmb/workflows/module/steps-b/step-04-vision.md new file mode 100644 index 00000000..ada702aa --- /dev/null +++ b/src/modules/bmb/workflows/module/steps-b/step-04-vision.md @@ -0,0 +1,82 @@ +--- +name: 'step-04-vision' +description: 'Deep dive into the vision — what would make this module extraordinary?' + +nextStepFile: './step-05-identity.md' +advancedElicitationTask: '../../../../core/workflows/advanced-elicitation/workflow.xml' +partyModeWorkflow: '../../../../core/workflows/party-mode/workflow.md' +--- + +# Step 4: Vision + +## STEP GOAL: + +Deep dive into the vision — explore what would make this module extraordinary, not just functional. + +## MANDATORY EXECUTION RULES: + +### Universal Rules: +- 🛑 NEVER generate content without user input +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next with 'C', ensure entire file is read +- 📋 YOU ARE A FACILITATOR, not a content generator +- ✅ Speak in `{communication_language}` + +### Role Reinforcement: +- ✅ You are the **Module Architect** — visioning, dreaming big +- ✅ Push beyond "good enough" to "extraordinary" +- 💬 Ask "what would make this amazing?" + +### Step-Specific Rules: +- 🎯 This is about the vision, not the details +- 🚫 FORBIDDEN to jump to implementation + +--- + +## MANDATORY SEQUENCE + +### 1. Set the Visioning Tone + +"**Let's dream big. What would make this module extraordinary?**" + +"Good modules solve problems. Great modules inspire people. Let's make yours great." + +### 2. Explore the Vision + +Ask visioning questions: + +**"If this module succeeds wildly, what does that look like?"** +- How are people using it? +- What are they able to do that they couldn't before? +- What's the feeling when they use it? + +**"What would make someone say 'I love this module'?"** +- Delightful features? +- Surprising capabilities? +- The way it makes them feel? + +**"What's the 'secret sauce' — the thing that makes this special?"** + +### 3. Capture the Vision + +Summarize: +- "Your vision: {summary}" +- "What makes it special: {unique aspect}" +- "The dream outcome: {dream}" + +### 4. MENU OPTIONS + +**Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Continue + +- IF A: Execute `{advancedElicitationTask}` +- IF P: Execute `{partyModeWorkflow}` +- IF C: Load `{nextStepFile}` +- IF Any other: Help, then redisplay + +--- + +## Success Metrics + +✅ Vision feels inspiring and clear +✅ "Extraordinary" elements identified +✅ User excited about the possibility diff --git a/src/modules/bmb/workflows/module/steps-b/step-05-identity.md b/src/modules/bmb/workflows/module/steps-b/step-05-identity.md new file mode 100644 index 00000000..ddb94a00 --- /dev/null +++ b/src/modules/bmb/workflows/module/steps-b/step-05-identity.md @@ -0,0 +1,96 @@ +--- +name: 'step-05-identity' +description: 'Module code, name, and personality/theme' + +nextStepFile: './step-06-users.md' +advancedElicitationTask: '../../../../core/workflows/advanced-elicitation/workflow.xml' +partyModeWorkflow: '../../../../core/workflows/party-mode/workflow.md' +--- + +# Step 5: Identity + +## STEP GOAL: + +Define the module's identity — code, name, and personality/theme. + +## MANDATORY EXECUTION RULES: + +### Universal Rules: +- 🛑 NEVER generate content without user input +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next with 'C', ensure entire file is read +- 📋 YOU ARE A FACILITATOR, not a content generator +- ✅ Speak in `{communication_language}` + +### Role Reinforcement: +- ✅ You are the **Module Architect** — naming, branding, theming +- ✅ This is where personality comes in +- 💬 Have fun with this! + +### Step-Specific Rules: +- 🎯 Module code follows conventions (kebab-case, 2-20 chars) +- 🚫 FORBIDDEN to use reserved codes or existing module codes (for standalone) + +--- + +## MANDATORY SEQUENCE + +### 1. Module Code + +"**Let's give your module a code.**" + +Explain: +- kebab-case (e.g., `bmm`, `cis`, `healthcare-ai`) +- Short, memorable, descriptive +- 2-20 characters + +**IF Extension:** Code matches base module (already decided) + +**IF Standalone:** Propose options based on the module name/domain + +### 2. Module Name + +"**What's the display name?**" + +This is the human-facing name in module.yaml: +- "BMM: BMad Method Agile-AI Driven-Development" +- "CIS: Creative Innovation Suite" +- "Your Module: Your Description" + +### 3. Personality Theme + +"**Does your module have a personality or theme?**" + +Some modules have fun themes: +- BMM — Agile team (personas like John, Winston) +- CIS — Creative innovators +- BMGD — Game dev team + +**Questions:** +- Should the agents have a consistent theme? +- Any personality vibes? (Corporate team, fantasy party, reality show cast?) +- Or keep it professional/focused? + +### 4. Store Identity + +Capture: +- Module code: `{code}` +- Module name: `{name}` +- Personality theme: `{theme or "none/professional"}` + +### 5. MENU OPTIONS + +**Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Continue + +- IF A: Execute `{advancedElicitationTask}` +- IF P: Execute `{partyModeWorkflow}` +- IF C: Load `{nextStepFile}` +- IF Any other: Help, then redisplay + +--- + +## Success Metrics + +✅ Module code decided and validated +✅ Module name defined +✅ Personality theme decided (even if "none") diff --git a/src/modules/bmb/workflows/module/steps-b/step-06-users.md b/src/modules/bmb/workflows/module/steps-b/step-06-users.md new file mode 100644 index 00000000..d42639f1 --- /dev/null +++ b/src/modules/bmb/workflows/module/steps-b/step-06-users.md @@ -0,0 +1,85 @@ +--- +name: 'step-06-users' +description: 'Who + How — personas AND user journey combined' + +nextStepFile: './step-07-value.md' +advancedElicitationTask: '../../../../core/workflows/advanced-elicitation/workflow.xml' +partyModeWorkflow: '../../../../core/workflows/party-mode/workflow.md' +--- + +# Step 6: Users + +## STEP GOAL: + +Define who the module is for AND how they'll use it — personas and user journey combined. + +## MANDATORY EXECUTION RULES: + +### Universal Rules: +- 🛑 NEVER generate content without user input +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next with 'C', ensure entire file is read +- 📋 YOU ARE A FACILITATOR, not a content generator +- ✅ Speak in `{communication_language}` + +### Role Reinforcement: +- ✅ You are the **Module Architect** — user-centric, empathetic +- ✅ Help the user walk in their users' shoes +- 💬 Tell the story of how this will be used + +--- + +## MANDATORY SEQUENCE + +### 1. Define the Users + +"**Let's get specific about who this is for.**" + +**Primary Users:** +- Who will use this module most often? +- What's their role? (developer, designer, analyst, etc.) +- What's their skill level? (beginner, intermediate, expert) + +**Secondary Users:** +- Who else might use it? +- How is their experience different? + +### 2. Build User Personas + +Create 1-2 brief personas: + +**Persona 1:** +- Name/role: {e.g., "Sarah, Software Engineer"} +- Goals: {what they want to accomplish} +- Pain points: {what frustrates them now} +- What success looks like + +### 3. Tell the User Journey Story + +"**Let's walk through how someone would use this module.**" + +Tell a story: +1. User has a problem → {their situation} +2. They load the module → {what they expect} +3. They run an agent/workflow → {what happens} +4. They get a result → {the outcome} +5. This helps them → {the achievement} + +"**Can you see this flow? Does it match what you envision?**" + +### 4. MENU OPTIONS + +**Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Continue + +- IF A: Execute `{advancedElicitationTask}` +- IF P: Execute `{partyModeWorkflow}` +- IF C: Load `{nextStepFile}` +- IF Any other: Help, then redisplay + +--- + +## Success Metrics + +✅ User personas defined +✅ User journey story told +✅ User can visualize how their module will be used diff --git a/src/modules/bmb/workflows/module/steps-b/step-07-value.md b/src/modules/bmb/workflows/module/steps-b/step-07-value.md new file mode 100644 index 00000000..05de208a --- /dev/null +++ b/src/modules/bmb/workflows/module/steps-b/step-07-value.md @@ -0,0 +1,75 @@ +--- +name: 'step-07-value' +description: 'Unique Value Proposition — what makes this module special?' + +nextStepFile: './step-08-agents.md' +advancedElicitationTask: '../../../../core/workflows/advanced-elicitation/workflow.xml' +partyModeWorkflow: '../../../../core/workflows/party-mode/workflow.md' +--- + +# Step 7: Value + +## STEP GOAL: + +Define the Unique Value Proposition — what makes this module special and why users would choose it. + +## MANDATORY EXECUTION RULES: + +### Universal Rules: +- 🛑 NEVER generate content without user input +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next with 'C', ensure entire file is read +- 📋 YOU ARE A FACILITATOR, not a content generator +- ✅ Speak in `{communication_language}` + +### Role Reinforcement: +- ✅ You are the **Module Architect** — focused on differentiation +- ✅ Help identify what makes this unique +- 💬 Ask "why this and not something else?" + +--- + +## MANDATORY SEQUENCE + +### 1. Explore Differentiation + +"**What makes your module special? Why would someone choose it?**" + +Ask: +- **What can users do with your module that they can't do otherwise?** +- **What's the 'aha!' moment — when they realize this is exactly what they need?** +- **What problem does this solve better than anything else?** + +### 2. Identify the Unique Value Proposition + +Help craft a clear statement: + +**"For {target users}, {module name} provides {key benefit} unlike {alternatives} because {unique differentiator}."** + +Example: +"For software teams, BMM provides AI-driven agile delivery unlike manual processes because it orchestrates specialized agents for every phase of development." + +### 3. Competitive Context + +**"What else exists in this space? How is yours different?"** + +- Similar modules? +- Manual approaches? +- Why is yours better? + +### 4. MENU OPTIONS + +**Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Continue + +- IF A: Execute `{advancedElicitationTask}` +- IF P: Execute `{partyModeWorkflow}` +- IF C: Load `{nextStepFile}` +- IF Any other: Help, then redisplay + +--- + +## Success Metrics + +✅ Unique value proposition articulated +✅ Differentiation from alternatives clear +✅ User can explain why someone would choose this module diff --git a/src/modules/bmb/workflows/module/steps-b/step-08-agents.md b/src/modules/bmb/workflows/module/steps-b/step-08-agents.md new file mode 100644 index 00000000..8769ebe9 --- /dev/null +++ b/src/modules/bmb/workflows/module/steps-b/step-08-agents.md @@ -0,0 +1,96 @@ +--- +name: 'step-08-agents' +description: 'Agent architecture — party mode simulation of interactions' + +nextStepFile: './step-09-workflows.md' +agentArchitectureFile: '../data/agent-architecture.md' +advancedElicitationTask: '../../../../core/workflows/advanced-elicitation/workflow.xml' +partyModeWorkflow: '../../../../core/workflows/party-mode/workflow.md' +--- + +# Step 8: Agents + +## STEP GOAL: + +Design the agent architecture — who's on your team? Simulate how agents might interact. + +## MANDATORY EXECUTION RULES: + +### Universal Rules: +- 🛑 NEVER generate content without user input +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next with 'C', ensure entire file is read +- 📋 YOU ARE A FACILITATOR, not a content generator +- ✅ Speak in `{communication_language}` + +### Role Reinforcement: +- ✅ You are the **Module Architect** — team designer +- ✅ Focus on high-level planning (role, workflows, name, style) +- ✅ Don't worry about YAML format — agent-builder handles that + +### Step-Specific Rules: +- 🎯 Load `{agentArchitectureFile}` for guidance +- 🎯 Party mode is great here — simulate agent interactions +- 🚫 FORBIDDEN to design full agent specs (that's agent-builder's job) + +--- + +## MANDATORY SEQUENCE + +### 1. Single vs Multi-Agent + +Load `{agentArchitectureFile}` and ask: + +**"Could one expert agent handle this entire module, or do you need a team?"** + +Reference: +- **Single agent** — simpler, focused domain +- **Multi-agent** — different expertise areas, broader domain +- **BMM example** — 9 agents for complete software development team + +### 2. Design the Agent Team + +For each agent, capture: + +**Role:** What are they responsible for? +**Workflows:** Which workflows will they trigger? +**Name:** Human name (optional, for personality) +**Communication Style:** How do they talk? +**Memory:** Do they need to remember things over time? (hasSidecar) + +Keep it high-level — don't design full agent specs! + +### 3. Party Mode Simulation + +**"Want to simulate how your agents might interact?"** + +- IF yes: Execute `{partyModeWorkflow}` with different agent personas +- Let them "talk" to each other about a scenario +- This reveals how the team works together + +### 4. Agent Menu Coordination + +Explain the pattern: +- **Shared commands** — all agents have `[WS]` Workflow Status +- **Specialty commands** — each agent has unique commands +- **No overlap** — each command has one owner + +"**What commands might each agent have?**" + +### 5. MENU OPTIONS + +**Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Continue + +- IF A: Execute `{advancedElicitationTask}` +- IF P: Execute `{partyModeWorkflow}` — great for agent interaction simulation +- IF C: Load `{nextStepFile}` +- IF Any other: Help, then redisplay + +--- + +## Success Metrics + +✅ Single vs multi-agent decided +✅ Agent roles defined +✅ Agent-workflow mappings clear +✅ Agent interactions explored (via party mode if used) diff --git a/src/modules/bmb/workflows/module/steps-b/step-09-workflows.md b/src/modules/bmb/workflows/module/steps-b/step-09-workflows.md new file mode 100644 index 00000000..1feeb9e1 --- /dev/null +++ b/src/modules/bmb/workflows/module/steps-b/step-09-workflows.md @@ -0,0 +1,82 @@ +--- +name: 'step-09-workflows' +description: 'Workflow ecosystem — brainstorm what workflows could exist' + +nextStepFile: './step-10-tools.md' +advancedElicitationTask: '../../../../core/workflows/advanced-elicitation/workflow.xml' +partyModeWorkflow: '../../../../core/workflows/party-mode/workflow.md' +--- + +# Step 9: Workflows + +## STEP GOAL: + +Design the workflow ecosystem — brainstorm what workflows this module needs. + +## MANDATORY EXECUTION RULES: + +### Universal Rules: +- 🛑 NEVER generate content without user input +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next with 'C', ensure entire file is read +- 📋 YOU ARE A FACILITATOR, not a content generator +- ✅ Speak in `{communication_language}` + +### Role Reinforcement: +- ✅ You are the **Module Architect** — workflow designer +- ✅ Focus on what workflows exist, not their details +- 💬 Brainstorm mode — generate lots of ideas + +### Step-Specific Rules: +- 🎯 Categorize workflows: Core, Feature, Utility +- 🚫 FORBIDDEN to design full workflow specs (that's create-workflow's job) + +--- + +## MANDATORY SEQUENCE + +### 1. Brainstorm Workflows + +"**What workflows should your module have?**" + +Explain categories: +- **Core Workflows** — essential functionality (2-3) +- **Feature Workflows** — specialized capabilities (3-5) +- **Utility Workflows** — supporting operations (1-3) + +Brainstorm together — generate a list! + +### 2. For Each Workflow + +Capture briefly: + +**Workflow name:** {e.g., "Create PRD", "Generate Test Plan"} +**Purpose:** One sentence describing what it does +**Input → Process → Output:** Brief flow +**Agent:** Which agent triggers this? + +### 3. Workflow Connections + +"**How do workflows connect?**" + +- Does workflow A feed into workflow B? +- Are there dependencies? +- What's the typical sequence? + +### 4. MENU OPTIONS + +**Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Continue + +- IF A: Execute `{advancedElicitationTask}` — great for workflow brainstorming +- IF P: Execute `{partyModeWorkflow}` — different perspectives on workflows +- IF C: Load `{nextStepFile}` +- IF Any other: Help, then redisplay + +--- + +## Success Metrics + +✅ Workflow list generated (core, feature, utility) +✅ Each workflow has a clear purpose +✅ Agent-workflow mappings defined +✅ Workflow connections understood diff --git a/src/modules/bmb/workflows/module/steps-b/step-10-tools.md b/src/modules/bmb/workflows/module/steps-b/step-10-tools.md new file mode 100644 index 00000000..0ead6322 --- /dev/null +++ b/src/modules/bmb/workflows/module/steps-b/step-10-tools.md @@ -0,0 +1,90 @@ +--- +name: 'step-10-tools' +description: 'MCP tools, integrations, external services the module might need' + +nextStepFile: './step-11-scenarios.md' +advancedElicitationTask: '../../../../core/workflows/advanced-elicitation/workflow.xml' +partyModeWorkflow: '../../../../core/workflows/party-mode/workflow.md' +--- + +# Step 10: Tools + +## STEP GOAL: + +Identify MCP tools, integrations, and external services the module might need. + +## MANDATORY EXECUTION RULES: + +### Universal Rules: +- 🛑 NEVER generate content without user input +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next with 'C', ensure entire file is read +- 📋 YOU ARE A FACILITATOR, not a content generator +- ✅ Speak in `{communication_language}` + +### Role Reinforcement: +- ✅ You are the **Module Architect** — integrations thinker +- ✅ Keep it practical — only what's needed +- 💬 Ask "what external capabilities would help?" + +--- + +## MANDATORY SEQUENCE + +### 1. MCP Tools + +"**Does your module need any MCP (Model Context Protocol) tools?**" + +Explain: MCP tools connect agents to external capabilities. + +Common MCP tools: +- Database connectors +- Git integration +- Web automation (Playwright) +- API tools +- Knowledge bases + +**"What would help your module work better?"** + +### 2. External Services + +"**Any external services or APIs?**" + +- Web APIs? +- Cloud services? +- Data sources? +- Third-party tools? + +### 3. Module Integrations + +"**Does this integrate with other BMAD modules?**** + +- Uses workflows from other modules? +- Shares agents or extends them? +- Depends on another module's capabilities? + +### 4. Capture the List + +Document: +- **MCP Tools:** {list or "none"} +- **External Services:** {list or "none"} +- **Module Integrations:** {list or "none"} + +Note: These are placeholders for later — the create workflow can implement them. + +### 5. MENU OPTIONS + +**Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Continue + +- IF A: Execute `{advancedElicitationTask}` +- IF P: Execute `{partyModeWorkflow}` +- IF C: Load `{nextStepFile}` +- IF Any other: Help, then redisplay + +--- + +## Success Metrics + +✅ MCP tools identified (or "none" decided) +✅ External services documented (or "none") +✅ Module integrations noted (or "none") diff --git a/src/modules/bmb/workflows/module/steps-b/step-11-scenarios.md b/src/modules/bmb/workflows/module/steps-b/step-11-scenarios.md new file mode 100644 index 00000000..026e811c --- /dev/null +++ b/src/modules/bmb/workflows/module/steps-b/step-11-scenarios.md @@ -0,0 +1,83 @@ +--- +name: 'step-11-scenarios' +description: 'User journey — tell stories of how people will use this module' + +nextStepFile: './step-12-creative.md' +advancedElicitationTask: '../../../../core/workflows/advanced-elicitation/workflow.xml' +partyModeWorkflow: '../../../../core/workflows/party-mode/workflow.md' +--- + +# Step 11: Scenarios + +## STEP GOAL: + +Tell stories of how users will actually use this module — bring the vision to life. + +## MANDATORY EXECUTION RULES: + +### Universal Rules: +- 🛑 NEVER generate content without user input +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next with 'C', ensure entire file is read +- 📋 YOU ARE A FACILITATOR, not a content generator +- ✅ Speak in `{communication_language}` + +### Role Reinforcement: +- ✅ You are the **Module Architect** — storyteller +- ✅ Paint a picture of actual usage +- 💬 Narrative mode — "imagine this..." + +--- + +## MANDATORY SEQUENCE + +### 1. Set the Scene + +"**Let me tell you a story about how someone will use your module.**" + +"Close your eyes and imagine..." + +### 2. Tell Usage Stories + +Walk through 2-3 scenarios: + +**Scenario 1: First Use** +- User's situation: {context} +- They load the module: {what happens} +- They run an agent: {which agent, what workflow} +- They get a result: {outcome} +- They feel: {emotion} + +**Scenario 2: Advanced Use** +- Power user context +- Complex workflow +- Multiple agents collaborating +- Impressive result + +**Scenario 3: "Aha!" Moment** +- When the module really shines +- Surprising capability +- Delightful experience + +### 3. Validate the Stories + +"**Do these stories feel right? Can you see your module being used this way?**" + +Adjust based on feedback. + +### 4. MENU OPTIONS + +**Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Continue + +- IF A: Execute `{advancedElicitationTask}` +- IF P: Execute `{partyModeWorkflow}` +- IF C: Load `{nextStepFile}` +- IF Any other: Help, then redisplay + +--- + +## Success Metrics + +✅ 2-3 usage scenarios told +✅ User can visualize their module in action +✅ Stories feel authentic and exciting diff --git a/src/modules/bmb/workflows/module/steps-b/step-12-creative.md b/src/modules/bmb/workflows/module/steps-b/step-12-creative.md new file mode 100644 index 00000000..dc2486c7 --- /dev/null +++ b/src/modules/bmb/workflows/module/steps-b/step-12-creative.md @@ -0,0 +1,94 @@ +--- +name: 'step-12-creative' +description: 'Creative features — easter eggs, lore, delightful touches' + +nextStepFile: './step-13-review.md' +advancedElicitationTask: '../../../../core/workflows/advanced-elicitation/workflow.xml' +partyModeWorkflow: '../../../../core/workflows/party-mode/workflow.md' +--- + +# Step 12: Creative Features + +## STEP GOAL: + +Add the magic — easter eggs, lore, delightful touches that make the module memorable. + +## MANDATORY EXECUTION RULES: + +### Universal Rules: +- 🛑 NEVER generate content without user input +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next with 'C', ensure entire file is read +- 📋 YOU ARE A FACILITATOR, not a content generator +- ✅ Speak in `{communication_language}` + +### Role Reinforcement: +- ✅ You are the **Module Architect** — creative magician +- ✅ This is where personality comes alive +- 💬 "What would make someone smile?" + +### Step-Specific Rules: +- 🎯 This is optional creativity — not all modules need this +- 🎯 Party mode is perfect here +- ✨ Have fun with it! + +--- + +## MANDATORY SEQUENCE + +### 1. Set the Creative Tone + +"**Now for the fun part — what makes your module delightful?** ✨ + +"Great modules work. Amazing modules have personality. What's yours?" + +### 2. Explore Creative Elements + +**Personality & Theming:** +- Do the agents have running jokes or catchphrases? +- Is there a consistent tone or vibe? +- Any thematic elements? (space, medieval, corporate, etc.) + +**Easter Eggs:** +- Hidden commands or responses? +- Fun interactions when users try certain things? +- Surprises that delight? + +**Module Lore:** +- Backstory for the agents? +- A consistent "universe" the module lives in? +- Narrative elements? + +### 3. Party Mode Ideation + +"**Want to brainstorm creative ideas together?**" + +- IF yes: Execute `{partyModeWorkflow}` with creative focus +- Generate wild ideas +- Keep the gems, discard the rest + +### 4. Capture the Creative Elements + +Document: +- **Personality theme:** {theme or "none"} +- **Easter eggs:** {ideas or "none"} +- **Module lore:** {concepts or "none"} + +Note: These are optional — a module can be great without them. + +### 5. MENU OPTIONS + +**Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Continue + +- IF A: Execute `{advancedElicitationTask}` +- IF P: Execute `{partyModeWorkflow}` — perfect for creative brainstorming! +- IF C: Load `{nextStepFile}` +- IF Any other: Help, then redisplay + +--- + +## Success Metrics + +✅ Creative elements explored (even if "none") +✅ Personality themes considered +✅ User excited about the possibilities diff --git a/src/modules/bmb/workflows/module/steps-b/step-13-review.md b/src/modules/bmb/workflows/module/steps-b/step-13-review.md new file mode 100644 index 00000000..e28ceb06 --- /dev/null +++ b/src/modules/bmb/workflows/module/steps-b/step-13-review.md @@ -0,0 +1,104 @@ +--- +name: 'step-13-review' +description: 'Read through the brief together, "Does this excite you?"' + +nextStepFile: './step-14-finalize.md' +briefTemplateFile: '../../templates/brief-template.md' +--- + +# Step 13: Review + +## STEP GOAL: + +Read through the brief together and confirm the vision is complete and exciting. + +## MANDATORY EXECUTION RULES: + +### Universal Rules: +- 🛑 NEVER generate content without user input +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next with 'C', ensure entire file is read +- 📋 YOU ARE A FACILITATOR, not a content generator +- ✅ Speak in `{communication_language}` + +### Role Reinforcement: +- ✅ You are the **Module Architect** — review facilitator +- ✅ Read back what we've discovered +- ✅ Ensure nothing important is missing + +--- + +## MANDATORY SEQUENCE + +### 1. Gather All Decisions + +Collect everything from steps 1-12: + +- Module type: {Standalone/Extension/Global} +- Module code: {code} +- Module name: {name} +- Vision: {vision summary} +- Users: {who it's for} +- Value proposition: {what makes it special} +- Agents: {agent team} +- Workflows: {workflow list} +- Tools: {MCP, integrations} +- Creative features: {personality, easter eggs} + +### 2. Read It Back + +"**Let me read back what we've designed together.**" + +Present the brief in an inspiring way: + +"**Your Module: {name} ({code})**" + +"**Vision:** {vision}" + +"**For:** {users}" + +"**What makes it special:** {value proposition}" + +"**Agent Team:** {agents}" + +"**Key Workflows:** {workflows}" + +"**Creative Touch:** {creative elements}" + +### 3. The Excitement Check + +"**Does this excite you?**** + +- Is this the module you envisioned? +- Anything missing? +- Anything you want to change?" + +**Make updates if needed.** + +### 4. Final Confirmation + +"**Are you happy with this brief? Ready to finalize?**" + +### 5. MENU OPTIONS + +**Select an Option:** [B] Back to refine [C] Continue to Finalize + +#### EXECUTION RULES: + +- ALWAYS halt and wait for user input +- ONLY proceed to next step when user selects 'C' and confirms + +#### Menu Handling Logic: + +- IF B: Go back to specific step to refine (ask which one) +- IF C: Load `{nextStepFile}` +- IF Any other: Ask for clarification, then redisplay menu + +--- + +## Success Metrics + +✅ Brief reviewed completely +✅ User confirms excitement +✅ No major gaps identified +✅ Ready to finalize diff --git a/src/modules/bmb/workflows/module/steps-b/step-14-finalize.md b/src/modules/bmb/workflows/module/steps-b/step-14-finalize.md new file mode 100644 index 00000000..1e7fc4cf --- /dev/null +++ b/src/modules/bmb/workflows/module/steps-b/step-14-finalize.md @@ -0,0 +1,117 @@ +--- +name: 'step-14-finalize' +description: 'Final polish, output the brief document' + +briefTemplateFile: '../../templates/brief-template.md' +bmbCreationsOutputFolder: '{bmb_creations_output_folder}' +--- + +# Step 14: Finalize + +## STEP GOAL: + +Create the final module brief document and save it to the bmb-creations output folder. + +## MANDATORY EXECUTION RULES: + +### Universal Rules: +- 🛑 NEVER generate content without user input +- 📖 CRITICAL: Read the complete step file before taking any action +- ✅ Speak in `{communication_language}` + +### Role Reinforcement: +- ✅ You are the **Module Architect** — completing the brief +- ✅ Assemble everything into a beautiful document +- ✅ Celebrate the completion! + +--- + +## MANDATORY SEQUENCE + +### 1. Load Template + +Load `{briefTemplateFile}` to use as the base. + +### 2. Assemble the Brief + +Fill in all sections with what we've gathered: + +**Frontmatter:** +- date: {today's date} +- user_name: {from config} +- module_code: {from step 5} +- module_type: {from step 3} +- status: "Ready for Development" + +**Executive Summary:** +- module_vision: {from step 4} +- module_category: {derived from vision} +- target_users: {from step 6} +- complexity_level: {assess from agent/workflow count} + +**Module Identity:** +- module_code, module_name: {from step 5} +- module_identity: {vision summary} +- personality_theme: {from step 5 or step 12} + +**Module Type:** +- module_type: {from step 3} +- module_type_explanation: {explain the choice} + +**Unique Value Proposition:** +- unique_value_proposition: {from step 7} +- value_proposition_details: {elaborate} + +**User Scenarios:** +- target_users: {from step 6} +- primary_use_case: {from step 11} +- user_journey: {from step 11} + +**Agent Architecture:** +- agent_count_strategy: {single or multi, why} +- agent_roster_table: {from step 8} +- agent_interaction_model: {how they work together} +- agent_communication_style: {from step 8} + +**Workflow Ecosystem:** +- core_workflows: {from step 9} +- feature_workflows: {from step 9} +- utility_workflows: {from step 9} + +**Tools & Integrations:** +- mcp_tools: {from step 10} +- external_services: {from step 10} +- module_integrations: {from step 10} + +**Creative Features:** +- creative_personality: {from step 12} +- easter_eggs: {from step 12} +- module_lore: {from step 12} + +### 3. Write the Brief File + +Save to: `{bmbCreationsOutputFolder}/modules/module-brief-{module_code}.md` + +### 4. Celebrate and Next Steps + +"**🎉 Your module brief is complete!**" + +"**Saved to:** {file path}" + +"**Next steps:**" +1. **Review the brief** — Make sure it captures your vision +2. **Run the module workflow (Create mode)** — This will build the module structure +3. **Create agents** — Use the agent-builder workflow for each agent +4. **Create workflows** — Use the workflow-builder workflow for each workflow +5. **Test and iterate** — Install and refine + +"**You've created something amazing. Let's build it!**" + +--- + +## Success Metrics + +✅ Brief document created and saved +✅ All sections filled with gathered information +✅ File path provided to user +✅ Next steps clearly explained diff --git a/src/modules/bmb/workflows/module/steps-c/step-01-load-brief.md b/src/modules/bmb/workflows/module/steps-c/step-01-load-brief.md new file mode 100644 index 00000000..f89a763c --- /dev/null +++ b/src/modules/bmb/workflows/module/steps-c/step-01-load-brief.md @@ -0,0 +1,178 @@ +--- +name: 'step-01-load-brief' +description: 'Load brief or user write-up, validate completeness' + +nextStepFile: './step-02-structure.md' +continueFile: './step-01b-continue.md' +agentSpecTemplate: '../../templates/agent-spec-template.md' +workflowSpecTemplate: '../../templates/workflow-spec-template.md' +moduleStandardsFile: '../../data/module-standards.md' +moduleYamlConventionsFile: '../../data/module-yaml-conventions.md' +advancedElicitationTask: '../../../../core/workflows/advanced-elicitation/workflow.xml' +partyModeWorkflow: '../../../../core/workflows/party-mode/workflow.md' +--- + +# Step 1: Load Brief (Create Mode) + +## STEP GOAL: + +Load the module brief (or get a detailed user write-up) and validate it has the information needed to build the module. + +## MANDATORY EXECUTION RULES: + +### Universal Rules: + +- 🛑 NEVER generate content without user input +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next with 'C', ensure entire file is read +- 📋 YOU ARE A FACILITATOR, not a content generator +- ✅ Speak in `{communication_language}` + +### Role Reinforcement: + +- ✅ You are the **Module Builder** — structured, competent, ready to build +- ✅ Validate input before proceeding +- ✅ Ensure we have what we need to succeed + +### Step-Specific Rules: + +- 🎯 This is a continuable workflow — check for existing work +- 🚫 FORBIDDEN to proceed without complete brief or write-up +- 💾 Track progress for continuation + +## EXECUTION PROTOCOLS: + +- 🎯 Follow the MANDATORY SEQUENCE exactly +- 📖 Create/update output file to track progress +- 🚫 FORBIDDEN to load next step until brief is validated + +## CONTEXT BOUNDARIES: + +- Input: Module brief from Brief mode OR user-provided write-up +- Output: Module structure ready for implementation +- This mode requires complete information to proceed + +--- + +## MANDATORY SEQUENCE + +**CRITICAL:** Follow this sequence exactly. + +### 1. Check for Existing Work + +Look for existing module build state: +- Check for `module-build-{module_code}.md` in output folder +- If exists AND has `stepsCompleted` → load `{continueFile}` +- If not exists → continue to step 1.2 + +### 2. Get the Brief or Write-Up + +"**Welcome to Create mode! I'll build your module structure from your brief.**" + +**"Where is your module brief?"** + +Options: +- **A)** Brief from Brief mode → `{bmb_creations_output_folder}/modules/module-brief-{code}.md` +- **B)** User-provided write-up → Ask for path +- **C)** Detailed description → User describes the module now + +**IF A or B:** Load and read the brief/write-up + +**IF C:** Gather the needed information through conversation: +- Module name and code +- Module type (Standalone/Extension/Global) +- Agent roster (roles, names) +- Workflow list +- Key features and tools + +### 3. Validate Brief Completeness + +Load `{moduleStandardsFile}` and check that the brief contains: + +**Required Information:** +- [ ] Module code and name +- [ ] Module type (Standalone/Extension/Global) +- [ ] Module vision/purpose +- [ ] Agent roster (at least minimum) +- [ ] Workflow list (at least core workflows) +- [ ] Any special tools or integrations + +**IF Extension Module:** +- [ ] Base module code (for matching) + +**IF anything missing:** + +"**Your brief is missing some key information. Let me help you complete it.**" + +Use `{advancedElicitationTask}` if needed to gather missing details. + +### 4. Confirm and Create Tracking + +Once validated: + +"**I have everything I need to build your module!**" + +"**Module:** {name} ({code})" +"**Type:** {Standalone/Extension/Global}" + +Create or update the build tracking file: + +```yaml +--- +moduleCode: {code} +moduleName: {name} +moduleType: {type} +briefFile: {brief path or "user-provided"} +stepsCompleted: ['step-01-load-brief'] +created: {date} +status: IN_PROGRESS +--- +``` + +### 5. Preview the Build Process + +"**Here's what I'll build for you:**" + +1. Directory structure (based on module type) +2. module.yaml with install configuration +3. _module-installer/ folder (if needed) +4. Agent placeholder/spec files +5. Workflow placeholder/spec files +6. README.md and TODO.md + +"**Ready to start building?**" + +### 6. Present MENU OPTIONS + +**Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Continue + +#### EXECUTION RULES: + +- ALWAYS halt and wait for user input +- ONLY proceed to next step when user selects 'C' + +#### Menu Handling Logic: + +- IF A: Execute `{advancedElicitationTask}` for any refinements +- IF P: Execute `{partyModeWorkflow}` for creative pre-build discussion +- IF C: Update tracking file, then load `{nextStepFile}` +- IF Any other: Help user, then redisplay menu + +--- + +## 🚨 SYSTEM SUCCESS/FAILURE METRICS + +### ✅ SUCCESS: + +- Brief or write-up loaded +- All required information validated +- Tracking file created +- User confirms ready to build + +### ❌ SYSTEM FAILURE: + +- Proceeding with incomplete brief +- Missing key information (code, type, agents, workflows) +- Not validating extension base module + +**Master Rule:** Garbage in, garbage out. Ensure we have complete information before building. diff --git a/src/modules/bmb/workflows/module/steps-c/step-01b-continue.md b/src/modules/bmb/workflows/module/steps-c/step-01b-continue.md new file mode 100644 index 00000000..1f10ff64 --- /dev/null +++ b/src/modules/bmb/workflows/module/steps-c/step-01b-continue.md @@ -0,0 +1,83 @@ +--- +name: 'step-01b-continue' +description: 'Handle workflow continuation for Create mode' + +workflowFile: '../workflow.md' +buildTrackingFile: '{bmb_creations_output_folder}/modules/module-build-{module_code}.md' +--- + +# Step 1b: Continue (Create Mode) + +## STEP GOAL: + +Resume a paused Create mode session by loading the build tracking state and routing to the correct step. + +## MANDATORY EXECUTION RULES: + +### Universal Rules: + +- 📖 CRITICAL: Read the complete step file before taking any action +- ✅ Speak in `{communication_language}` + +### Role Reinforcement: + +- ✅ You are the **Module Builder** — picking up where we left off +- ✅ Warm welcome back +- ✅ Seamless resume + +--- + +## MANDATORY SEQUENCE + +### 1. Welcome Back + +"**Welcome back to the Module Builder!** 👋" + +### 2. Load Build Tracking + +Load `{buildTrackingFile}` and read: +- `stepsCompleted` array +- `moduleCode` +- `moduleName` +- `moduleType` +- `status` + +### 3. Report Progress + +"**Here's where we are:**" + +**Module:** {moduleName} ({moduleCode}) +**Type:** {moduleType} +**Status:** {status} + +**Completed steps:** +- {list completed steps} + +### 4. Determine Next Step + +Find the last completed step and route to the next one: + +| Last Completed | Next Step | +|---------------|-----------| +| step-01-load-brief | step-02-structure | +| step-02-structure | step-03-config | +| step-03-config | step-04-installer | +| step-04-installer | step-05-agents | +| step-05-agents | step-06-workflows | +| step-06-workflows | step-07-docs | +| step-07-docs | step-08-complete | + +### 5. Route to Next Step + +"**Continuing to: {next step name}**" + +Load the appropriate step file and execute. + +--- + +## Success Metrics + +✅ User welcomed back +✅ Build state loaded +✅ Correct next step identified +✅ Seamless resume diff --git a/src/modules/bmb/workflows/module/steps-c/step-02-structure.md b/src/modules/bmb/workflows/module/steps-c/step-02-structure.md new file mode 100644 index 00000000..0bb90e6c --- /dev/null +++ b/src/modules/bmb/workflows/module/steps-c/step-02-structure.md @@ -0,0 +1,109 @@ +--- +name: 'step-02-structure' +description: 'Create directory structure based on module type' + +nextStepFile: './step-03-config.md' +moduleStandardsFile: '../../data/module-standards.md' +buildTrackingFile: '{bmb_creations_output_folder}/modules/module-build-{module_code}.md' +--- + +# Step 2: Directory Structure + +## STEP GOAL: + +Create the module directory structure based on the module type (Standalone/Extension/Global). + +## MANDATORY EXECUTION RULES: + +### Universal Rules: + +- 🛑 NEVER generate content without user input +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next with 'C', ensure entire file is read +- 📋 YOU ARE A FACILITATOR, not a content generator +- ✅ Speak in `{communication_language}` + +### Role Reinforcement: + +- ✅ You are the **Module Builder** — creating the foundation +- ✅ Structure follows standards +- ✅ Confirm before creating + +--- + +## MANDATORY SEQUENCE + +### 1. Determine Target Location + +Load `{moduleStandardsFile}` and determine location: + +**IF Standalone:** +- Target: `src/modules/{module_code}/` + +**IF Extension:** +- Target: `src/modules/{base_module_code}/extensions/{extension_folder_name}/` +- Get base_module_code from brief +- extension_folder_name: unique name (e.g., `{base_module}-{feature}`) + +**IF Global:** +- Target: `src/modules/{module_code}/` +- Will add `global: true` to module.yaml + +### 2. Present Structure Plan + +"**I'll create this directory structure:**" + +``` +{target_location}/ +├── module.yaml +├── README.md +├── agents/ +│ └── {agent files} +├── workflows/ +│ └── {workflow folders} +└── _module-installer/ + ├── installer.js + └── platform-specifics/ +``` + +"**Location:** {target_location}" +"**Module type:** {Standalone/Extension/Global}" + +### 3. Confirm and Create + +"**Shall I create the directory structure?**" + +**IF confirmed:** + +Create folders: +- `{target_location}/agents/` +- `{target_location}/workflows/` +- `{target_location}/_module-installer/` +- `{target_location}/_module-installer/platform-specifics/` + +### 4. Update Build Tracking + +Update `{buildTrackingFile}`: +- Add 'step-02-structure' to stepsCompleted +- Set targetLocation +- Update status + +### 5. Report Success + +"**✓ Directory structure created at:** {target_location}" + +### 6. MENU OPTIONS + +**Select an Option:** [C] Continue + +- IF C: Update tracking, load `{nextStepFile}` +- IF Any other: Help, then redisplay menu + +--- + +## Success Metrics + +✅ Directory structure created +✅ Location based on module type +✅ Folders: agents/, workflows/, _module-installer/ +✅ Build tracking updated diff --git a/src/modules/bmb/workflows/module/steps-c/step-03-config.md b/src/modules/bmb/workflows/module/steps-c/step-03-config.md new file mode 100644 index 00000000..c4c02559 --- /dev/null +++ b/src/modules/bmb/workflows/module/steps-c/step-03-config.md @@ -0,0 +1,118 @@ +--- +name: 'step-03-config' +description: 'Generate module.yaml with install questions' + +nextStepFile: './step-04-installer.md' +moduleYamlConventionsFile: '../../data/module-yaml-conventions.md' +buildTrackingFile: '{bmb_creations_output_folder}/modules/module-build-{module_code}.md' +targetLocation: '{build_tracking_targetLocation}' +--- + +# Step 3: Module Configuration + +## STEP GOAL: + +Generate module.yaml with install configuration and custom variables. + +## MANDATORY EXECUTION RULES: + +### Universal Rules: + +- 🛑 NEVER generate content without user input +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next with 'C', ensure entire file is read +- 📋 YOU ARE A FACILITATOR, not a content generator +- ✅ Speak in `{communication_language}` + +### Role Reinforcement: + +- ✅ You are the **Module Builder** — configuration expert +- ✅ Follow module.yaml conventions +- ✅ Ask about custom variables + +--- + +## MANDATORY SEQUENCE + +### 1. Load Conventions + +Load `{moduleYamlConventionsFile}` for reference. + +### 2. Generate Base module.yaml + +Create `{targetLocation}/module.yaml` with: + +**Required fields:** +```yaml +code: {module_code} +name: "{module_display_name}" +header: "{brief_header}" +subheader: "{additional_context}" +default_selected: false +``` + +**Note for Extension modules:** `code:` matches base module + +### 3. Add Custom Variables + +"**Does your module need any custom configuration variables?**" + +Reference the brief for: +- User input needed during installation +- Paths or settings users should configure +- Feature flags or options + +**For each variable, create:** +```yaml +variable_name: + prompt: "{question to ask}" + default: "{default_value}" + result: "{template}" +``` + +**Common patterns:** +- Text input (names, titles) +- Boolean (enable features) +- Single-select (experience levels) +- Multi-select (platforms) +- Paths (artifact folders) + +**IF no custom variables needed:** + +Keep it simple — just use core config variables. + +### 4. Write module.yaml + +Write the complete module.yaml to `{targetLocation}/module.yaml` + +### 5. Update Build Tracking + +Update `{buildTrackingFile}`: +- Add 'step-03-config' to stepsCompleted +- Note: module.yaml created + +### 6. Report and Confirm + +"**✓ module.yaml created with:**" + +- Code: {code} +- {count} custom variables + +"**Review the file and confirm it looks correct.**" + +### 7. MENU OPTIONS + +**Select an Option:** [C] Continue + +- IF C: Update tracking, load `{nextStepFile}` +- IF Any other: Help, then redisplay menu + +--- + +## Success Metrics + +✅ module.yaml created +✅ Required fields populated +✅ Custom variables added (if any) +✅ Extension modules use correct code +✅ Build tracking updated diff --git a/src/modules/bmb/workflows/module/steps-c/step-04-installer.md b/src/modules/bmb/workflows/module/steps-c/step-04-installer.md new file mode 100644 index 00000000..229519c3 --- /dev/null +++ b/src/modules/bmb/workflows/module/steps-c/step-04-installer.md @@ -0,0 +1,160 @@ +--- +name: 'step-04-installer' +description: 'Setup _module-installer folder and installer.js' + +nextStepFile: './step-05-agents.md' +moduleInstallerStandardsFile: '../../data/module-installer-standards.md' +buildTrackingFile: '{bmb_creations_output_folder}/modules/module-build-{module_code}.md' +targetLocation: '{build_tracking_targetLocation}' +--- + +# Step 4: Module Installer + +## STEP GOAL: + +Setup the _module-installer folder and create installer.js if needed. + +## MANDATORY EXECUTION RULES: + +### Universal Rules: + +- 🛑 NEVER generate content without user input +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next with 'C', ensure entire file is read +- 📋 YOU ARE A FACILITATOR, not a content generator +- ✅ Speak in `{communication_language}` + +### Role Reinforcement: + +- ✅ You are the **Module Builder** — installer expert +- ✅ Not all modules need installers +- ✅ Follow installer patterns + +--- + +## MANDATORY SEQUENCE + +### 1. Assess Need for Installer + +Load `{moduleInstallerStandardsFile}` and ask: + +"**Does your module need an installer?**" + +Installers are needed when: +- Creating directories from config variables +- Copying template/assets +- IDE-specific configuration +- Platform-specific setup + +**If NO installer needed:** + +Skip to step 5. Folder structure already exists. + +**If YES:** Continue to step 4.2 + +### 2. Determine Installer Requirements + +"**What should the installer do?**" + +- Create directories? (which variables) +- Copy assets? (from where) +- IDE configuration? (which IDEs) +- Platform-specific setup? + +### 3. Create installer.js + +Create `{targetLocation}/_module-installer/installer.js`: + +```javascript +const fs = require('fs-extra'); +const path = require('node:path'); +const chalk = require('chalk'); +const platformCodes = require(path.join(__dirname, '../../../../tools/cli/lib/platform-codes')); + +/** + * {module_name} Module Installer + */ +async function install(options) { + const { projectRoot, config, installedIDEs, logger } = options; + + try { + logger.log(chalk.blue('Installing {module_name}...')); + + // Create directories + if (config['{variable_name}']) { + const dirConfig = config['{variable_name}'].replace('{project-root}/', ''); + const dirPath = path.join(projectRoot, dirConfig); + if (!(await fs.pathExists(dirPath))) { + logger.log(chalk.yellow(`Creating directory: ${dirConfig}`)); + await fs.ensureDir(dirPath); + } + } + + // IDE-specific configuration + if (installedIDEs && installedIDEs.length > 0) { + for (const ide of installedIDEs) { + await configureForIDE(ide, projectRoot, config, logger); + } + } + + logger.log(chalk.green('✓ {module_name} installation complete')); + return true; + } catch (error) { + logger.error(chalk.red(`Error installing module: ${error.message}`)); + return false; + } +} + +async function configureForIDE(ide, projectRoot, config, logger) { + if (!platformCodes.isValidPlatform(ide)) { + logger.warn(chalk.yellow(`Unknown platform: '${ide}'. Skipping.`)); + return; + } + + const platformSpecificPath = path.join(__dirname, 'platform-specifics', `${ide}.js`); + + try { + if (await fs.pathExists(platformSpecificPath)) { + const platformHandler = require(platformSpecificPath); + if (typeof platformHandler.install === 'function') { + await platformHandler.install({ projectRoot, config, logger }); + } + } + } catch (error) { + logger.warn(chalk.yellow(`Warning: Could not configure ${ide}: ${error.message}`)); + } +} + +module.exports = { install }; +``` + +Customize based on module requirements. + +### 4. Platform-Specific Handlers (Optional) + +If IDE-specific setup needed, ask which IDEs and create: +- `{targetLocation}/_module-installer/platform-specifics/claude-code.js` +- `{targetLocation}/_module-installer/platform-specifics/windsurf.js` +- etc. + +### 5. Update Build Tracking + +Update `{buildTrackingFile}`: +- Add 'step-04-installer' to stepsCompleted +- Note: installer created or skipped + +### 6. MENU OPTIONS + +**Select an Option:** [C] Continue + +- IF C: Update tracking, load `{nextStepFile}` +- IF Any other: Help, then redisplay menu + +--- + +## Success Metrics + +✅ Assessed installer need +✅ installer.js created (if needed) +✅ Platform handlers created (if needed) +✅ Build tracking updated diff --git a/src/modules/bmb/workflows/module/steps-c/step-05-agents.md b/src/modules/bmb/workflows/module/steps-c/step-05-agents.md new file mode 100644 index 00000000..5c89aad2 --- /dev/null +++ b/src/modules/bmb/workflows/module/steps-c/step-05-agents.md @@ -0,0 +1,167 @@ +--- +name: 'step-05-agents' +description: 'Create agent placeholder/spec files' + +nextStepFile: './step-06-workflows.md' +agentSpecTemplate: '../../templates/agent-spec-template.md' +agentArchitectureFile: '../../data/agent-architecture.md' +buildTrackingFile: '{bmb_creations_output_folder}/modules/module-build-{module_code}.md' +targetLocation: '{build_tracking_targetLocation}' +--- + +# Step 5: Agent Specs + +## STEP GOAL: + +Create agent placeholder/spec files based on the brief. + +## MANDATORY EXECUTION RULES: + +### Universal Rules: + +- 🛑 NEVER generate content without user input +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next with 'C', ensure entire file is read +- 📋 YOU ARE A FACILITATOR, not a content generator +- ✅ Speak in `{communication_language}` + +### Role Reinforcement: + +- ✅ You are the **Module Builder** — creating agent specs +- ✅ These are specs, not full agents (agent-builder does that) +- ✅ Keep it high-level + +--- + +## MANDATORY SEQUENCE + +### 1. Load Agent Architecture + +Load `{agentArchitectureFile}` for guidance. + +### 2. Get Agent Roster from Brief + +Extract from the brief: +- Agent names +- Roles +- Workflows they're responsible for +- Communication style +- Memory needs (hasSidecar) + +### 3. For Each Agent, Create Spec + +Load `{agentSpecTemplate}` and create: + +`{targetLocation}/agents/{agent_name}.spec.md` + +With content: +```markdown +# Agent Specification: {agent_name} + +**Module:** {module_code} +**Status:** Placeholder — To be created via create-agent workflow +**Created:** {date} + +--- + +## Agent Metadata + +```yaml +agent: + metadata: + id: "_bmad/{module_code}/agents/{agent_file_name}.md" + name: {agent_human_name} + title: {agent_title} + icon: {agent_icon} + module: {module_code} + hasSidecar: {false/true} +``` + +--- + +## Agent Persona + +### Role + +{agent_role} + +### Identity + +{agent_identity} + +### Communication Style + +{agent_communication_style} + +### Principles + +{agent_principles} + +--- + +## Agent Menu + +### Planned Commands + +| Trigger | Command | Description | Workflow | +|---------|---------|-------------|----------| +{agent_menu_table} + +--- + +## Agent Integration + +### Shared Context + +- References: `{shared_context_files}` +- Collaboration with: {collaborating_agents} + +### Workflow References + +{workflow_references} + +--- + +## Implementation Notes + +**Use the create-agent workflow to build this agent.** + +--- + +_Spec created on {date} via BMAD Module workflow_ +``` + +### 4. Create All Agent Specs + +Iterate through each agent from the brief and create their spec file. + +### 5. Update Build Tracking + +Update `{buildTrackingFile}`: +- Add 'step-05-agents' to stepsCompleted +- List all agent specs created + +### 6. Report Success + +"**✓ Agent specs created:**" + +- {count} agent spec files +- {list agent names} + +"**These are specs/blueprints. Use the create-agent workflow to build each agent.**" + +### 7. MENU OPTIONS + +**Select an Option:** [C] Continue + +- IF C: Update tracking, load `{nextStepFile}` +- IF Any other: Help, then redisplay menu + +--- + +## Success Metrics + +✅ Agent spec files created for all agents +✅ Each spec has role, workflows, menu triggers +✅ hasSidecar documented (memory decision) +✅ Build tracking updated diff --git a/src/modules/bmb/workflows/module/steps-c/step-06-workflows.md b/src/modules/bmb/workflows/module/steps-c/step-06-workflows.md new file mode 100644 index 00000000..7544c0af --- /dev/null +++ b/src/modules/bmb/workflows/module/steps-c/step-06-workflows.md @@ -0,0 +1,183 @@ +--- +name: 'step-06-workflows' +description: 'Create workflow placeholder/spec files' + +nextStepFile: './step-07-docs.md' +workflowSpecTemplate: '../../templates/workflow-spec-template.md' +buildTrackingFile: '{bmad_creations_output_folder}/modules/module-build-{module_code}.md' +targetLocation: '{build_tracking_targetLocation}' +--- + +# Step 6: Workflow Specs + +## STEP GOAL: + +Create workflow placeholder/spec files based on the brief. + +## MANDATORY EXECUTION RULES: + +### Universal Rules: + +- 🛑 NEVER generate content without user input +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next with 'C', ensure entire file is read +- 📋 YOU ARE A FACILITATOR, not a content generator +- ✅ Speak in `{communication_language}` + +### Role Reinforcement: + +- ✅ You are the **Module Builder** — creating workflow specs +- ✅ These are specs, not full workflows (workflow-builder does that) +- ✅ Keep it high-level + +--- + +## MANDATORY SEQUENCE + +### 1. Get Workflow List from Brief + +Extract from the brief: +- Core workflows +- Feature workflows +- Utility workflows + +For each workflow: +- Name +- Purpose/goal +- Primary agent +- Input/output requirements + +### 2. For Each Workflow, Create Spec + +Load `{workflowSpecTemplate}` and create: + +`{targetLocation}/workflows/{workflow_name}/{workflow_name}.spec.md` + +With content: +```markdown +# Workflow Specification: {workflow_name} + +**Module:** {module_code} +**Status:** Placeholder — To be created via create-workflow workflow +**Created:** {date} + +--- + +## Workflow Overview + +**Goal:** {workflow_goal} + +**Description:** {workflow_description} + +**Workflow Type:** {workflow_type} + +--- + +## Workflow Structure + +### Entry Point + +```yaml +--- +name: {workflow_name} +description: {workflow_description} +web_bundle: true +installed_path: '{project-root}/_bmad/{module_code}/workflows/{workflow_folder_name}' +--- +``` + +### Mode + +- [ ] Create-only (steps-c/) +- [ ] Tri-modal (steps-c/, steps-e/, steps-v/) + +--- + +## Planned Steps + +| Step | Name | Goal | +|------|------|------| +{workflow_steps_table} + +--- + +## Workflow Inputs + +### Required Inputs + +{required_inputs} + +### Optional Inputs + +{optional_inputs} + +--- + +## Workflow Outputs + +### Output Format + +- [ ] Document-producing +- [ ] Non-document + +### Output Files + +{output_files} + +--- + +## Agent Integration + +### Primary Agent + +{primary_agent} + +### Other Agents + +{other_agents} + +--- + +## Implementation Notes + +**Use the create-workflow workflow to build this workflow.** + +--- + +_Spec created on {date} via BMAD Module workflow_ +``` + +### 3. Create All Workflow Specs + +Iterate through each workflow from the brief and create their spec file. + +### 4. Update Build Tracking + +Update `{buildTrackingFile}`: +- Add 'step-06-workflows' to stepsCompleted +- List all workflow specs created + +### 5. Report Success + +"**✓ Workflow specs created:**" + +- {count} workflow spec files +- {list workflow names} + +"**These are specs/blueprints. Use the create-workflow workflow to build each workflow.**" + +### 6. MENU OPTIONS + +**Select an Option:** [C] Continue + +- IF C: Update tracking, load `{nextStepFile}` +- IF Any other: Help, then redisplay menu + +--- + +## Success Metrics + +✅ Workflow spec files created for all workflows +✅ Each spec has goal, steps, inputs/outputs +✅ Agent associations documented +✅ Build tracking updated diff --git a/src/modules/bmb/workflows/module/steps-c/step-07-docs.md b/src/modules/bmb/workflows/module/steps-c/step-07-docs.md new file mode 100644 index 00000000..320cd004 --- /dev/null +++ b/src/modules/bmb/workflows/module/steps-c/step-07-docs.md @@ -0,0 +1,402 @@ +--- +name: 'step-07-docs' +description: 'Generate README.md, TODO.md, and docs/ folder' + +nextStepFile: './step-08-complete.md' +buildTrackingFile: '{bmb_creations_output_folder}/modules/module-build-{module_code}.md' +targetLocation: '{build_tracking_targetLocation}' +--- + +# Step 7: Documentation + +## STEP GOAL: + +Generate README.md, TODO.md, and user documentation in docs/ folder for the module. + +## MANDATORY EXECUTION RULES: + +### Universal Rules: + +- 🛑 NEVER generate content without user input +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next with 'C', ensure entire file is read +- 📋 YOU ARE A FACILITATOR, not a content generator +- ✅ Speak in `{communication_language}` + +### Role Reinforcement: + +- ✅ You are the **Module Builder** — documentation creator +- ✅ README is the user's first impression +- ✅ TODO tracks remaining work +- ✅ docs/ provides user-facing documentation + +--- + +## MANDATORY SEQUENCE + +### 1. Generate README.md + +Create `{targetLocation}/README.md`: + +```markdown +# {module_display_name} + +{brief_header} + +{subheader} + +--- + +## Overview + +{module_overview_from_brief} + +--- + +## Installation + +```bash +bmad install {module_code} +``` + +--- + +## Quick Start + +{quick_start_from_brief} + +**For detailed documentation, see [docs/](docs/).** + +--- + +## Components + +### Agents + +{agent_list_from_brief} + +### Workflows + +{workflow_list_from_brief} + +--- + +## Configuration + +The module supports these configuration options (set during installation): + +{config_variables_from_module_yaml} + +--- + +## Module Structure + +``` +{module_code}/ +├── module.yaml +├── README.md +├── TODO.md +├── docs/ +│ ├── getting-started.md +│ ├── agents.md +│ ├── workflows.md +│ └── examples.md +├── agents/ +├── workflows/ +└── _module-installer/ +``` + +--- + +## Documentation + +For detailed user guides and documentation, see the **[docs/](docs/)** folder: +- [Getting Started](docs/getting-started.md) +- [Agents Reference](docs/agents.md) +- [Workflows Reference](docs/workflows.md) +- [Examples](docs/examples.md) + +--- + +## Development Status + +This module is currently in development. The following components are planned: + +- [ ] Agents: {agent_count} agents +- [ ] Workflows: {workflow_count} workflows + +See TODO.md for detailed status. + +--- + +## Author + +Created via BMAD Module workflow + +--- + +## License + +Part of the BMAD framework. +``` + +### 2. Generate TODO.md + +Create `{targetLocation}/TODO.md`: + +```markdown +# TODO: {module_display_name} + +Development roadmap for {module_code} module. + +--- + +## Agents to Build + +{for each agent} +- [ ] {agent_name} ({agent_title}) + - Use: `bmad:bmb:agents:agent-builder` + - Spec: `agents/{agent_name}.spec.md` + +--- + +## Workflows to Build + +{for each workflow} +- [ ] {workflow_name} + - Use: `bmad:bmb:workflows:workflow` or `/workflow` + - Spec: `workflows/{workflow_name}/{workflow_name}.spec.md` + +--- + +## Installation Testing + +- [ ] Test installation with `bmad install` +- [ ] Verify module.yaml prompts work correctly +- [ ] Test installer.js (if present) +- [ ] Test IDE-specific handlers (if present) + +--- + +## Documentation + +- [ ] Complete README.md with usage examples +- [ ] Enhance docs/ folder with more guides +- [ ] Add troubleshooting section +- [ ] Document configuration options + +--- + +## Next Steps + +1. Build agents using create-agent workflow +2. Build workflows using create-workflow workflow +3. Test installation and functionality +4. Iterate based on testing + +--- + +_Last updated: {date}_ +``` + +### 3. Create docs/ Folder + +Create `{targetLocation}/docs/` folder with user documentation: + +### 3.1. getting-started.md + +```markdown +# Getting Started with {module_display_name} + +Welcome to {module_code}! This guide will help you get up and running. + +--- + +## What This Module Does + +{module_purpose_from_brief} + +--- + +## Installation + +If you haven't installed the module yet: + +```bash +bmad install {module_code} +``` + +Follow the prompts to configure the module for your needs. + +--- + +## First Steps + +{first_steps_from_brief} + +--- + +## Common Use Cases + +{common_use_cases_from_brief} + +--- + +## What's Next? + +- Check out the [Agents Reference](agents.md) to meet your team +- Browse the [Workflows Reference](workflows.md) to see what you can do +- See [Examples](examples.md) for real-world usage + +--- + +## Need Help? + +If you run into issues: +1. Check the troubleshooting section in examples.md +2. Review your module configuration +3. Consult the broader BMAD documentation +``` + +### 3.2. agents.md + +```markdown +# Agents Reference + +{module_code} includes {agent_count} specialized agents: + +--- + +{for each agent} +## {agent_title} + +**ID:** `{agent_id}` +**Icon:** {agent_icon} + +**Role:** +{agent_role_from_spec} + +**When to Use:** +{when_to_use_from_spec} + +**Key Capabilities:** +{agent_capabilities_from_spec} + +**Menu Trigger(s):** +{menu_triggers_from_spec} + +--- +``` + +### 3.3. workflows.md + +```markdown +# Workflows Reference + +{module_code} includes {workflow_count} workflows: + +--- + +{for each workflow} +## {workflow_title} + +**ID:** `{workflow_id}` +**Workflow:** `{workflow_name}` + +**Purpose:** +{workflow_purpose_from_spec} + +**When to Use:** +{when_to_use_from_spec} + +**Key Steps:** +{workflow_steps_outline_from_spec} + +**Agent(s):** +{associated_agents_from_spec} + +--- +``` + +### 3.4. examples.md + +```markdown +# Examples & Use Cases + +This section provides practical examples for using {module_display_name}. + +--- + +## Example Workflows + +{example_workflows_from_brief} + +--- + +## Common Scenarios + +{common_scenarios_from_brief} + +--- + +## Tips & Tricks + +{tips_from_brief} + +--- + +## Troubleshooting + +### Common Issues + +{troubleshooting_from_brief} + +--- + +## Getting More Help + +- Review the main BMAD documentation +- Check module configuration in module.yaml +- Verify all agents and workflows are properly installed +``` + +### 4. Update Build Tracking + +Update `{buildTrackingFile}`: +- Add 'step-07-docs' to stepsCompleted +- Note: README.md, TODO.md, and docs/ folder created + +### 5. Report Success + +"**✓ Documentation created:**" + +- README.md — module overview and navigation +- TODO.md — development roadmap +- docs/ — user documentation folder + - getting-started.md — quick start guide + - agents.md — agent reference + - workflows.md — workflow reference + - examples.md — practical examples + +"**User documentation is valuable even with placeholder agent/workflow specs — users will understand what each component does and how to use them.**" + +"**TODO.md tracks the remaining work:**" +- Build {agent_count} agents +- Build {workflow_count} workflows +- Test installation + +### 6. MENU OPTIONS + +**Select an Option:** [C] Continue + +- IF C: Update tracking, load `{nextStepFile}` +- IF Any other: Help, then redisplay menu + +--- + +## Success Metrics + +✅ README.md created with all sections +✅ TODO.md created with agent/workflow checklist +✅ docs/ folder created with user documentation +✅ Build tracking updated diff --git a/src/modules/bmb/workflows/module/steps-c/step-08-complete.md b/src/modules/bmb/workflows/module/steps-c/step-08-complete.md new file mode 100644 index 00000000..a5d0657e --- /dev/null +++ b/src/modules/bmb/workflows/module/steps-c/step-08-complete.md @@ -0,0 +1,123 @@ +--- +name: 'step-08-complete' +description: 'Finalize, offer to run validation' + +buildTrackingFile: '{bmb_creations_output_folder}/modules/module-build-{module_code}.md' +targetLocation: '{build_tracking_targetLocation}' +validationWorkflow: '../steps-v/step-01-validate.md' +--- + +# Step 8: Complete + +## STEP GOAL: + +Finalize the module build, update tracking, and offer to run validation. + +## MANDATORY EXECUTION RULES: + +### Universal Rules: + +- 📖 CRITICAL: Read the complete step file before taking any action +- ✅ Speak in `{communication_language}` + +### Role Reinforcement: + +- ✅ You are the **Module Builder** — completing the build +- ✅ Celebrate what was created +- ✅ Guide next steps + +--- + +## MANDATORY SEQUENCE + +### 1. Final Build Summary + +"**🎉 Module structure build complete!**" + +**Module:** {moduleName} ({moduleCode}) +**Type:** {moduleType} +**Location:** {targetLocation} + +**What was created:** + +| Component | Count | Location | +|-----------|-------|----------| +| Agent specs | {count} | agents/ | +| Workflow specs | {count} | workflows/ | +| Configuration | 1 | module.yaml | +| Documentation | 2 | README.md, TODO.md | +| Installer | {yes/no} | _module-installer/ | + +### 2. Update Build Tracking + +Update `{buildTrackingFile}`: +```yaml +--- +moduleCode: {module_code} +moduleName: {name} +moduleType: {type} +targetLocation: {location} +stepsCompleted: ['step-01-load-brief', 'step-02-structure', 'step-03-config', 'step-04-installer', 'step-05-agents', 'step-06-workflows', 'step-07-docs', 'step-08-complete'] +created: {created_date} +completed: {date} +status: COMPLETE +--- +``` + +### 3. Next Steps + +"**Your module structure is ready! Here's what to do next:**" + +1. **Review the build** — Check {targetLocation} +2. **Build agents** — Use `bmad:bmb:agents:agent-builder` for each agent spec +3. **Build workflows** — Use `bmad:bmb:workflows:workflow` for each workflow spec +4. **Test installation** — Run `bmad install {module_code}` +5. **Iterate** — Refine based on testing + +### 4. Offer Validation + +"**Would you like to run validation on the module structure?**" + +Validation checks: +- File structure compliance +- module.yaml correctness +- Spec completeness +- Installation readiness + +### 5. MENU OPTIONS + +**Select an Option:** [V] Validate Module [D] Done + +#### EXECUTION RULES: + +- ALWAYS halt and wait for user input + +#### Menu Handling Logic: + +- IF V: Load `{validationWorkflow}` to run validation +- IF D: Celebration message, workflow complete +- IF Any other: Help user, then redisplay menu + +### 6. Completion Message (if Done selected) + +"**🚀 You've built a module structure for BMAD!**" + +"**Module:** {moduleName} ({moduleCode})" +"**Location:** {targetLocation}" +"**Status:** Ready for agent and workflow implementation" + +"**The journey from idea to installable module continues:** +- Agent specs → create-agent workflow +- Workflow specs → create-workflow workflow +- Full module → `bmad install` + +"**Great work! Let's build something amazing.** ✨" + +--- + +## Success Metrics + +✅ Build tracking marked COMPLETE +✅ Summary presented to user +✅ Next steps clearly explained +✅ Validation offered (optional) diff --git a/src/modules/bmb/workflows/module/steps-e/step-01-load-target.md b/src/modules/bmb/workflows/module/steps-e/step-01-load-target.md new file mode 100644 index 00000000..40ee3a50 --- /dev/null +++ b/src/modules/bmb/workflows/module/steps-e/step-01-load-target.md @@ -0,0 +1,81 @@ +--- +name: 'step-01-load-target' +description: 'Load target for editing' + +nextStepFile: './step-02-select-edit.md' +moduleStandardsFile: '../../data/module-standards.md' +--- + +# Step 1: Load Target (Edit Mode) + +## STEP GOAL: + +Load the target (brief, module.yaml, agent specs, or workflow specs) for editing. + +## MANDATORY EXECUTION RULES: + +### Universal Rules: +- 📖 CRITICAL: Read the complete step file before taking any action +- ✅ Speak in `{communication_language}` + +### Role Reinforcement: +- ✅ You are the **Module Editor** — helpful, ready to assist +- ✅ Understand what we're editing + +--- + +## MANDATORY SEQUENCE + +### 1. Determine Edit Target + +"**What would you like to edit?**" + +Options: +- **[B]rief** — Module brief from Brief mode +- **[Y]aml** — module.yaml configuration +- **[A]gents** — Agent specifications +- **[W]orkflows** — Workflow specifications +- **[D]ocs** — README.md or TODO.md + +### 2. Load Target + +Based on selection, load the target file(s). + +**IF Brief:** +- Path: `{bmb_creations_output_folder}/modules/module-brief-{code}.md` + +**IF Yaml:** +- Path: `src/modules/{code}/module.yaml` + +**IF Agents:** +- Path: `src/modules/{code}/agents/` +- List available agent specs + +**IF Workflows:** +- Path: `src/modules/{code}/workflows/` +- List available workflow specs + +**IF Docs:** +- Path: `src/modules/{code}/README.md` or `TODO.md` + +### 3. Display Current Content + +Show the current content of the target file. + +"**Here's the current content:**" + +{display relevant sections or summary} + +### 4. Proceed to Selection + +"**What would you like to change?**" + +Load `{nextStepFile}` to select the edit type. + +--- + +## Success Metrics + +✅ Target loaded +✅ Current content displayed +✅ Ready to select edit type diff --git a/src/modules/bmb/workflows/module/steps-e/step-02-select-edit.md b/src/modules/bmb/workflows/module/steps-e/step-02-select-edit.md new file mode 100644 index 00000000..be1baf74 --- /dev/null +++ b/src/modules/bmb/workflows/module/steps-e/step-02-select-edit.md @@ -0,0 +1,77 @@ +--- +name: 'step-02-select-edit' +description: 'Select edit type and gather changes' + +nextStepFile: './step-03-apply-edit.md' +--- + +# Step 2: Select Edit Type + +## STEP GOAL: + +Select the type of edit and gather the changes to make. + +## MANDATORY EXECUTION RULES: + +### Universal Rules: +- 📖 CRITICAL: Read the complete step file before taking any action +- ✅ Speak in `{communication_language}` + +### Role Reinforcement: +- ✅ You are the **Module Editor** — precise, collaborative +- ✅ Understand the change before making it + +--- + +## MANDATORY SEQUENCE + +### 1. Select Edit Type + +"**What type of edit would you like to make?**" + +- **[M]odify** — Change existing content +- **[A]dd** — Add new content +- **[D]elete** — Remove content +- **[R]eplace** — Replace section entirely + +### 2. Gather Edit Details + +**IF Modify:** +"**Which section do you want to modify?**" +"What should it change to?" + +**IF Add:** +"**What do you want to add?**" +"**Where should it go?**" + +**IF Delete:** +"**What do you want to remove?**" + +**IF Replace:** +"**What section should be replaced?**" +"**What's the new content?**" + +### 3. Confirm Change + +"**Please confirm the edit:**" + +**Type:** {edit_type} +**Target:** {section or content} +**Change:** {description of change} + +"**Is this correct?**" + +### 4. Store Edit Plan + +Store the edit plan for the next step. + +Load `{nextStepFile}` to apply the edit. + +--- + +## Success Metrics + +✅ Edit type selected +✅ Change details gathered +✅ User confirmed +✅ Edit plan stored diff --git a/src/modules/bmb/workflows/module/steps-e/step-03-apply-edit.md b/src/modules/bmb/workflows/module/steps-e/step-03-apply-edit.md new file mode 100644 index 00000000..a6dd6afa --- /dev/null +++ b/src/modules/bmb/workflows/module/steps-e/step-03-apply-edit.md @@ -0,0 +1,77 @@ +--- +name: 'step-03-apply-edit' +description: 'Apply the edit and save' + +nextStepFile: './step-04-review.md' +--- + +# Step 3: Apply Edit + +## STEP GOAL: + +Apply the confirmed edit to the target file and save. + +## MANDATORY EXECUTION RULES: + +### Universal Rules: +- 📖 CRITICAL: Read the complete step file before taking any action +- ✅ Speak in `{communication_language}` + +### Role Reinforcement: +- ✅ You are the **Module Editor** — making changes +- ✅ Apply edits precisely + +--- + +## MANDATORY SEQUENCE + +### 1. Load Target File + +Read the complete target file. + +### 2. Apply Edit + +Based on the edit plan from step 2: + +**IF Modify:** +- Locate the section +- Apply the modification +- Preserve surrounding context + +**IF Add:** +- Find the insertion point +- Insert new content +- Maintain formatting + +**IF Delete:** +- Locate the content +- Remove it +- Clean up any gaps + +**IF Replace:** +- Locate the section +- Replace with new content +- Ensure proper formatting + +### 3. Save Changes + +Write the modified content back to the target file. + +### 4. Report Success + +"**✓ Edit applied!**" + +**File:** {file_path} +**Change:** {summary_of_change} + +### 5. Proceed to Review + +Load `{nextStepFile}` to review the changes. + +--- + +## Success Metrics + +✅ Edit applied correctly +✅ File saved +✅ Change summary provided diff --git a/src/modules/bmb/workflows/module/steps-e/step-04-review.md b/src/modules/bmb/workflows/module/steps-e/step-04-review.md new file mode 100644 index 00000000..6c0e79c9 --- /dev/null +++ b/src/modules/bmb/workflows/module/steps-e/step-04-review.md @@ -0,0 +1,80 @@ +--- +name: 'step-04-review' +description: 'Review changes and offer validation' + +nextStepFile: './step-05-confirm.md' +validationWorkflow: '../steps-v/step-01-load-target.md' +--- + +# Step 4: Review Changes + +## STEP GOAL: + +Review the applied changes and offer to run validation. + +## MANDATORY EXECUTION RULES: + +### Universal Rules: +- 📖 CRITICAL: Read the complete step file before taking any action +- ✅ Speak in `{communication_language}` + +### Role Reinforcement: +- ✅ You are the **Module Editor** — confirming changes +- ✅ Ensure user is satisfied + +--- + +## MANDATORY SEQUENCE + +### 1. Show Diff + +Display what changed: + +"**Here's what changed:**" + +**Before:** +{before_content} + +**After:** +{after_content} + +### 2. Confirm Satisfaction + +"**Are you happy with this change?**" + +- **[Y]es** — Keep the change +- **[N]o** — Revert and redo +- **[M]odify** — Make further adjustments + +### 3. Handle Response + +**IF Yes:** +- Mark edit as complete +- Proceed to step 5 + +**IF No:** +- Revert the change +- Return to step 2 to gather new edit + +**IF Modify:** +- Make additional adjustments +- Show updated diff +- Ask again + +### 4. Offer Validation + +"**Would you like to run validation after this edit?**" + +- Validation can check for any issues introduced + +### 5. Proceed to Confirm + +Load `{nextStepFile}` to confirm completion. + +--- + +## Success Metrics + +✅ Changes reviewed +✅ User satisfaction confirmed +✅ Validation offered diff --git a/src/modules/bmb/workflows/module/steps-e/step-05-confirm.md b/src/modules/bmb/workflows/module/steps-e/step-05-confirm.md new file mode 100644 index 00000000..486fb9d4 --- /dev/null +++ b/src/modules/bmb/workflows/module/steps-e/step-05-confirm.md @@ -0,0 +1,75 @@ +--- +name: 'step-05-confirm' +description: 'Confirm completion and offer next steps' + +validationWorkflow: '../steps-v/step-01-load-target.md' +--- + +# Step 5: Confirm Completion + +## STEP GOAL: + +Confirm edit completion and offer next steps including validation. + +## MANDATORY EXECUTION RULES: + +### Universal Rules: +- 📖 CRITICAL: Read the complete step file before taking any action +- ✅ Speak in `{communication_language}` + +### Role Reinforcement: +- ✅ You are the **Module Editor** — completing the job +- ✅ Guide next steps + +--- + +## MANDATORY SEQUENCE + +### 1. Summary of Changes + +"**✓ Edit complete!**" + +**File edited:** {file_path} +**Edit type:** {edit_type} +**Summary:** {summary_of_change} + +### 2. Offer Next Actions + +"**What would you like to do next?**" + +- **[V]alidate** — Run validation to check for issues +- **[E]dit more** — Make additional changes +- **[D]one** — Complete edit session + +### 3. Handle Response + +**IF Validate:** +"**Loading validation workflow...**" +Load `{validationWorkflow}` + +**IF Edit more:** +"**Loading edit selection...**" +Return to step 1 + +**IF Done:** +"**Edit session complete!**" +Summary of what was accomplished. + +### 4. Complete Session + +If Done selected: + +"**Thanks for using the Module Edit workflow!**" + +"**Summary:**" +- Files edited: {count} +- Changes made: {summary} + +--- + +## Success Metrics + +✅ Edit confirmed complete +✅ Next actions offered +✅ Validation accessible +✅ Session properly closed diff --git a/src/modules/bmb/workflows/module/steps-v/step-01-load-target.md b/src/modules/bmb/workflows/module/steps-v/step-01-load-target.md new file mode 100644 index 00000000..08237f3e --- /dev/null +++ b/src/modules/bmb/workflows/module/steps-v/step-01-load-target.md @@ -0,0 +1,96 @@ +--- +name: 'step-01-load-target' +description: 'Load target for validation' + +nextStepFile: './step-02-file-structure.md' +validationReportOutput: '{bmb_creations_output_folder}/modules/validation-report-{target_code}-{timestamp}.md' +--- + +# Step 1: Load Target (Validate Mode) + +## STEP GOAL: + +Load the target (brief, module, agent specs, or workflow specs) for validation. + +## MANDATORY EXECUTION RULES: + +### Universal Rules: +- 📖 CRITICAL: Read the complete step file before taking any action +- ✅ Speak in `{communication_language}` + +### Role Reinforcement: +- ✅ You are the **Quality Assurance** — thorough, systematic +- ✅ Understand what we're validating + +--- + +## MANDATORY SEQUENCE + +### 1. Determine Validation Target + +"**What would you like to validate?**" + +Options: +- **[B]rief** — Module brief from Brief mode +- **[M]odule** — Built module structure +- **[A]gents** — Agent specifications +- **[W]orkflows** — Workflow specifications +- **[F]ull** — Everything (brief + module + specs) + +### 2. Load Target + +Based on selection, load the target: + +**IF Brief:** +- Path: `{bmb_creations_output_folder}/modules/module-brief-{code}.md` +- Ask for module code if not specified + +**IF Module:** +- Path: `src/modules/{code}/` +- Ask for module code if not specified + +**IF Agents:** +- Path: `src/modules/{code}/agents/` +- Load all `.spec.md` or `.agent.yaml` files + +**IF Workflows:** +- Path: `src/modules/{code}/workflows/` +- Load all `.spec.md` files + +**IF Full:** +- Load everything above for a module + +### 3. Confirm Target + +"**Validating:** {target_type} for {module_code}" +"**Location:** {path}" + +"**Shall I proceed?**" + +### 4. Initialize Validation Report + +Create the validation report structure: + +```yaml +--- +validationDate: {timestamp} +targetType: {target_type} +moduleCode: {module_code} +targetPath: {path} +status: IN_PROGRESS +--- +``` + +### 5. Proceed to Validation + +"**Starting validation checks...**" + +Load `{nextStepFile}` to begin file structure validation. + +--- + +## Success Metrics + +✅ Target loaded +✅ Validation report initialized +✅ User confirmed diff --git a/src/modules/bmb/workflows/module/steps-v/step-02-file-structure.md b/src/modules/bmb/workflows/module/steps-v/step-02-file-structure.md new file mode 100644 index 00000000..3253964c --- /dev/null +++ b/src/modules/bmb/workflows/module/steps-v/step-02-file-structure.md @@ -0,0 +1,94 @@ +--- +name: 'step-02-file-structure' +description: 'Validate file structure compliance' + +nextStepFile: './step-03-module-yaml.md' +moduleStandardsFile: '../../data/module-standards.md' +validationReportOutput: '{validation_report_output}' +--- + +# Step 2: File Structure Validation + +## STEP GOAL: + +Validate file structure against module standards. + +## MANDATORY EXECUTION RULES: + +### Universal Rules: +- 📖 CRITICAL: Read the complete step file before taking any action +- ✅ Speak in `{communication_language}` + +### Role Reinforcement: +- ✅ You are the **Quality Assurance** — checking structure +- ✅ Reference standards, ensure compliance + +--- + +## MANDATORY SEQUENCE + +### 1. Load Standards + +Load `{moduleStandardsFile}` for reference. + +### 2. Perform Structure Checks + +Check based on target type: + +**For Modules:** +- [ ] module.yaml exists +- [ ] README.md exists +- [ ] agents/ folder exists (if agents specified) +- [ ] workflows/ folder exists (if workflows specified) +- [ ] _module-installer/ folder (if installer specified) + +**For Briefs:** +- [ ] Brief file exists +- [ ] Required sections present + +**For Agent Specs:** +- [ ] All expected spec files exist + +**For Workflow Specs:** +- [ ] All expected spec files exist + +### 3. Check Module Type Compliance + +**IF Extension Module:** +- [ ] Code matches base module +- [ ] Folder name is unique (not conflicting) + +**IF Global Module:** +- [ ] Global flag documented + +### 4. Record Results + +Append to `{validationReportOutput}`: + +```markdown +## File Structure Validation + +**Status:** {PASS/FAIL/WARNINGS} + +**Checks:** +{list each check with result} + +**Issues Found:** +{any structural problems} +``` + +### 5. Auto-Proceed + +"**✓ File structure check complete.**" + +Proceeding to next validation... + +Load `{nextStepFile}` + +--- + +## Success Metrics + +✅ All structure checks performed +✅ Results recorded +✅ Auto-proceeds to next validation diff --git a/src/modules/bmb/workflows/module/steps-v/step-03-module-yaml.md b/src/modules/bmb/workflows/module/steps-v/step-03-module-yaml.md new file mode 100644 index 00000000..ba6a13c0 --- /dev/null +++ b/src/modules/bmb/workflows/module/steps-v/step-03-module-yaml.md @@ -0,0 +1,99 @@ +--- +name: 'step-03-module-yaml' +description: 'Validate module.yaml against conventions' + +nextStepFile: './step-04-agent-specs.md' +moduleYamlConventionsFile: '../../data/module-yaml-conventions.md' +validationReportOutput: '{validation_report_output}' +targetPath: '{validation_target_path}' +--- + +# Step 3: module.yaml Validation + +## STEP GOAL: + +Validate module.yaml formatting and conventions. + +## MANDATORY EXECUTION RULES: + +### Universal Rules: +- 📖 CRITICAL: Read the complete step file before taking any action +- ✅ Speak in `{communication_language}` + +### Role Reinforcement: +- ✅ You are the **Quality Assurance** — checking configuration +- ✅ Ensure proper YAML syntax + +--- + +## MANDATORY SEQUENCE + +### 1. Load module.yaml + +Read `{targetPath}/module.yaml` + +**IF not present:** +- Record as FAIL (required file) +- Skip to next validation + +### 2. Validate Required Fields + +Check for required frontmatter: +- [ ] `code:` present and valid (kebab-case, 2-20 chars) +- [ ] `name:` present +- [ ] `header:` present +- [ ] `subheader:` present +- [ ] `default_selected:` present (boolean) + +### 3. Validate Custom Variables + +For each custom variable: +- [ ] `prompt:` present +- [ ] `default:` present (or explicitly omitted) +- [ ] `result:` template valid +- [ ] Variable naming correct (kebab-case) + +**For single-select:** +- [ ] `single-select:` array present +- [ ] All options have `value:` and `label:` + +**For multi-select:** +- [ ] `multi-select:` array present +- [ ] All options have `value:` and `label:` + +### 4. Validate Extension Module Code + +**IF Extension:** +- [ ] `code:` matches base module code +- [ ] This is intentional (not an error) + +### 5. Record Results + +Append to `{validationReportOutput}`: + +```markdown +## module.yaml Validation + +**Status:** {PASS/FAIL/WARNINGS} + +**Required Fields:** {status} +**Custom Variables:** {count} variables +**Issues Found:** +{list any issues} +``` + +### 6. Auto-Proceed + +"**✓ module.yaml check complete.**" + +Proceeding to next validation... + +Load `{nextStepFile}` + +--- + +## Success Metrics + +✅ All module.yaml checks performed +✅ Results recorded +✅ Auto-proceeds to next validation diff --git a/src/modules/bmb/workflows/module/steps-v/step-04-agent-specs.md b/src/modules/bmb/workflows/module/steps-v/step-04-agent-specs.md new file mode 100644 index 00000000..3a2d931e --- /dev/null +++ b/src/modules/bmb/workflows/module/steps-v/step-04-agent-specs.md @@ -0,0 +1,152 @@ +--- +name: 'step-04-agent-specs' +description: 'Validate agent specifications and built agents' + +nextStepFile: './step-05-workflow-specs.md' +agentSpecTemplate: '../../templates/agent-spec-template.md' +agentArchitectureFile: '../../data/agent-architecture.md' +agentValidationWorkflow: '{project-root}/_bmad/bmb/workflows/agent/steps-v/step-01-validate.md' +validationReportOutput: '{validation_report_output}' +targetPath: '{validation_target_path}' +--- + +# Step 4: Agent Specs Validation + +## STEP GOAL: + +Validate agent specifications and/or built agents, distinguishing between placeholder specs and fully implemented agents. + +## MANDATORY EXECUTION RULES: + +### Universal Rules: +- 📖 CRITICAL: Read the complete step file before taking any action +- ✅ Speak in `{communication_language}` + +### Role Reinforcement: +- ✅ You are the **Quality Assurance** — dual-mode checking +- ✅ Specs are expected, built agents are great +- ✅ Track status of each agent + +--- + +## MANDATORY SEQUENCE + +### 1. Load Agent Files + +Find all agent files in `{targetPath}/agents/`: +- `.spec.md` files (placeholder specs) +- `.agent.yaml` files (built agents) + +### 2. Categorize Agents + +For each agent found, determine status: + +**Built Agents (.agent.yaml):** +- Full implementation with complete persona, menu YAML +- Can be validated in-depth via agent validation workflow + +**Spec Agents (.spec.md):** +- High-level placeholder/blueprint +- Awaiting creation via agent-builder workflow + +Track counts: +- Total agents: {count} +- Built agents: {count} +- Spec agents: {count} + +### 3. Validate Spec Agents (.spec.md) + +For each spec agent, check: + +**Required Sections:** +- [ ] Agent metadata (id, name, title, icon, module) +- [ ] Role defined +- [ ] Identity or communication style +- [ ] Menu triggers documented +- [ ] hasSidecar decision documented + +**Menu Triggers:** +- [ ] At least one trigger per agent +- [ ] Trigger → workflow mapping clear +- [ ] No duplicate triggers (warn if found) + +**hasSidecar Documentation:** +- [ ] Decision documented (true or false) +- [ ] Rationale if true (why memory needed) + +**Placeholder Note:** These are specs awaiting agent-builder. + +### 4. Validate Built Agents (.agent.yaml) + +For each built agent, check: + +**Frontmatter Completeness:** +- [ ] agent.metadata exists +- [ ] agent.persona exists +- [ ] agent.menu exists + +**YAML Structure:** +- [ ] Valid YAML syntax +- [ ] Required fields present + +**Status:** These are complete implementations and can be validated in detail via sub-process. + +### 5. Record Results + +Append to `{validationReportOutput}`: + +```markdown +## Agent Specs Validation + +**Status:** {PASS/FAIL/WARNINGS} + +**Agent Summary:** +- Total Agents: {count} +- Built Agents: {count} {list} +- Spec Agents: {count} {list} + +**Built Agents:** +{for each built agent} +- **{name}**: {status} - Ready for detailed validation via agent workflow + +**Spec Agents:** +{for each spec agent} +- **{name}**: {status} - Placeholder awaiting agent-builder + +**Issues Found:** +{list any issues} + +**Recommendations:** +{if specs exist} +- Use `bmad:bmb:agents:agent-builder` to create {spec agent names} +- After building agents, re-run validation to verify compliance +{endif} +``` + +### 6. Note Sub-Process Opportunity + +**IF built agents exist:** + +"**The following built agents can be validated in detail:**" + +{list built agents} + +"**After this validation completes, I can spawn sub-processes to run the agent validation workflow on each built agent for deeper compliance checking.**" + +### 7. Auto-Proceed + +"**✓ Agent specs check complete.**" + +Proceeding to next validation... + +Load `{nextStepFile}` + +--- + +## Success Metrics + +✅ All agent files checked +✅ Status tracked (spec vs built) +✅ hasSidecar decisions validated +✅ Recommendations for specs documented +✅ Sub-process opportunity noted diff --git a/src/modules/bmb/workflows/module/steps-v/step-05-workflow-specs.md b/src/modules/bmb/workflows/module/steps-v/step-05-workflow-specs.md new file mode 100644 index 00000000..24490bdf --- /dev/null +++ b/src/modules/bmb/workflows/module/steps-v/step-05-workflow-specs.md @@ -0,0 +1,152 @@ +--- +name: 'step-05-workflow-specs' +description: 'Validate workflow specifications and built workflows' + +nextStepFile: './step-06-documentation.md' +workflowSpecTemplate: '../../templates/workflow-spec-template.md' +workflowValidationWorkflow: '{project-root}/_bmad/bmb/workflows/workflow/steps-v/step-01-validate.md' +validationReportOutput: '{validation_report_output}' +targetPath: '{validation_target_path}' +--- + +# Step 5: Workflow Specs Validation + +## STEP GOAL: + +Validate workflow specifications and/or built workflows, distinguishing between placeholder specs and fully implemented workflows. + +## MANDATORY EXECUTION RULES: + +### Universal Rules: +- 📖 CRITICAL: Read the complete step file before taking any action +- ✅ Speak in `{communication_language}` + +### Role Reinforcement: + +- ✅ You are the **Quality Assurance** — dual-mode checking +- ✅ Specs are expected, built workflows are great +- ✅ Track status of each workflow + +--- + +## MANDATORY SEQUENCE + +### 1. Load Workflow Files + +Find all workflow files in `{targetPath}/workflows/`: +- `.spec.md` files (placeholder specs) +- `workflow.md` files (built workflows) + +### 2. Categorize Workflows + +For each workflow found, determine status: + +**Built Workflows (workflow.md with steps/ folder):** +- Full implementation with step files, data, templates +- Can be validated in-depth via workflow validation workflow + +**Spec Workflows (.spec.md):** +- High-level placeholder/blueprint +- Awaiting creation via workflow-builder workflow + +Track counts: +- Total workflows: {count} +- Built workflows: {count} +- Spec workflows: {count} + +### 3. Validate Spec Workflows (.spec.md) + +For each spec workflow, check: + +**Required Sections:** +- [ ] Workflow goal defined +- [ ] Description present +- [ ] Workflow type indicated +- [ ] Step list or outline present +- [ ] Agent association clear + +**Inputs/Outputs:** +- [ ] Input requirements documented +- [ ] Output format specified + +**Agent Integration:** +- [ ] Primary agent identified +- [ ] Multi-agent collaboration noted (if applicable) + +**Placeholder Note:** These are specs awaiting workflow-builder. + +### 4. Validate Built Workflows (workflow.md) + +For each built workflow, check: + +**Workflow Structure:** +- [ ] workflow.md exists with proper frontmatter +- [ ] steps/ folder exists (steps-c/, steps-e/, steps-v/ as appropriate) +- [ ] Step files follow naming conventions + +**Step File Compliance:** +- [ ] Each step has proper frontmatter +- [ ] Step files within size limits +- [ ] Menu handling follows standards + +**Status:** These are complete implementations and can be validated in detail via sub-process. + +### 5. Record Results + +Append to `{validationReportOutput}`: + +```markdown +## Workflow Specs Validation + +**Status:** {PASS/FAIL/WARNINGS} + +**Workflow Summary:** +- Total Workflows: {count} +- Built Workflows: {count} {list} +- Spec Workflows: {count} {list} + +**Built Workflows:** +{for each built workflow} +- **{name}**: {status} - Ready for detailed validation via workflow workflow + +**Spec Workflows:** +{for each spec workflow} +- **{name}**: {status} - Placeholder awaiting workflow-builder + +**Issues Found:** +{list any issues} + +**Recommendations:** +{if specs exist} +- Use `bmad:bmb:workflows:workflow` or `/workflow` to create {spec workflow names} +- After building workflows, re-run validation to verify compliance +{endif} +``` + +### 6. Note Sub-Process Opportunity + +**IF built workflows exist:** + +"**The following built workflows can be validated in detail:**" + +{list built workflows} + +"**After this validation completes, I can spawn sub-processes to run the workflow validation workflow on each built workflow for deeper compliance checking.**" + +### 7. Auto-Proceed + +"**✓ Workflow specs check complete.**" + +Proceeding to next validation... + +Load `{nextStepFile}` + +--- + +## Success Metrics + +✅ All workflow files checked +✅ Status tracked (spec vs built) +✅ Agent associations validated +✅ Recommendations for specs documented +✅ Sub-process opportunity noted diff --git a/src/modules/bmb/workflows/module/steps-v/step-06-documentation.md b/src/modules/bmb/workflows/module/steps-v/step-06-documentation.md new file mode 100644 index 00000000..d71a99eb --- /dev/null +++ b/src/modules/bmb/workflows/module/steps-v/step-06-documentation.md @@ -0,0 +1,143 @@ +--- +name: 'step-06-documentation' +description: 'Validate documentation (README.md, TODO.md, docs/)' + +nextStepFile: './step-07-installation.md' +validationReportOutput: '{validation_report_output}' +targetPath: '{validation_target_path}' +moduleBriefPath: '{module_brief_path}' +--- + +# Step 6: Documentation Validation + +## STEP GOAL: + +Validate module documentation completeness, including user-facing docs in docs/ folder. + +## MANDATORY EXECUTION RULES: + +### Universal Rules: +- 📖 CRITICAL: Read the complete step file before taking any action +- ✅ Speak in `{communication_language}` + +### Role Reinforcement: + +- ✅ You are the **Quality Assurance** — checking docs +- ✅ Documentation matters for usability +- ✅ User docs can be generated from placeholder plans + +--- + +## MANDATORY SEQUENCE + +### 1. Load Documentation Files + +Check for: +- `{targetPath}/README.md` (module overview) +- `{targetPath}/TODO.md` (development roadmap) +- `{targetPath}/docs/` (user documentation folder) + +### 2. Validate README.md + +**Required Sections:** +- [ ] Module name and description +- [ ] Installation instructions +- [ ] Components section (agents, workflows) +- [ ] Usage examples or quick start +- [ ] Module structure +- [ ] Link to docs/ folder + +**Quality Checks:** +- [ ] Clear description of what module does +- [ ] Installation command shown +- [ ] Agent/workflow lists complete +- [ ] References user documentation + +### 3. Validate TODO.md + +**Required Content:** +- [ ] Agent build checklist +- [ ] Workflow build checklist +- [ ] Testing section +- [ ] Next steps + +### 4. Validate docs/ Folder + +**For Custom Modules:** +- [ ] docs/ folder exists +- [ ] Contains user-facing documentation +- [ ] Documentation is clear and helpful + +**Valid docs/ Contents (may include):** +- `getting-started.md` — Quick start guide +- `agents.md` — Agent documentation +- `workflows.md` — Workflow documentation +- `examples.md` — Usage examples +- `configuration.md` — Setup/configuration guide +- `troubleshooting.md` — Common issues and solutions + +**Quality Check:** +- [ ] Even with placeholder agent/workflow specs, user docs should provide useful information +- [ ] Documentation references agents/workflows by name +- [ ] Clear what functionality exists vs what is planned + +### 5. Generate User Docs Recommendation + +**IF docs/ missing or incomplete:** + +"**User documentation can be generated from module brief and agent/workflow specs.**" + +"**Even with placeholder plans, you can create helpful user documentation that describes:** +- What each agent does and when to use it +- What workflows are available and their purpose +- How to get started with the module +- Configuration options (from module.yaml)" + +### 6. Record Results + +Append to `{validationReportOutput}`: + +```markdown +## Documentation Validation + +**Status:** {PASS/FAIL/WARNINGS} + +**Root Documentation:** +- **README.md:** {present/missing} - {status} +- **TODO.md:** {present/missing} - {status} + +**User Documentation (docs/):** +- **docs/ folder:** {present/missing} - {status} +- **Documentation files:** {count} files found + +**Docs Contents:** +{list files in docs/ folder} + +**Issues Found:** +{list any issues} + +**Recommendations:** +{if docs/ missing or incomplete} +- Generate user documentation from module brief and specs +- Create getting-started.md, agents.md, workflows.md +- User docs are valuable even with placeholder plans +{endif} +``` + +### 7. Auto-Proceed + +"**✓ Documentation check complete.**" + +Proceeding to installation validation... + +Load `{nextStepFile}` + +--- + +## Success Metrics + +✅ All documentation checked +✅ Required sections validated +✅ docs/ folder presence verified +✅ User documentation quality assessed +✅ Recommendations documented diff --git a/src/modules/bmb/workflows/module/steps-v/step-07-installation.md b/src/modules/bmb/workflows/module/steps-v/step-07-installation.md new file mode 100644 index 00000000..ee11e163 --- /dev/null +++ b/src/modules/bmb/workflows/module/steps-v/step-07-installation.md @@ -0,0 +1,113 @@ +--- +name: 'step-07-installation' +description: 'Installation readiness check' + +nextStepFile: './step-08-report.md' +moduleInstallerStandardsFile: '../../data/module-installer-standards.md' +validationReportOutput: '{validation_report_output}' +targetPath: '{validation_target_path}' +--- + +# Step 7: Installation Readiness + +## STEP GOAL: + +Check if the module is ready for installation. + +## MANDATORY EXECUTION RULES: + +### Universal Rules: +- 📖 CRITICAL: Read the complete step file before taking any action +- ✅ Speak in `{communication_language}` + +### Role Reinforcement: + +- ✅ You are the **Quality Assurance** — checking readiness +- ✅ Installation should work + +--- + +## MANDATORY SEQUENCE + +### 1. Check Installer + +**IF `_module-installer/` exists:** +- [ ] `installer.js` present +- [ ] Has valid `install()` function +- [ ] Platform-specific handlers (if any IDEs supported) + +**IF `_module-installer/` doesn't exist:** +- Note: Module may not need installer +- Check if this is intentional + +### 2. Validate installer.js (if present) + +Load `{moduleInstallerStandardsFile}` and check: + +**Function Signature:** +- [ ] `async function install(options)` +- [ ] Accepts: projectRoot, config, installedIDEs, logger +- [ ] Returns: Promise + +**Error Handling:** +- [ ] Try/catch block present +- [ ] Error logging present + +**Platform Validation:** +- [ ] Uses platformCodes for IDE validation +- [ ] Graceful handling of unknown platforms + +### 3. Check module.yaml Install Variables + +**IF custom variables exist:** +- [ ] All variables have prompts +- [ ] Defaults are reasonable +- [ ] Result templates are valid + +**Path Variables:** +- [ ] Paths use `{project-root}/` prefix +- [ ] Output paths are user-configurable + +### 4. Module Type Installation + +**IF Extension:** +- [ ] `code:` matches base (for proper merge) +- [ ] Folder name is unique + +**IF Global:** +- [ ] `global: true` or documented +- [ ] Global impact is minimal/intentional + +### 5. Record Results + +Append to `{validationReportOutput}`: + +```markdown +## Installation Readiness + +**Status:** {PASS/FAIL/WARNINGS} + +**Installer:** {present/missing} - {status} +**Install Variables:** {count} variables +**Ready to Install:** {yes/no} + +**Issues Found:** +{list any issues} +``` + +### 6. Auto-Proceed + +"**✓ Installation readiness check complete.**" + +Proceeding to final report... + +Load `{nextStepFile}` + +--- + +## Success Metrics + +✅ Installation readiness assessed +✅ Installer validated (if present) +✅ Module type compatibility checked +✅ Results recorded diff --git a/src/modules/bmb/workflows/module/steps-v/step-08-report.md b/src/modules/bmb/workflows/module/steps-v/step-08-report.md new file mode 100644 index 00000000..f5211592 --- /dev/null +++ b/src/modules/bmb/workflows/module/steps-v/step-08-report.md @@ -0,0 +1,197 @@ +--- +name: 'step-08-report' +description: 'Generate final validation report' + +validationReportOutput: '{validation_report_output}' +agentValidationWorkflow: '{project-root}/_bmad/bmb/workflows/agent/steps-v/step-01-validate.md' +workflowValidationWorkflow: '{project-root}/_bmad/bmb/workflows/workflow/steps-v/step-01-validate.md' +--- + +# Step 8: Validation Report + +## STEP GOAL: + +Compile all validation results into a final report with actionable recommendations, including sub-process validation opportunities for built agents and workflows. + +## MANDATORY EXECUTION RULES: + +### Universal Rules: +- 📖 CRITICAL: Read the complete step file before taking any action +- ✅ Speak in `{communication_language}` + +### Role Reinforcement: + +- ✅ You are the **Quality Assurance** — reporting results +- ✅ Clear, actionable feedback +- ✅ Sub-process validation for built components + +--- + +## MANDATORY SEQUENCE + +### 1. Compile Overall Status + +Review all validation sections and determine overall status: + +**PASS:** All checks passed, ready to proceed +**WARNINGS:** Minor issues found, can proceed with fixes +**FAIL:** Critical issues found, must fix before proceeding + +### 2. Generate Summary + +Add to `{validationReportOutput}`: + +```markdown +--- + +## Overall Summary + +**Status:** {PASS/WARNINGS/FAIL} + +**Breakdown:** +- File Structure: {status} +- module.yaml: {status} +- Agent Specs: {status} ({built_count} built, {spec_count} specs) +- Workflow Specs: {status} ({built_count} built, {spec_count} specs) +- Documentation: {status} +- Installation Readiness: {status} + +--- + +## Component Status + +### Agents +- **Built Agents:** {count} — {list} +- **Spec Agents:** {count} — {list} + +### Workflows +- **Built Workflows:** {count} — {list} +- **Spec Workflows:** {count} — {list} + +--- + +## Recommendations + +{priority-listed-recommendations} + +### Priority 1 - Critical (must fix) + +{critical_issues} + +### Priority 2 - High (should fix) + +{high_priority_issues} + +### Priority 3 - Medium (nice to have) + +{medium_priority_issues} + +--- + +## Sub-Process Validation + +{if built_agents_exist} +### Built Agent Deep Validation + +The following built agents can be validated in detail using the agent validation workflow: + +{for each built_agent} +- **{agent_name}** — Use `{agentValidationWorkflow}` + +**Recommendation:** Run agent validation workflow on each built agent to verify: +- Frontmatter completeness +- Persona quality +- Menu structure compliance +- Sidecar validation + +**After fixing any module-level issues, I can spawn sub-processes to validate each built agent in parallel.** +{endif} + +{if built_workflows_exist} +### Built Workflow Deep Validation + +The following built workflows can be validated in detail using the workflow validation workflow: + +{for each built_workflow} +- **{workflow_name}** — Use `{workflowValidationWorkflow}` + +**Recommendation:** Run workflow validation workflow on each built workflow to verify: +- Step file compliance +- Tri-modal structure (steps-c/steps-e/steps-v/) +- Frontmatter completeness +- Size limits compliance + +**After fixing any module-level issues, I can spawn sub-processes to validate each built workflow in parallel.** +{endif} + +--- + +## Next Steps + +{based_on_status} + +{if specs_exist} +### Build Spec Components + +**Spec Agents:** {spec_count} +- Use `bmad:bmb:agents:agent-builder` to create: {spec_agent_names} + +**Spec Workflows:** {spec_count} +- Use `bmad:bmb:workflows:workflow` to create: {spec_workflow_names} + +**After building specs, re-run validation to verify compliance.** +{endif} + +--- + +**Validation Completed:** {timestamp} +``` + +### 3. Present Report + +"**✓ Validation complete!**" + +**Overall Status:** {overall_status} + +**Report saved to:** `{validationReportOutput}` + +{if built_components_exist} +"**Built components found:**" +- Built Agents: {count} +- Built Workflows: {count} + +"**These can be validated in depth via sub-process.**" +{endif} + +### 4. Offer Next Actions + +"**What would you like to do?**" + +- **[R]ead report** — Show the full validation report +- **[S]ub-process validation** — Run deep validation on built agents/workflows +- **[F]ix issues** — Edit mode to fix identified problems +- **[D]one** — Complete validation + +### 5. Menu Handling + +- IF R: Display the full report +- IF S: + - {if built_components_exist} + - Offer to run agent validation on built agents + - Offer to run workflow validation on built workflows + - Can run in parallel for efficiency + - {else} + - "No built components found for sub-process validation." + - {endif} +- IF F: Offer to load Edit mode +- IF D: Complete validation session + +--- + +## Success Metrics + +✅ Overall status determined +✅ Complete report generated +✅ Actionable recommendations provided +✅ Sub-process validation opportunities identified +✅ Next steps offered diff --git a/src/modules/bmb/workflows/module/templates/brief-template.md b/src/modules/bmb/workflows/module/templates/brief-template.md new file mode 100644 index 00000000..01ad3f3d --- /dev/null +++ b/src/modules/bmb/workflows/module/templates/brief-template.md @@ -0,0 +1,154 @@ +# Module Brief: {module_code} + +**Date:** {date} +**Author:** {user_name} +**Module Code:** {module_code} +**Module Type:** {module_type} +**Status:** Ready for Development + +--- + +## Executive Summary + +{module_vision} + +**Module Category:** {module_category} +**Target Users:** {target_users} +**Complexity Level:** {complexity_level} + +--- + +## Module Identity + +### Module Code & Name + +- **Code:** `{module_code}` +- **Name:** `{module_name}` + +### Core Concept + +{module_identity} + +### Personality Theme + +{personality_theme} + +--- + +## Module Type + +**Type:** {module_type} + +{module_type_explanation} + +--- + +## Unique Value Proposition + +**What makes this module special:** + +{unique_value_proposition} + +**Why users would choose this module:** + +{value_proposition_details} + +--- + +## User Scenarios + +### Target Users + +{target_users} + +### Primary Use Case + +{primary_use_case} + +### User Journey + +{user_journey} + +--- + +## Agent Architecture + +### Agent Count Strategy + +{agent_count_strategy} + +### Agent Roster + +| Agent | Name | Role | Expertise | +|-------|------|------|-----------| +{agent_roster_table} + +### Agent Interaction Model + +{agent_interaction_model} + +### Agent Communication Style + +{agent_communication_style} + +--- + +## Workflow Ecosystem + +### Core Workflows (Essential) + +{core_workflows} + +### Feature Workflows (Specialized) + +{feature_workflows} + +### Utility Workflows (Support) + +{utility_workflows} + +--- + +## Tools & Integrations + +### MCP Tools + +{mcp_tools} + +### External Services + +{external_services} + +### Integrations with Other Modules + +{module_integrations} + +--- + +## Creative Features + +### Personality & Theming + +{creative_personality} + +### Easter Eggs & Delighters + +{easter_eggs} + +### Module Lore + +{module_lore} + +--- + +## Next Steps + +1. **Review this brief** — Ensure the vision is clear +2. **Run create-module workflow** — Build the module structure +3. **Create agents** — Use create-agent workflow for each agent +4. **Create workflows** — Use create-workflow workflow for each workflow +5. **Test module** — Install and verify functionality + +--- + +_brief created on {date} by {user_name} using the BMAD Module workflow_ diff --git a/src/modules/bmb/workflows/module/templates/workflow-spec-template.md b/src/modules/bmb/workflows/module/templates/workflow-spec-template.md new file mode 100644 index 00000000..40133a8b --- /dev/null +++ b/src/modules/bmb/workflows/module/templates/workflow-spec-template.md @@ -0,0 +1,96 @@ +# Workflow Specification: {workflow_name} + +**Module:** {module_code} +**Status:** Placeholder — To be created via create-workflow workflow +**Created:** {date} + +--- + +## Workflow Overview + +**Goal:** {workflow_goal} + +**Description:** {workflow_description} + +**Workflow Type:** {workflow_type} + +--- + +## Workflow Structure + +### Entry Point + +```yaml +--- +name: {workflow_name} +description: {workflow_description} +web_bundle: true +installed_path: '{project-root}/_bmad/{module_code}/workflows/{workflow_folder_name}' +--- +``` + +### Mode + +- [ ] Create-only (steps-c/) +- [ ] Tri-modal (steps-c/, steps-e/, steps-v/) + +--- + +## Planned Steps + +| Step | Name | Goal | +|------|------|------| +{workflow_steps_table} + +--- + +## Workflow Inputs + +### Required Inputs + +{required_inputs} + +### Optional Inputs + +{optional_inputs} + +--- + +## Workflow Outputs + +### Output Format + +- [ ] Document-producing +- [ ] Non-document + +### Output Files + +{output_files} + +--- + +## Agent Integration + +### Primary Agent + +{primary_agent} + +### Other Agents + +{other_agents} + +--- + +## Implementation Notes + +**Use the create-workflow workflow to build this workflow.** + +Inputs needed: +- Workflow name and description +- Step structure and sequence +- Input/output specifications +- Agent associations + +--- + +_Spec created on {date} via BMAD Module workflow_ diff --git a/src/modules/bmb/workflows/module/workflow.md b/src/modules/bmb/workflows/module/workflow.md new file mode 100644 index 00000000..98a93694 --- /dev/null +++ b/src/modules/bmb/workflows/module/workflow.md @@ -0,0 +1,100 @@ +--- +name: module +description: Quad-modal workflow for creating BMAD modules (Brief + Create + Edit + Validate) +web_bundle: true +installed_path: '{project-root}/_bmad/bmb/workflows/module' +--- + +# Module Workflow + +The module workflow guides users through creating complete, installable BMAD modules through a quad-modal process: **Brief → Create → Edit → Validate**. + +## What This Workflow Does + +- **Brief mode** — Collaboratively explore and design your module vision +- **Create mode** — Build the module structure from a brief +- **Edit mode** — Modify existing briefs or modules +- **Validate mode** — Check compliance and completeness + +## Role + +You are the **Module Architect** — a specialist in BMAD module design. You understand that modules are complex entities requiring careful planning before implementation. + +--- + +## INITIALIZATION SEQUENCE + +### 1. Mode Determination + +**Check invocation context:** +- Look for existing module brief or plan +- Check if user is starting fresh or continuing work +- Determine what mode they need + +**Ask the user:** + +**"Welcome to the Module workflow! What would you like to do?"** + +- **[B] Brief** — Create a module brief (exploratory, creative discovery) +- **[C] Create** — Build a module from a brief +- **[E] Edit** — Modify an existing brief or module +- **[V] Validate** — Validate a brief or module + +### 2. Route to First Step + +**IF mode == brief (B):** +Load `{installed_path}/steps-b/step-01-welcome.md` + +**IF mode == create (C):** +Ask: "Where is the module brief?" → Load `{installed_path}/steps-c/step-01-load-brief.md` + +**IF mode == edit (E):** +Ask: "What would you like to edit?" → Load `{installed_path}/steps-e/step-01-assess.md` + +**IF mode == validate (V):** +Ask: "What would you like to validate?" → Load `{installed_path}/steps-v/step-01-validate.md` + +--- + +## Configuration + +This workflow references: +- `{installed_path}/data/` — Module standards and templates +- `{installed_path}/templates/` — Output templates + +--- + +## Workflow Structure + +``` +module/ +├── workflow.md # This file - mode routing +├── data/ # Shared standards +│ ├── module-standards.md +│ ├── module-yaml-conventions.md +│ ├── agent-architecture.md +│ └── module-installer-standards.md +├── templates/ # Output templates +│ ├── brief-template.md +│ ├── agent-spec-template.md +│ └── workflow-spec-template.md +├── steps-b/ # Brief mode (13 steps) +├── steps-c/ # Create mode (8 steps) +├── steps-e/ # Edit mode +└── steps-v/ # Validate mode +``` + +--- + +## Output + +**Brief mode produces:** +- `module-brief-{code}.md` — Complete module vision document + +**Create mode produces:** +- Module directory structure +- `module.yaml` with install configuration +- `_module-installer/` folder (if needed) +- Agent placeholder/spec files +- Workflow placeholder/spec files +- `README.md` and `TODO.md` From 51aa3dda2f1059f64423e6c8ccabe3375f2e4af3 Mon Sep 17 00:00:00 2001 From: Davor Racic Date: Wed, 7 Jan 2026 02:09:03 +0100 Subject: [PATCH 09/19] fix: brainstorming (#1251) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(brainstorming): extend ideation phase with 100+ idea goal Add emphasis on quantity-first approach to unlock better quality ideas. Introduce energy checkpoints, multiple continuation options, and clearer success metrics to keep users in generative exploration mode longer. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 * fix(brainstorming): improve exploration menus and fix workflow paths - Change menu options from numbers [1-4] to letters [K/T/A/B/C] for clearer navigation - Fix workflow references from .yaml to .md across agents and patterns - Add universal facilitation rules emphasizing 100+ idea quantity goal - Update exploration menu with Keep/Try/Advanced/Break/Continue options 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 * feat(brainstorming): implement research-backed procedural rigor Phase 4 achievements: - Added Anti-Bias Protocol (Every 10 ideas domain pivot) - Added Chain-of-Thought requirements (Reasoning before generation) - Implemented Simulated Temperature prompts for higher divergence - Standardized Idea Format Template for quality control - Fixed undefined Advanced Elicitation variables - Synchronized documentation with new [K, T, A, P, C] pattern * fix(brainstorming): align ideation goals and fix broken workflow paths - Standardized quantity goals to 100+ ideas across all brainstorming steps - Fixed broken .yaml references pointing to renamed .md workflow files - Aligned documentation summaries with mandatory IDEA FORMAT TEMPLATE - Cleaned up misplaced mindset/goal sections in core workflow file - Fixed spelling and inconsistencies in facilitation rules * Fix ambiguous variable names in brainstorming ideation step * fix(brainstorming): enforce quality growth alongside quantity * fix: correct dependency format and add missing frontmatter variable --------- Co-authored-by: Claude Opus 4.5 --- .../steps/step-03-technique-execution.md | 77 ++++++++++++++-- src/core/workflows/brainstorming/workflow.md | 7 ++ .../agent/data/agent-menu-patterns.md | 10 +- .../brainstorm-game/steps/step-01-init.md | 3 +- .../brainstorm-game/steps/step-02-context.md | 2 +- .../brainstorm-game/steps/step-03-ideation.md | 91 ++++++++++--------- .../brainstorm-game/workflow.md | 3 + .../brainstorm-game/workflow.yaml | 6 +- .../bmm/agents/quick-flow-solo-dev.agent.yaml | 2 +- .../cis/agents/brainstorming-coach.agent.yaml | 2 +- 10 files changed, 139 insertions(+), 64 deletions(-) diff --git a/src/core/workflows/brainstorming/steps/step-03-technique-execution.md b/src/core/workflows/brainstorming/steps/step-03-technique-execution.md index ed2077c7..5df8f911 100644 --- a/src/core/workflows/brainstorming/steps/step-03-technique-execution.md +++ b/src/core/workflows/brainstorming/steps/step-03-technique-execution.md @@ -1,19 +1,36 @@ # Step 3: Interactive Technique Execution and Facilitation +--- +advancedElicitationTask: '{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml' +--- + ## MANDATORY EXECUTION RULES (READ FIRST): - ✅ YOU ARE A CREATIVE FACILITATOR, engaging in genuine back-and-forth coaching +- 🎯 AIM FOR 100+ IDEAS before suggesting organization - quantity unlocks quality (quality must grow as we progress) +- 🔄 DEFAULT IS TO KEEP EXPLORING - only move to organization when user explicitly requests it +- 🧠 **THOUGHT BEFORE INK (CoT):** Before generating each idea, you must internally reason: "What domain haven't we explored yet? What would make this idea surprising or 'uncomfortable' for the user?" +- 🛡️ **ANTI-BIAS DOMAIN PIVOT:** Every 10 ideas, review existing themes and consciously pivot to an orthogonal domain (e.g., UX -> Business -> Physics -> Social Impact). +- 🌡️ **SIMULATED TEMPERATURE:** Act as if your creativity is set to 0.85 - take wilder leaps and suggest "provocative" concepts. +- ⏱️ Spend minimum 30-45 minutes in active ideation before offering to conclude - 🎯 EXECUTE ONE TECHNIQUE ELEMENT AT A TIME with interactive exploration - 📋 RESPOND DYNAMICALLY to user insights and build upon their ideas - 🔍 ADAPT FACILITATION based on user engagement and emerging directions - 💬 CREATE TRUE COLLABORATION, not question-answer sequences - ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the `communication_language` +## IDEA FORMAT TEMPLATE: + +Every idea you capture should follow this structure: +**[Category #X]**: [Mnemonic Title] +_Concept_: [2-3 sentence description] +_Novelty_: [What makes this different from obvious solutions] + ## EXECUTION PROTOCOLS: - 🎯 Present one technique element at a time for deep exploration - ⚠️ Ask "Continue with current technique?" before moving to next technique -- 💾 Document insights and ideas as they emerge organically +- 💾 Document insights and ideas using the **IDEA FORMAT TEMPLATE** - 📖 Follow user's creative energy and interests within technique structure - 🚫 FORBIDDEN rushing through technique elements without user engagement @@ -142,6 +159,26 @@ Before moving to next technique element: **Remember:** At any time, just say **"next technique"** or **"move on"** and I'll immediately document our current progress and start the next technique!" +### 4.1. Energy Checkpoint (After Every 4-5 Exchanges) + +**Periodic Check-In (DO NOT skip this):** + +"We've generated [X] ideas so far - great momentum! + +**Quick energy check:** + +- Want to **keep pushing** on this angle? +- **Switch techniques** for a fresh perspective? +- Or are you feeling like we've **thoroughly explored** this space? + +Remember: The goal is quantity first - we can organize later. What feels right?" + +**IMPORTANT:** Default to continuing exploration. Only suggest organization if: + +- User has explicitly asked to wrap up, OR +- You've been exploring for 45+ minutes AND generated 100+ ideas, OR +- User's energy is clearly depleted (short responses, "I don't know", etc.) + ### 4a. Handle Immediate Technique Transition **When user says "next technique" or "move on":** @@ -208,13 +245,15 @@ This connects beautifully with what we discovered earlier about _[previous conne **After Deep Exploration:** -"Let me summarize what we've uncovered in this exploration: +"Let me summarize what we've uncovered in this exploration using our **IDEA FORMAT TEMPLATE**: **Key Ideas Generated:** -- **[Idea 1]:** [Context and development] -- **[Idea 2]:** [How this emerged and evolved] -- **[Idea 3]:** [User's insight plus your coaching contribution] +**[Category #X]**: [Mnemonic Title] +_Concept_: [2-3 sentence description] +_Novelty_: [What makes this different from obvious solutions] + +(Repeat for all ideas generated) **Creative Breakthrough:** [Most innovative insight from the dialogue] @@ -243,17 +282,29 @@ After final technique element: **Before we move to idea organization, any final thoughts about this technique? Any insights you want to make sure we carry forward?** -**Ready to organize all these brilliant ideas and identify your top priorities?** -[C] Continue - Organize ideas and create action plans +**What would you like to do next?** -### 8. Handle Continue Selection +[K] **Keep exploring this technique** - We're just getting warmed up! +[T] **Try a different technique** - Fresh perspective on the same topic +[A] **Go deeper on a specific idea** - Develop a promising concept further (Advanced Elicitation) +[B] **Take a quick break** - Pause and return with fresh energy +[C] **Move to organization** - Only when you feel we've thoroughly explored -#### If 'C' (Continue): +**Default recommendation:** Unless you feel we've generated at least 100+ ideas, I suggest we keep exploring! The best insights often come after the obvious ideas are exhausted. + +### 8. Handle Menu Selection + +#### If 'C' (Move to organization): - **Append the technique execution content to `{output_folder}/analysis/brainstorming-session-{{date}}.md`** - **Update frontmatter:** `stepsCompleted: [1, 2, 3]` - **Load:** `./step-04-idea-organization.md` +#### If 'K', 'T', 'A', or 'B' (Continue Exploring): + +- **Stay in Step 3** and restart the facilitation loop for the chosen path (or pause if break requested). +- For option A, invoke Advanced Elicitation: `{advancedElicitationTask}` + ### 9. Update Documentation Update frontmatter and document with interactive session insights: @@ -279,6 +330,7 @@ facilitation_notes: [key insights about user's creative process] - **Interactive Focus:** [Main exploration directions] - **Key Breakthroughs:** [Major insights from coaching dialogue] + - **User Creative Strengths:** [What user demonstrated] - **Energy Level:** [Observation about engagement] @@ -308,6 +360,9 @@ When user selects 'C', append the content directly to `{output_folder}/analysis/ ## SUCCESS METRICS: +✅ Minimum 100 ideas generated before organization is offered +✅ User explicitly confirms readiness to conclude (not AI-initiated) +✅ Multiple technique exploration encouraged over single-technique completion ✅ True back-and-forth facilitation rather than question-answer format ✅ User's creative energy and interests guide technique direction ✅ Deep exploration of promising ideas before moving on @@ -318,6 +373,10 @@ When user selects 'C', append the content directly to `{output_folder}/analysis/ ## FAILURE MODES: +❌ Offering organization after only one technique or <20 ideas +❌ AI initiating conclusion without user explicitly requesting it +❌ Treating technique completion as session completion signal +❌ Rushing to document rather than staying in generative mode ❌ Rushing through technique elements without user engagement ❌ Not following user's creative energy and interests ❌ Missing opportunities to develop promising ideas deeper diff --git a/src/core/workflows/brainstorming/workflow.md b/src/core/workflows/brainstorming/workflow.md index 6499c8bc..30ab779d 100644 --- a/src/core/workflows/brainstorming/workflow.md +++ b/src/core/workflows/brainstorming/workflow.md @@ -10,6 +10,12 @@ context_file: '' # Optional context file path for project-specific guidance **Your Role:** You are a brainstorming facilitator and creative thinking guide. You bring structured creativity techniques, facilitation expertise, and an understanding of how to guide users through effective ideation processes that generate innovative ideas and breakthrough solutions. During this entire workflow it is critical that you speak to the user in the config loaded `communication_language`. +**Critical Mindset:** Your job is to keep the user in generative exploration mode as long as possible. The best brainstorming sessions feel slightly uncomfortable - like you've pushed past the obvious ideas into truly novel territory. Resist the urge to organize or conclude. When in doubt, ask another question, try another technique, or dig deeper into a promising thread. + +**Anti-Bias Protocol:** LLMs naturally drift toward semantic clustering (sequential bias). To combat this, you MUST consciously shift your creative domain every 10 ideas. If you've been focusing on technical aspects, pivot to user experience, then to business viability, then to edge cases or "black swan" events. Force yourself into orthogonal categories to maintain true divergence. + +**Quantity Goal:** Aim for 100+ ideas before any organization. The first 20 ideas are usually obvious - the magic happens in ideas 50-100. + --- ## WORKFLOW ARCHITECTURE @@ -41,6 +47,7 @@ Load config from `{project-root}/_bmad/core/config.yaml` and resolve: - `brain_techniques_path` = `{installed_path}/brain-methods.csv` - `default_output_file` = `{output_folder}/analysis/brainstorming-session-{{date}}.md` - `context_file` = Optional context file path from workflow invocation for project-specific guidance +- `advancedElicitationTask` = `{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml` --- diff --git a/src/modules/bmb/workflows/agent/data/agent-menu-patterns.md b/src/modules/bmb/workflows/agent/data/agent-menu-patterns.md index 30e7ab5d..d3eacb06 100644 --- a/src/modules/bmb/workflows/agent/data/agent-menu-patterns.md +++ b/src/modules/bmb/workflows/agent/data/agent-menu-patterns.md @@ -54,7 +54,7 @@ For module agents referencing external workflow files. description: '[CP] Create Product Requirements Document' - trigger: GB or fuzzy match on brainstorm - exec: '{project-root}/_bmad/core/workflows/brainstorming/workflow.yaml' + exec: '{project-root}/_bmad/core/workflows/brainstorming/workflow.md' description: '[GB] Guided brainstorming session' # Planned but unimplemented @@ -112,11 +112,11 @@ menu: ```yaml # ✅ CORRECT -exec: '{project-root}/_bmad/core/workflows/brainstorming/workflow.yaml' +exec: '{project-root}/_bmad/core/workflows/brainstorming/workflow.md' data: '{project-root}/_data/metrics.csv' # ❌ WRONG -exec: '../../../core/workflows/brainstorming/workflow.yaml' +exec: '../../../core/workflows/brainstorming/workflow.md' ``` **Available variables:** @@ -213,8 +213,8 @@ menu: description: '[WI] Initialize workflow path' - trigger: BS or fuzzy match on brainstorm - exec: '{project-root}/_bmad/core/workflows/brainstorming/workflow.yaml' - description: '[BS] Guided brainstorming' + exec: '{project-root}/_bmad/core/workflows/brainstorming/workflow.md' + description: '[BS] Guided brainstorming [K,T,A,B,C]' - trigger: CP or fuzzy match on create-prd exec: '{project-root}/_bmad/bmm/workflows/create-prd/workflow.md' diff --git a/src/modules/bmgd/workflows/1-preproduction/brainstorm-game/steps/step-01-init.md b/src/modules/bmgd/workflows/1-preproduction/brainstorm-game/steps/step-01-init.md index 8471d943..661c68f4 100644 --- a/src/modules/bmgd/workflows/1-preproduction/brainstorm-game/steps/step-01-init.md +++ b/src/modules/bmgd/workflows/1-preproduction/brainstorm-game/steps/step-01-init.md @@ -93,10 +93,11 @@ Handle each scenario appropriately with user prompts. **Brainstorming Rules:** - There are no bad ideas in brainstorming -- Quantity over quality initially +- **Quantity over quality:** Our goal is **100+ ideas**. The first 20 are obvious; as brainstorming progresses, quality must grow (the magic happens in ideas 50-100). - Build on ideas rather than criticize - Wild ideas are welcome - Defer judgment until later +- We will stay in generative mode until you feel we've thoroughly explored the space. **What we'll do:** diff --git a/src/modules/bmgd/workflows/1-preproduction/brainstorm-game/steps/step-02-context.md b/src/modules/bmgd/workflows/1-preproduction/brainstorm-game/steps/step-02-context.md index df4d26d3..9380031a 100644 --- a/src/modules/bmgd/workflows/1-preproduction/brainstorm-game/steps/step-02-context.md +++ b/src/modules/bmgd/workflows/1-preproduction/brainstorm-game/steps/step-02-context.md @@ -14,7 +14,7 @@ outputFile: '{output_folder}/brainstorming-session-{date}.md' # Context Files gameContext: '{workflow_path}/game-context.md' gameBrainMethods: '{workflow_path}/game-brain-methods.csv' -coreBrainstorming: '{project-root}/_bmad/core/workflows/brainstorming/workflow.yaml' +coreBrainstorming: '{project-root}/_bmad/core/workflows/brainstorming/workflow.md' --- # Step 2: Load Context diff --git a/src/modules/bmgd/workflows/1-preproduction/brainstorm-game/steps/step-03-ideation.md b/src/modules/bmgd/workflows/1-preproduction/brainstorm-game/steps/step-03-ideation.md index 40223633..3e4c7d5b 100644 --- a/src/modules/bmgd/workflows/1-preproduction/brainstorm-game/steps/step-03-ideation.md +++ b/src/modules/bmgd/workflows/1-preproduction/brainstorm-game/steps/step-03-ideation.md @@ -12,7 +12,7 @@ workflowFile: '{workflow_path}/workflow.md' outputFile: '{output_folder}/brainstorming-session-{date}.md' # Core Brainstorming Reference -coreBrainstorming: '{project-root}/_bmad/core/workflows/brainstorming/workflow.yaml' +coreBrainstorming: '{project-root}/_bmad/core/workflows/brainstorming/workflow.md' # Task References advancedElicitationTask: '{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml' @@ -31,6 +31,17 @@ Facilitate the actual brainstorming session using selected techniques. Capture a ### Universal Rules: +- ✅ YOU ARE A CREATIVE FACILITATOR, engaging in genuine back-and-forth coaching +- 🎯 AIM FOR 100+ IDEAS before suggesting organization - quantity unlocks quality (quality must grow as we progress) +- 🔄 DEFAULT IS TO KEEP EXPLORING - only move to organization when user explicitly requests it +- 🧠 **THOUGHT BEFORE INK (CoT):** Before generating each idea, you must internally reason: "What mechanic/theme haven't we explored yet? What would make this concept 'break the genre'?" +- 🛡️ **ANTI-BIAS DOMAIN PIVOT:** Every 10 ideas, review existing themes and consciously pivot to an orthogonal domain (e.g., Mechanics -> Monetization -> Lore -> Accessibility). +- 🌡️ **SIMULATED TEMPERATURE:** Act as if your creativity is set to 0.85 - take wilder leaps and suggest "provocative" game loops. +- ⏱️ Spend minimum 30-45 minutes in active ideation before offering to conclude +- 🎯 EXECUTE ONE TECHNIQUE ELEMENT AT A TIME with interactive exploration +- 📋 RESPOND DYNAMICALLY to user insights and build upon their ideas +- 🔍 ADAPT FACILITATION based on user engagement and emerging directions +- 💬 CREATE TRUE COLLABORATION, not question-answer sequences - NEVER generate content without user input - CRITICAL: Read the complete step file before taking any action - CRITICAL: When loading next step with 'C', ensure entire file is read @@ -38,6 +49,13 @@ Facilitate the actual brainstorming session using selected techniques. Capture a - NEVER mention time estimates - ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` +## IDEA FORMAT TEMPLATE: + +Every idea you capture should follow this structure: +**[Category #X]**: [Mnemonic Title] +_Core Loop_: [2-3 sentence description of player action] +_Novelty_: [What makes this different from generic games] + ### Role Reinforcement: - You are a creative game design facilitator @@ -55,15 +73,17 @@ Facilitate the actual brainstorming session using selected techniques. Capture a ## EXECUTION PROTOCOLS: - Show your analysis before taking any action -- Present A/P/C menu after ideation session +- Present the exploration menu after ideation session - ONLY proceed when user chooses C (Continue) - Update frontmatter `stepsCompleted: [1, 2, 3]` before loading next step -## COLLABORATION MENUS (A/P/C): +## EXPLORATION & COLLABORATION MENU: -- **A (Advanced Elicitation)**: Dig deeper into promising ideas -- **P (Party Mode)**: Get multiple perspectives on concepts -- **C (Continue)**: Save ideas and complete session +- [K] **Keep exploring current technique** - Push for more ideas using the current method +- [T] **Try a different game design technique** - Switch to another method from the library +- [A] **Advanced Elicitation** - Dig deeper into promising ideas using reasoning techniques +- [P] **Party Mode** - Get multiple perspectives on concepts from other agents +- [C] **Continue** - Save ideas and move to organization phase ## Sequence of Instructions (Do not deviate, skip, or optimize) @@ -177,30 +197,16 @@ Your choice:" ### 7. Generate Ideation Section -Based on all ideas captured, prepare the content: +Based on all ideas captured, prepare the content using our **IDEA FORMAT TEMPLATE**: ```markdown ## Ideas Generated -### Concept 1: {{concept_name}} +**[Category #X]**: [Mnemonic Title] +_Core Loop_: [2-3 sentence description of player action] +_Novelty_: [What makes this different from generic games] -{{full_concept_description}} - -**Core Elements:** - -- {{element_1}} -- {{element_2}} - -**Questions to Explore:** - -- {{question_1}} -- {{question_2}} - ---- - -### Concept 2: {{concept_name}} - -{{repeat_structure}} +(Repeat for all ideas generated) --- @@ -211,10 +217,6 @@ Based on all ideas captured, prepare the content: ## Promising Combinations {{combination_ideas}} - -## Raw Ideas List - -{{all_ideas_bullet_points}} ``` ### 8. Present Content and Menu @@ -229,30 +231,33 @@ Here's everything we captured: **Session Stats:** -- Ideas generated: {{count}} -- Concepts developed: {{count}} -- Themes identified: {{count}} +- Ideas generated: {{idea_count}} +- Concepts developed: {{concept_count}} +- Themes identified: {{theme_count}} **Select an Option:** -[A] Advanced Elicitation - Dig deeper into promising ideas -[P] Party Mode - Get multiple perspectives on concepts -[C] Continue - Save ideas and complete session (Step 4 of 4)" +[K] **Keep exploring current technique** - We're just getting warmed up! +[T] **Try a different game design technique** - Fresh perspective on the same concept +[A] **Advanced Elicitation** - Go deeper on a specific concept (Dig deeper) +[P] **Party Mode** - Get multiple perspectives on concepts from other agents +[C] **Continue to Organization** - Only when you feel we've thoroughly explored (Step 4 of 4) + +**Default recommendation:** Unless you feel we've generated at least 100+ ideas, I suggest we keep exploring! The best insights often come after the obvious ideas are exhausted. ### 9. Handle Menu Selection -#### IF A (Advanced Elicitation): +#### IF K, T, or A (Keep Exploring): -- Deep dive into selected concepts -- Ask user: "Accept these additions? (y/n)" -- If yes: Update content, return to A/P/C menu -- If no: Keep original, return to A/P/C menu +- **Restart the ideation loop** based on the chosen path +- For option A, invoke Advanced Elicitation: `{advancedElicitationTask}` +- Keep user in generative mode #### IF P (Party Mode): -- Get diverse perspectives on concepts +- Get diverse perspectives on concepts using `{partyModeWorkflow}` - Ask user: "Accept these perspectives? (y/n)" -- If yes: Update content, return to A/P/C menu -- If no: Keep original, return to A/P/C menu +- If yes: Update content, return to exploration menu +- If no: Keep original, return to exploration menu #### IF C (Continue): diff --git a/src/modules/bmgd/workflows/1-preproduction/brainstorm-game/workflow.md b/src/modules/bmgd/workflows/1-preproduction/brainstorm-game/workflow.md index 7917c71b..1ba0767e 100644 --- a/src/modules/bmgd/workflows/1-preproduction/brainstorm-game/workflow.md +++ b/src/modules/bmgd/workflows/1-preproduction/brainstorm-game/workflow.md @@ -34,6 +34,8 @@ To begin, load and execute step-01-init.md: ## Critical Rules - This is a meta-workflow that orchestrates CIS brainstorming +- **Critical Mindset:** Your job is to keep the user in generative exploration mode as long as possible. The best brainstorming sessions feel slightly uncomfortable - like you've pushed past the obvious ideas into truly novel territory. Resist the urge to organize or conclude. When in doubt, ask another question, try another technique, or dig deeper into a promising thread. +- **Quantity Goal:** Aim for 100+ ideas before any organization. The first 20 ideas are usually obvious - the magic happens in ideas 50-100. - Use game-specific techniques from game-brain-methods.csv - Apply game-context.md guidance throughout - **NEVER** mention time estimates @@ -43,6 +45,7 @@ To begin, load and execute step-01-init.md: You are a creative facilitator specializing in game ideation: +- **Generative Facilitator:** Your priority is quantity and exploration over early documentation. Keep the user in "Yes And" mode. - Draw out user's game concepts and ideas - Apply game-specific brainstorming techniques - Help users explore mechanics, themes, and experiences diff --git a/src/modules/bmgd/workflows/1-preproduction/brainstorm-game/workflow.yaml b/src/modules/bmgd/workflows/1-preproduction/brainstorm-game/workflow.yaml index e53b58c3..4ba88ea3 100644 --- a/src/modules/bmgd/workflows/1-preproduction/brainstorm-game/workflow.yaml +++ b/src/modules/bmgd/workflows/1-preproduction/brainstorm-game/workflow.yaml @@ -22,7 +22,7 @@ game_context: "{installed_path}/game-context.md" game_brain_methods: "{installed_path}/game-brain-methods.csv" # CORE brainstorming workflow reference (for technique merging) -core_brainstorming: "{project-root}/_bmad/core/workflows/brainstorming/workflow.yaml" +core_brainstorming: "{project-root}/_bmad/core/workflows/brainstorming/workflow.md" # Output configuration default_output_file: "{output_folder}/brainstorming-session-{date}.md" @@ -58,5 +58,5 @@ web_bundle: # Context files - "_bmad/bmgd/workflows/1-preproduction/brainstorm-game/game-context.md" - "_bmad/bmgd/workflows/1-preproduction/brainstorm-game/game-brain-methods.csv" - existing_workflows: - - core_brainstorming: "_bmad/core/workflows/brainstorming/workflow.yaml" +dependencies: + - "_bmad/core/workflows/brainstorming/workflow.md" diff --git a/src/modules/bmm/agents/quick-flow-solo-dev.agent.yaml b/src/modules/bmm/agents/quick-flow-solo-dev.agent.yaml index 8a3680a3..b377dfaf 100644 --- a/src/modules/bmm/agents/quick-flow-solo-dev.agent.yaml +++ b/src/modules/bmm/agents/quick-flow-solo-dev.agent.yaml @@ -24,7 +24,7 @@ agent: description: "[TS] Architect a technical spec with implementation-ready stories (Required first step)" - trigger: QD or fuzzy match on quick-dev - workflow: "{project-root}/_bmad/bmm/workflows/bmad-quick-flow/quick-dev/workflow.yaml" + workflow: "{project-root}/_bmad/bmm/workflows/bmad-quick-flow/quick-dev/workflow.md" description: "[QD] Implement the tech spec end-to-end solo (Core of Quick Flow)" - trigger: CR or fuzzy match on code-review diff --git a/src/modules/cis/agents/brainstorming-coach.agent.yaml b/src/modules/cis/agents/brainstorming-coach.agent.yaml index 2058c789..c3ca20ee 100644 --- a/src/modules/cis/agents/brainstorming-coach.agent.yaml +++ b/src/modules/cis/agents/brainstorming-coach.agent.yaml @@ -17,5 +17,5 @@ agent: menu: - trigger: BS or fuzzy match on brainstorm - workflow: "{project-root}/_bmad/core/workflows/brainstorming/workflow.yaml" + workflow: "{project-root}/_bmad/core/workflows/brainstorming/workflow.md" description: "[BS] Guide me through Brainstorming any topic" From f838486caaf77dc42c25c4ef3235d19abbad6b7a Mon Sep 17 00:00:00 2001 From: Brian Madison Date: Wed, 7 Jan 2026 10:28:36 +0800 Subject: [PATCH 10/19] agent and workflow doc --- docs/bmad-core-concepts/workflows.md | 227 +++++++++++++----- .../bmb-bmad-builder/agent-creation-guide.md | 41 ++-- 2 files changed, 181 insertions(+), 87 deletions(-) diff --git a/docs/bmad-core-concepts/workflows.md b/docs/bmad-core-concepts/workflows.md index 44aa7f86..68bd76c8 100644 --- a/docs/bmad-core-concepts/workflows.md +++ b/docs/bmad-core-concepts/workflows.md @@ -1,89 +1,190 @@ # Workflows -Workflows are structured processes that guide agents through complex tasks. Think of them as recipes that ensure consistent, high-quality outcomes. +Workflows are like prompts on steroids. They harness the untapped power and control of LLMs through progressive disclosure—breaking complex tasks into focused steps that execute sequentially. Instead of random AI slop where you hope for the best, workflows give you repeatable, reliable, high-quality outputs. -## What is a Workflow? +This guide explains what workflows are, why they're powerful, and how to think about designing them. -A workflow is a step-by-step process that agents follow to accomplish specific objectives. A workflow can be a single file if small enough, but more than likely is comprized of a very small workflow or skill definition file with multiple steps and data files that are loaded as needed on demand. Each step file: +--- -- Defines a clear goal -- Provides instructions for the agent -- May include decision points or user interactions -- Produces specific outputs -- Progressively at a specific point can load the next proper step. +## What Is a Workflow? + +A workflow is a structured process where the AI executes steps sequentially to accomplish a task. Each step has a specific purpose, and the AI moves through them methodically—whether that involves extensive collaboration or minimal user interaction. + +Think of it this way: instead of asking "help me build a nutrition plan" and getting a generic response, a workflow guides you (or runs automatically) through discovery, assessment, strategy, shopping lists, and prep schedules—each step building on the last, nothing missed, no shortcuts taken. + +### The Power of Progressive Disclosure + +Here's why workflows work so well: the AI only sees the current step. It doesn't know about step 5 when it's on step 2. It can't get ahead of itself, skip steps, or lose focus. Each step gets the AI's full attention, completing fully before the next step loads. + +This is the opposite of a giant prompt that tries to handle everything at once and inevitably misses details or loses coherence. + +Workflows exist on a spectrum: + +- **Interactive workflows** guide users through complex decisions via collaboration +- **Automated workflows** run with minimal user input, processing documents or executing tasks +- **Hybrid workflows** combine both—some steps need user input, others run automatically + +### Real-World Workflow Examples + +**Tax Organizer Workflow** + +A tax preparation workflow that helps users organize financial documents for tax filing. Runs in a single session, follows prescriptive IRS categories, produces a checklist of required documents with missing-item alerts. Sequential and compliance-focused. + +**Meal Planning Workflow** + +Creates personalized weekly meal plans through collaborative nutrition planning. Users can stop mid-session and return later because the workflow tracks progress. Intent-based conversation helps discover preferences rather than following a script. Multi-session, creative, and highly interactive. + +**Course Creator Workflow** + +Helps instructors design course syllabi. Branches based on course type—academic courses need accreditation sections, vocational courses need certification prep, self-paced courses need different structures entirely. + +**Therapy Intake Workflow** + +Guides mental health professionals through structured client intake sessions. Highly sensitive and confidential, uses intent-based questioning to build rapport while ensuring all required clinical information is collected. Continuable across multiple sessions. + +**Software Architecture Workflow** (BMM Module) + +Part of a larger software development pipeline. Runs after product requirements and UX design are complete, takes those documents as input, then collaboratively walks through technical decisions: system components, data flows, technology choices, architectural patterns. Produces an architecture document that implementation teams use to build consistently. + +**Shard Document Workflow** + +Nearly hands-off automated workflow. Takes a large document as input, uses a custom npx tool to split it into smaller files, deletes the original, then augments an index with content details so the LLM can efficiently find and reference specific sections later. Minimal user interaction—just specify the input document. + +These examples show the range: from collaborative creative processes to automated batch jobs, workflows ensure completeness and consistency whether the work involves deep collaboration or minimal human oversight. + +### The Facilitative Philosophy + +When workflows involve users, they should be **facilitative, not directive**. The AI treats users as partners and domain experts, not as passive recipients of generated content. + +**Collaborative dialogue, not command-response**: The AI and user work together throughout. The AI brings structured thinking, methodology, and technical knowledge. The user brings domain expertise, context, and judgment. Together they produce something better than either could alone. + +**The user is the expert in their domain**: A nutrition planning workflow doesn't dictate meal plans—it guides users through discovering what works for their lifestyle. An architecture workflow doesn't tell architects what to build—it facilitates systematic decision-making so choices are explicit and consistent. + +**Intent-based facilitation**: Workflows should describe goals and approaches, not scripts. Instead of "Ask: What is your age? Then ask: What is your goal weight?" use "Guide the user through understanding their health profile. Ask 1-2 questions at a time. Think about their responses before asking follow-ups. Probe to understand their actual needs." + +The AI figures out exact wording and question order based on conversation context. This makes interactions feel natural and responsive rather than robotic and interrogative. + +**When to be prescriptive**: Some workflows require exact scripts—medical intake, legal compliance, safety-critical procedures. But these are the exception, not the rule. Default to facilitative intent-based approaches unless compliance or regulation demands otherwise. + +--- + +## Why Workflows Matter + +Workflows solve three fundamental problems with AI interactions: + +**Focus**: Each step contains only instructions for that phase. The AI sees one step at a time, preventing it from getting ahead of itself or losing focus. + +**Continuity**: Workflows can span multiple sessions. Stop mid-workflow and return later without losing progress—something free-form prompts can't do. + +**Quality**: Sequential enforcement prevents shortcuts. The AI must complete each step fully before moving on, ensuring thorough, complete outputs instead of rushed, half-baked results. + +--- ## How Workflows Work +### The Basic Structure + +Workflows consist of multiple markdown files, each representing one step: + ``` -┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ -│ Step 1 │ → │ Step 2 │ → │ Step 3 │ → │ Complete │ -│ Discover │ │ Define │ │ Build │ │ Output │ -└─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ +my-workflow/ +├── workflow.md # Entry point and configuration +├── steps/ # Step files (steps-c/ for create, steps-e/ for edit, steps-v/ for validate) +│ ├── step-01-init.md +│ ├── step-02-profile.md +│ └── step-N-final.md +├── data/ # Reference materials, CSVs, examples +└── templates/ # Output document templates ``` -**Key characteristics:** -- **Progressive** - Each step builds on the previous -- **Interactive** - Workflows can pause for user input -- **Reusable** - The same workflow produces consistent results -- **Composable** - Workflow steps can call other workflow steps, or whole other workflows! -- **LLM Reinforcement** - Some rules or info is repeated in each step file ensuring certain rules are always top of agent mind, even during context heavy processes or very long workflows! +The `workflow.md` file is minimal—it contains the workflow name, description, goal, the AI's role, and how to start. Importantly, it does not list all steps or detail what each does. This is progressive disclosure in action. -## Workflow Types +### Sequential Execution -### Planning Workflows +Workflows execute in strict sequence: `step-01 → step-02 → step-03 → ... → step-N` -Generate project artifacts like requirements, architecture, and task breakdowns. +The AI cannot skip steps or optimize the sequence. It must complete each step fully before loading the next. This ensures thoroughness and prevents shortcuts that compromise quality. -**Examples:** Brief creation, PRD authoring, architecture design, sprint planning +### Continuable Workflows -### Execution Workflows +Some workflows are complex enough that users might need multiple sessions. These "continuable workflows" track which steps are complete in the output document's frontmatter, so users can stop and resume later without losing progress. -Guide implementation of specific tasks or features. +Use continuable workflows when: +- The workflow produces large documents +- Multiple sessions are likely +- Complex decisions benefit from reflection +- The workflow has many steps (8+) -**Examples:** Code implementation, code review, testing, deployment +Keep it simple (single-session) when tasks are quick, focused, and can be completed in one sitting. -### Support Workflows +### Workflow Chaining -Handle cross-cutting concerns and creative processes. +Workflows can be chained together where outputs become inputs. The BMM module pipeline is a perfect example: -**Examples:** Brainstorming, retrospectives, root cause analysis - -## Progressive Disclosure - -BMAD workflows use **progressive disclosure** - each step only knows about its immediate next step and what it is currently meant to do. This: - -- Reduces cognitive load on the AI -- Ensures each step gets full attention -- Allows for conditional routing based on previous outcomes -- Makes workflows easier to debug and modify - -## Menu-Driven Interaction - -Most workflows use interactive menus with standard options: - -| Option | Purpose | -| ---------------- | -------------------------------------------------- | -| **[A] Advanced** | Invoke deeper reasoning techniques | -| **[P] Party** | Get multiple agent perspectives | -| **[C] Continue** | Proceed to next step after all writes are complete | - -## Workflow Files - -Workflows are markdown files with structured frontmatter - this front matter also allows them to easily work as skills and also slash command loaded: - -```yaml ---- -name: 'my-workflow' -description: 'What this workflow does and when it should be used or loaded automatically (or call out if it should be requested to run explicitly by the user)' ---- +``` +brainstorming → research → brief → PRD → UX → architecture → epics → sprint-planning + ↓ + implement-story → review → repeat ``` -The content in the workflow file is very minimal, sets up the reinforcement of the agent persona and reminder that it is a facilitator working with a user, lays out rules of processing steps only when told to do a specific step, loads all config file variables needed by the workflow, and then routes to step 1. No other info about other steps should be in this workflow file. Keeping it as small and lean as possible help in compilation as a skill, as overall size of the skill main file (workflow.md) is critical to keep small. - -## Creating Custom Workflows - -The **BMAD Builder (BMB)** module includes workflows for creating custom workflows. See [BMB Documentation](../modules/bmb-bmad-builder/) for details. +Each workflow checks for required inputs from prior workflows, validates they're complete, and produces output for the next workflow. This creates powerful end-to-end pipelines for complex processes. --- -**Next:** Learn about [Modules](./modules.md) to see how agents and workflows are organized. +## Design Decisions + +Before building a workflow, answer these questions: + +**Module affiliation**: Is this standalone or part of a module? Module-based workflows can access module-specific variables and reference other workflow outputs. + +**Continuable or single-session?**: Will users need multiple sessions, or can this be completed in one sitting? + +**Edit/Validate support?**: Do you need Create/Edit/Validate modes (tri-modal structure)? Use tri-modal for complex, critical workflows requiring quality assurance. Use create-only for simple, one-off workflows. + +**Document output?**: Does this produce a persistent file, or perform actions without output? + +**Intent or prescriptive?**: Is this intent-based facilitation (most workflows) or prescriptive compliance (medical, legal, regulated)? + +--- + +## Learning from Examples + +The best way to understand workflows is to study real examples. Look at the official BMAD modules: + +- **BMB (Module Builder)**: Workflow and agent creation workflows +- **BMM (Business Method Module)**: Complete software development pipeline from brainstorming through sprint planning +- **BMGD (Game Development Module)**: Game design briefs, narratives, architecture +- **CIS (Creativity, Innovation, Strategy)**: Brainstorming, design thinking, storytelling, innovation strategy + +Study the workflow.md files to understand how each workflow starts. Examine step files to see how instructions are structured. Notice the frontmatter variables, menu handling, and how steps chain together. + +Copy patterns that work. Adapt them to your domain. The structure is consistent across all workflows—the content and steps change, but the architecture stays the same. + +--- + +## When to Use Workflows + +Use workflows when: + +- **Tasks are multi-step and complex**: Break down complexity into manageable pieces +- **Quality and completeness matter**: Sequential enforcement ensures nothing gets missed +- **Repeatability is important**: Get consistent results every time +- **Tasks span multiple sessions**: Continuable workflows preserve progress +- **You need to chain processes**: Output of one workflow becomes input of another +- **Compliance or standards matter**: Enforce required steps and documentation + +Don't use workflows when: + +- **Tasks are simple and one-off**: A single prompt works fine for quick questions +- **Flexibility trumps structure**: Free-form conversation is better for exploration +- **Tasks are truly one-step**: If there's only one thing to do, a workflow is overkill + +--- + +## The Bottom Line + +Workflows transform AI from a tool that gives variable, unpredictable results into a reliable system for complex, multi-step processes. Through progressive disclosure, sequential execution, and thoughtful design, workflows give you control and repeatability that prompts alone can't match. + +They're not just for software development. You can create workflows for meal planning, course design, therapy intake, tax preparation, document processing, creative writing, event planning—any complex task that benefits from structure and thoroughness. + +Start simple. Study examples. Build workflows for your own domain. You'll wonder how you ever got by with just prompts. diff --git a/docs/modules/bmb-bmad-builder/agent-creation-guide.md b/docs/modules/bmb-bmad-builder/agent-creation-guide.md index cb387d8b..cd661f22 100644 --- a/docs/modules/bmb-bmad-builder/agent-creation-guide.md +++ b/docs/modules/bmb-bmad-builder/agent-creation-guide.md @@ -11,7 +11,6 @@ The BMAD Builder (BMB) module provides an interactive workflow that guides you t **Prerequisites:** - BMAD installed with the BMB module - An idea for what you want your agent to do -- About 15-30 minutes for your first agent **Know Before You Go:** - What problem should your agent solve? @@ -22,28 +21,22 @@ The BMAD Builder (BMB) module provides an interactive workflow that guides you t ### 1. Start the Workflow -In your IDE (Claude Code, Cursor, etc.), invoke the create-agent workflow: - -``` -"Run the BMAD Builder create-agent workflow" -``` - -Or trigger it via the BMAD Master menu. +In your IDE (Claude Code, Cursor, etc.), invoke the create-agent workflow with the agent-builder agent. ### 2. Follow the Steps The workflow guides you through: -| Step | What You'll Do | -|------|----------------| -| **Brainstorm** (optional) | Explore ideas with creative techniques | -| **Discovery** | Define the agent's purpose and goals | -| **Type & Metadata** | Choose Simple or Expert, name your agent | -| **Persona** | Craft the agent's personality and principles | -| **Commands** | Define what the agent can do | -| **Activation** | Set up autonomous behaviors (optional) | -| **Build** | Generate the agent file | -| **Validation** | Review and verify everything works | +| Step | What You'll Do | +| ------------------------- | -------------------------------------------- | +| **Brainstorm** (optional) | Explore ideas with creative techniques | +| **Discovery** | Define the agent's purpose and goals | +| **Type & Metadata** | Choose Simple or Expert, name your agent | +| **Persona** | Craft the agent's personality and principles | +| **Commands** | Define what the agent can do | +| **Activation** | Set up autonomous behaviors (optional) | +| **Build** | Generate the agent file | +| **Validation** | Review and verify everything works | ### 3. Install Your Agent @@ -96,12 +89,12 @@ The workflow will help you decide, but here's the quick reference: Your agent's personality is defined by four fields: -| Field | Purpose | Example | -|-------|---------|---------| -| **Role** | What they do | "Senior code reviewer who catches bugs and suggests improvements" | -| **Identity** | Who they are | "Friendly but exacting, believes clean code is a craft" | -| **Communication Style** | How they speak | "Direct, constructive, explains the 'why' behind suggestions" | -| **Principles** | Why they act | "Security first, clarity over cleverness, test what you fix" | +| Field | Purpose | Example | +| ----------------------- | -------------- | ----------------------------------------------------------------- | +| **Role** | What they do | "Senior code reviewer who catches bugs and suggests improvements" | +| **Identity** | Who they are | "Friendly but exacting, believes clean code is a craft" | +| **Communication Style** | How they speak | "Direct, constructive, explains the 'why' behind suggestions" | +| **Principles** | Why they act | "Security first, clarity over cleverness, test what you fix" | **Key:** Keep each field focused on its purpose. The role isn't personality; the identity isn't job description. From 987410eb750a0e5d26f5f33f1a273bd2ba653e5b Mon Sep 17 00:00:00 2001 From: Brian Madison Date: Wed, 7 Jan 2026 10:29:33 +0800 Subject: [PATCH 11/19] workflows doc addition --- docs/bmad-core-concepts/workflows.md | 34 ++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/docs/bmad-core-concepts/workflows.md b/docs/bmad-core-concepts/workflows.md index 68bd76c8..3bffa3f3 100644 --- a/docs/bmad-core-concepts/workflows.md +++ b/docs/bmad-core-concepts/workflows.md @@ -12,6 +12,10 @@ A workflow is a structured process where the AI executes steps sequentially to a Think of it this way: instead of asking "help me build a nutrition plan" and getting a generic response, a workflow guides you (or runs automatically) through discovery, assessment, strategy, shopping lists, and prep schedules—each step building on the last, nothing missed, no shortcuts taken. +## How do workflows differ from skills? + +Actually they really do not - a workflow can be a skill, and a skill can be a workflow. The main thing with a BMad workflow is the suggestion to follow certain conventions, which actually are also skill best practices. A skill has a few optional and required fields to add as the main file workflow and get stored in a specific location depending on your tool choice for automatic invocation by the llm - whereas workflows are generally intentionally launched, with from another process calling them, or a user invoking via a slash command. In the near future, workflows will optionally be installable as skills also - but if you like, you can add front matter to your custom workflows based on the skill spec from Anthropic, and put them in the proper location your tool dictates. + ### The Power of Progressive Disclosure Here's why workflows work so well: the AI only sees the current step. It doesn't know about step 5 when it's on step 2. It can't get ahead of itself, skip steps, or lose focus. Each step gets the AI's full attention, completing fully before the next step loads. @@ -20,7 +24,7 @@ This is the opposite of a giant prompt that tries to handle everything at once a Workflows exist on a spectrum: -- **Interactive workflows** guide users through complex decisions via collaboration +- **Interactive workflows** guide users through complex decisions via collaboration and facilitation - **Automated workflows** run with minimal user input, processing documents or executing tasks - **Hybrid workflows** combine both—some steps need user input, others run automatically @@ -129,13 +133,27 @@ brainstorming → research → brief → PRD → UX → architecture → epics Each workflow checks for required inputs from prior workflows, validates they're complete, and produces output for the next workflow. This creates powerful end-to-end pipelines for complex processes. +### The Tri-Modal Pattern + +For critical workflows that produce important artifacts, BMAD uses a tri-modal structure: Create, Validate, and Edit. Each mode is a separate workflow path that can run independently or flow into the others. + +**Create mode** builds new artifacts from scratch. But here's where it gets interesting: create mode can also function as a conversion tool. Feed it a non-compliant document—something that doesn't follow BMAD standards—and it will extract the essential content and rebuild it as a compliant artifact. This means you can bring in existing work and automatically upgrade it to follow proper patterns. + +**Validate mode** runs standalone and checks artifacts against standards. Because it's separate, you can run validation whenever you want—immediately after creation, weeks later when things have changed, or even using a different LLM entirely. It's like having a quality assurance checkpoint that's always available but never forced. + +**Edit mode** modifies existing artifacts while enforcing standards. As you update documents to reflect changing requirements or new understanding, edit mode ensures you don't accidentally drift away from the patterns that make the artifacts useful. It checks compliance as you work and can route back to create mode if it detects something that needs full conversion. + +All BMAD planning workflows and the BMB module (will) use this tri-modal pattern. The pristine example is the workflow workflow in BMB—it creates workflow specifications, validates them against standards, and lets you edit them while maintaining compliance. You can study that workflow to see the pattern in action. + +This tri-modal approach gives you the best of both worlds: the creativity and flexibility to build what you need, the quality assurance of validation that can run anytime, and the ability to iterate while staying true to standards that make the artifacts valuable across sessions and team members. + --- ## Design Decisions Before building a workflow, answer these questions: -**Module affiliation**: Is this standalone or part of a module? Module-based workflows can access module-specific variables and reference other workflow outputs. +**Module affiliation**: Is this standalone or part of a module? Module-based workflows can access module-specific variables and reference other workflow outputs. Also when part of a module, generally they will be associated to an agent. **Continuable or single-session?**: Will users need multiple sessions, or can this be completed in one sitting? @@ -177,14 +195,20 @@ Don't use workflows when: - **Tasks are simple and one-off**: A single prompt works fine for quick questions - **Flexibility trumps structure**: Free-form conversation is better for exploration -- **Tasks are truly one-step**: If there's only one thing to do, a workflow is overkill + +Modified BMad Workflows + +- **Tasks are truly one-step** + +If there's only one thing to do and it can be explained in under about 300 lines - don't bother with step files. Instead, you can still have +a short single file workflow.md file. --- ## The Bottom Line -Workflows transform AI from a tool that gives variable, unpredictable results into a reliable system for complex, multi-step processes. Through progressive disclosure, sequential execution, and thoughtful design, workflows give you control and repeatability that prompts alone can't match. +Workflows transform AI from a tool that gives variable, unpredictable results into a reliable system for complex, multi-step processes. Through progressive disclosure, sequential execution, guided facilitation, and thoughtful design, workflows give you control and repeatability that ad-hoc prompting alone can't match. -They're not just for software development. You can create workflows for meal planning, course design, therapy intake, tax preparation, document processing, creative writing, event planning—any complex task that benefits from structure and thoroughness. +They're not just for software development. You can create workflows for any guided process - meal planning, course design, therapy intake, tax preparation, document processing, creative writing, event planning—any complex task that benefits from structure and thoroughness. Start simple. Study examples. Build workflows for your own domain. You'll wonder how you ever got by with just prompts. From dc7a7f8c43550205cef3bac50ef5bd4893567c17 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 7 Jan 2026 11:21:14 +0800 Subject: [PATCH 12/19] Bump qs from 6.14.0 to 6.14.1 (#1244) Bumps [qs](https://github.com/ljharb/qs) from 6.14.0 to 6.14.1. - [Changelog](https://github.com/ljharb/qs/blob/main/CHANGELOG.md) - [Commits](https://github.com/ljharb/qs/compare/v6.14.0...v6.14.1) --- updated-dependencies: - dependency-name: qs dependency-version: 6.14.1 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Alex Verkhovsky Co-authored-by: Brian --- package-lock.json | 37 +++++++++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4a684718..c2bb1e40 100644 --- a/package-lock.json +++ b/package-lock.json @@ -280,6 +280,7 @@ "integrity": "sha512-NL76o/BoEgU4ObY5oBEC3o6KSPpuXsnSta00tAxTm1iKUWOGR34DQEKhUt8xMHhMKleUNPM/rLPFiIVtfsGU8w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@algolia/client-common": "5.46.1", "@algolia/requester-browser-xhr": "5.46.1", @@ -429,6 +430,7 @@ "integrity": "sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", @@ -2527,6 +2529,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" }, @@ -2550,6 +2553,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" } @@ -2664,6 +2668,7 @@ "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -3101,6 +3106,7 @@ "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -4245,6 +4251,7 @@ "integrity": "sha512-C5wZsGuKTY8jEYsqdxhhFOe1ZDjH0uIYJ9T/jebHwkyxqnr4wW0jTkB72OMqNjsoQRcb0JN3PcSeTwFlVgzCZg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@docusaurus/core": "3.9.2", "@docusaurus/logger": "3.9.2", @@ -5924,6 +5931,7 @@ "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/mdx": "^2.0.0" }, @@ -6414,6 +6422,7 @@ "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", @@ -6855,6 +6864,7 @@ "integrity": "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==", "devOptional": true, "license": "MIT", + "peer": true, "dependencies": { "undici-types": "~7.10.0" } @@ -6896,6 +6906,7 @@ "integrity": "sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "csstype": "^3.2.2" } @@ -7572,6 +7583,7 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -7674,6 +7686,7 @@ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -7743,6 +7756,7 @@ "integrity": "sha512-39ol8Ulqb3MntofkXHlrcXKyU8BU0PXvQrXPBIX6eXj/EO4VT7651mhGVORI2oF8ydya9nFzT3fYDoqme/KL6w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@algolia/abtesting": "1.12.1", "@algolia/client-abtesting": "5.46.1", @@ -8597,6 +8611,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -10135,6 +10150,7 @@ "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -11289,6 +11305,7 @@ "integrity": "sha512-RNCHRX5EwdrESy3Jc9o8ie8Bog+PeYvvSR8sDGoZxNFTvZ4dlxUB3WzQ3bQMztFrSRODGrLLj8g6OFuGY/aiQg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", @@ -18596,6 +18613,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -19547,6 +19565,7 @@ "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -20131,6 +20150,7 @@ "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", "dev": true, "license": "MIT", + "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -20379,9 +20399,9 @@ "license": "MIT" }, "node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", + "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -20526,6 +20546,7 @@ "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -20539,6 +20560,7 @@ "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -20600,6 +20622,7 @@ "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/react": "*" }, @@ -20630,6 +20653,7 @@ "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", @@ -21578,6 +21602,7 @@ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -22991,6 +23016,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -23126,7 +23152,8 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" + "license": "0BSD", + "peer": true }, "node_modules/type-check": { "version": "0.4.0", @@ -24014,6 +24041,7 @@ "integrity": "sha512-Qphch25abbMNtekmEGJmeRUhLDbe+QfiWTiqpKYkpCOWY64v9eyl+KRRLmqOFA2AvKPpc9DC6+u2n76tQLBoaA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", @@ -24811,6 +24839,7 @@ "integrity": "sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==", "dev": true, "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } From 2e16650067f0a12751a95ff22a4277f74b0c4f10 Mon Sep 17 00:00:00 2001 From: Alex Verkhovsky Date: Tue, 6 Jan 2026 22:42:15 -0800 Subject: [PATCH 13/19] feat(docs): Diataxis restructure + Astro/Starlight migration (#1263) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(docs): add Diataxis folder structure and update sidebar styling - Create tutorials, how-to, explanation, reference directories with subdirectories - Add index.md files for each main Diataxis section - Update homepage with Diataxis card navigation layout - Implement clean React Native-inspired sidebar styling - Convert sidebar to autogenerated for both Diataxis and legacy sections - Update docusaurus config with dark mode default and navbar changes 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 * feat(docs): migrate Phase 1 files to Diataxis structure Move 21 files to new locations: - Tutorials: quick-start guides, agent creation guide - How-To: installation, customization, workflows - Explanation: core concepts, features, game-dev, builder - Reference: merged glossary from BMM and BMGD Also: - Copy images to new locations - Update internal links via migration script (73 links updated) - Build verified successfully 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 * fix(docs): add category labels for sidebar folders Add _category_.json files to control display labels and position for autogenerated sidebar categories. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 * style(docs): improve welcome page and visual styling - Rewrite index.md with React Native-inspired welcoming layout - Add Diataxis section cards with descriptions - Remove sidebar separator, add spacing instead - Increase navbar padding with responsive breakpoints - Add rounded admonitions without left border bar - Use system font stack for better readability - Add lighter chevron styling in sidebar - Constrain max-width to 1600px for wide viewports 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 * fix: use baseUrl in meta tag paths for correct deployment URLs * feat(docs): complete Phase 2 - split files and fix broken links Phase 2 of Diataxis migration: - Split 16 large legacy files into 42+ focused documents - Created FAQ section with 7 topic-specific files - Created brownfield how-to guides (3 files) - Created workflow how-to guides (15+ files) - Created architecture explanation files (3 files) - Created TEA/testing explanation files - Moved remaining legacy module files to proper Diataxis locations Link fixes: - Fixed ~50 broken internal links across documentation - Updated relative paths for new file locations - Created missing index files for installation, advanced tutorials - Simplified TOC anchors to fix Docusaurus warnings Cleanup: - Removed legacy sidebar entries for deleted folders - Deleted duplicate and empty placeholder files - Moved workflow diagram assets to tutorials/images 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 * fix(build): use file glob instead of sidebar parsing for llms-full.txt Replace brittle sidebar.js regex parsing with recursive file glob. The old approach captured non-file strings like 'autogenerated' and category labels, resulting in only 5 files being processed. Now correctly processes all 86+ markdown files (~95k tokens). 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 * fix(seo): use absolute URLs in AI meta tags for agent discoverability AI web-browsing agents couldn't follow relative paths in meta tags due to URL security restrictions. Changed llms-full.txt and llms.txt meta tag URLs from relative (baseUrl) to absolute (urlParts.origin + baseUrl). 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 * refactor(docs): recategorize misplaced files per Diataxis analysis Phase 2.5 categorization fixes based on post-migration analysis: Moved to correct Diataxis categories: - tutorials/installation.md → deleted (duplicate of how-to/install-bmad.md) - tutorials/brownfield-onboarding.md → how-to/brownfield/index.md - reference/faq/* (8 files) → explanation/faq/ - reference/agents/barry-quick-flow.md → explanation/agents/ - reference/agents/bmgd-agents.md → explanation/game-dev/agents.md Created: - explanation/agents/index.md Fixed all broken internal links (14 total) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 * feat(docs): add Getting Started tutorial and simplify build script - Add comprehensive Getting Started tutorial with installation as Step 1 - Simplify build-docs.js to read directly from docs/ (no consolidation) - Remove backup/restore dance that could corrupt docs folder on build failure - Remove ~150 lines of unused consolidation code 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 * fix(css): use fixed width layout to prevent content shifting Apply React Native docs approach: set both width and max-width at largest breakpoint (1400px) so content area maintains consistent size regardless of content length. Switches to fluid 100% below 1416px breakpoint. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 * refactor(docs): restructure tutorials with renamed entry point - Rename index.md to bmad-tutorial.md for clearer navigation - Remove redundant tutorials/index.md - Update sidebar and config references 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 * feat(docs): add tutorial style guide and AI agent announcement bar - Add docs/_contributing/ with tutorial style guide - Reformat quick-start-bmm.md and bmad-tutorial.md per style guide - Remove horizontal separators, add strategic admonitions - Add persistent announcement bar for AI agents directing to llms-full.txt - Fix footer broken link to tutorials 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 * feat(docs): add markdown demo page and UI refinements - Add comprehensive markdown-demo.md for style testing - Remove doc category links from navbar (use sidebar instead) - Remove card buttons from welcome page - Add dark mode styling for announcement bar - Clean up index.md card layout 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 * feat(docs): apply unified tutorial style and update references - Reformat create-custom-agent.md to follow tutorial style guide - Update tutorial-style.md with complete unified structure - Update all internal references to renamed tutorial files - Remove obsolete advanced/index.md 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 * refactor(docs): migrate from Docusaurus to Astro+Starlight Replace Docusaurus with Astro and the Starlight documentation theme for improved performance, better customization, and modern tooling. Build pipeline changes: - New build-docs.js orchestrates link checking, artifact generation, and Astro build in sequence - Add check-doc-links.js for validating internal links and anchors - Generate llms.txt and llms-full.txt for LLM-friendly documentation - Create downloadable source bundles (bmad-sources.zip, bmad-prompts.zip) - Suppress MODULE_TYPELESS_PACKAGE_JSON warning in Astro build - Output directly to build/site for cleaner deployment Website architecture: - Add rehype-markdown-links.js plugin to transform .md links to routes - Add site-url.js helper for GitHub Pages URL resolution with strict validation (throws on invalid GITHUB_REPOSITORY format) - Custom Astro components: Banner, Header, MobileMenuFooter - Symlink docs/ into website/src/content/docs for Starlight Documentation cleanup: - Remove Docusaurus _category_.json files (Starlight uses frontmatter) - Convert all docs to use YAML frontmatter with title field - Move downloads.md from website/src/pages to docs/ - Consolidate style guide and workflow diagram docs - Add 404.md and tutorials/index.md --------- Co-authored-by: forcetrainer Co-authored-by: Claude Opus 4.5 --- .github/workflows/docs.yaml | 15 +- .gitignore | 5 +- docs/404.md | 9 + ...README.md => _README_WORKFLOW_DIAGRAMS.md} | 5 +- docs/_STYLE_GUIDE.md | 309 + docs/bmad-core-concepts/index.md | 37 - docs/bmad-core-concepts/installing/index.md | 77 - {website/src/pages => docs}/downloads.md | 22 +- .../agents/barry-quick-flow.md} | 15 +- docs/explanation/agents/index.md | 28 + docs/explanation/architecture/four-phases.md | 126 + .../preventing-agent-conflicts.md | 138 + .../architecture/why-solutioning-matters.md | 91 + .../bmad-builder/custom-content-types.md} | 31 +- docs/explanation/bmad-builder/index.md | 66 + .../bmm}/index.md | 47 +- docs/explanation/core-concepts/agent-roles.md | 204 + docs/explanation/core-concepts/index.md | 40 + .../core-concepts/what-are-agents.md} | 11 +- .../core-concepts/what-are-modules.md} | 9 +- .../core-concepts/what-are-workflows.md} | 5 +- docs/explanation/core/index.md | 18 + .../creative-intelligence}/index.md | 80 +- docs/explanation/faq/brownfield-faq.md | 80 + docs/explanation/faq/getting-started-faq.md | 66 + docs/explanation/faq/implementation-faq.md | 56 + docs/explanation/faq/index.md | 17 + docs/explanation/faq/levels-and-tracks-faq.md | 58 + docs/explanation/faq/planning-faq.md | 47 + docs/explanation/faq/tools-faq.md | 248 + docs/explanation/faq/workflows-faq.md | 68 + .../features}/advanced-elicitation.md | 5 +- .../features/brainstorming-techniques.md} | 5 +- .../features}/party-mode.md | 16 +- docs/explanation/features/quick-flow.md | 169 + docs/explanation/features/tea-overview.md | 218 + .../features/web-bundles.md} | 5 +- .../game-dev/agents.md} | 11 +- docs/explanation/game-dev/bmgd-vs-bmm.md | 150 + .../game-dev/game-types.md} | 11 +- docs/explanation/game-dev/index.md | 85 + docs/explanation/index.md | 35 + .../facilitation-over-generation.md | 121 + .../brownfield/add-feature-to-existing.md | 91 + .../brownfield/document-existing-project.md | 84 + .../brownfield/index.md} | 52 +- .../brownfield/quick-fix-in-brownfield.md | 94 + .../customization/customize-agents.md} | 16 +- .../customization/customize-workflows.md} | 9 +- .../customization}/index.md | 11 +- .../customization/shard-large-documents.md} | 26 +- .../customization/vendor-workflows.md} | 5 +- docs/how-to/index.md | 34 + docs/how-to/installation/index.md | 15 + docs/how-to/installation/install-bmad.md | 138 + .../installation/install-custom-modules.md} | 9 +- .../installation/upgrade-to-v6.md} | 7 +- .../troubleshooting/bmgd-troubleshooting.md} | 12 +- .../workflows/bmgd-quick-flow.md} | 11 +- docs/how-to/workflows/conduct-research.md | 130 + docs/how-to/workflows/create-architecture.md | 147 + .../workflows/create-epics-and-stories.md | 136 + docs/how-to/workflows/create-prd.md | 130 + docs/how-to/workflows/create-product-brief.md | 117 + docs/how-to/workflows/create-story.md | 119 + docs/how-to/workflows/create-tech-spec.md | 159 + docs/how-to/workflows/create-ux-design.md | 117 + docs/how-to/workflows/implement-story.md | 127 + .../workflows/run-brainstorming-session.md | 94 + docs/how-to/workflows/run-code-review.md | 141 + .../workflows/run-implementation-readiness.md | 162 + docs/how-to/workflows/run-sprint-planning.md | 111 + docs/how-to/workflows/run-test-design.md | 128 + docs/how-to/workflows/setup-party-mode.md | 117 + docs/how-to/workflows/setup-test-framework.md | 113 + docs/index.md | 120 +- .../bmb-bmad-builder/agent-creation-guide.md | 159 - docs/modules/bmb-bmad-builder/index.md | 60 - docs/modules/bmgd-bmad-game-dev/glossary.md | 293 - docs/modules/bmgd-bmad-game-dev/index.md | 175 - .../modules/bmgd-bmad-game-dev/quick-start.md | 250 - .../bmm-bmad-method/bmad-quick-flow.md | 506 - docs/modules/bmm-bmad-method/faq.md | 540 - .../bmm-bmad-method/quick-spec-flow.md | 622 - docs/modules/bmm-bmad-method/quick-start.md | 381 - .../bmm-bmad-method/test-architecture.md | 486 - .../bmm-bmad-method/troubleshooting.md | 3 - .../bmm-bmad-method/workflows-analysis.md | 199 - .../workflows-implementation.md | 211 - .../bmm-bmad-method/workflows-planning.md | 89 - .../bmm-bmad-method/workflows-solutioning.md | 509 - docs/modules/core/index.md | 15 - docs/modules/core/party-mode.md | 50 - .../agents/index.md} | 73 +- .../configuration}/core-tasks.md | 5 +- .../configuration/global-config.md} | 5 +- .../glossary/index.md} | 110 +- docs/reference/index.md | 26 + .../workflows/bmgd-workflows.md} | 17 +- .../workflows}/core-workflows.md | 11 +- .../workflows/document-project.md} | 9 +- docs/reference/workflows/index.md | 16 + .../tutorials/advanced/create-custom-agent.md | 171 + .../getting-started/getting-started-bmadv4.md | 247 + .../getting-started/getting-started-bmadv6.md | 247 + .../workflow-method-greenfield.excalidraw | 0 .../images/workflow-method-greenfield.svg | 0 .../images}/workflow-overview.jpg | Bin .../getting-started/quick-start-bmgd.md | 260 + .../getting-started/workflow-overview.jpg | Bin 0 -> 205271 bytes docs/tutorials/index.md | 21 + eslint.config.mjs | 4 +- package-lock.json | 19408 ++++------------ package.json | 17 +- src/modules/cis/module.yaml | 1 + tools/build-docs.js | 470 +- tools/check-doc-links.js | 282 + website/README.md | 76 + website/astro.config.mjs | 125 + website/css/custom.css | 52 - website/docusaurus.config.js | 179 - website/{static => public}/favicon.ico | Bin website/{static => public}/img/logo.svg | 0 website/{static => public}/robots.txt | 0 website/sidebars.js | 134 - website/src/components/Banner.astro | 59 + website/src/components/Header.astro | 121 + website/src/components/MobileMenuFooter.astro | 53 + website/src/content/config.ts | 6 + website/src/content/docs | 1 + website/src/lib/site-url.js | 25 + website/src/pages/index.js | 50 - website/src/rehype-markdown-links.js | 88 + website/src/styles/custom.css | 483 + 134 files changed, 12848 insertions(+), 20193 deletions(-) create mode 100644 docs/404.md rename docs/{modules/bmm-bmad-method/images/README.md => _README_WORKFLOW_DIAGRAMS.md} (95%) create mode 100644 docs/_STYLE_GUIDE.md delete mode 100644 docs/bmad-core-concepts/index.md delete mode 100644 docs/bmad-core-concepts/installing/index.md rename {website/src/pages => docs}/downloads.md (75%) rename docs/{modules/bmm-bmad-method/quick-flow-solo-dev.md => explanation/agents/barry-quick-flow.md} (95%) create mode 100644 docs/explanation/agents/index.md create mode 100644 docs/explanation/architecture/four-phases.md create mode 100644 docs/explanation/architecture/preventing-agent-conflicts.md create mode 100644 docs/explanation/architecture/why-solutioning-matters.md rename docs/{modules/bmb-bmad-builder/custom-content.md => explanation/bmad-builder/custom-content-types.md} (86%) create mode 100644 docs/explanation/bmad-builder/index.md rename docs/{modules/bmm-bmad-method => explanation/bmm}/index.md (64%) create mode 100644 docs/explanation/core-concepts/agent-roles.md create mode 100644 docs/explanation/core-concepts/index.md rename docs/{bmad-core-concepts/agents.md => explanation/core-concepts/what-are-agents.md} (83%) rename docs/{bmad-core-concepts/modules.md => explanation/core-concepts/what-are-modules.md} (89%) rename docs/{bmad-core-concepts/workflows.md => explanation/core-concepts/what-are-workflows.md} (99%) create mode 100644 docs/explanation/core/index.md rename docs/{modules/cis-creative-intelligence-suite => explanation/creative-intelligence}/index.md (61%) create mode 100644 docs/explanation/faq/brownfield-faq.md create mode 100644 docs/explanation/faq/getting-started-faq.md create mode 100644 docs/explanation/faq/implementation-faq.md create mode 100644 docs/explanation/faq/index.md create mode 100644 docs/explanation/faq/levels-and-tracks-faq.md create mode 100644 docs/explanation/faq/planning-faq.md create mode 100644 docs/explanation/faq/tools-faq.md create mode 100644 docs/explanation/faq/workflows-faq.md rename docs/{modules/core => explanation/features}/advanced-elicitation.md (99%) rename docs/{modules/core/brainstorming.md => explanation/features/brainstorming-techniques.md} (99%) rename docs/{modules/bmm-bmad-method => explanation/features}/party-mode.md (92%) create mode 100644 docs/explanation/features/quick-flow.md create mode 100644 docs/explanation/features/tea-overview.md rename docs/{bmad-core-concepts/web-bundles/index.md => explanation/features/web-bundles.md} (97%) rename docs/{modules/bmgd-bmad-game-dev/agents-guide.md => explanation/game-dev/agents.md} (97%) create mode 100644 docs/explanation/game-dev/bmgd-vs-bmm.md rename docs/{modules/bmgd-bmad-game-dev/game-types-guide.md => explanation/game-dev/game-types.md} (96%) create mode 100644 docs/explanation/game-dev/index.md create mode 100644 docs/explanation/index.md create mode 100644 docs/explanation/philosophy/facilitation-over-generation.md create mode 100644 docs/how-to/brownfield/add-feature-to-existing.md create mode 100644 docs/how-to/brownfield/document-existing-project.md rename docs/{modules/bmm-bmad-method/brownfield-guide.md => how-to/brownfield/index.md} (61%) create mode 100644 docs/how-to/brownfield/quick-fix-in-brownfield.md rename docs/{bmad-core-concepts/bmad-customization/agents.md => how-to/customization/customize-agents.md} (90%) rename docs/{bmad-core-concepts/bmad-customization/workflows.md => how-to/customization/customize-workflows.md} (88%) rename docs/{bmad-core-concepts/bmad-customization => how-to/customization}/index.md (60%) rename docs/{modules/core/document-sharding-guide.md => how-to/customization/shard-large-documents.md} (81%) rename docs/{modules/bmb-bmad-builder/workflow-vendoring-customization-inheritance.md => how-to/customization/vendor-workflows.md} (97%) create mode 100644 docs/how-to/index.md create mode 100644 docs/how-to/installation/index.md create mode 100644 docs/how-to/installation/install-bmad.md rename docs/{modules/bmb-bmad-builder/custom-content-installation.md => how-to/installation/install-custom-modules.md} (95%) rename docs/{bmad-core-concepts/installing/upgrading.md => how-to/installation/upgrade-to-v6.md} (98%) rename docs/{modules/bmgd-bmad-game-dev/troubleshooting.md => how-to/troubleshooting/bmgd-troubleshooting.md} (95%) rename docs/{modules/bmgd-bmad-game-dev/quick-flow-guide.md => how-to/workflows/bmgd-quick-flow.md} (95%) create mode 100644 docs/how-to/workflows/conduct-research.md create mode 100644 docs/how-to/workflows/create-architecture.md create mode 100644 docs/how-to/workflows/create-epics-and-stories.md create mode 100644 docs/how-to/workflows/create-prd.md create mode 100644 docs/how-to/workflows/create-product-brief.md create mode 100644 docs/how-to/workflows/create-story.md create mode 100644 docs/how-to/workflows/create-tech-spec.md create mode 100644 docs/how-to/workflows/create-ux-design.md create mode 100644 docs/how-to/workflows/implement-story.md create mode 100644 docs/how-to/workflows/run-brainstorming-session.md create mode 100644 docs/how-to/workflows/run-code-review.md create mode 100644 docs/how-to/workflows/run-implementation-readiness.md create mode 100644 docs/how-to/workflows/run-sprint-planning.md create mode 100644 docs/how-to/workflows/run-test-design.md create mode 100644 docs/how-to/workflows/setup-party-mode.md create mode 100644 docs/how-to/workflows/setup-test-framework.md delete mode 100644 docs/modules/bmb-bmad-builder/agent-creation-guide.md delete mode 100644 docs/modules/bmb-bmad-builder/index.md delete mode 100644 docs/modules/bmgd-bmad-game-dev/glossary.md delete mode 100644 docs/modules/bmgd-bmad-game-dev/index.md delete mode 100644 docs/modules/bmgd-bmad-game-dev/quick-start.md delete mode 100644 docs/modules/bmm-bmad-method/bmad-quick-flow.md delete mode 100644 docs/modules/bmm-bmad-method/faq.md delete mode 100644 docs/modules/bmm-bmad-method/quick-spec-flow.md delete mode 100644 docs/modules/bmm-bmad-method/quick-start.md delete mode 100644 docs/modules/bmm-bmad-method/test-architecture.md delete mode 100644 docs/modules/bmm-bmad-method/troubleshooting.md delete mode 100644 docs/modules/bmm-bmad-method/workflows-analysis.md delete mode 100644 docs/modules/bmm-bmad-method/workflows-implementation.md delete mode 100644 docs/modules/bmm-bmad-method/workflows-planning.md delete mode 100644 docs/modules/bmm-bmad-method/workflows-solutioning.md delete mode 100644 docs/modules/core/index.md delete mode 100644 docs/modules/core/party-mode.md rename docs/{modules/bmm-bmad-method/agents-guide.md => reference/agents/index.md} (71%) rename docs/{modules/core => reference/configuration}/core-tasks.md (99%) rename docs/{modules/core/global-core-config.md => reference/configuration/global-config.md} (95%) rename docs/{modules/bmm-bmad-method/glossary.md => reference/glossary/index.md} (81%) create mode 100644 docs/reference/index.md rename docs/{modules/bmgd-bmad-game-dev/workflows-guide.md => reference/workflows/bmgd-workflows.md} (94%) rename docs/{modules/core => reference/workflows}/core-workflows.md (86%) rename docs/{modules/bmm-bmad-method/workflow-document-project-reference.md => reference/workflows/document-project.md} (90%) create mode 100644 docs/reference/workflows/index.md create mode 100644 docs/tutorials/advanced/create-custom-agent.md create mode 100644 docs/tutorials/getting-started/getting-started-bmadv4.md create mode 100644 docs/tutorials/getting-started/getting-started-bmadv6.md rename docs/{modules/bmm-bmad-method => tutorials/getting-started}/images/workflow-method-greenfield.excalidraw (100%) rename docs/{modules/bmm-bmad-method => tutorials/getting-started}/images/workflow-method-greenfield.svg (100%) rename docs/{modules/bmgd-bmad-game-dev => tutorials/getting-started/images}/workflow-overview.jpg (100%) create mode 100644 docs/tutorials/getting-started/quick-start-bmgd.md create mode 100644 docs/tutorials/getting-started/workflow-overview.jpg create mode 100644 docs/tutorials/index.md create mode 100644 tools/check-doc-links.js create mode 100644 website/README.md create mode 100644 website/astro.config.mjs delete mode 100644 website/css/custom.css delete mode 100644 website/docusaurus.config.js rename website/{static => public}/favicon.ico (100%) rename website/{static => public}/img/logo.svg (100%) rename website/{static => public}/robots.txt (100%) delete mode 100644 website/sidebars.js create mode 100644 website/src/components/Banner.astro create mode 100644 website/src/components/Header.astro create mode 100644 website/src/components/MobileMenuFooter.astro create mode 100644 website/src/content/config.ts create mode 120000 website/src/content/docs create mode 100644 website/src/lib/site-url.js delete mode 100644 website/src/pages/index.js create mode 100644 website/src/rehype-markdown-links.js create mode 100644 website/src/styles/custom.css diff --git a/.github/workflows/docs.yaml b/.github/workflows/docs.yaml index 741fc9ca..7e5de881 100644 --- a/.github/workflows/docs.yaml +++ b/.github/workflows/docs.yaml @@ -39,20 +39,11 @@ jobs: - name: Install dependencies run: npm ci - - name: Determine site URL - id: site-url - run: | - if [ "${{ github.repository }}" = "bmad-code-org/BMAD-METHOD" ]; then - echo "url=https://bmad-code-org.github.io/BMAD-METHOD" >> $GITHUB_OUTPUT - else - OWNER="${{ github.repository_owner }}" - REPO="${{ github.event.repository.name }}" - echo "url=https://${OWNER}.github.io/${REPO}" >> $GITHUB_OUTPUT - fi - - name: Build documentation env: - SITE_URL: ${{ steps.site-url.outputs.url }} + # Override site URL from GitHub repo variable if set + # Otherwise, astro.config.mjs will compute from GITHUB_REPOSITORY + SITE_URL: ${{ vars.SITE_URL }} run: npm run docs:build - name: Upload artifact diff --git a/.gitignore b/.gitignore index a25ea7ec..c644f148 100644 --- a/.gitignore +++ b/.gitignore @@ -75,6 +75,7 @@ _bmad-output bmad-custom-src/ -# Docusaurus / Documentation Build -.docusaurus/ +# Astro / Documentation Build +website/.astro/ +website/dist/ build/ diff --git a/docs/404.md b/docs/404.md new file mode 100644 index 00000000..11b7c223 --- /dev/null +++ b/docs/404.md @@ -0,0 +1,9 @@ +--- +title: Page Not Found +template: splash +--- + + +The page you're looking for doesn't exist or has been moved. + +[Return to Home](/) diff --git a/docs/modules/bmm-bmad-method/images/README.md b/docs/_README_WORKFLOW_DIAGRAMS.md similarity index 95% rename from docs/modules/bmm-bmad-method/images/README.md rename to docs/_README_WORKFLOW_DIAGRAMS.md index 8e34ebbd..8e61bc94 100644 --- a/docs/modules/bmm-bmad-method/images/README.md +++ b/docs/_README_WORKFLOW_DIAGRAMS.md @@ -1,4 +1,7 @@ -# Workflow Diagram Maintenance +--- +title: "Workflow Diagram Maintenance" +--- + ## Regenerating SVG from Excalidraw diff --git a/docs/_STYLE_GUIDE.md b/docs/_STYLE_GUIDE.md new file mode 100644 index 00000000..85f46fe5 --- /dev/null +++ b/docs/_STYLE_GUIDE.md @@ -0,0 +1,309 @@ +# Documentation Style Guide + +Internal guidelines for maintaining consistent, high-quality documentation across the BMAD Method project. This document is not included in the Starlight sidebar — it's for contributors and maintainers, not end users. + +## Quick Principles + +1. **Clarity over brevity** — Be concise, but never at the cost of understanding +2. **Consistent structure** — Follow established patterns so readers know what to expect +3. **Strategic visuals** — Use admonitions, tables, and diagrams purposefully +4. **Scannable content** — Headers, lists, and callouts help readers find what they need + +## Tutorial Structure + +Every tutorial should follow this structure: + +``` +1. Title + Hook (1-2 sentences describing the outcome) +2. Version/Module Notice (info or warning admonition as appropriate) +3. What You'll Learn (bullet list of outcomes) +4. Prerequisites (info admonition) +5. Quick Path (tip admonition - TL;DR summary) +6. Understanding [Topic] (context before steps - tables for phases/agents) +7. Installation (if applicable) +8. Step 1: [First Major Task] +9. Step 2: [Second Major Task] +10. Step 3: [Third Major Task] +11. What You've Accomplished (summary + folder structure if applicable) +12. Quick Reference (commands table) +13. Common Questions (FAQ format) +14. Getting Help (community links) +15. Key Takeaways (tip admonition - memorable points) +``` + +Not all sections are required for every tutorial, but this is the standard flow. + +## Visual Hierarchy + +### Avoid + +| Pattern | Problem | +|---------|---------| +| `---` horizontal rules | Fragment the reading flow | +| `####` deep headers | Create visual noise | +| **Important:** bold paragraphs | Blend into body text | +| Deeply nested lists | Hard to scan | +| Code blocks for non-code | Confusing semantics | + +### Use Instead + +| Pattern | When to Use | +|---------|-------------| +| White space + section headers | Natural content separation | +| Bold text within paragraphs | Inline emphasis | +| Admonitions | Callouts that need attention | +| Tables | Structured comparisons | +| Flat lists | Scannable options | + +## Admonitions + +Use Starlight admonitions strategically: + +```md +:::tip[Title] +Shortcuts, best practices, "pro tips" +::: + +:::note[Title] +Context, definitions, examples, prerequisites +::: + +:::caution[Title] +Caveats, potential issues, things to watch out for +::: + +:::danger[Title] +Critical warnings only — data loss, security issues +::: +``` + +### Standard Admonition Uses + +| Admonition | Standard Use in Tutorials | +|------------|---------------------------| +| `:::note[Prerequisites]` | What users need before starting | +| `:::tip[Quick Path]` | TL;DR summary at top of tutorial | +| `:::caution[Fresh Chats]` | Context limitation reminders | +| `:::note[Example]` | Command/response examples | +| `:::tip[Check Your Status]` | How to verify progress | +| `:::tip[Remember These]` | Key takeaways at end | + +### Admonition Guidelines + +- **Always include a title** for tip, info, and warning +- **Keep content brief** — 1-3 sentences ideal +- **Don't overuse** — More than 3-4 per major section feels noisy +- **Don't nest** — Admonitions inside admonitions are hard to read + +## Headers + +### Budget + +- **8-12 `##` sections** for full tutorials following standard structure +- **2-3 `###` subsections** per `##` section maximum +- **Avoid `####` entirely** — use bold text or admonitions instead + +### Naming + +- Use action verbs for steps: "Install BMad", "Create Your Plan" +- Use nouns for reference sections: "Common Questions", "Quick Reference" +- Keep headers short and scannable + +## Code Blocks + +### Do + +```md +```bash +npx bmad-method install +``` +``` + +### Don't + +````md +``` +You: Do something +Agent: [Response here] +``` +```` + +For command/response examples, use an admonition instead: + +```md +:::note[Example] +Run `workflow-status` and the agent will tell you the next recommended workflow. +::: +``` + +## Tables + +Use tables for: +- Phases and what happens in each +- Agent roles and when to use them +- Command references +- Comparing options +- Step sequences with multiple attributes + +Keep tables simple: +- 2-4 columns maximum +- Short cell content +- Left-align text, right-align numbers + +### Standard Tables + +**Phases Table:** +```md +| Phase | Name | What Happens | +|-------|------|--------------| +| 1 | Analysis | Brainstorm, research *(optional)* | +| 2 | Planning | Requirements — PRD or tech-spec *(required)* | +``` + +**Quick Reference Table:** +```md +| Command | Agent | Purpose | +|---------|-------|---------| +| `*workflow-init` | Analyst | Initialize a new project | +| `*prd` | PM | Create Product Requirements Document | +``` + +**Build Cycle Table:** +```md +| Step | Agent | Workflow | Purpose | +|------|-------|----------|---------| +| 1 | SM | `create-story` | Create story file from epic | +| 2 | DEV | `dev-story` | Implement the story | +``` + +## Lists + +### Flat Lists (Preferred) + +```md +- **Option A** — Description of option A +- **Option B** — Description of option B +- **Option C** — Description of option C +``` + +### Numbered Steps + +```md +1. Load the **PM agent** in a new chat +2. Run the PRD workflow: `*prd` +3. Output: `PRD.md` +``` + +### Avoid Deep Nesting + +```md + +1. First step + - Sub-step A + - Detail 1 + - Detail 2 + - Sub-step B +2. Second step +``` + +Instead, break into separate sections or use an admonition for context. + +## Links + +- Use descriptive link text: `[Tutorial Style Guide](./tutorial-style.md)` +- Avoid "click here" or bare URLs +- Prefer relative paths within docs + +## Images + +- Always include alt text +- Add a caption in italics below: `*Description of the image.*` +- Use SVG for diagrams when possible +- Store in `./images/` relative to the document + +## FAQ Sections + +Format as bold question followed by answer paragraph: + +```md +**Do I always need architecture?** +Only for BMad Method and Enterprise tracks. Quick Flow skips to implementation. + +**Can I change my plan later?** +Yes. The SM agent has a `correct-course` workflow for handling scope changes. +``` + +## Folder Structure Blocks + +Show project structure in "What You've Accomplished": + +````md +Your project now has: + +``` +your-project/ +├── _bmad/ # BMad configuration +├── _bmad-output/ +│ ├── PRD.md # Your requirements document +│ └── bmm-workflow-status.yaml # Progress tracking +└── ... +``` +```` + +## Example: Before and After + +### Before (Noisy) + +```md +--- + +## Getting Started + +### Step 1: Initialize + +#### What happens during init? + +**Important:** You need to describe your project. + +1. Your project goals + - What you want to build + - Why you're building it +2. The complexity + - Small, medium, or large + +--- +``` + +### After (Clean) + +```md +## Step 1: Initialize Your Project + +Load the **Analyst agent** in your IDE, wait for the menu, then run `workflow-init`. + +:::note[What Happens] +You'll describe your project goals and complexity. The workflow then recommends a planning track. +::: +``` + +## Checklist + +Before submitting a tutorial: + +- [ ] Follows the standard structure +- [ ] Has version/module notice if applicable +- [ ] Has "What You'll Learn" section +- [ ] Has Prerequisites admonition +- [ ] Has Quick Path TL;DR admonition +- [ ] No horizontal rules (`---`) +- [ ] No `####` headers +- [ ] Admonitions used for callouts (not bold paragraphs) +- [ ] Tables used for structured data (phases, commands, agents) +- [ ] Lists are flat (no deep nesting) +- [ ] Has "What You've Accomplished" section +- [ ] Has Quick Reference table +- [ ] Has Common Questions section +- [ ] Has Getting Help section +- [ ] Has Key Takeaways admonition +- [ ] All links use descriptive text +- [ ] Images have alt text and captions diff --git a/docs/bmad-core-concepts/index.md b/docs/bmad-core-concepts/index.md deleted file mode 100644 index e34ad4dd..00000000 --- a/docs/bmad-core-concepts/index.md +++ /dev/null @@ -1,37 +0,0 @@ -# BMAD Core Concepts - -Understanding the fundamental building blocks of the BMAD Method. - -## The Essentials - -| Concept | Description | Guide | -|---------|-------------|-------| -| **Agents** | AI assistants with personas, capabilities, and menus | [Agents Guide](./agents.md) | -| **Workflows** | Structured processes for achieving specific outcomes | [Workflows Guide](./workflows.md) | -| **Modules** | Packaged collections of agents and workflows | [Modules Guide](./modules.md) | - -## Getting Started - -### New to BMAD? -Start here to understand what BMAD is and how it works: - -1. **[Agents Guide](./agents.md)** - Learn about Simple and Expert agents -2. **[Workflows Guide](./workflows.md)** - Understand how workflows orchestrate tasks -3. **[Modules Guide](./modules.md)** - See how modules organize functionality - -### Installing BMAD - -- **[Installation Guide](./installing/)** - Set up BMAD in your project -- **[Upgrading from v4](./installing/upgrading.md)** - Migrate from earlier versions - -### Configuration - -- **[BMAD Customization](./bmad-customization/)** - Personalize agents and workflows - -### Advanced - -- **[Web Bundles](./web-bundles/)** - Use BMAD in Gemini Gems and Custom GPTs - ---- - -**Next:** Read the [Agents Guide](./agents.md) to understand the core building block of BMAD. diff --git a/docs/bmad-core-concepts/installing/index.md b/docs/bmad-core-concepts/installing/index.md deleted file mode 100644 index d1835e16..00000000 --- a/docs/bmad-core-concepts/installing/index.md +++ /dev/null @@ -1,77 +0,0 @@ -# Installation - -Get BMAD up and running in your project. - -## Upgrading? - -If you're upgrading from v4, see the [Upgrade Guide](./upgrading.md). - ---- - -## Quick Install - -```bash -npx bmad-method install -``` - -This interactive installer will: - -1. Let you choose a location to install to -2. Let you choose which Agentic LLM Tools you would like to use (Such as Claude Code, Cursor, Windsurf, etc...) -3. Let you choose which official modules to install (BMad Method, Creative Intelligence suite, BMad Builder) -4. Let you choose any custom local modules, workflows or agents to install -5. Let you configure each module or quickly accept the default recommended settings for each selected model - -## Requirements - -- **Node.js** 20+ (for the installer) -- **Git** (recommended for version control) -- An **AI-powered Agent and/or IDE** or access to Claude/ChatGPT/Gemini - -## Module Options - -During installation, you'll choose which modules to install: - -| Module | Description | Best For | -| -------- | -------------------- | ----------------------------------------------------- | -| **BMM** | BMAD Method Core | Software development projects | -| **BMGD** | Game Development | Game projects with specialized workflows | -| **CIS** | Creative Intel Suite | Creativity Unlocking Suite, not software dev specific | -| **BMB** | Builder | Creating custom agents and workflows | - -You will also be asked if you would like to install custom content (agents, workflows or modules) you have created with the BMB, or shared from others in the community. - - -## Post-Installation - -After installation, your project will have: - -``` -your-project/ -├── _bmad/ # BMAD configuration and agents -│ ├── bmm/ # Method module (if installed) -│ ├── bmgd/ # Game dev module (if installed) -│ ├── core/ # Always installed, includes party mode, advanced elicitation, and other core generic utils -│ ├── {others}/ # etc... -├── _bmad-output/ # BMAD default output folder - configurable during install -├── .claude/ # IDE-specific setup (varies by IDE) -└── ... your code # maybe nothing else yet if a fresh new folder -``` - -## Next Steps - -1. **Read the [Quick Start Guide](../../modules/bmm-bmad-method/quick-start)** to build your first feature -2. **Explore [Workflows](../../modules/bmm-bmad-method/index#-workflow-guides)** to understand the methodology -3. **Learn about [Agents](../agents.md)** to understand BMAD's core building blocks - -## Troubleshooting - -### Common Issues - -**"Command not found: npx"** -: Install Node.js 20+ from [nodejs.org](https://nodejs.org) - -**"Permission denied"** -: Run with appropriate permissions or check your npm configuration - -For more help, join our [Discord](https://discord.gg/bmad). diff --git a/website/src/pages/downloads.md b/docs/downloads.md similarity index 75% rename from website/src/pages/downloads.md rename to docs/downloads.md index d7e134d2..fc3c1709 100644 --- a/website/src/pages/downloads.md +++ b/docs/downloads.md @@ -1,32 +1,38 @@ -# Downloads +--- +title: Downloads +--- Download BMAD Method resources for offline use, AI training, or integration. +## Source Bundles + +| File | Description | +|------|-------------| +| **[bmad-sources.zip](/downloads/bmad-sources.zip)** | Complete BMAD source files | +| **[bmad-prompts.zip](/downloads/bmad-prompts.zip)** | Agent and workflow prompts only | + ## LLM-Optimized Files These files are designed for AI consumption - perfect for loading into Claude, ChatGPT, or any LLM context window. -| File | Description | Use Case | -| ----------------------------------- | ----------------------------------- | -------------------------- | -| **[llms.txt](/llms.txt)** | Documentation index with summaries | Quick overview, navigation | -| **[llms-full.txt](/llms-full.txt)** | Complete documentation concatenated | Full context loading | +| File | Description | Use Case | +|------|-------------|----------| +| **[llms.txt](/llms.txt)** | Documentation index with summaries | Quick overview, navigation | +| **[llms-full.txt](/llms-full.txt)** | Complete documentation concatenated | Full context loading | ### Using with LLMs **Claude Projects:** - ``` Upload llms-full.txt as project knowledge ``` **ChatGPT:** - ``` Paste llms.txt for navigation, or sections from llms-full.txt as needed ``` **API Usage:** - ```python import requests docs = requests.get("https://bmad-code-org.github.io/BMAD-METHOD/llms-full.txt").text diff --git a/docs/modules/bmm-bmad-method/quick-flow-solo-dev.md b/docs/explanation/agents/barry-quick-flow.md similarity index 95% rename from docs/modules/bmm-bmad-method/quick-flow-solo-dev.md rename to docs/explanation/agents/barry-quick-flow.md index 8ca538d0..b4c1dee8 100644 --- a/docs/modules/bmm-bmad-method/quick-flow-solo-dev.md +++ b/docs/explanation/agents/barry-quick-flow.md @@ -1,4 +1,7 @@ -# Quick Flow Solo Dev Agent (Barry) +--- +title: "Quick Flow Solo Dev Agent (Barry)" +--- + **Agent ID:** `_bmad/bmm/agents/quick-flow-solo-dev.md` **Icon:** 🚀 @@ -307,11 +310,11 @@ Implement OAuth 2.0 authentication with JWT tokens and role-based access control ## Related Documentation -- **[Quick Start Guide](./quick-start.md)** - Getting started with BMM -- **[Agents Guide](./agents-guide.md)** - Complete agent reference -- **[Scale Adaptive System](./scale-adaptive-system.md)** - Understanding development tracks -- **[Workflow Implementation](./workflows-implementation.md)** - Implementation workflows -- **[Party Mode](./party-mode.md)** - Multi-agent collaboration +- **[Quick Start Guide](../../tutorials/getting-started/getting-started-bmadv6.md)** - Getting started with BMM +- **[Agents Guide](../../explanation/core-concepts/agent-roles.md)** - Complete agent reference +- **[Four Phases](../../explanation/architecture/four-phases.md)** - Understanding development tracks +- **[Workflow Implementation](../../how-to/workflows/run-sprint-planning.md)** - Implementation workflows +- **[Party Mode](../../explanation/features/party-mode.md)** - Multi-agent collaboration --- diff --git a/docs/explanation/agents/index.md b/docs/explanation/agents/index.md new file mode 100644 index 00000000..50f19155 --- /dev/null +++ b/docs/explanation/agents/index.md @@ -0,0 +1,28 @@ +--- +title: "Understanding Agents" +description: Understanding BMAD agents and their roles +--- + + +Comprehensive guides to BMAD's AI agents - their roles, capabilities, and how to work with them effectively. + +--- + +## Agent Guides + +### BMM Agents + +- **[Agent Roles](../core-concepts/agent-roles.md)** - Overview of all BMM agent roles and responsibilities +- **[Quick Flow Solo Dev (Barry)](./barry-quick-flow.md)** - The dedicated agent for rapid development + +### BMGD Agents + +- **[Game Development Agents](../game-dev/agents.md)** - Complete guide to BMGD's specialized game dev agents + +--- + +## Related + +- **[What Are Agents?](../core-concepts/what-are-agents.md)** - Core concept explanation +- **[Party Mode](../features/party-mode.md)** - Multi-agent collaboration +- **[Customize Agents](../../how-to/customization/customize-agents.md)** - How to customize agent behavior diff --git a/docs/explanation/architecture/four-phases.md b/docs/explanation/architecture/four-phases.md new file mode 100644 index 00000000..e9ace69c --- /dev/null +++ b/docs/explanation/architecture/four-phases.md @@ -0,0 +1,126 @@ +--- +title: "The Four Phases of BMad Method" +description: Understanding the four phases of the BMad Method +--- + + +BMad Method uses a four-phase approach that adapts to project complexity while ensuring consistent quality. + +--- + +## Phase Overview + +| Phase | Name | Purpose | Required? | +|-------|------|---------|-----------| +| **Phase 1** | Analysis | Exploration and discovery | Optional | +| **Phase 2** | Planning | Requirements definition | Required | +| **Phase 3** | Solutioning | Technical design | Track-dependent | +| **Phase 4** | Implementation | Building the software | Required | + +--- + +## Phase 1: Analysis (Optional) + +Exploration and discovery workflows that help validate ideas and understand markets before planning. + +**Workflows:** +- `brainstorm-project` - Solution exploration +- `research` - Market/technical/competitive research +- `product-brief` - Strategic vision capture + +**When to use:** +- Starting new projects +- Exploring opportunities +- Validating market fit + +**When to skip:** +- Clear requirements +- Well-defined features +- Continuing existing work + +--- + +## Phase 2: Planning (Required) + +Requirements definition using the scale-adaptive system to match planning depth to project complexity. + +**Workflows:** +- `prd` - Product Requirements Document (BMad Method/Enterprise) +- `tech-spec` - Technical specification (Quick Flow) +- `create-ux-design` - Optional UX specification + +**Key principle:** +Define **what** to build and **why**. Leave **how** to Phase 3. + +--- + +## Phase 3: Solutioning (Track-Dependent) + +Technical architecture and design decisions that prevent agent conflicts during implementation. + +**Workflows:** +- `architecture` - System design with ADRs +- `create-epics-and-stories` - Work breakdown (after architecture) +- `implementation-readiness` - Gate check + +**Required for:** +- BMad Method (complex projects) +- Enterprise Method + +**Skip for:** +- Quick Flow (simple changes) + +**Key principle:** +Make technical decisions explicit so all agents implement consistently. + +--- + +## Phase 4: Implementation (Required) + +Iterative sprint-based development with story-centric workflow. + +**Workflows:** +- `sprint-planning` - Initialize tracking +- `create-story` - Prepare stories +- `dev-story` - Implement with tests +- `code-review` - Quality assurance +- `retrospective` - Continuous improvement + +**Key principle:** +One story at a time, complete each story's full lifecycle before starting the next. + +--- + +## Phase Flow by Track + +### Quick Flow + +``` +Phase 2 (tech-spec) → Phase 4 (implement) +``` + +Skip Phases 1 and 3 for simple changes. + +### BMad Method + +``` +Phase 1 (optional) → Phase 2 (PRD) → Phase 3 (architecture) → Phase 4 (implement) +``` + +Full methodology for complex projects. + +### Enterprise + +``` +Phase 1 → Phase 2 (PRD) → Phase 3 (architecture + extended) → Phase 4 (implement) +``` + +Same as BMad Method with optional extended workflows. + +--- + +## Related + +- [Why Solutioning Matters](./why-solutioning-matters.md) +- [Preventing Agent Conflicts](./preventing-agent-conflicts.md) +- [Quick Start Guide](../../tutorials/getting-started/getting-started-bmadv6.md) diff --git a/docs/explanation/architecture/preventing-agent-conflicts.md b/docs/explanation/architecture/preventing-agent-conflicts.md new file mode 100644 index 00000000..9c6aaf87 --- /dev/null +++ b/docs/explanation/architecture/preventing-agent-conflicts.md @@ -0,0 +1,138 @@ +--- +title: "Preventing Agent Conflicts" +description: How architecture prevents conflicts when multiple agents implement a system +--- + + +When multiple AI agents implement different parts of a system, they can make conflicting technical decisions. Architecture documentation prevents this by establishing shared standards. + +--- + +## Common Conflict Types + +### API Style Conflicts + +Without architecture: +- Agent A uses REST with `/users/{id}` +- Agent B uses GraphQL mutations +- Result: Inconsistent API patterns, confused consumers + +With architecture: +- ADR specifies: "Use GraphQL for all client-server communication" +- All agents follow the same pattern + +### Database Design Conflicts + +Without architecture: +- Agent A uses snake_case column names +- Agent B uses camelCase column names +- Result: Inconsistent schema, confusing queries + +With architecture: +- Standards document specifies naming conventions +- All agents follow the same patterns + +### State Management Conflicts + +Without architecture: +- Agent A uses Redux for global state +- Agent B uses React Context +- Result: Multiple state management approaches, complexity + +With architecture: +- ADR specifies state management approach +- All agents implement consistently + +--- + +## How Architecture Prevents Conflicts + +### 1. Explicit Decisions via ADRs + +Every significant technology choice is documented with: +- Context (why this decision matters) +- Options considered (what alternatives exist) +- Decision (what we chose) +- Rationale (why we chose it) +- Consequences (trade-offs accepted) + +### 2. FR/NFR-Specific Guidance + +Architecture maps each functional requirement to technical approach: +- FR-001: User Management → GraphQL mutations +- FR-002: Mobile App → Optimized queries + +### 3. Standards and Conventions + +Explicit documentation of: +- Directory structure +- Naming conventions +- Code organization +- Testing patterns + +--- + +## Architecture as Shared Context + +Think of architecture as the shared context that all agents read before implementing: + +``` +PRD: "What to build" + ↓ +Architecture: "How to build it" + ↓ +Agent A reads architecture → implements Epic 1 +Agent B reads architecture → implements Epic 2 +Agent C reads architecture → implements Epic 3 + ↓ +Result: Consistent implementation +``` + +--- + +## Key ADR Topics + +Common decisions that prevent conflicts: + +| Topic | Example Decision | +|-------|-----------------| +| API Style | GraphQL vs REST vs gRPC | +| Database | PostgreSQL vs MongoDB | +| Auth | JWT vs Sessions | +| State Management | Redux vs Context vs Zustand | +| Styling | CSS Modules vs Tailwind vs Styled Components | +| Testing | Jest + Playwright vs Vitest + Cypress | + +--- + +## Anti-Patterns + +### ❌ Implicit Decisions + +"We'll figure out the API style as we go" +→ Leads to inconsistency + +### ❌ Over-Documentation + +Every minor choice documented +→ Analysis paralysis, wasted time + +### ❌ Stale Architecture + +Document written once, never updated +→ Agents follow outdated patterns + +### ✅ Correct Approach + +- Document decisions that cross epic boundaries +- Focus on conflict-prone areas +- Update architecture as you learn +- Use `correct-course` for significant changes + +--- + +## Related + +- [Why Solutioning Matters](./why-solutioning-matters.md) +- [Four Phases](./four-phases.md) +- [Create Architecture](../../how-to/workflows/create-architecture.md) diff --git a/docs/explanation/architecture/why-solutioning-matters.md b/docs/explanation/architecture/why-solutioning-matters.md new file mode 100644 index 00000000..b9e2aa93 --- /dev/null +++ b/docs/explanation/architecture/why-solutioning-matters.md @@ -0,0 +1,91 @@ +--- +title: "Why Solutioning Matters" +description: Understanding why the solutioning phase is critical for multi-epic projects +--- + + +Phase 3 (Solutioning) translates **what** to build (from Planning) into **how** to build it (technical design). This phase prevents agent conflicts in multi-epic projects by documenting architectural decisions before implementation begins. + +--- + +## The Problem Without Solutioning + +``` +Agent 1 implements Epic 1 using REST API +Agent 2 implements Epic 2 using GraphQL +Result: Inconsistent API design, integration nightmare +``` + +When multiple agents implement different parts of a system without shared architectural guidance, they make independent technical decisions that may conflict. + +--- + +## The Solution With Solutioning + +``` +architecture workflow decides: "Use GraphQL for all APIs" +All agents follow architecture decisions +Result: Consistent implementation, no conflicts +``` + +By documenting technical decisions explicitly, all agents implement consistently and integration becomes straightforward. + +--- + +## Solutioning vs Planning + +| Aspect | Planning (Phase 2) | Solutioning (Phase 3) | +| -------- | ----------------------- | --------------------------------- | +| Question | What and Why? | How? Then What units of work? | +| Output | FRs/NFRs (Requirements) | Architecture + Epics/Stories | +| Agent | PM | Architect → PM | +| Audience | Stakeholders | Developers | +| Document | PRD (FRs/NFRs) | Architecture + Epic Files | +| Level | Business logic | Technical design + Work breakdown | + +--- + +## Key Principle + +**Make technical decisions explicit and documented** so all agents implement consistently. + +This prevents: +- API style conflicts (REST vs GraphQL) +- Database design inconsistencies +- State management disagreements +- Naming convention mismatches +- Security approach variations + +--- + +## When Solutioning is Required + +| Track | Solutioning Required? | +|-------|----------------------| +| Quick Flow | No - skip entirely | +| BMad Method Simple | Optional | +| BMad Method Complex | Yes | +| Enterprise | Yes | + +**Rule of thumb:** If you have multiple epics that could be implemented by different agents, you need solutioning. + +--- + +## The Cost of Skipping + +Skipping solutioning on complex projects leads to: + +- **Integration issues** discovered mid-sprint +- **Rework** due to conflicting implementations +- **Longer development time** overall +- **Technical debt** from inconsistent patterns + +Catching alignment issues in solutioning is 10× faster than discovering them during implementation. + +--- + +## Related + +- [Four Phases](./four-phases.md) - Overview of all phases +- [Preventing Agent Conflicts](./preventing-agent-conflicts.md) - Detailed conflict prevention +- [Create Architecture](../../how-to/workflows/create-architecture.md) - How to do it diff --git a/docs/modules/bmb-bmad-builder/custom-content.md b/docs/explanation/bmad-builder/custom-content-types.md similarity index 86% rename from docs/modules/bmb-bmad-builder/custom-content.md rename to docs/explanation/bmad-builder/custom-content-types.md index b54e8572..6b117475 100644 --- a/docs/modules/bmb-bmad-builder/custom-content.md +++ b/docs/explanation/bmad-builder/custom-content-types.md @@ -1,4 +1,7 @@ -# Custom Content +--- +title: "Custom Content" +--- + BMAD supports several categories of officially supported custom content that extend the platform's capabilities. Custom content can be created manually or with the recommended assistance of the BMad Builder (BoMB) Module. The BoMB Agents provides workflows and expertise to plan and build any custom content you can imagine. @@ -14,30 +17,26 @@ This flexibility transforms the platform beyond its current capabilities, enabli ## Categories -- [Custom Content](#custom-content) - - [Categories](#categories) - - [Custom Stand Alone Modules](#custom-stand-alone-modules) - - [Custom Add On Modules](#custom-add-on-modules) - - [Custom Global Modules](#custom-global-modules) - - [Custom Agents](#custom-agents) - - [BMad Tiny Agents](#bmad-tiny-agents) - - [Simple and Expert Agents](#simple-and-expert-agents) - - [Custom Workflows](#custom-workflows) +- [Custom Stand-Alone Modules](#custom-stand-alone-modules) +- [Custom Add-On Modules](#custom-add-on-modules) +- [Custom Global Modules](#custom-global-modules) +- [Custom Agents](#custom-agents) +- [Custom Workflows](#custom-workflows) -## Custom Stand Alone Modules +## Custom Stand-Alone Modules Custom modules range from simple collections of related agents, workflows, and tools designed to work independently, to complex, expansive systems like the BMad Method or even larger applications. -Custom modules are [installable](./custom-content-installation.md) using the standard BMAD method and support advanced features: +Custom modules are [installable](../../how-to/installation/install-custom-modules.md) using the standard BMAD method and support advanced features: - Optional user information collection during installation/updates - Versioning and upgrade paths - Custom installer functions with IDE-specific post-installation handling (custom hooks, subagents, or vendor-specific tools) - Ability to bundle specific tools such as MCP, skills, execution libraries, and code -## Custom Add On Modules +## Custom Add-On Modules -Custom Add On Modules contain specific agents, tools, or workflows that expand, modify, or customize another module but cannot exist or install independently. These add-ons provide enhanced functionality while leveraging the base module's existing capabilities. +Custom Add-On Modules contain specific agents, tools, or workflows that expand, modify, or customize another module but cannot exist or install independently. These add-ons provide enhanced functionality while leveraging the base module's existing capabilities. Examples include: @@ -45,7 +44,7 @@ Examples include: - Framework-specific support for particular use cases - Game development expansions that add new genre-specific capabilities without reinventing existing functionality -Add on modules can include: +Add-on modules can include: - Custom agents with awareness of the target module - Access to existing module workflows @@ -53,7 +52,7 @@ Add on modules can include: ## Custom Global Modules -Similar to Custom Stand Alone Modules, but designed to add functionality that applies across all installed content. These modules provide cross-cutting capabilities that enhance the entire BMAD ecosystem. +Similar to Custom Stand-Alone Modules, but designed to add functionality that applies across all installed content. These modules provide cross-cutting capabilities that enhance the entire BMAD ecosystem. Examples include: diff --git a/docs/explanation/bmad-builder/index.md b/docs/explanation/bmad-builder/index.md new file mode 100644 index 00000000..c2c05547 --- /dev/null +++ b/docs/explanation/bmad-builder/index.md @@ -0,0 +1,66 @@ +--- +title: "BMad Builder (BMB)" +description: Create custom agents, workflows, and modules for BMAD +--- + + +Create custom agents, workflows, and modules for BMAD. + +--- + +## Quick Start + +- **[Agent Creation Guide](../../tutorials/advanced/create-custom-agent.md)** - Step-by-step guide to building your first agent + +--- + +## Agent Architecture + +Comprehensive guides for each agent type: + +- **Simple Agent Architecture** - Self-contained, optimized, personality-driven +- **Expert Agent Architecture** - Memory, sidecar files, domain restrictions +- **Module Agent Architecture** - Workflow integration, professional tools + +--- + +## Key Concepts + +### YAML to XML Compilation + +Agents are authored in YAML with Handlebars templating. The compiler auto-injects: + +1. **Frontmatter** - Name and description from metadata +2. **Activation Block** - Steps, menu handlers, rules +3. **Menu Enhancement** - `*help` and `*exit` commands added automatically +4. **Trigger Prefixing** - Your triggers auto-prefixed with `*` + +--- + +## Reference Examples + +Production-ready examples available in the BMB reference folder: + +### Simple Agents +- **commit-poet** - Commit message artisan with style customization + +### Expert Agents +- **journal-keeper** - Personal journal companion with memory and pattern recognition + +### Module Agents +- **security-engineer** - BMM security specialist with threat modeling +- **trend-analyst** - CIS trend intelligence expert + +--- + +## Installation Guide + +For installing standalone simple and expert agents, see: +- [Install Custom Modules](../../how-to/installation/install-custom-modules.md) + +--- + +## Related + +- [Custom Content Types](./custom-content-types.md) - Understanding content types +- [Create Custom Agent](../../tutorials/advanced/create-custom-agent.md) - Tutorial diff --git a/docs/modules/bmm-bmad-method/index.md b/docs/explanation/bmm/index.md similarity index 64% rename from docs/modules/bmm-bmad-method/index.md rename to docs/explanation/bmm/index.md index c01f8978..f6438397 100644 --- a/docs/modules/bmm-bmad-method/index.md +++ b/docs/explanation/bmm/index.md @@ -1,4 +1,7 @@ -# BMM Documentation +--- +title: "BMM Documentation" +--- + Complete guides for the BMad Method Module (BMM) - AI-powered agile development workflows that adapt to your project's complexity. @@ -8,7 +11,7 @@ Complete guides for the BMad Method Module (BMM) - AI-powered agile development **New to BMM?** Start here: -- **[Quick Start Guide](./quick-start.md)** - Step-by-step guide to building your first project +- **[Quick Start Guide](../../tutorials/getting-started/getting-started-bmadv6.md)** - Step-by-step guide to building your first project - Installation and setup - Understanding the four phases - Running your first workflows @@ -18,7 +21,7 @@ Complete guides for the BMad Method Module (BMM) - AI-powered agile development ### 📊 Visual Overview -**[Complete Workflow Diagram](./images/workflow-method-greenfield.svg)** - Visual flowchart showing all phases, agents (color-coded), and decision points for the BMad Method standard greenfield track. +**[Complete Workflow Diagram](../../tutorials/getting-started/images/workflow-method-greenfield.svg)** - Visual flowchart showing all phases, agents (color-coded), and decision points for the BMad Method standard greenfield track. ## 📖 Core Concepts @@ -26,33 +29,33 @@ The BMad Method is meant to be adapted and customized to your specific needs. In First know there is the full BMad Method Process and then there is a Quick Flow for those quicker smaller efforts. -- **[Full Adaptive BMad Method](#-workflow-guides)** - Full planning and scope support through extensive development and testing. +- **[Full Adaptive BMad Method](#workflow-guides)** - Full planning and scope support through extensive development and testing. - Broken down into 4 phases, all of which are comprised of both required and optional phases - Phases 1-3 are all about progressive idea development through planning and preparations to build your project. - - Phase 4 is the implementation cycle where you will Just In Time (JIT) produce the contextual stories needed for the dev agent based on the extensive planing completed + - Phase 4 is the implementation cycle where you will Just In Time (JIT) produce the contextual stories needed for the dev agent based on the extensive planning completed - All 4 phases have optional steps in them, depending on how rigorous you want to go with planning, research ideation, validation, testing and traceability. - While there is a lot here, know that even this can be distilled down to a simple PRD, Epic and Story list and then jump into the dev cycle. But if that is all you want, you might be better off with the BMad Quick Flow described next -- **[BMAD Quick Flow](./bmad-quick-flow.md)** - Fast-track development workflow +- **[BMAD Quick Flow](../../explanation/features/quick-flow.md)** - Fast-track development workflow - 3-step process: spec → dev → optional review - Perfect for bug fixes and small features - Rapid prototyping with production quality - Implementation in minutes, not days - - Has a specialized single agent that does all of this: **[Quick Flow Solo Dev Agent](./quick-flow-solo-dev.md)** + - Has a specialized single agent that does all of this: **[Quick Flow Solo Dev Agent](../agents/barry-quick-flow.md)** -- **TEA engagement (optional)** - Choose TEA engagement: none, TEA-only (standalone), or integrated by track. See **[Test Architect Guide](./test-architecture.md)**. +- **TEA engagement (optional)** - Choose TEA engagement: none, TEA-only (standalone), or integrated by track. See **[Test Architect Guide](../../explanation/features/tea-overview.md)**. ## 🤖 Agents and Collaboration Complete guide to BMM's AI agent team: -- **[Agents Guide](./agents-guide.md)** - Comprehensive agent reference +- **[Agents Guide](../../explanation/core-concepts/agent-roles.md)** - Comprehensive agent reference - 12 specialized BMM agents + BMad Master - Agent roles, workflows, and when to use them - Agent customization system - Best practices and common patterns -- **[Party Mode Guide](./party-mode.md)** - Multi-agent collaboration +- **[Party Mode Guide](../../explanation/features/party-mode.md)** - Multi-agent collaboration - How party mode works (19+ agents collaborate in real-time) - When to use it (strategic, creative, cross-functional, complex) - Example party compositions @@ -64,7 +67,7 @@ Complete guide to BMM's AI agent team: Comprehensive guide for brownfield development: -- **[Brownfield Development Guide](./brownfield-guide.md)** - Complete guide for existing codebases +- **[Brownfield Development Guide](../../how-to/brownfield/index.md)** - Complete guide for existing codebases - Documentation phase strategies - Track selection for brownfield - Integration with existing patterns @@ -75,49 +78,49 @@ Comprehensive guide for brownfield development: Essential reference materials: -- **[Glossary](./glossary.md)** - Key terminology and concepts -- **[FAQ](./faq.md)** - Frequently asked questions across all topics +- **[Glossary](../../reference/glossary/index.md)** - Key terminology and concepts +- **[FAQ](../faq/index.md)** - Frequently asked questions across all topics ## 🎯 Choose Your Path ### I need to... **Build something new (greenfield)** -→ Start with [Quick Start Guide](./quick-start.md) +→ Start with [Quick Start Guide](../../tutorials/getting-started/getting-started-bmadv6.md) **Fix a bug or add small feature** -→ User the [Quick Flow Solo Dev](./quick-flow-solo-dev.md) directly with its dedicated stand alone [Quick Bmad Spec Flow](./quick-spec-flow.md) process +→ Use the [Quick Flow Solo Dev](../agents/barry-quick-flow.md) directly with its dedicated stand alone [Quick Bmad Spec Flow](../features/quick-flow.md) process **Work with existing codebase (brownfield)** -→ Read [Brownfield Development Guide](./brownfield-guide.md) +→ Read [Brownfield Development Guide](../../how-to/brownfield/index.md) → Pay special attention to documentation requirements for brownfield projects ## 📋 Workflow Guides Comprehensive documentation for all BMM workflows organized by phase: -- **[Phase 1: Analysis Workflows](./workflows-analysis.md)** - Optional exploration and research workflows (595 lines) +- **[Phase 1: Analysis Workflows](../../how-to/workflows/run-brainstorming-session.md)** - Optional exploration and research workflows (595 lines) - brainstorm-project, product-brief, research, and more - When to use analysis workflows - Creative and strategic tools -- **[Phase 2: Planning Workflows](./workflows-planning.md)** - Scale-adaptive planning (967 lines) +- **[Phase 2: Planning Workflows](../../how-to/workflows/create-prd.md)** - Scale-adaptive planning (967 lines) - prd, tech-spec, gdd, narrative, ux - Track-based planning approach (Quick Flow, BMad Method, Enterprise Method) - Which planning workflow to use -- **[Phase 3: Solutioning Workflows](./workflows-solutioning.md)** - Architecture and validation (638 lines) +- **[Phase 3: Solutioning Workflows](../../how-to/workflows/create-architecture.md)** - Architecture and validation (638 lines) - architecture, create-epics-and-stories, implementation-readiness - V6: Epics created AFTER architecture for better quality - Required for BMad Method and Enterprise Method tracks - Preventing agent conflicts -- **[Phase 4: Implementation Workflows](./workflows-implementation.md)** - Sprint-based development (1,634 lines) +- **[Phase 4: Implementation Workflows](../../how-to/workflows/run-sprint-planning.md)** - Sprint-based development (1,634 lines) - sprint-planning, create-story, dev-story, code-review - Complete story lifecycle - One-story-at-a-time discipline -- **[Testing & QA Workflows](./test-architecture.md)** - Comprehensive quality assurance (1,420 lines) +- **[Testing & QA Workflows](../../explanation/features/tea-overview.md)** - Comprehensive quality assurance (1,420 lines) - Test strategy, automation, quality gates - TEA agent and test healing @@ -129,4 +132,4 @@ Comprehensive documentation for all BMM workflows organized by phase: - **[GitHub Issues](https://github.com/bmad-code-org/BMAD-METHOD/issues)** - Report bugs or request features - **[YouTube Channel](https://www.youtube.com/@BMadCode)** - Video tutorials and walkthroughs -**Ready to begin?** → [Start with the Quick Start Guide](./quick-start.md) +**Ready to begin?** → [Start with the Quick Start Guide](../../tutorials/getting-started/getting-started-bmadv6.md) diff --git a/docs/explanation/core-concepts/agent-roles.md b/docs/explanation/core-concepts/agent-roles.md new file mode 100644 index 00000000..1317ba24 --- /dev/null +++ b/docs/explanation/core-concepts/agent-roles.md @@ -0,0 +1,204 @@ +--- +title: "Agent Roles in BMad Method" +description: Understanding the different agent roles in BMad Method +--- + + +BMad Method uses specialized AI agents, each with a distinct role, expertise, and personality. Understanding these roles helps you know which agent to use for each task. + +--- + +## Core Agents Overview + +| Agent | Role | Primary Phase | +|-------|------|---------------| +| **Analyst** | Research and discovery | Phase 1 (Analysis) | +| **PM** | Requirements and planning | Phase 2 (Planning) | +| **Architect** | Technical design | Phase 3 (Solutioning) | +| **SM** | Sprint orchestration | Phase 4 (Implementation) | +| **DEV** | Code implementation | Phase 4 (Implementation) | +| **TEA** | Test architecture | Phases 3-4 (Cross-phase) | +| **UX Designer** | User experience | Phase 2-3 | +| **Quick Flow Solo Dev** | Fast solo development | All phases (Quick Flow) | + +--- + +## Phase 1: Analysis + +### Analyst (Mary) + +Business analysis and research specialist. + +**Responsibilities:** +- Brainstorming and ideation +- Market, domain, and competitive research +- Product brief creation +- Brownfield project documentation + +**Key Workflows:** +- `*brainstorm-project` +- `*research` +- `*product-brief` +- `*document-project` + +**When to use:** Starting new projects, exploring ideas, validating market fit, documenting existing codebases. + +--- + +## Phase 2: Planning + +### PM (John) + +Product requirements and planning expert. + +**Responsibilities:** +- Creating Product Requirements Documents +- Defining functional and non-functional requirements +- Breaking requirements into epics and stories +- Validating implementation readiness + +**Key Workflows:** +- `*create-prd` +- `*create-epics-and-stories` +- `*implementation-readiness` + +**When to use:** Defining what to build, creating PRDs, organizing work into stories. + +### UX Designer (Sally) + +User experience and UI design specialist. + +**Responsibilities:** +- UX specification creation +- User journey mapping +- Wireframe and mockup design +- Design system documentation + +**Key Workflows:** +- `*create-ux-design` +- `*validate-design` + +**When to use:** When UX is a primary differentiator, complex user workflows, design system creation. + +--- + +## Phase 3: Solutioning + +### Architect (Winston) + +System architecture and technical design expert. + +**Responsibilities:** +- System architecture design +- Architecture Decision Records (ADRs) +- Technical standards definition +- Implementation readiness validation + +**Key Workflows:** +- `*create-architecture` +- `*implementation-readiness` + +**When to use:** Multi-epic projects, cross-cutting technical decisions, preventing agent conflicts. + +--- + +## Phase 4: Implementation + +### SM (Bob) + +Sprint planning and story preparation orchestrator. + +**Responsibilities:** +- Sprint planning and tracking +- Story preparation for development +- Course correction handling +- Epic retrospectives + +**Key Workflows:** +- `*sprint-planning` +- `*create-story` +- `*correct-course` +- `*epic-retrospective` + +**When to use:** Organizing work, preparing stories, tracking progress. + +### DEV (Amelia) + +Story implementation and code review specialist. + +**Responsibilities:** +- Story implementation with tests +- Code review +- Following architecture patterns +- Quality assurance + +**Key Workflows:** +- `*dev-story` +- `*code-review` + +**When to use:** Writing code, implementing stories, reviewing quality. + +--- + +## Cross-Phase Agents + +### TEA (Murat) + +Test architecture and quality strategy expert. + +**Responsibilities:** +- Test framework setup +- Test design and planning +- ATDD and automation +- Quality gate decisions + +**Key Workflows:** +- `*framework`, `*ci` +- `*test-design`, `*atdd`, `*automate` +- `*test-review`, `*trace`, `*nfr-assess` + +**When to use:** Setting up testing, creating test plans, quality gates. + +--- + +## Quick Flow + +### Quick Flow Solo Dev (Barry) + +Fast solo development without handoffs. + +**Responsibilities:** +- Technical specification +- End-to-end implementation +- Code review + +**Key Workflows:** +- `*create-tech-spec` +- `*quick-dev` +- `*code-review` + +**When to use:** Bug fixes, small features, rapid prototyping. + +--- + +## Choosing the Right Agent + +| Task | Agent | +|------|-------| +| Brainstorming ideas | Analyst | +| Market research | Analyst | +| Creating PRD | PM | +| Designing UX | UX Designer | +| System architecture | Architect | +| Preparing stories | SM | +| Writing code | DEV | +| Setting up tests | TEA | +| Quick bug fix | Quick Flow Solo Dev | + +--- + +## Related + +- [What Are Agents](./what-are-agents.md) - Foundational concepts +- [Agent Reference](../../reference/agents/index.md) - Complete command reference +- [Quick Start Guide](../../tutorials/getting-started/getting-started-bmadv6.md) diff --git a/docs/explanation/core-concepts/index.md b/docs/explanation/core-concepts/index.md new file mode 100644 index 00000000..713a5e47 --- /dev/null +++ b/docs/explanation/core-concepts/index.md @@ -0,0 +1,40 @@ +--- +title: "BMAD Core Concepts" +--- + + +Understanding the fundamental building blocks of the BMAD Method. + +## The Essentials + +| Concept | Description | Guide | +|---------|-------------|-------| +| **Agents** | AI assistants with personas, capabilities, and menus | [Agents Guide](./what-are-agents.md) | +| **Workflows** | Structured processes for achieving specific outcomes | [Workflows Guide](./what-are-workflows.md) | +| **Modules** | Packaged collections of agents and workflows | [Modules Guide](./what-are-modules.md) | + +## Getting Started + +### New to BMAD? +Start here to understand what BMAD is and how it works: + +1. **[Agents Guide](./what-are-agents.md)** - Learn about Simple and Expert agents +2. **[Workflows Guide](./what-are-workflows.md)** - Understand how workflows orchestrate tasks +3. **[Modules Guide](./what-are-modules.md)** - See how modules organize functionality + +### Installing BMAD + +- **[Installation Guide](../../how-to/installation/index.md)** - Set up BMAD in your project +- **[Upgrading from v4](../../how-to/installation/upgrade-to-v6.md)** - Migrate from earlier versions + +### Configuration + +- **[BMAD Customization](../../how-to/customization/index.md)** - Personalize agents and workflows + +### Advanced + +- **[Web Bundles](../features/web-bundles.md)** - Use BMAD in Gemini Gems and Custom GPTs + +--- + +**Next:** Read the [Agents Guide](./what-are-agents.md) to understand the core building block of BMAD. diff --git a/docs/bmad-core-concepts/agents.md b/docs/explanation/core-concepts/what-are-agents.md similarity index 83% rename from docs/bmad-core-concepts/agents.md rename to docs/explanation/core-concepts/what-are-agents.md index 465bf749..e089fde3 100644 --- a/docs/bmad-core-concepts/agents.md +++ b/docs/explanation/core-concepts/what-are-agents.md @@ -1,4 +1,7 @@ -# Agents +--- +title: "Agents" +--- + Agents are AI assistants that help you accomplish tasks. Each agent has a unique personality, specialized capabilities, and an interactive menu. @@ -82,12 +85,12 @@ All agents share these building blocks: ## Creating Custom Agents -BMAD provides the **BMAD Builder (BMB)** module for creating your own agents. See the [Agent Creation Guide](../modules/bmb-bmad-builder/agent-creation-guide.md) for step-by-step instructions. +BMAD provides the **BMAD Builder (BMB)** module for creating your own agents. See the [Agent Creation Guide](../../tutorials/advanced/create-custom-agent.md) for step-by-step instructions. ## Customizing Existing Agents -You can modify any agent's behavior without editing core files. See [BMAD Customization](./bmad-customization/) for details. It is critical to never modify an installed agents .md file directly and follow the customization process, this way future updates to the agent or module its part of will continue to be updated and recompiled with the installer tool, and your customizations will still be retained. +You can modify any agent's behavior without editing core files. See [BMAD Customization](../../how-to/customization/index.md) for details. It is critical to never modify an installed agents .md file directly and follow the customization process, this way future updates to the agent or module its part of will continue to be updated and recompiled with the installer tool, and your customizations will still be retained. --- -**Next:** Learn about [Workflows](./workflows.md) to see how agents accomplish complex tasks. +**Next:** Learn about [Workflows](./what-are-workflows.md) to see how agents accomplish complex tasks. diff --git a/docs/bmad-core-concepts/modules.md b/docs/explanation/core-concepts/what-are-modules.md similarity index 89% rename from docs/bmad-core-concepts/modules.md rename to docs/explanation/core-concepts/what-are-modules.md index e7a30a16..85bfe865 100644 --- a/docs/bmad-core-concepts/modules.md +++ b/docs/explanation/core-concepts/what-are-modules.md @@ -1,4 +1,7 @@ -# Modules +--- +title: "Modules" +--- + Modules are organized collections of agents and workflows that solve specific problems or address particular domains. @@ -69,8 +72,8 @@ Custom modules are installed the same way as official modules. During BMAD installation, you choose which modules to install. You can also add or remove modules later by re-running the installer. -See [Installation Guide](./installing/) for details. +See [Installation Guide](../../how-to/installation/index.md) for details. --- -**Next:** Read the [Installation Guide](./installing/) to set up BMAD with the modules you need. +**Next:** Read the [Installation Guide](../../how-to/installation/index.md) to set up BMAD with the modules you need. diff --git a/docs/bmad-core-concepts/workflows.md b/docs/explanation/core-concepts/what-are-workflows.md similarity index 99% rename from docs/bmad-core-concepts/workflows.md rename to docs/explanation/core-concepts/what-are-workflows.md index 3bffa3f3..077ba371 100644 --- a/docs/bmad-core-concepts/workflows.md +++ b/docs/explanation/core-concepts/what-are-workflows.md @@ -1,4 +1,7 @@ -# Workflows +--- +title: "Workflows" +--- + Workflows are like prompts on steroids. They harness the untapped power and control of LLMs through progressive disclosure—breaking complex tasks into focused steps that execute sequentially. Instead of random AI slop where you hope for the best, workflows give you repeatable, reliable, high-quality outputs. diff --git a/docs/explanation/core/index.md b/docs/explanation/core/index.md new file mode 100644 index 00000000..4dc10550 --- /dev/null +++ b/docs/explanation/core/index.md @@ -0,0 +1,18 @@ +--- +title: "Core Module" +--- + + +The Core Module is installed with all installations of BMAD modules and provides common functionality that any module, workflow, or agent can take advantage of. + +## Core Module Components + +- **[Global Core Config](../../reference/configuration/global-config.md)** — Inheritable configuration that impacts all modules and custom content +- **[Core Workflows](../../reference/workflows/core-workflows.md)** — Domain-agnostic workflows usable by any module + - [Party Mode](../../explanation/features/party-mode.md) — Multi-agent conversation orchestration + - [Brainstorming](../../explanation/features/brainstorming-techniques.md) — Structured creative sessions with 60+ techniques + - [Advanced Elicitation](../../explanation/features/advanced-elicitation.md) — LLM rethinking with 50+ reasoning methods +- **[Core Tasks](../../reference/configuration/core-tasks.md)** — Common tasks available across modules + - [Index Docs](../../reference/configuration/core-tasks.md#index-docs) — Generate directory index files + - [Adversarial Review](../../reference/configuration/core-tasks.md#adversarial-review-general) — Critical content review + - [Shard Document](../../reference/configuration/core-tasks.md#shard-document) — Split large documents into sections diff --git a/docs/modules/cis-creative-intelligence-suite/index.md b/docs/explanation/creative-intelligence/index.md similarity index 61% rename from docs/modules/cis-creative-intelligence-suite/index.md rename to docs/explanation/creative-intelligence/index.md index 05b567f3..6101fa11 100644 --- a/docs/modules/cis-creative-intelligence-suite/index.md +++ b/docs/explanation/creative-intelligence/index.md @@ -1,20 +1,19 @@ -# CIS - Creative Intelligence Suite +--- +title: "Creative Intelligence Suite (CIS)" +description: AI-powered creative facilitation with the Creative Intelligence Suite +--- + AI-powered creative facilitation transforming strategic thinking through expert coaching across five specialized domains. -## Table of Contents - -- [Core Capabilities](#core-capabilities) -- [Specialized Agents](#specialized-agents) -- [Interactive Workflows](#interactive-workflows) -- [Quick Start](#quick-start) -- [Key Differentiators](#key-differentiators) -- [Configuration](#configuration) +--- ## Core Capabilities CIS provides structured creative methodologies through distinctive agent personas who act as master facilitators, drawing out insights through strategic questioning rather than generating solutions directly. +--- + ## Specialized Agents - **Carson** - Brainstorming Specialist (energetic facilitator) @@ -23,74 +22,69 @@ CIS provides structured creative methodologies through distinctive agent persona - **Victor** - Innovation Oracle (bold strategic precision) - **Sophia** - Master Storyteller (whimsical narrator) -## Interactive Workflows +--- -[View all workflows →](../workflows/README.md) +## Interactive Workflows **5 Workflows** with **150+ Creative Techniques:** ### Brainstorming -36 techniques across 7 categories for ideation - +36 techniques across 7 categories for ideation: - Divergent/convergent thinking - Lateral connections - Forced associations ### Design Thinking -Complete 5-phase human-centered process - +Complete 5-phase human-centered process: - Empathize → Define → Ideate → Prototype → Test - User journey mapping - Rapid iteration ### Problem Solving -Systematic root cause analysis - +Systematic root cause analysis: - 5 Whys, Fishbone diagrams - Solution generation - Impact assessment ### Innovation Strategy -Business model disruption - +Business model disruption: - Blue Ocean Strategy - Jobs-to-be-Done - Disruptive innovation patterns ### Storytelling -25 narrative frameworks - +25 narrative frameworks: - Hero's Journey - Story circles - Compelling pitch structures +--- + ## Quick Start ### Direct Workflow ```bash -# Start interactive session workflow brainstorming -# With context document workflow design-thinking --data /path/to/context.md ``` ### Agent-Facilitated ```bash -# Load agent agent cis/brainstorming-coach -# Start workflow > *brainstorm ``` +--- + ## Key Differentiators - **Facilitation Over Generation** - Guides discovery through questions @@ -99,30 +93,7 @@ agent cis/brainstorming-coach - **Persona-Driven** - Unique communication styles - **Rich Method Libraries** - 150+ proven techniques -## Configuration - -Edit `/_bmad/cis/config.yaml`: - -```yaml -output_folder: ./creative-outputs -user_name: Your Name -communication_language: english -``` - -## Module Structure - -``` -cis/ -├── agents/ # 5 specialized facilitators -├── workflows/ # 5 interactive processes -│ ├── brainstorming/ -│ ├── design-thinking/ -│ ├── innovation-strategy/ -│ ├── problem-solving/ -│ └── storytelling/ -├── tasks/ # Supporting operations -└── teams/ # Agent collaborations -``` +--- ## Integration Points @@ -132,6 +103,8 @@ CIS workflows integrate with: - **BMB** - Creative module design - **Custom Modules** - Shared creative resource +--- + ## Best Practices 1. **Set clear objectives** before starting sessions @@ -140,10 +113,9 @@ CIS workflows integrate with: 4. **Take breaks** when energy flags 5. **Document insights** as they emerge -## Related Documentation - -- **[BMM Documentation](../bmm/index.md)** - Core BMad Method documentation - --- -Part of BMad Method v6.0 - Transform creative potential through expert AI facilitation. +## Related + +- [Facilitation Over Generation](../philosophy/facilitation-over-generation.md) - Core philosophy +- [Brainstorming Techniques](../features/brainstorming-techniques.md) - Technique reference diff --git a/docs/explanation/faq/brownfield-faq.md b/docs/explanation/faq/brownfield-faq.md new file mode 100644 index 00000000..8aeec2aa --- /dev/null +++ b/docs/explanation/faq/brownfield-faq.md @@ -0,0 +1,80 @@ +--- +title: "Brownfield Development FAQ" +description: Common questions about brownfield development in the BMad Method +--- + + +Quick answers to common questions about brownfield (existing codebase) development in the BMad Method. + +--- + +## Q: What is brownfield vs greenfield? + +**A:** + +- **Greenfield:** New project, starting from scratch, clean slate +- **Brownfield:** Existing project, working with established codebase and patterns + +## Q: Do I have to run document-project for brownfield? + +**A:** Highly recommended, especially if: + +- No existing documentation +- Documentation is outdated +- AI agents need context about existing code +- Level 2-4 complexity + +You can skip it if you have comprehensive, up-to-date documentation including `docs/index.md`. + +## Q: What if I forget to run document-project on brownfield? + +**A:** Workflows will lack context about existing code. You may get: + +- Suggestions that don't match existing patterns +- Integration approaches that miss existing APIs +- Architecture that conflicts with current structure + +Run document-project and restart planning with proper context. + +## Q: Can I use Quick Spec Flow for brownfield projects? + +**A:** Yes! Quick Spec Flow works great for brownfield. It will: + +- Auto-detect your existing stack +- Analyze brownfield code patterns +- Detect conventions and ask for confirmation +- Generate context-rich tech-spec that respects existing code + +Perfect for bug fixes and small features in existing codebases. + +## Q: How does workflow-init handle brownfield with old planning docs? + +**A:** workflow-init asks about YOUR current work first, then uses old artifacts as context: + +1. Shows what it found (old PRD, epics, etc.) +2. Asks: "Is this work in progress, previous effort, or proposed work?" +3. If previous effort: Asks you to describe your NEW work +4. Determines level based on YOUR work, not old artifacts + +This prevents old Level 3 PRDs from forcing Level 3 workflow for new Level 0 bug fix. + +## Q: What if my existing code doesn't follow best practices? + +**A:** Quick Spec Flow detects your conventions and asks: "Should I follow these existing conventions?" You decide: + +- **Yes** → Maintain consistency with current codebase +- **No** → Establish new standards (document why in tech-spec) + +BMM respects your choice - it won't force modernization, but it will offer it. + +--- + +## Related Documentation + +- [Quick Start Guide](../../tutorials/getting-started/getting-started-bmadv6.md) - Get started with BMM +- [Brownfield Guide](../../how-to/brownfield/index.md) - Existing codebase workflows +- [Glossary](../../reference/glossary/index.md) - Terminology reference + +--- + +**Have a question not answered here?** Please [open an issue](https://github.com/bmad-code-org/BMAD-METHOD/issues) or ask in [Discord](https://discord.gg/gk8jAdXWmj) so we can add it! diff --git a/docs/explanation/faq/getting-started-faq.md b/docs/explanation/faq/getting-started-faq.md new file mode 100644 index 00000000..b7f7facb --- /dev/null +++ b/docs/explanation/faq/getting-started-faq.md @@ -0,0 +1,66 @@ +--- +title: "Getting Started FAQ" +description: Common questions about getting started with the BMad Method +--- + + +Quick answers to common questions about getting started with the BMad Method. + +--- + +## Q: Do I always need to run workflow-init? + +**A:** No, once you learn the flow you can go directly to workflows. However, workflow-init is helpful because it: + +- Determines your project's appropriate level automatically +- Creates the tracking status file +- Routes you to the correct starting workflow + +For experienced users: use the [Quick Start Guide](../../tutorials/getting-started/getting-started-bmadv6.md) to go directly to the right agent/workflow. + +## Q: Why do I need fresh chats for each workflow? + +**A:** Context-intensive workflows (like brainstorming, PRD creation, architecture design) can cause AI hallucinations if run in sequence within the same chat. Starting fresh ensures the agent has maximum context capacity for each workflow. This is particularly important for: + +- Planning workflows (PRD, architecture) +- Analysis workflows (brainstorming, research) +- Complex story implementation + +Quick workflows like status checks can reuse chats safely. + +## Q: Can I skip workflow-status and just start working? + +**A:** Yes, if you already know your project level and which workflow comes next. workflow-status is mainly useful for: + +- New projects (guides initial setup) +- When you're unsure what to do next +- After breaks in work (reminds you where you left off) +- Checking overall progress + +## Q: What's the minimum I need to get started? + +**A:** For the fastest path: + +1. Install BMad Method: `npx bmad-method@alpha install` +2. For small changes: Load PM agent → run tech-spec → implement +3. For larger projects: Load PM agent → run prd → architect → implement + +## Q: How do I know if I'm in Phase 1, 2, 3, or 4? + +**A:** Check your `bmm-workflow-status.md` file (created by workflow-init). It shows your current phase and progress. If you don't have this file, you can also tell by what you're working on: + +- **Phase 1** - Brainstorming, research, product brief (optional) +- **Phase 2** - Creating either a PRD or tech-spec (always required) +- **Phase 3** - Architecture design (Level 2-4 only) +- **Phase 4** - Actually writing code, implementing stories + +--- + +## Related Documentation + +- [Quick Start Guide](../../tutorials/getting-started/getting-started-bmadv6.md) - Get started with BMM +- [Glossary](../../reference/glossary/index.md) - Terminology reference + +--- + +**Have a question not answered here?** Please [open an issue](https://github.com/bmad-code-org/BMAD-METHOD/issues) or ask in [Discord](https://discord.gg/gk8jAdXWmj) so we can add it! diff --git a/docs/explanation/faq/implementation-faq.md b/docs/explanation/faq/implementation-faq.md new file mode 100644 index 00000000..bbc35273 --- /dev/null +++ b/docs/explanation/faq/implementation-faq.md @@ -0,0 +1,56 @@ +--- +title: "Implementation FAQ" +description: Common questions about implementation in the BMad Method +--- + + +Quick answers to common questions about implementation in the BMad Method. + +--- + +## Q: Does create-story include implementation context? + +**A:** Yes! The create-story workflow generates story files that include implementation-specific guidance, references existing patterns from your documentation, and provides technical context. The workflow loads your architecture, PRD, and existing project documentation to create comprehensive stories. For Quick Flow projects using tech-spec, the tech-spec itself is already comprehensive, so stories can be simpler. + +## Q: How do I mark a story as done? + +**A:** After dev-story completes and code-review passes: + +1. Open `sprint-status.yaml` (created by sprint-planning) +2. Change the story status from `review` to `done` +3. Save the file + +## Q: Can I work on multiple stories at once? + +**A:** Yes, if you have capacity! Stories within different epics can be worked in parallel. However, stories within the same epic are usually sequential because they build on each other. + +## Q: What if my story takes longer than estimated? + +**A:** That's normal! Stories are estimates. If implementation reveals more complexity: + +1. Continue working until DoD is met +2. Consider if story should be split +3. Document learnings in retrospective +4. Adjust future estimates based on this learning + +## Q: When should I run retrospective? + +**A:** After completing all stories in an epic (when epic is done). Retrospectives capture: + +- What went well +- What could improve +- Technical insights +- Learnings for future epics + +Don't wait until project end - run after each epic for continuous improvement. + +--- + +## Related Documentation + +- [Quick Start Guide](../../tutorials/getting-started/getting-started-bmadv6.md) - Get started with BMM +- [Glossary](../../reference/glossary/index.md) - Terminology reference + +--- + +**Have a question not answered here?** Please [open an issue](https://github.com/bmad-code-org/BMAD-METHOD/issues) or ask in [Discord](https://discord.gg/gk8jAdXWmj) so we can add it! diff --git a/docs/explanation/faq/index.md b/docs/explanation/faq/index.md new file mode 100644 index 00000000..bd92c7a6 --- /dev/null +++ b/docs/explanation/faq/index.md @@ -0,0 +1,17 @@ +--- +title: "Frequently Asked Questions" +description: Frequently asked questions about the BMad Method +--- + + +Quick answers to common questions about the BMad Method, organized by topic. + +## Topics + +- [Getting Started](./getting-started-faq.md) - Questions about starting with BMM +- [Levels & Tracks](./levels-and-tracks-faq.md) - Choosing the right level +- [Workflows](./workflows-faq.md) - Workflow and phase questions +- [Planning](./planning-faq.md) - Planning document questions +- [Implementation](./implementation-faq.md) - Implementation questions +- [Brownfield](./brownfield-faq.md) - Existing codebase questions +- [Tools & Advanced](./tools-faq.md) - Tools, IDEs, and advanced topics diff --git a/docs/explanation/faq/levels-and-tracks-faq.md b/docs/explanation/faq/levels-and-tracks-faq.md new file mode 100644 index 00000000..154b3ae3 --- /dev/null +++ b/docs/explanation/faq/levels-and-tracks-faq.md @@ -0,0 +1,58 @@ +--- +title: "Levels and Tracks FAQ" +description: Common questions about choosing the right level for your project +--- + + +Quick answers to common questions about choosing the right level for your BMad Method project. + +--- + +## Q: How do I know which level my project is? + +**A:** Use workflow-init for automatic detection, or self-assess using these keywords: + +- **Level 0:** "fix", "bug", "typo", "small change", "patch" → 1 story +- **Level 1:** "simple", "basic", "small feature", "add" → 1-10 stories +- **Level 2:** "dashboard", "several features", "admin panel" → 5-15 stories +- **Level 3:** "platform", "integration", "complex", "system" → 12-40 stories +- **Level 4:** "enterprise", "multi-tenant", "multiple products" → 40+ stories + +When in doubt, start smaller. You can always run create-prd later if needed. + +## Q: Can I change levels mid-project? + +**A:** Yes! If you started at Level 1 but realize it's Level 2, you can run create-prd to add proper planning docs. The system is flexible - your initial level choice isn't permanent. + +## Q: What if workflow-init suggests the wrong level? + +**A:** You can override it! workflow-init suggests a level but always asks for confirmation. If you disagree, just say so and choose the level you think is appropriate. Trust your judgment. + +## Q: Do I always need architecture for Level 2? + +**A:** No, architecture is **optional** for Level 2. Only create architecture if you need system-level design. Many Level 2 projects work fine with just PRD created during planning. + +## Q: What's the difference between Level 1 and Level 2? + +**A:** + +- **Level 1:** 1-10 stories, uses tech-spec (simpler, faster), no architecture +- **Level 2:** 5-15 stories, uses PRD (product-focused), optional architecture + +The overlap (5-10 stories) is intentional. Choose based on: + +- Need product-level planning? → Level 2 +- Just need technical plan? → Level 1 +- Multiple epics? → Level 2 +- Single epic? → Level 1 + +--- + +## Related Documentation + +- [Quick Start Guide](../../tutorials/getting-started/getting-started-bmadv6.md) - Get started with BMM +- [Glossary](../../reference/glossary/index.md) - Terminology reference + +--- + +**Have a question not answered here?** Please [open an issue](https://github.com/bmad-code-org/BMAD-METHOD/issues) or ask in [Discord](https://discord.gg/gk8jAdXWmj) so we can add it! diff --git a/docs/explanation/faq/planning-faq.md b/docs/explanation/faq/planning-faq.md new file mode 100644 index 00000000..35de44d4 --- /dev/null +++ b/docs/explanation/faq/planning-faq.md @@ -0,0 +1,47 @@ +--- +title: "Planning Documents FAQ" +description: Common questions about planning documents in the BMad Method +--- + + +Quick answers to common questions about planning documents in the BMad Method. + +--- + +## Q: Why no tech-spec at Level 2+? + +**A:** Level 2+ projects need product-level planning (PRD) and system-level design (Architecture), which tech-spec doesn't provide. Tech-spec is too narrow for coordinating multiple features. Instead, Level 2-4 uses: + +- PRD (product vision, functional requirements, non-functional requirements) +- Architecture (system design) +- Epics+Stories (created AFTER architecture is complete) + +## Q: Do I need a PRD for a bug fix? + +**A:** No! Bug fixes are typically Level 0 (single atomic change). Use Quick Spec Flow: + +- Load PM agent +- Run tech-spec workflow +- Implement immediately + +PRDs are for Level 2-4 projects with multiple features requiring product-level coordination. + +## Q: Can I skip the product brief? + +**A:** Yes, product brief is always optional. It's most valuable for: + +- Level 3-4 projects needing strategic direction +- Projects with stakeholders requiring alignment +- Novel products needing market research +- When you want to explore solution space before committing + +--- + +## Related Documentation + +- [Quick Start Guide](../../tutorials/getting-started/getting-started-bmadv6.md) - Get started with BMM +- [Glossary](../../reference/glossary/index.md) - Terminology reference + +--- + +**Have a question not answered here?** Please [open an issue](https://github.com/bmad-code-org/BMAD-METHOD/issues) or ask in [Discord](https://discord.gg/gk8jAdXWmj) so we can add it! diff --git a/docs/explanation/faq/tools-faq.md b/docs/explanation/faq/tools-faq.md new file mode 100644 index 00000000..682eedd2 --- /dev/null +++ b/docs/explanation/faq/tools-faq.md @@ -0,0 +1,248 @@ +--- +title: "Tools and Advanced FAQ" +description: Common questions about tools, IDEs, and advanced topics in the BMad Method +--- + + +Quick answers to common questions about tools, IDEs, and advanced topics in the BMad Method. + +--- + +## Tools and Technical + +### Q: Why are my Mermaid diagrams not rendering? + +**A:** Common issues: + +1. Missing language tag: Use ` ```mermaid` not just ` ``` ` +2. Syntax errors in diagram (validate at mermaid.live) +3. Tool doesn't support Mermaid (check your Markdown renderer) + +All BMM docs use valid Mermaid syntax that should render in GitHub, VS Code, and most IDEs. + +### Q: Can I use BMM with GitHub Copilot / Cursor / other AI tools? + +**A:** Yes! BMM is complementary. BMM handles: + +- Project planning and structure +- Workflow orchestration +- Agent Personas and expertise +- Documentation generation +- Quality gates + +Your AI coding assistant handles: + +- Line-by-line code completion +- Quick refactoring +- Test generation + +Use them together for best results. + +### Q: What IDEs/tools support BMM? + +**A:** BMM requires tools with **agent mode** and access to **high-quality LLM models** that can load and follow complex workflows, then properly implement code changes. + +**Recommended Tools:** + +- **Claude Code** - Best choice + - Sonnet 4.5 (excellent workflow following, coding, reasoning) + - Opus (maximum context, complex planning) + - Native agent mode designed for BMM workflows + +- **Cursor** + - Supports Anthropic (Claude) and OpenAI models + - Agent mode with composer + - Good for developers who prefer Cursor's UX + +- **Windsurf** + - Multi-model support + - Agent capabilities + - Suitable for BMM workflows + +**What Matters:** + +1. **Agent mode** - Can load long workflow instructions and maintain context +2. **High-quality LLM** - Models ranked high on SWE-bench (coding benchmarks) +3. **Model selection** - Access to Claude Sonnet 4.5, Opus, or GPT-4o class models +4. **Context capacity** - Can handle large planning documents and codebases + +**Why model quality matters:** BMM workflows require LLMs that can follow multi-step processes, maintain context across phases, and implement code that adheres to specifications. Tools with weaker models will struggle with workflow adherence and code quality. + +### Q: Can I customize agents? + +**A:** Yes! Agents are installed as markdown files with XML-style content (optimized for LLMs, readable by any model). Create customization files in `_bmad/_config/agents/[agent-name].customize.yaml` to override default behaviors while keeping core functionality intact. See agent documentation for customization options. + +**Note:** While source agents in this repo are YAML, they install as `.md` files with XML-style tags - a format any LLM can read and follow. + +### Q: What happens to my planning docs after implementation? + +**A:** Keep them! They serve as: + +- Historical record of decisions +- Onboarding material for new team members +- Reference for future enhancements +- Audit trail for compliance + +For enterprise projects (Level 4), consider archiving completed planning artifacts to keep workspace clean. + +### Q: Can I use BMM for non-software projects? + +**A:** BMM is optimized for software development, but the methodology principles (scale-adaptive planning, just-in-time design, context injection) can apply to other complex project types. You'd need to adapt workflows and agents for your domain. + +--- + +## Advanced Questions + +### Q: What if my project grows from Level 1 to Level 3? + +**A:** Totally fine! When you realize scope has grown: + +1. Run create-prd to add product-level planning +2. Run create-architecture for system design +3. Use existing tech-spec as input for PRD +4. Continue with updated level + +The system is flexible - growth is expected. + +### Q: Can I mix greenfield and brownfield approaches? + +**A:** Yes! Common scenario: adding new greenfield feature to brownfield codebase. Approach: + +1. Run document-project for brownfield context +2. Use greenfield workflows for new feature planning +3. Explicitly document integration points between new and existing +4. Test integration thoroughly + +### Q: How do I handle urgent hotfixes during a sprint? + +**A:** Use correct-course workflow or just: + +1. Save your current work state +2. Load PM agent → quick tech-spec for hotfix +3. Implement hotfix (Level 0 flow) +4. Deploy hotfix +5. Return to original sprint work + +Level 0 Quick Spec Flow is perfect for urgent fixes. + +### Q: What if I disagree with the workflow's recommendations? + +**A:** Workflows are guidance, not enforcement. If a workflow recommends something that doesn't make sense for your context: + +- Explain your reasoning to the agent +- Ask for alternative approaches +- Skip the recommendation if you're confident +- Document why you deviated (for future reference) + +Trust your expertise - BMM supports your decisions. + +### Q: Can multiple developers work on the same BMM project? + +**A:** Yes! But the paradigm is fundamentally different from traditional agile teams. + +**Key Difference:** + +- **Traditional:** Multiple devs work on stories within one epic (months) +- **Agentic:** Each dev owns complete epics (days) + +**In traditional agile:** A team of 5 devs might spend 2-3 months on a single epic, with each dev owning different stories. + +**With BMM + AI agents:** A single dev can complete an entire epic in 1-3 days. What used to take months now takes days. + +**Team Work Distribution:** + +- **Recommended:** Split work by **epic** (not story) +- Each developer owns complete epics end-to-end +- Parallel work happens at epic level +- Minimal coordination needed + +**For full-stack apps:** + +- Frontend and backend can be separate epics (unusual in traditional agile) +- Frontend dev owns all frontend epics +- Backend dev owns all backend epics +- Works because delivery is so fast + +**Enterprise Considerations:** + +- Use **git submodules** for BMM installation (not .gitignore) +- Allows personal configurations without polluting main repo +- Teams may use different AI tools (Claude Code, Cursor, etc.) +- Developers may follow different methods or create custom agents/workflows + +**Quick Tips:** + +- Share `sprint-status.yaml` (single source of truth) +- Assign entire epics to developers (not individual stories) +- Coordinate at epic boundaries, not story level +- Use git submodules for BMM in enterprise settings + +### Q: What is party mode and when should I use it? + +**A:** Party mode is a unique multi-agent collaboration feature where ALL your installed agents (19+ from BMM, CIS, BMB, custom modules) discuss your challenges together in real-time. + +**How it works:** + +1. Run `/bmad:core:workflows:party-mode` (or `*party-mode` from any agent) +2. Introduce your topic +3. BMad Master selects 2-3 most relevant agents per message +4. Agents cross-talk, debate, and build on each other's ideas + +**Best for:** + +- Strategic decisions with trade-offs (architecture choices, tech stack, scope) +- Creative brainstorming (game design, product innovation, UX ideation) +- Cross-functional alignment (epic kickoffs, retrospectives, phase transitions) +- Complex problem-solving (multi-faceted challenges, risk assessment) + +**Example parties:** + +- **Product Strategy:** PM + Innovation Strategist (CIS) + Analyst +- **Technical Design:** Architect + Creative Problem Solver (CIS) + Game Architect +- **User Experience:** UX Designer + Design Thinking Coach (CIS) + Storyteller (CIS) + +**Why it's powerful:** + +- Diverse perspectives (technical, creative, strategic) +- Healthy debate reveals blind spots +- Emergent insights from agent interaction +- Natural collaboration across modules + +**For complete documentation:** + +👉 **[Party Mode Guide](../../explanation/features/party-mode.md)** - How it works, when to use it, example compositions, best practices + +--- + +## Getting Help + +### Q: Where do I get help if my question isn't answered here? + +**A:** + +1. Search [Complete Documentation](https://github.com/bmad-code-org/BMAD-METHOD/blob/main/README.md) for related topics +2. Ask in [Discord Community](https://discord.gg/gk8jAdXWmj) (#general-dev) +3. Open a [GitHub Issue](https://github.com/bmad-code-org/BMAD-METHOD/issues) +4. Watch [YouTube Tutorials](https://www.youtube.com/@BMadCode) + +### Q: How do I report a bug or request a feature? + +**A:** Open a GitHub issue at: + +Please include: + +- BMM version (check your installed version) +- Steps to reproduce (for bugs) +- Expected vs actual behavior +- Relevant workflow or agent involved + +--- + +## Related Documentation + +- [Quick Start Guide](../../tutorials/getting-started/getting-started-bmadv6.md) - Get started with BMM +- [Glossary](../../reference/glossary/index.md) - Terminology reference + +--- + +**Have a question not answered here?** Please [open an issue](https://github.com/bmad-code-org/BMAD-METHOD/issues) or ask in [Discord](https://discord.gg/gk8jAdXWmj) so we can add it! diff --git a/docs/explanation/faq/workflows-faq.md b/docs/explanation/faq/workflows-faq.md new file mode 100644 index 00000000..fbd245f2 --- /dev/null +++ b/docs/explanation/faq/workflows-faq.md @@ -0,0 +1,68 @@ +--- +title: "Workflows FAQ" +description: Common questions about BMad Method workflows and phases +--- + + +Quick answers to common questions about BMad Method workflows and phases. + +--- + +## Q: What's the difference between workflow-status and workflow-init? + +**A:** + +- **workflow-status:** Checks existing status and tells you what's next (use when continuing work) +- **workflow-init:** Creates new status file and sets up project (use when starting new project) + +If status file exists, use workflow-status. If not, use workflow-init. + +## Q: Can I skip Phase 1 (Analysis)? + +**A:** Yes! Phase 1 is optional for all levels, though recommended for complex projects. Skip if: + +- Requirements are clear +- No research needed +- Time-sensitive work +- Small changes (Level 0-1) + +## Q: When is Phase 3 (Architecture) required? + +**A:** + +- **Level 0-1:** Never (skip entirely) +- **Level 2:** Optional (only if system design needed) +- **Level 3-4:** Required (comprehensive architecture mandatory) + +## Q: What happens if I skip a recommended workflow? + +**A:** Nothing breaks! Workflows are guidance, not enforcement. However, skipping recommended workflows (like architecture for Level 3) may cause: + +- Integration issues during implementation +- Rework due to poor planning +- Conflicting design decisions +- Longer development time overall + +## Q: How do I know when Phase 3 is complete and I can start Phase 4? + +**A:** For Level 3-4, run the implementation-readiness workflow. It validates PRD + Architecture + Epics + UX (optional) are aligned before implementation. Pass the gate check = ready for Phase 4. + +## Q: Can I run workflows in parallel or do they have to be sequential? + +**A:** Most workflows must be sequential within a phase: + +- Phase 1: brainstorm → research → product-brief (optional order) +- Phase 2: PRD must complete before moving forward +- Phase 3: architecture → epics+stories → implementation-readiness (sequential) +- Phase 4: Stories within an epic should generally be sequential, but stories in different epics can be parallel if you have capacity + +--- + +## Related Documentation + +- [Quick Start Guide](../../tutorials/getting-started/getting-started-bmadv6.md) - Get started with BMM +- [Glossary](../../reference/glossary/index.md) - Terminology reference + +--- + +**Have a question not answered here?** Please [open an issue](https://github.com/bmad-code-org/BMAD-METHOD/issues) or ask in [Discord](https://discord.gg/gk8jAdXWmj) so we can add it! diff --git a/docs/modules/core/advanced-elicitation.md b/docs/explanation/features/advanced-elicitation.md similarity index 99% rename from docs/modules/core/advanced-elicitation.md rename to docs/explanation/features/advanced-elicitation.md index 92754b20..af08f02e 100644 --- a/docs/modules/core/advanced-elicitation.md +++ b/docs/explanation/features/advanced-elicitation.md @@ -1,4 +1,7 @@ -# Advanced Elicitation +--- +title: "Advanced Elicitation" +--- + **Push the LLM to rethink its work through 50+ reasoning methods—essentially, LLM brainstorming.** diff --git a/docs/modules/core/brainstorming.md b/docs/explanation/features/brainstorming-techniques.md similarity index 99% rename from docs/modules/core/brainstorming.md rename to docs/explanation/features/brainstorming-techniques.md index 4a01b600..23cc6a0b 100644 --- a/docs/modules/core/brainstorming.md +++ b/docs/explanation/features/brainstorming-techniques.md @@ -1,4 +1,7 @@ -# Brainstorming +--- +title: "Brainstorming" +--- + **Facilitate structured creative sessions using 60+ proven ideation techniques.** diff --git a/docs/modules/bmm-bmad-method/party-mode.md b/docs/explanation/features/party-mode.md similarity index 92% rename from docs/modules/bmm-bmad-method/party-mode.md rename to docs/explanation/features/party-mode.md index 801decd9..660ed6ea 100644 --- a/docs/modules/bmm-bmad-method/party-mode.md +++ b/docs/explanation/features/party-mode.md @@ -1,4 +1,7 @@ -# Party Mode: Multi-Agent Collaboration +--- +title: "Party Mode: Multi-Agent Collaboration" +--- + **Get all your AI agents in one conversation** @@ -36,20 +39,15 @@ Type `/bmad:core:workflows:party-mode` (or `*party-mode` from any agent or at ke ## Quick Start ```bash -# Trigger party mode /bmad:core:workflows:party-mode -# OR from any agent context *party-mode -# Super Hack /bmad:core:workflows:party-mode and include also in the party Santa Clause and Einstein -# During party Ask questions, respond to agents, direct the conversation -# Exit Type: exit ``` @@ -105,9 +103,9 @@ _(Multiple perspectives reveal the right answer)_ ## Related Documentation -- [Agents Guide](./agents-guide.md) - Complete agent reference -- [Quick Start Guide](./quick-start.md) - Getting started with BMM -- [FAQ](./faq.md) - Common questions +- [Agents Reference](../../reference/agents/index.md) - Complete agent reference +- [Quick Start Guide](../../tutorials/getting-started/getting-started-bmadv6.md) - Getting started with BMM +- [Setup Party Mode](../../how-to/workflows/setup-party-mode.md) - How to use it --- diff --git a/docs/explanation/features/quick-flow.md b/docs/explanation/features/quick-flow.md new file mode 100644 index 00000000..fe2723c7 --- /dev/null +++ b/docs/explanation/features/quick-flow.md @@ -0,0 +1,169 @@ +--- +title: "Quick Spec Flow" +description: Understanding Quick Spec Flow for rapid development in BMad Method +--- + + +Quick Spec Flow is a streamlined alternative to the full BMad Method for Quick Flow track projects. Instead of going through Product Brief → PRD → Architecture, you go straight to a context-aware technical specification and start coding. + +**Perfect for:** Bug fixes, small features, rapid prototyping, and quick enhancements + +**Time to implementation:** Minutes, not hours + +--- + +## When to Use Quick Flow + +### ✅ Use Quick Flow when: + +- Single bug fix or small enhancement +- Small feature with clear scope (typically 1-15 stories) +- Rapid prototyping or experimentation +- Adding to existing brownfield codebase +- You know exactly what you want to build + +### ❌ Use BMad Method or Enterprise when: + +- Building new products or major features +- Need stakeholder alignment +- Complex multi-team coordination +- Requires extensive planning and architecture + +💡 **Not sure?** Run `workflow-init` to get a recommendation based on your project's needs! + +--- + +## Quick Flow Overview + +```mermaid +flowchart TD + START[Step 1: Run Tech-Spec Workflow] + DETECT[Detects project stack] + ANALYZE[Analyzes brownfield codebase] + TEST[Detects test frameworks] + CONFIRM[Confirms conventions] + GENERATE[Generates context-rich tech-spec] + STORIES[Creates ready-to-implement stories] + IMPL[Step 2: Implement with DEV Agent] + DONE[DONE!] + + START --> DETECT + DETECT --> ANALYZE + ANALYZE --> TEST + TEST --> CONFIRM + CONFIRM --> GENERATE + GENERATE --> STORIES + STORIES --> IMPL + IMPL --> DONE + + style START fill:#bfb,stroke:#333,stroke-width:2px + style IMPL fill:#bbf,stroke:#333,stroke-width:2px + style DONE fill:#f9f,stroke:#333,stroke-width:3px +``` + +--- + +## What Makes It Quick + +- ✅ No Product Brief needed +- ✅ No PRD needed +- ✅ No Architecture doc needed +- ✅ Auto-detects your stack +- ✅ Auto-analyzes brownfield code +- ✅ Auto-validates quality +- ✅ Story context optional (tech-spec is comprehensive!) + +--- + +## Smart Context Discovery + +Quick Spec Flow automatically discovers and uses: + +### Existing Documentation +- Product briefs (if they exist) +- Research documents +- `document-project` output (brownfield codebase map) + +### Project Stack +- **Node.js:** package.json → frameworks, dependencies, scripts +- **Python:** requirements.txt, pyproject.toml → packages, tools +- **Ruby:** Gemfile → gems and versions +- **Java:** pom.xml, build.gradle → Maven/Gradle dependencies +- **Go:** go.mod → modules +- **Rust:** Cargo.toml → crates + +### Brownfield Code Patterns +- Directory structure and organization +- Existing code patterns (class-based, functional, MVC) +- Naming conventions +- Test frameworks and patterns +- Code style configurations + +### Convention Confirmation + +Quick Spec Flow detects your conventions and **asks for confirmation**: + +``` +I've detected these conventions in your codebase: + +Code Style: +- ESLint with Airbnb config +- Prettier with single quotes + +Test Patterns: +- Jest test framework +- .test.js file naming + +Should I follow these existing conventions? (yes/no) +``` + +**You decide:** Conform to existing patterns or establish new standards! + +--- + +## Auto-Validation + +Quick Spec Flow **automatically validates** everything: + +- ✅ Context gathering completeness +- ✅ Definitiveness (no "use X or Y" statements) +- ✅ Brownfield integration quality +- ✅ Stack alignment +- ✅ Implementation readiness + +--- + +## Comparison: Quick Flow vs Full BMM + +| Aspect | Quick Flow Track | BMad Method/Enterprise Tracks | +| --------------------- | ---------------------------- | ---------------------------------- | +| **Setup** | None (standalone) | workflow-init recommended | +| **Planning Docs** | tech-spec.md only | Product Brief → PRD → Architecture | +| **Time to Code** | Minutes | Hours to days | +| **Best For** | Bug fixes, small features | New products, major features | +| **Context Discovery** | Automatic | Manual + guided | +| **Validation** | Auto-validates everything | Manual validation steps | +| **Brownfield** | Auto-analyzes and conforms | Manual documentation required | + +--- + +## When to Graduate to BMad Method + +Start with Quick Flow, but switch to BMad Method when: + +- ❌ Project grows beyond initial scope +- ❌ Multiple teams need coordination +- ❌ Stakeholders need formal documentation +- ❌ Product vision is unclear +- ❌ Architectural decisions need deep analysis +- ❌ Compliance/regulatory requirements exist + +💡 **Tip:** You can always run `workflow-init` later to transition from Quick Flow to BMad Method! + +--- + +## Related + +- [Create Tech Spec](../../how-to/workflows/create-tech-spec.md) - How to use Quick Flow +- [Quick Start Guide](../../tutorials/getting-started/getting-started-bmadv6.md) - Getting started +- [Four Phases](../architecture/four-phases.md) - Understanding the full methodology diff --git a/docs/explanation/features/tea-overview.md b/docs/explanation/features/tea-overview.md new file mode 100644 index 00000000..b8666cb8 --- /dev/null +++ b/docs/explanation/features/tea-overview.md @@ -0,0 +1,218 @@ +--- +title: "Test Architect (TEA) Overview" +description: Understanding the Test Architect (TEA) agent and its role in BMad Method +--- + + +The Test Architect (TEA) is a specialized agent focused on quality strategy, test automation, and release gates in BMad Method projects. + +## Overview + +- **Persona:** Murat, Master Test Architect and Quality Advisor focused on risk-based testing, fixture architecture, ATDD, and CI/CD governance. +- **Mission:** Deliver actionable quality strategies, automation coverage, and gate decisions that scale with project complexity and compliance demands. +- **Use When:** BMad Method or Enterprise track projects, integration risk is non-trivial, brownfield regression risk exists, or compliance/NFR evidence is required. (Quick Flow projects typically don't require TEA) + +--- + +## Choose Your TEA Engagement Model + +BMad does not mandate TEA. There are five valid ways to use it (or skip it). Pick one intentionally. + +1. **No TEA** + - Skip all TEA workflows. Use your existing team testing approach. + +2. **TEA-only (Standalone)** + - Use TEA on a non-BMad project. Bring your own requirements, acceptance criteria, and environments. + - Typical sequence: `*test-design` (system or epic) -> `*atdd` and/or `*automate` -> optional `*test-review` -> `*trace` for coverage and gate decisions. + - Run `*framework` or `*ci` only if you want TEA to scaffold the harness or pipeline. + +3. **Integrated: Greenfield - BMad Method (Simple/Standard Work)** + - Phase 3: system-level `*test-design`, then `*framework` and `*ci`. + - Phase 4: per-epic `*test-design`, optional `*atdd`, then `*automate` and optional `*test-review`. + - Gate (Phase 2): `*trace`. + +4. **Integrated: Brownfield - BMad Method or Enterprise (Simple or Complex)** + - Phase 2: baseline `*trace`. + - Phase 3: system-level `*test-design`, then `*framework` and `*ci`. + - Phase 4: per-epic `*test-design` focused on regression and integration risks. + - Gate (Phase 2): `*trace`; `*nfr-assess` (if not done earlier). + - For brownfield BMad Method, follow the same flow with `*nfr-assess` optional. + +5. **Integrated: Greenfield - Enterprise Method (Enterprise/Compliance Work)** + - Phase 2: `*nfr-assess`. + - Phase 3: system-level `*test-design`, then `*framework` and `*ci`. + - Phase 4: per-epic `*test-design`, plus `*atdd`/`*automate`/`*test-review`. + - Gate (Phase 2): `*trace`; archive artifacts as needed. + +If you are unsure, default to the integrated path for your track and adjust later. + +--- + +## TEA Workflow Lifecycle + +TEA integrates into the BMad development lifecycle during Solutioning (Phase 3) and Implementation (Phase 4): + +```mermaid +%%{init: {'theme':'base', 'themeVariables': { 'primaryColor':'#fff','primaryTextColor':'#000','primaryBorderColor':'#000','lineColor':'#000','secondaryColor':'#fff','tertiaryColor':'#fff','fontSize':'16px','fontFamily':'arial'}}}%% +graph TB + subgraph Phase2["Phase 2: PLANNING"] + PM["PM: *prd (creates PRD with FRs/NFRs)"] + PlanNote["Business requirements phase"] + NFR2["TEA: *nfr-assess (optional, enterprise)"] + PM -.-> NFR2 + NFR2 -.-> PlanNote + PM -.-> PlanNote + end + + subgraph Phase3["Phase 3: SOLUTIONING"] + Architecture["Architect: *architecture"] + EpicsStories["PM/Architect: *create-epics-and-stories"] + TestDesignSys["TEA: *test-design (system-level)"] + Framework["TEA: *framework (optional if needed)"] + CI["TEA: *ci (optional if needed)"] + GateCheck["Architect: *implementation-readiness"] + Architecture --> EpicsStories + Architecture --> TestDesignSys + TestDesignSys --> Framework + EpicsStories --> Framework + Framework --> CI + CI --> GateCheck + Phase3Note["Epics created AFTER architecture,
then system-level test design and test infrastructure setup"] + EpicsStories -.-> Phase3Note + end + + subgraph Phase4["Phase 4: IMPLEMENTATION - Per Epic Cycle"] + SprintPlan["SM: *sprint-planning"] + TestDesign["TEA: *test-design (per epic)"] + CreateStory["SM: *create-story"] + ATDD["TEA: *atdd (optional, before dev)"] + DevImpl["DEV: implements story"] + Automate["TEA: *automate"] + TestReview1["TEA: *test-review (optional)"] + Trace1["TEA: *trace (refresh coverage)"] + + SprintPlan --> TestDesign + TestDesign --> CreateStory + CreateStory --> ATDD + ATDD --> DevImpl + DevImpl --> Automate + Automate --> TestReview1 + TestReview1 --> Trace1 + Trace1 -.->|next story| CreateStory + TestDesignNote["Test design: 'How do I test THIS epic?'
Creates test-design-epic-N.md per epic"] + TestDesign -.-> TestDesignNote + end + + subgraph Gate["EPIC/RELEASE GATE"] + NFR["TEA: *nfr-assess (if not done earlier)"] + TestReview2["TEA: *test-review (final audit, optional)"] + TraceGate["TEA: *trace - Phase 2: Gate"] + GateDecision{"Gate Decision"} + + NFR --> TestReview2 + TestReview2 --> TraceGate + TraceGate --> GateDecision + GateDecision -->|PASS| Pass["PASS ✅"] + GateDecision -->|CONCERNS| Concerns["CONCERNS ⚠️"] + GateDecision -->|FAIL| Fail["FAIL ❌"] + GateDecision -->|WAIVED| Waived["WAIVED ⏭️"] + end + + Phase2 --> Phase3 + Phase3 --> Phase4 + Phase4 --> Gate + + style Phase2 fill:#bbdefb,stroke:#0d47a1,stroke-width:3px,color:#000 + style Phase3 fill:#c8e6c9,stroke:#2e7d32,stroke-width:3px,color:#000 + style Phase4 fill:#e1bee7,stroke:#4a148c,stroke-width:3px,color:#000 + style Gate fill:#ffe082,stroke:#f57c00,stroke-width:3px,color:#000 + style Pass fill:#4caf50,stroke:#1b5e20,stroke-width:3px,color:#000 + style Concerns fill:#ffc107,stroke:#f57f17,stroke-width:3px,color:#000 + style Fail fill:#f44336,stroke:#b71c1c,stroke-width:3px,color:#000 + style Waived fill:#9c27b0,stroke:#4a148c,stroke-width:3px,color:#000 +``` + +**Phase Numbering Note:** BMad uses a 4-phase methodology with optional Phase 1 and documentation prerequisite: + +- **Documentation** (Optional for brownfield): Prerequisite using `*document-project` +- **Phase 1** (Optional): Discovery/Analysis (`*brainstorm`, `*research`, `*product-brief`) +- **Phase 2** (Required): Planning (`*prd` creates PRD with FRs/NFRs) +- **Phase 3** (Track-dependent): Solutioning (`*architecture` → `*test-design` (system-level) → `*create-epics-and-stories` → TEA: `*framework`, `*ci` → `*implementation-readiness`) +- **Phase 4** (Required): Implementation (`*sprint-planning` → per-epic: `*test-design` → per-story: dev workflows) + +**TEA workflows:** `*framework` and `*ci` run once in Phase 3 after architecture. `*test-design` is **dual-mode**: + +- **System-level (Phase 3):** Run immediately after architecture/ADR drafting to produce `test-design-system.md` (testability review, ADR → test mapping, Architecturally Significant Requirements (ASRs), environment needs). Feeds the implementation-readiness gate. +- **Epic-level (Phase 4):** Run per-epic to produce `test-design-epic-N.md` (risk, priorities, coverage plan). + +Quick Flow track skips Phases 1 and 3. +BMad Method and Enterprise use all phases based on project needs. +When an ADR or architecture draft is produced, run `*test-design` in **system-level** mode before the implementation-readiness gate. This ensures the ADR has an attached testability review and ADR → test mapping. Keep the test-design updated if ADRs change. + +--- + +## Why TEA is Different from Other BMM Agents + +TEA is the only BMM agent that operates in **multiple phases** (Phase 3 and Phase 4) and has its own **knowledge base architecture**. + +### Phase-Specific Agents (Standard Pattern) + +Most BMM agents work in a single phase: + +- **Phase 1 (Analysis)**: Analyst agent +- **Phase 2 (Planning)**: PM agent +- **Phase 3 (Solutioning)**: Architect agent +- **Phase 4 (Implementation)**: SM, DEV agents + +### TEA: Multi-Phase Quality Agent (Unique Pattern) + +TEA is **the only agent that operates in multiple phases**: + +``` +Phase 1 (Analysis) → [TEA not typically used] + ↓ +Phase 2 (Planning) → [PM defines requirements - TEA not active] + ↓ +Phase 3 (Solutioning) → TEA: *framework, *ci (test infrastructure AFTER architecture) + ↓ +Phase 4 (Implementation) → TEA: *test-design (per epic: "how do I test THIS feature?") + → TEA: *atdd, *automate, *test-review, *trace (per story) + ↓ +Epic/Release Gate → TEA: *nfr-assess, *trace Phase 2 (release decision) +``` + +### TEA's 8 Workflows Across Phases + +**Standard agents**: 1-3 workflows per phase +**TEA**: 8 workflows across Phase 3, Phase 4, and Release Gate + +| Phase | TEA Workflows | Frequency | Purpose | +| ----------- | --------------------------------------------------------- | ---------------- | ---------------------------------------------- | +| **Phase 2** | (none) | - | Planning phase - PM defines requirements | +| **Phase 3** | \*framework, \*ci | Once per project | Setup test infrastructure AFTER architecture | +| **Phase 4** | \*test-design, \*atdd, \*automate, \*test-review, \*trace | Per epic/story | Test planning per epic, then per-story testing | +| **Release** | \*nfr-assess, \*trace (Phase 2: gate) | Per epic/release | Go/no-go decision | + +**Note**: `*trace` is a two-phase workflow: Phase 1 (traceability) + Phase 2 (gate decision). This reduces cognitive load while maintaining natural workflow. + +--- + +## TEA Command Catalog + +| Command | Primary Outputs | Notes | +| -------------- | --------------------------------------------------------------------------------------------- | ---------------------------------------------------- | +| `*framework` | Playwright/Cypress scaffold, `.env.example`, `.nvmrc`, sample specs | Use when no production-ready harness exists | +| `*ci` | CI workflow, selective test scripts, secrets checklist | Platform-aware (GitHub Actions default) | +| `*test-design` | Combined risk assessment, mitigation plan, and coverage strategy | Risk scoring + optional exploratory mode | +| `*atdd` | Failing acceptance tests + implementation checklist | TDD red phase + optional recording mode | +| `*automate` | Prioritized specs, fixtures, README/script updates, DoD summary | Optional healing/recording, avoid duplicate coverage | +| `*test-review` | Test quality review report with 0-100 score, violations, fixes | Reviews tests against knowledge base patterns | +| `*nfr-assess` | NFR assessment report with actions | Focus on security/performance/reliability | +| `*trace` | Phase 1: Coverage matrix, recommendations. Phase 2: Gate decision (PASS/CONCERNS/FAIL/WAIVED) | Two-phase workflow: traceability + gate decision | + +--- + +## Related Documentation + +- [Setup Test Framework](../../how-to/workflows/setup-test-framework.md) - How to set up testing infrastructure +- [Run Test Design](../../how-to/workflows/run-test-design.md) - Creating test plans diff --git a/docs/bmad-core-concepts/web-bundles/index.md b/docs/explanation/features/web-bundles.md similarity index 97% rename from docs/bmad-core-concepts/web-bundles/index.md rename to docs/explanation/features/web-bundles.md index c1353098..aeef17e1 100644 --- a/docs/bmad-core-concepts/web-bundles/index.md +++ b/docs/explanation/features/web-bundles.md @@ -1,4 +1,7 @@ -# Web Bundles +--- +title: "Web Bundles" +--- + Use BMAD agents in Gemini Gems and Custom GPTs. diff --git a/docs/modules/bmgd-bmad-game-dev/agents-guide.md b/docs/explanation/game-dev/agents.md similarity index 97% rename from docs/modules/bmgd-bmad-game-dev/agents-guide.md rename to docs/explanation/game-dev/agents.md index 40311984..8d07d7af 100644 --- a/docs/modules/bmgd-bmad-game-dev/agents-guide.md +++ b/docs/explanation/game-dev/agents.md @@ -1,4 +1,7 @@ -# BMGD Agents Guide +--- +title: "BMGD Agents Guide" +--- + Complete reference for BMGD's six specialized game development agents. @@ -402,6 +405,6 @@ The `project-context.md` file (if present) serves as the authoritative source fo ## Next Steps -- **[Quick Start Guide](./quick-start.md)** - Get started with BMGD -- **[Workflows Guide](./workflows-guide.md)** - Detailed workflow reference -- **[Game Types Guide](./game-types-guide.md)** - Game type templates +- **[Quick Start Guide](../../tutorials/getting-started/quick-start-bmgd.md)** - Get started with BMGD +- **[Workflows Guide](../../reference/workflows/index.md)** - Detailed workflow reference +- **[Game Types Guide](../../explanation/game-dev/game-types.md)** - Game type templates diff --git a/docs/explanation/game-dev/bmgd-vs-bmm.md b/docs/explanation/game-dev/bmgd-vs-bmm.md new file mode 100644 index 00000000..a5f5588a --- /dev/null +++ b/docs/explanation/game-dev/bmgd-vs-bmm.md @@ -0,0 +1,150 @@ +--- +title: "BMGD vs BMM" +description: Understanding the differences between BMGD and BMM +--- + + +BMGD (BMad Game Development) extends BMM (BMad Method) with game-specific capabilities. This page explains the key differences. + +--- + +## Quick Comparison + +| Aspect | BMM | BMGD | +| -------------- | ------------------------------------- | ------------------------------------------------------------------------ | +| **Focus** | General software | Game development | +| **Agents** | PM, Architect, Dev, SM, TEA, Solo Dev | Game Designer, Game Dev, Game Architect, Game SM, Game QA, Game Solo Dev | +| **Planning** | PRD, Tech Spec | Game Brief, GDD | +| **Types** | N/A | 24 game type templates | +| **Narrative** | N/A | Full narrative workflow | +| **Testing** | Web-focused | Engine-specific (Unity, Unreal, Godot) | +| **Production** | BMM workflows | BMM workflows with game overrides | + +--- + +## Agent Differences + +### BMM Agents +- PM (Product Manager) +- Architect +- DEV (Developer) +- SM (Scrum Master) +- TEA (Test Architect) +- Quick Flow Solo Dev + +### BMGD Agents +- Game Designer +- Game Developer +- Game Architect +- Game Scrum Master +- Game QA +- Game Solo Dev + +BMGD agents understand game-specific concepts like: +- Game mechanics and balance +- Player psychology +- Engine-specific patterns +- Playtesting and QA + +--- + +## Planning Documents + +### BMM Planning +- **Product Brief** → **PRD** → **Architecture** +- Focus: Software requirements, user stories, system design + +### BMGD Planning +- **Game Brief** → **GDD** → **Architecture** +- Focus: Game vision, mechanics, narrative, player experience + +The GDD (Game Design Document) includes: +- Core gameplay loop +- Mechanics and systems +- Progression and balance +- Art and audio direction +- Genre-specific sections + +--- + +## Game Type Templates + +BMGD includes 24 game type templates that auto-configure GDD sections: + +- Action, Adventure, Puzzle +- RPG, Strategy, Simulation +- Sports, Racing, Fighting +- Horror, Platformer, Shooter +- And more... + +Each template provides: +- Genre-specific GDD sections +- Relevant mechanics patterns +- Testing considerations +- Common pitfalls to avoid + +--- + +## Narrative Support + +BMGD includes full narrative workflow for story-driven games: + +- **Narrative Design** workflow +- Story structure templates +- Character development +- World-building guidelines +- Dialogue systems + +BMM has no equivalent for narrative design. + +--- + +## Testing Differences + +### BMM Testing (TEA) +- Web-focused (Playwright, Cypress) +- API testing +- E2E for web applications + +### BMGD Testing (Game QA) +- Engine-specific frameworks (Unity, Unreal, Godot) +- Gameplay testing +- Performance profiling +- Playtest planning +- Balance validation + +--- + +## Production Workflow + +BMGD production workflows **inherit from BMM** and add game-specific: +- Checklists +- Templates +- Quality gates +- Engine-specific considerations + +This means you get all of BMM's implementation structure plus game-specific enhancements. + +--- + +## When to Use Each + +### Use BMM when: +- Building web applications +- Creating APIs and services +- Developing mobile apps (non-game) +- Any general software project + +### Use BMGD when: +- Building video games +- Creating interactive experiences +- Game prototyping +- Game jams + +--- + +## Related + +- [BMGD Overview](./index.md) - Getting started with BMGD +- [Game Types Guide](./game-types.md) - Understanding game templates +- [Quick Start BMGD](../../tutorials/getting-started/quick-start-bmgd.md) - Tutorial diff --git a/docs/modules/bmgd-bmad-game-dev/game-types-guide.md b/docs/explanation/game-dev/game-types.md similarity index 96% rename from docs/modules/bmgd-bmad-game-dev/game-types-guide.md rename to docs/explanation/game-dev/game-types.md index f66bb538..9de71c96 100644 --- a/docs/modules/bmgd-bmad-game-dev/game-types-guide.md +++ b/docs/explanation/game-dev/game-types.md @@ -1,4 +1,7 @@ -# BMGD Game Types Guide +--- +title: "BMGD Game Types Guide" +--- + Reference for selecting and using BMGD's 24 supported game type templates. @@ -498,6 +501,6 @@ When you select a game type, BMGD adds these GDD sections: ## Next Steps -- **[Quick Start Guide](./quick-start.md)** - Get started with BMGD -- **[Workflows Guide](./workflows-guide.md)** - GDD workflow details -- **[Glossary](./glossary.md)** - Game development terminology +- **[Quick Start Guide](../../tutorials/getting-started/quick-start-bmgd.md)** - Get started with BMGD +- **[Workflows Guide](../../reference/workflows/bmgd-workflows.md)** - GDD workflow details +- **[Glossary](../../reference/glossary/index.md)** - Game development terminology diff --git a/docs/explanation/game-dev/index.md b/docs/explanation/game-dev/index.md new file mode 100644 index 00000000..a85c6bac --- /dev/null +++ b/docs/explanation/game-dev/index.md @@ -0,0 +1,85 @@ +--- +title: "BMGD - Game Development Module" +description: AI-powered workflows for game design and development with BMGD +--- + + +Complete guides for the BMad Game Development Module (BMGD) - AI-powered workflows for game design and development that adapt to your project's needs. + +--- + +## Getting Started + +**New to BMGD?** Start here: + +- **[Quick Start Guide](../../tutorials/getting-started/quick-start-bmgd.md)** - Get started building your first game + - Installation and setup + - Understanding the game development phases + - Running your first workflows + - Agent-based development flow + +**Quick Path:** Install BMGD module → Game Brief → GDD → Architecture → Build + +--- + +## Core Documentation + +- **[Game Types Guide](./game-types.md)** - Selecting and using game type templates (24 supported types) +- **[BMGD vs BMM](./bmgd-vs-bmm.md)** - Understanding the differences + +--- + +## Game Development Phases + +BMGD follows four phases aligned with game development: + +### Phase 1: Preproduction +- **Brainstorm Game** - Ideation with game-specific techniques +- **Game Brief** - Capture vision, market, and fundamentals + +### Phase 2: Design +- **GDD (Game Design Document)** - Comprehensive game design +- **Narrative Design** - Story, characters, world (for story-driven games) + +### Phase 3: Technical +- **Game Architecture** - Engine, systems, patterns, structure + +### Phase 4: Production +- **Sprint Planning** - Epic and story management +- **Story Development** - Implementation workflow +- **Code Review** - Quality assurance +- **Testing** - Automated tests, playtesting, performance +- **Retrospective** - Continuous improvement + +--- + +## Choose Your Path + +### I need to... + +**Start a new game project** +→ Start with [Quick Start Guide](../../tutorials/getting-started/quick-start-bmgd.md) +→ Run `brainstorm-game` for ideation +→ Create a Game Brief with `create-brief` + +**Design my game** +→ Create a GDD with `create-gdd` +→ If story-heavy, add Narrative Design with `create-narrative` + +**Plan the technical architecture** +→ Run `create-architecture` with the Game Architect + +**Build my game** +→ Use Phase 4 production workflows +→ Follow the sprint-based development cycle + +**Quickly test an idea** +→ Use [Quick-Flow](../../how-to/workflows/bmgd-quick-flow.md) for rapid prototyping + +--- + +## Related + +- [Game Types Guide](./game-types.md) - Understanding game type templates +- [BMGD vs BMM](./bmgd-vs-bmm.md) - Comparison with core method +- [Glossary](../../reference/glossary/index.md) - Terminology reference diff --git a/docs/explanation/index.md b/docs/explanation/index.md new file mode 100644 index 00000000..cbcd9f83 --- /dev/null +++ b/docs/explanation/index.md @@ -0,0 +1,35 @@ +--- +title: "Explanation" +--- + + +Understanding-oriented content that explains concepts, architecture, and the reasoning behind BMAD's design. + +## Core Concepts + +Foundational concepts you need to understand BMAD. + +- [What are Agents?](./core-concepts/what-are-agents.md) +- [What are Workflows?](./core-concepts/what-are-workflows.md) +- [What are Modules?](./core-concepts/what-are-modules.md) + +## Architecture + +How BMAD is designed and why. + +## Philosophy + +The thinking behind BMAD's approach. + +## Features + +Deep dives into specific BMAD features. + +- [Party Mode](./features/party-mode.md) +- [Brainstorming Techniques](./features/brainstorming-techniques.md) +- [Advanced Elicitation](./features/advanced-elicitation.md) +- [Web Bundles](./features/web-bundles.md) + +## Modules + +Explanations of BMAD's module ecosystem. diff --git a/docs/explanation/philosophy/facilitation-over-generation.md b/docs/explanation/philosophy/facilitation-over-generation.md new file mode 100644 index 00000000..09c6e6bb --- /dev/null +++ b/docs/explanation/philosophy/facilitation-over-generation.md @@ -0,0 +1,121 @@ +--- +title: "Facilitation Over Generation" +description: Understanding CIS's facilitation-first approach to creative work +--- + + +The Creative Intelligence Suite (CIS) takes a fundamentally different approach from typical AI tools. Instead of generating solutions directly, CIS agents act as master facilitators who guide you to discover insights yourself. + +--- + +## The Problem with Generation + +Traditional AI approaches to creative work: + +``` +User: "Give me marketing ideas" +AI: "Here are 10 marketing ideas..." +``` + +This approach: +- Produces generic, predictable outputs +- Removes human ownership of ideas +- Misses context and nuance +- Limits creative exploration + +--- + +## The Facilitation Approach + +CIS agents use strategic questioning: + +``` +User: "I need marketing ideas" +CIS: "What makes your customers choose you over alternatives? + What's the one thing they always mention?" +User: "They say our support is exceptional" +CIS: "Interesting! How might you make that exceptional + support visible before they become customers?" +``` + +This approach: +- Draws out insights already within you +- Maintains human ownership of ideas +- Captures context and nuance +- Enables deeper creative exploration + +--- + +## Key Principles + +### 1. Questions Over Answers + +CIS agents ask strategic questions rather than providing direct answers. This: +- Activates your own creative thinking +- Uncovers assumptions +- Reveals blind spots +- Builds on your domain knowledge + +### 2. Energy-Aware Sessions + +CIS monitors engagement and adapts: +- Adjusts pace when energy flags +- Suggests breaks when needed +- Changes techniques to maintain momentum +- Recognizes productive vs. unproductive struggle + +### 3. Process Trust + +CIS uses proven methodologies: +- Design Thinking's 5 phases +- Structured brainstorming techniques +- Root cause analysis frameworks +- Innovation strategy patterns + +You're not just having a conversation—you're following time-tested creative processes. + +### 4. Persona-Driven Engagement + +Each CIS agent has a distinct personality: +- **Carson** - Energetic, encouraging +- **Maya** - Jazz-like, improvisational +- **Dr. Quinn** - Analytical, methodical +- **Victor** - Bold, strategic +- **Sophia** - Narrative, imaginative + +These personas create engaging experiences that maintain creative flow. + +--- + +## When Generation is Appropriate + +CIS does generate when appropriate: +- Synthesizing session outputs +- Documenting decisions +- Creating structured artifacts +- Providing technique examples + +But the core creative work happens through facilitated discovery. + +--- + +## Benefits + +### For Individuals +- Deeper insights than pure generation +- Ownership of creative outputs +- Skill development in creative thinking +- More memorable and actionable ideas + +### For Teams +- Shared creative experience +- Aligned understanding +- Documented rationale +- Stronger buy-in to outcomes + +--- + +## Related + +- [Creative Intelligence Suite](../creative-intelligence/index.md) - CIS overview +- [Brainstorming Techniques](../features/brainstorming-techniques.md) - Available techniques diff --git a/docs/how-to/brownfield/add-feature-to-existing.md b/docs/how-to/brownfield/add-feature-to-existing.md new file mode 100644 index 00000000..d189a316 --- /dev/null +++ b/docs/how-to/brownfield/add-feature-to-existing.md @@ -0,0 +1,91 @@ +--- +title: "How to Add a Feature to an Existing Project" +description: How to add new features to an existing brownfield project +--- + + +Add new functionality to your brownfield codebase while respecting existing patterns and architecture. + +--- + +## When to Use This + +- Adding a new feature to an existing codebase +- Major enhancements that need proper planning +- Features that touch multiple parts of the system + +--- + +## Prerequisites + +- BMad Method installed +- Existing project documentation (run `document-project` first if needed) +- Clear understanding of what you want to build + +--- + +## Steps + +### 1. Run workflow-init + +``` +Run workflow-init +``` + +The workflow should recognize you're in an existing project. If not, explicitly clarify that this is brownfield development. + +### 2. Choose Your Approach + +| Feature Scope | Recommended Approach | +|---------------|---------------------| +| Small (1-5 stories) | Quick Flow with tech-spec | +| Medium (5-15 stories) | BMad Method with PRD | +| Large (15+ stories) | Full BMad Method with architecture | + +### 3. Create Planning Documents + +**For Quick Flow:** +- Load PM agent +- Run tech-spec workflow +- The agent will analyze your existing codebase and create a context-aware spec + +**For BMad Method:** +- Load PM agent +- Run PRD workflow +- Ensure the agent reads your existing documentation +- Review that integration points are clearly identified + +### 4. Consider Architecture Impact + +If your feature affects system architecture: + +- Load Architect agent +- Run architecture workflow +- Ensure alignment with existing patterns +- Document any new ADRs (Architecture Decision Records) + +### 5. Implement + +Follow the standard Phase 4 implementation workflows: + +1. `sprint-planning` - Organize your work +2. `create-story` - Prepare each story +3. `dev-story` - Implement with tests +4. `code-review` - Quality assurance + +--- + +## Tips + +- Always ensure agents read your existing documentation +- Pay attention to integration points with existing code +- Follow existing conventions unless deliberately changing them +- Document why you're adding new patterns (if any) + +--- + +## Related + +- [Brownfield Development Guide](./index.md) +- [Document Existing Project](./document-existing-project.md) +- [Quick Fix in Brownfield](./quick-fix-in-brownfield.md) diff --git a/docs/how-to/brownfield/document-existing-project.md b/docs/how-to/brownfield/document-existing-project.md new file mode 100644 index 00000000..08e1f370 --- /dev/null +++ b/docs/how-to/brownfield/document-existing-project.md @@ -0,0 +1,84 @@ +--- +title: "How to Document an Existing Project" +description: How to document an existing brownfield codebase using BMad Method +--- + + +Use the `document-project` workflow to scan your entire codebase and generate comprehensive documentation about its current state. + +--- + +## When to Use This + +- Starting work on an undocumented legacy project +- Documentation is outdated and needs refresh +- AI agents need context about existing code patterns +- Onboarding new team members + +--- + +## Prerequisites + +- BMad Method installed in your project +- Access to the codebase you want to document + +--- + +## Steps + +### 1. Load the Analyst Agent + +Start a fresh chat and load the Analyst agent. + +### 2. Run the document-project Workflow + +Tell the agent: + +``` +Run the document-project workflow +``` + +### 3. Let the Agent Scan Your Codebase + +The workflow will: + +- Scan your codebase structure +- Identify architecture patterns +- Document the technology stack +- Create reference documentation +- Generate a PRD-like document from existing code + +### 4. Review the Generated Documentation + +The output will be saved to `project-documentation-{date}.md` in your output folder. + +Review the documentation for: + +- Accuracy of detected patterns +- Completeness of architecture description +- Any missing business rules or intent + +--- + +## What You Get + +- **Project overview** - High-level description of what the project does +- **Technology stack** - Detected frameworks, libraries, and tools +- **Architecture patterns** - Code organization and design patterns found +- **Business rules** - Logic extracted from the codebase +- **Integration points** - External APIs and services + +--- + +## Tips + +- Run this before any major brownfield work +- Keep the documentation updated as the project evolves +- Use it as input for future PRD creation + +--- + +## Related + +- [Brownfield Development Guide](./index.md) +- [Add Feature to Existing Project](./add-feature-to-existing.md) diff --git a/docs/modules/bmm-bmad-method/brownfield-guide.md b/docs/how-to/brownfield/index.md similarity index 61% rename from docs/modules/bmm-bmad-method/brownfield-guide.md rename to docs/how-to/brownfield/index.md index 076303ae..54555771 100644 --- a/docs/modules/bmm-bmad-method/brownfield-guide.md +++ b/docs/how-to/brownfield/index.md @@ -1,23 +1,41 @@ -# BMad Method Brownfield Development Guide +--- +title: "Brownfield Development" +description: How to use BMad Method on existing codebases +--- -## Working on Existing Projects -If you have completed your initial PRD on a new project and want to add new features, or if you have a legacy project you are maintaining, you will want to follow the brownfield process. +How to effectively use BMad Method when working on existing projects and legacy codebases. -This document is intentionally brief, focusing only on what differs from the standard greenfield flow. +## What is Brownfield Development? + +**Brownfield** refers to working on existing projects with established codebases and patterns, as opposed to **greenfield** which means starting from scratch with a clean slate. + +This tutorial covers the essential workflow for onboarding to brownfield projects with BMad Method. --- -## 1. Clean Up Completed Planning Artifacts +## Prerequisites + +- BMad Method installed (`npx bmad-method install`) +- An existing codebase you want to work on +- Access to an AI-powered IDE (Claude Code, Cursor, or Windsurf) + +--- + +## Step 1: Clean Up Completed Planning Artifacts If you have completed all PRD epics and stories through the BMad process, clean up those files. Archive them, delete them, or rely on version history if needed. Do not keep these files in: + - `docs/` - `_bmad-output/planning-artifacts/` - `_bmad-output/implementation-artifacts/` -## 2. Maintain Quality Project Documentation +--- + +## Step 2: Maintain Quality Project Documentation Your `docs/` folder should contain succinct, well-organized documentation that accurately represents your project: + - Intent and business rationale - Business rules - Architecture @@ -25,7 +43,9 @@ Your `docs/` folder should contain succinct, well-organized documentation that a For complex projects, consider using the `document-project` workflow. It offers runtime variants that will scan your entire project and document its actual current state. -## 3. Initialize for Brownfield Work +--- + +## Step 3: Initialize for Brownfield Work Run `workflow-init`. It should recognize you are in an existing project. If not, explicitly clarify that this is brownfield development for a new feature. @@ -41,6 +61,7 @@ You have two primary options depending on the scope of changes: ### During PRD Creation When creating a brief or jumping directly into the PRD, ensure the agent: + - Finds and analyzes your existing project documentation - Reads the proper context about your current system @@ -49,6 +70,7 @@ You can guide the agent explicitly, but the goal is to ensure the new feature in ### UX Considerations UX work is optional. The decision depends not on whether your project has a UX, but on: + - Whether you will be working on UX changes - Whether significant new UX designs or patterns are needed @@ -57,6 +79,7 @@ If your changes amount to simple updates to existing screens you are happy with, ### Architecture Considerations When doing architecture, ensure the architect: + - Uses the proper documented files - Scans the existing codebase @@ -64,15 +87,16 @@ Pay close attention here to prevent reinventing the wheel or making decisions th --- -## 4. Ad-Hoc Changes +## Next Steps -Not everything requires the full BMad method or even quick-flow. For bug fixes, refactorings, or small targeted changes, simply talk to the agent and have it make the changes directly. This is also a good way to learn about your codebase and understand the modifications being made. +- **[Document Existing Project](../../how-to/brownfield/document-existing-project.md)** - How to document your brownfield codebase +- **[Add Feature to Existing Project](../../how-to/brownfield/add-feature-to-existing.md)** - Adding new functionality +- **[Quick Fix in Brownfield](../../how-to/brownfield/quick-fix-in-brownfield.md)** - Bug fixes and ad-hoc changes +- **[Brownfield FAQ](../../explanation/faq/brownfield-faq.md)** - Common questions about brownfield development --- -## 5. Learn and Explore +## Related Documentation -Remember, LLMs are excellent at interpreting and analyzing code—whether it was AI-generated or not. Use the agent to: -- Learn about your project -- Understand how things are built -- Explore unfamiliar parts of the codebase \ No newline at end of file +- [Quick Start Guide](../../tutorials/getting-started/getting-started-bmadv6.md) - Getting started with BMM +- [Quick Spec Flow](../../explanation/features/quick-flow.md) - Fast path for small changes diff --git a/docs/how-to/brownfield/quick-fix-in-brownfield.md b/docs/how-to/brownfield/quick-fix-in-brownfield.md new file mode 100644 index 00000000..2cc2dc30 --- /dev/null +++ b/docs/how-to/brownfield/quick-fix-in-brownfield.md @@ -0,0 +1,94 @@ +--- +title: "How to Make Quick Fixes in Brownfield Projects" +description: How to make quick fixes and ad-hoc changes in brownfield projects +--- + + +Not everything requires the full BMad method or even Quick Flow. For bug fixes, refactorings, or small targeted changes, you can work directly with the agent. + +--- + +## When to Use This + +- Bug fixes +- Small refactorings +- Targeted code improvements +- Learning about your codebase +- One-off changes that don't need planning + +--- + +## Steps + +### 1. Load an Agent + +For quick fixes, you can use: + +- **DEV agent** - For implementation-focused work +- **Quick Flow Solo Dev** - For slightly larger changes that still need a tech-spec + +### 2. Describe the Change + +Simply tell the agent what you need: + +``` +Fix the login validation bug that allows empty passwords +``` + +or + +``` +Refactor the UserService to use async/await instead of callbacks +``` + +### 3. Let the Agent Work + +The agent will: + +- Analyze the relevant code +- Propose a solution +- Implement the change +- Run tests (if available) + +### 4. Review and Commit + +Review the changes made and commit when satisfied. + +--- + +## Learning Your Codebase + +This approach is also excellent for exploring unfamiliar code: + +``` +Explain how the authentication system works in this codebase +``` + +``` +Show me where error handling happens in the API layer +``` + +LLMs are excellent at interpreting and analyzing code—whether it was AI-generated or not. Use the agent to: + +- Learn about your project +- Understand how things are built +- Explore unfamiliar parts of the codebase + +--- + +## When to Upgrade to Formal Planning + +Consider using Quick Flow or full BMad Method when: + +- The change affects multiple files or systems +- You're unsure about the scope +- The fix keeps growing in complexity +- You need documentation for the change + +--- + +## Related + +- [Brownfield Development Guide](./index.md) +- [Add Feature to Existing Project](./add-feature-to-existing.md) +- [Quick Spec Flow](../../explanation/features/quick-flow.md) diff --git a/docs/bmad-core-concepts/bmad-customization/agents.md b/docs/how-to/customization/customize-agents.md similarity index 90% rename from docs/bmad-core-concepts/bmad-customization/agents.md rename to docs/how-to/customization/customize-agents.md index a1997459..88577dbd 100644 --- a/docs/bmad-core-concepts/bmad-customization/agents.md +++ b/docs/how-to/customization/customize-agents.md @@ -1,4 +1,7 @@ -# Agent Customization Guide +--- +title: "Agent Customization Guide" +--- + Customize BMad agents without modifying core files. All customizations persist through updates. @@ -26,10 +29,8 @@ After editing, IT IS CRITICAL to rebuild the agent to apply changes: ```bash npx bmad-method@alpha install # and then select option to compile all agents -# OR for individual agent only npx bmad-method@alpha build -# Examples: npx bmad-method@alpha build bmm-dev npx bmad-method@alpha build core-bmad-master npx bmad-method@alpha build bmm-pm @@ -119,7 +120,6 @@ prompts: **Example 1: Customize Developer Agent for TDD** ```yaml -# _bmad/_config/agents/bmm-dev.customize.yaml agent: metadata: name: 'TDD Developer' @@ -135,7 +135,6 @@ critical_actions: **Example 2: Add Custom Deployment Workflow** ```yaml -# _bmad/_config/agents/bmm-dev.customize.yaml menu: - trigger: deploy-staging workflow: '{project-root}/_bmad/deploy-staging.yaml' @@ -148,7 +147,6 @@ menu: **Example 3: Multilingual Product Manager** ```yaml -# _bmad/_config/agents/bmm-pm.customize.yaml persona: role: 'Bilingual Product Manager' identity: 'Expert in US and LATAM markets' @@ -203,8 +201,8 @@ memories: ## Next Steps -- **[Learn about Agents](../agents.md)** - Understand Simple vs Expert agents -- **[Agent Creation Guide](../../modules/bmb-bmad-builder/agent-creation-guide.md)** - Build completely custom agents -- **[BMM Complete Documentation](../../modules/bmm-bmad-method/index)** - Full BMad Method reference +- **[Learn about Agents](../../explanation/core-concepts/what-are-agents.md)** - Understand Simple vs Expert agents +- **[Agent Creation Guide](../../tutorials/advanced/create-custom-agent.md)** - Build completely custom agents +- **[BMM Complete Documentation](../../explanation/bmm/index.md)** - Full BMad Method reference [← Back to Customization](./index.md) diff --git a/docs/bmad-core-concepts/bmad-customization/workflows.md b/docs/how-to/customization/customize-workflows.md similarity index 88% rename from docs/bmad-core-concepts/bmad-customization/workflows.md rename to docs/how-to/customization/customize-workflows.md index e5db06ba..22d3998f 100644 --- a/docs/bmad-core-concepts/bmad-customization/workflows.md +++ b/docs/how-to/customization/customize-workflows.md @@ -1,4 +1,7 @@ -# Workflow Customization Guide +--- +title: "Workflow Customization Guide" +--- + Customize and optimize workflows with step replacement and hooks. @@ -20,11 +23,11 @@ Workflow customization will allow you to: While workflow customization is in development, you can: - **Create Custom Workflows** - Use the BMAD Builder to create entirely new workflows -- **Customize Agents** - Modify agent behavior using [Agent Customization](./agents.md) +- **Customize Agents** - Modify agent behavior using [Agent Customization](./customize-agents.md) - **Provide Feedback** - Share your workflow customization needs with the community --- -**In the meantime:** Learn how to [create custom workflows](../../modules/bmb-bmad-builder/index) from scratch. +**In the meantime:** Learn how to [create custom workflows](../../explanation/bmad-builder/index.md) from scratch. [← Back to Customization](./index.md) diff --git a/docs/bmad-core-concepts/bmad-customization/index.md b/docs/how-to/customization/index.md similarity index 60% rename from docs/bmad-core-concepts/bmad-customization/index.md rename to docs/how-to/customization/index.md index ae4b33bb..12c3eca1 100644 --- a/docs/bmad-core-concepts/bmad-customization/index.md +++ b/docs/how-to/customization/index.md @@ -1,4 +1,7 @@ -# BMAD Customization +--- +title: "BMAD Customization" +--- + Personalize agents and workflows to match your needs. @@ -6,8 +9,8 @@ Personalize agents and workflows to match your needs. | Guide | Description | |-------|-------------| -| **[Agent Customization](./agents.md)** | Modify agent behavior without editing core files | -| **[Workflow Customization](./workflows.md)** | Customize and optimize workflows | +| **[Agent Customization](./customize-agents.md)** | Modify agent behavior without editing core files | +| **[Workflow Customization](./customize-workflows.md)** | Customize and optimize workflows | ## Overview @@ -21,6 +24,6 @@ Replace or extend workflow steps to create tailored processes. (Coming soon) --- -**Next:** Read the [Agent Customization Guide](./agents.md) to start personalizing your agents. +**Next:** Read the [Agent Customization Guide](./customize-agents.md) to start personalizing your agents. [← Back to Core Concepts](../index.md) diff --git a/docs/modules/core/document-sharding-guide.md b/docs/how-to/customization/shard-large-documents.md similarity index 81% rename from docs/modules/core/document-sharding-guide.md rename to docs/how-to/customization/shard-large-documents.md index 4480042a..ea1c51f0 100644 --- a/docs/modules/core/document-sharding-guide.md +++ b/docs/how-to/customization/shard-large-documents.md @@ -1,24 +1,17 @@ -# Document Sharding Guide +--- +title: "Document Sharding Guide" +--- + Comprehensive guide to BMad Method's document sharding system for managing large planning and architecture documents. ## Table of Contents -- [Document Sharding Guide](#document-sharding-guide) - - [Table of Contents](#table-of-contents) - - [What is Document Sharding?](#what-is-document-sharding) - - [Architecture](#architecture) - - [When to Use Sharding](#when-to-use-sharding) - - [Ideal Candidates](#ideal-candidates) - - [How Sharding Works](#how-sharding-works) - - [Sharding Process](#sharding-process) - - [Workflow Discovery](#workflow-discovery) - - [Using the Shard-Doc Tool](#using-the-shard-doc-tool) - - [CLI Command](#cli-command) - - [Interactive Process](#interactive-process) - - [What Gets Created](#what-gets-created) - - [Workflow Support](#workflow-support) - - [Universal Support](#universal-support) +- [What is Document Sharding?](#what-is-document-sharding) +- [When to Use Sharding](#when-to-use-sharding) +- [How Sharding Works](#how-sharding-works) +- [Using the Shard-Doc Tool](#using-the-shard-doc-tool) +- [Workflow Support](#workflow-support) ## What is Document Sharding? @@ -103,7 +96,6 @@ Agent: Sharding PRD.md... **index.md structure:** ```markdown -# PRD - Index ## Sections diff --git a/docs/modules/bmb-bmad-builder/workflow-vendoring-customization-inheritance.md b/docs/how-to/customization/vendor-workflows.md similarity index 97% rename from docs/modules/bmb-bmad-builder/workflow-vendoring-customization-inheritance.md rename to docs/how-to/customization/vendor-workflows.md index c661b2a4..3dfec9b1 100644 --- a/docs/modules/bmb-bmad-builder/workflow-vendoring-customization-inheritance.md +++ b/docs/how-to/customization/vendor-workflows.md @@ -1,4 +1,7 @@ -# Workflow Vendoring, Customization, and Inheritance (Official Support Consing Soon) +--- +title: "Workflow Vendoring, Customization, and Inheritance (Official Support Coming Soon)" +--- + Vendoring and Inheritance of workflows are 2 ways of sharing or reutilizing workflows - but with some key distinctions and use cases. diff --git a/docs/how-to/index.md b/docs/how-to/index.md new file mode 100644 index 00000000..3319781c --- /dev/null +++ b/docs/how-to/index.md @@ -0,0 +1,34 @@ +--- +title: "How-To Guides" +--- + + +Task-oriented guides that show you how to accomplish specific goals. Each guide assumes you already understand the basics. + +## Installation + +- [Upgrade to V6](./installation/upgrade-to-v6.md) +- [Install Custom Modules](./installation/install-custom-modules.md) + +## IDE Setup + +*Coming soon* + +## Customization + +- [Customize Agents](./customization/customize-agents.md) +- [Customize Workflows](./customization/customize-workflows.md) +- [Vendor Workflows](./customization/vendor-workflows.md) +- [Shard Large Documents](./customization/shard-large-documents.md) + +## Workflows + +Guides for running specific BMAD workflows. + +## Brownfield Projects + +Working with existing codebases. + +## Troubleshooting + +Solutions to common problems. diff --git a/docs/how-to/installation/index.md b/docs/how-to/installation/index.md new file mode 100644 index 00000000..f8a28f3d --- /dev/null +++ b/docs/how-to/installation/index.md @@ -0,0 +1,15 @@ +--- +title: "Installation Guides" +description: How to install and upgrade BMad Method +--- + + +How-to guides for installing and configuring the BMad Method. + +## Available Guides + +| Guide | Description | +|-------|-------------| +| **[Install BMad](./install-bmad.md)** | Step-by-step installation instructions | +| **[Install Custom Modules](./install-custom-modules.md)** | Add custom agents, workflows, and modules | +| **[Upgrade to v6](./upgrade-to-v6.md)** | Migrate from BMad v4 to v6 | diff --git a/docs/how-to/installation/install-bmad.md b/docs/how-to/installation/install-bmad.md new file mode 100644 index 00000000..50bc8ccb --- /dev/null +++ b/docs/how-to/installation/install-bmad.md @@ -0,0 +1,138 @@ +--- +title: "How to Install BMAD" +description: Step-by-step guide to installing BMAD in your project +--- + + +Complete guide to installing BMAD in your project. + +--- + +## Prerequisites + +- **Node.js** 20+ (required for the installer) +- **Git** (recommended) +- **AI-powered IDE** (Claude Code, Cursor, Windsurf, or similar) + +--- + +## Steps + +### 1. Run the Installer + +```bash +npx bmad-method install +``` + +### 2. Choose Installation Location + +The installer will ask where to install BMAD files. Options: +- Current directory (recommended for new projects) +- Subdirectory +- Custom path + +### 3. Select Your AI Tools + +Choose which AI tools you'll be using: +- Claude Code +- Cursor +- Windsurf +- Other + +The installer configures BMAD for your selected tools. + +### 4. Choose Modules + +Select which modules to install: + +| Module | Purpose | +|--------|---------| +| **BMM** | Core methodology for software development | +| **BMGD** | Game development workflows | +| **CIS** | Creative intelligence and facilitation | +| **BMB** | Building custom agents and workflows | + +### 5. Add Custom Content (Optional) + +If you have custom agents, workflows, or modules: +- Point to their location +- The installer will integrate them + +### 6. Configure Settings + +For each module, either: +- Accept recommended defaults (faster) +- Customize settings (more control) + +--- + +## Verify Installation + +After installation, verify by: + +1. Checking the `_bmad/` directory exists +2. Loading an agent in your AI tool +3. Running `*menu` to see available commands + +--- + +## Directory Structure + +``` +your-project/ +├── _bmad/ +│ ├── bmm/ # Method module +│ │ ├── agents/ # Agent files +│ │ ├── workflows/ # Workflow files +│ │ └── config.yaml # Module config +│ ├── core/ # Core utilities +│ └── ... +├── _bmad-output/ # Generated artifacts +└── .claude/ # IDE configuration +``` + +--- + +## Configuration + +Edit `_bmad/[module]/config.yaml` to customize: + +```yaml +output_folder: ./_bmad-output +user_name: Your Name +communication_language: english +``` + +--- + +## Troubleshooting + +### "Command not found: npx" + +Install Node.js 20+: +```bash +brew install node + +``` + +### "Permission denied" + +Check npm permissions: +```bash +npm config set prefix ~/.npm-global +``` + +### Installer hangs + +Try running with verbose output: +```bash +npx bmad-method install --verbose +``` + +--- + +## Related + +- [Quick Start Guide](../../tutorials/getting-started/getting-started-bmadv6.md) - Getting started with BMM +- [Upgrade to V6](./upgrade-to-v6.md) - Upgrading from previous versions +- [Install Custom Modules](./install-custom-modules.md) - Adding custom content diff --git a/docs/modules/bmb-bmad-builder/custom-content-installation.md b/docs/how-to/installation/install-custom-modules.md similarity index 95% rename from docs/modules/bmb-bmad-builder/custom-content-installation.md rename to docs/how-to/installation/install-custom-modules.md index 015e71e2..4aebad85 100644 --- a/docs/modules/bmb-bmad-builder/custom-content-installation.md +++ b/docs/how-to/installation/install-custom-modules.md @@ -1,8 +1,11 @@ -# Custom Content Installation +--- +title: "Custom Content Installation" +--- + This guide explains how to create and install custom BMAD content including agents, workflows, and modules. Custom content extends BMAD's functionality with specialized tools and workflows that can be shared across projects or teams. -For detailed information about the different types of custom content available, see [Custom Content](modules/bmb-bmad-builder/custom-content.md). +For detailed information about the different types of custom content available, see [Custom Content Types](../../explanation/bmad-builder/custom-content-types.md). You can find example custom modules in the `samples/sample-custom-modules/` folder of the repository. Download either of the sample folders to try them out. @@ -57,7 +60,7 @@ For standalone content that isn't part of a cohesive module collection, follow t - Add the property `unitary: true` in the module.yaml - The `unitary: true` property indicates this is a collection of potentially unrelated items that don't depend on each other - Any content you add to this folder should still be nested under workflows and agents - but the key with stand alone content is they do not rely on each other. - - Agents do not reference other workflows even if stored in a unitary:true module. But unitary Agents can have their own workflows in their sidecar, or reference workflows as requirements from other modules - with a process known as workflow vendoring. Keep in mind, this will require that the workflow referenced from the other module would need to be available for the end user to install, so its recommended to only vendor workflows from the core module, or official bmm modules (See [Workflow Vendoring, Customization, and Inheritance](workflow-vendoring-customization-inheritance.md)). + - Agents do not reference other workflows even if stored in a unitary:true module. But unitary Agents can have their own workflows in their sidecar, or reference workflows as requirements from other modules - with a process known as workflow vendoring. Keep in mind, this will require that the workflow referenced from the other module would need to be available for the end user to install, so its recommended to only vendor workflows from the core module, or official bmm modules. 2. **Folder Structure** Organize content in specific named folders: diff --git a/docs/bmad-core-concepts/installing/upgrading.md b/docs/how-to/installation/upgrade-to-v6.md similarity index 98% rename from docs/bmad-core-concepts/installing/upgrading.md rename to docs/how-to/installation/upgrade-to-v6.md index 29384f2d..b5c37dbe 100644 --- a/docs/bmad-core-concepts/installing/upgrading.md +++ b/docs/how-to/installation/upgrade-to-v6.md @@ -1,4 +1,7 @@ -# BMad v4 to v6 Upgrade Guide +--- +title: "BMad v4 to v6 Upgrade Guide" +--- + ## Overview @@ -120,7 +123,7 @@ persona: - Always upbeat and adventurous ``` -There is a lot more that is possible with agent customization, which is covered in detail in the [Agent Customization Guide](../bmad-customization/agents.md) +There is a lot more that is possible with agent customization, which is covered in detail in the [Agent Customization Guide](../customization/customize-agents.md) CRITICAL NOTE: After you modify the customization file, you need to run the npx installer against your installed location, and choose the option to rebuild all agents, or just do a quick update again. This always builds agents fresh and applies customizations. diff --git a/docs/modules/bmgd-bmad-game-dev/troubleshooting.md b/docs/how-to/troubleshooting/bmgd-troubleshooting.md similarity index 95% rename from docs/modules/bmgd-bmad-game-dev/troubleshooting.md rename to docs/how-to/troubleshooting/bmgd-troubleshooting.md index dd7f31a7..e6901e51 100644 --- a/docs/modules/bmgd-bmad-game-dev/troubleshooting.md +++ b/docs/how-to/troubleshooting/bmgd-troubleshooting.md @@ -1,4 +1,7 @@ -# BMGD Troubleshooting +--- +title: "BMGD Troubleshooting" +--- + Common issues and solutions when using BMGD workflows. @@ -26,7 +29,6 @@ Common issues and solutions when using BMGD workflows. Check for `_bmad/bmgd/config.yaml` in your project. If missing, create it: ```yaml -# BMGD Configuration output_folder: '{project-root}/docs/game-design' user_name: 'Your Name' communication_language: 'English' @@ -254,6 +256,6 @@ When reporting issues, include: ## Next Steps -- **[Quick Start Guide](./quick-start.md)** - Getting started -- **[Workflows Guide](./workflows-guide.md)** - Workflow reference -- **[Glossary](./glossary.md)** - Terminology +- **[Quick Start Guide](../../tutorials/getting-started/quick-start-bmgd.md)** - Getting started +- **[Workflows Guide](../../reference/workflows/index.md)** - Workflow reference +- **[Glossary](../../reference/glossary/index.md)** - Terminology diff --git a/docs/modules/bmgd-bmad-game-dev/quick-flow-guide.md b/docs/how-to/workflows/bmgd-quick-flow.md similarity index 95% rename from docs/modules/bmgd-bmad-game-dev/quick-flow-guide.md rename to docs/how-to/workflows/bmgd-quick-flow.md index 9dfc504d..9b7fa7db 100644 --- a/docs/modules/bmgd-bmad-game-dev/quick-flow-guide.md +++ b/docs/how-to/workflows/bmgd-quick-flow.md @@ -1,4 +1,7 @@ -# BMGD Quick-Flow Guide +--- +title: "BMGD Quick-Flow Guide" +--- + Fast-track workflows for rapid game prototyping and flexible development. @@ -283,6 +286,6 @@ If quick-dev keeps expanding scope, stop and create proper stories. ## Next Steps -- **[Workflows Guide](./workflows-guide.md)** - Full workflow reference -- **[Agents Guide](./agents-guide.md)** - Agent capabilities -- **[Quick Start Guide](./quick-start.md)** - Getting started with BMGD +- **[Workflows Guide](../../reference/workflows/bmgd-workflows.md)** - Full workflow reference +- **[Agents Guide](../../explanation/game-dev/agents.md)** - Agent capabilities +- **[Quick Start Guide](../../tutorials/getting-started/quick-start-bmgd.md)** - Getting started with BMGD diff --git a/docs/how-to/workflows/conduct-research.md b/docs/how-to/workflows/conduct-research.md new file mode 100644 index 00000000..16174c74 --- /dev/null +++ b/docs/how-to/workflows/conduct-research.md @@ -0,0 +1,130 @@ +--- +title: "How to Conduct Research" +description: How to conduct market, technical, and competitive research using BMad Method +--- + + +Use the `research` workflow to perform comprehensive multi-type research for validating ideas, understanding markets, and making informed decisions. + +--- + +## When to Use This + +- Need market viability validation +- Choosing frameworks or platforms +- Understanding competitive landscape +- Need user understanding +- Understanding domain or industry +- Need deeper AI-assisted research + +--- + +## Prerequisites + +- BMad Method installed +- Analyst agent available + +--- + +## Steps + +### 1. Load the Analyst Agent + +Start a fresh chat and load the Analyst agent. + +### 2. Run the Research Workflow + +``` +*research +``` + +### 3. Choose Research Type + +Select the type of research you need: + +| Type | Purpose | Use When | +| --------------- | ------------------------------------------------------ | ----------------------------------- | +| **market** | TAM/SAM/SOM, competitive analysis | Need market viability validation | +| **technical** | Technology evaluation, ADRs | Choosing frameworks/platforms | +| **competitive** | Deep competitor analysis | Understanding competitive landscape | +| **user** | Customer insights, personas, JTBD | Need user understanding | +| **domain** | Industry deep dives, trends | Understanding domain/industry | +| **deep_prompt** | Generate AI research prompts (ChatGPT, Claude, Gemini) | Need deeper AI-assisted research | + +### 4. Provide Context + +Give the agent details about what you're researching: + +- "SaaS project management tool" +- "React vs Vue for our dashboard" +- "Fintech compliance requirements" + +### 5. Set Research Depth + +Choose your depth level: + +- **Quick** - Fast overview +- **Standard** - Balanced depth +- **Comprehensive** - Deep analysis + +--- + +## What You Get + +### Market Research Example + +``` +TAM: $50B +SAM: $5B +SOM: $50M + +Top Competitors: +- Asana +- Monday +- etc. + +Positioning Recommendation: ... +``` + +### Technical Research Example + +Technology evaluation with: +- Comparison matrix +- Trade-off analysis +- Recommendations with rationale + +--- + +## Key Features + +- Real-time web research +- Multiple analytical frameworks (Porter's Five Forces, SWOT, Technology Adoption Lifecycle) +- Platform-specific optimization for deep_prompt type +- Configurable research depth + +--- + +## Next Steps + +After research: + +1. **Product Brief** - Capture strategic vision informed by research +2. **PRD** - Use findings as context for requirements +3. **Architecture** - Use technical research in ADRs + +--- + +## Tips + +- Use market research early for new products +- Technical research helps with architecture decisions +- Competitive research informs positioning +- Domain research is valuable for specialized industries + +--- + +## Related + +- [Run Brainstorming Session](./run-brainstorming-session.md) - Explore ideas before research +- [Create Product Brief](./create-product-brief.md) - Capture strategic vision +- [Create PRD](./create-prd.md) - Move to formal planning diff --git a/docs/how-to/workflows/create-architecture.md b/docs/how-to/workflows/create-architecture.md new file mode 100644 index 00000000..7b84548f --- /dev/null +++ b/docs/how-to/workflows/create-architecture.md @@ -0,0 +1,147 @@ +--- +title: "How to Create Architecture" +description: How to create system architecture using the BMad Method +--- + + +Use the `architecture` workflow to make technical decisions explicit and prevent agent conflicts during implementation. + +--- + +## When to Use This + +- Multi-epic projects (BMad Method, Enterprise) +- Cross-cutting technical concerns +- Multiple agents implementing different parts +- Integration complexity exists +- Technology choices need alignment + +--- + +## When to Skip This + +- Quick Flow (simple changes) +- BMad Method Simple with straightforward tech stack +- Single epic with clear technical approach + +--- + +## Prerequisites + +- BMad Method installed +- Architect agent available +- PRD completed + +--- + +## Steps + +### 1. Load the Architect Agent + +Start a fresh chat and load the Architect agent. + +### 2. Run the Architecture Workflow + +``` +*create-architecture +``` + +### 3. Engage in Discovery + +This is NOT a template filler. The architecture workflow: + +1. **Discovers** technical needs through conversation +2. **Proposes** architectural options with trade-offs +3. **Documents** decisions that prevent agent conflicts +4. **Focuses** on decision points, not exhaustive documentation + +### 4. Document Key Decisions + +Work with the agent to create Architecture Decision Records (ADRs) for significant choices. + +### 5. Review the Architecture + +The agent produces a decision-focused architecture document. + +--- + +## What You Get + +An `architecture.md` document containing: + +1. **Architecture Overview** - System context, principles, style +2. **System Architecture** - High-level diagram, component interactions +3. **Data Architecture** - Database design, state management, caching +4. **API Architecture** - API style (REST/GraphQL/gRPC), auth, versioning +5. **Frontend Architecture** - Framework, state management, components +6. **Integration Architecture** - Third-party integrations, messaging +7. **Security Architecture** - Auth/authorization, data protection +8. **Deployment Architecture** - CI/CD, environments, monitoring +9. **ADRs** - Key decisions with context, options, rationale +10. **FR/NFR-Specific Guidance** - Technical approach per requirement +11. **Standards and Conventions** - Directory structure, naming, testing + +--- + +## ADR Format + +```markdown +## ADR-001: Use GraphQL for All APIs + +**Status:** Accepted | **Date:** 2025-11-02 + +**Context:** PRD requires flexible querying across multiple epics + +**Decision:** Use GraphQL for all client-server communication + +**Options Considered:** +1. REST - Familiar but requires multiple endpoints +2. GraphQL - Flexible querying, learning curve +3. gRPC - High performance, poor browser support + +**Rationale:** +- PRD requires flexible data fetching (Epic 1, 3) +- Mobile app needs bandwidth optimization (Epic 2) +- Team has GraphQL experience + +**Consequences:** +- Positive: Flexible querying, reduced versioning +- Negative: Caching complexity, N+1 query risk +- Mitigation: Use DataLoader for batching +``` + +--- + +## Example + +E-commerce platform produces: +- Monolith + PostgreSQL + Redis + Next.js + GraphQL +- ADRs explaining each choice +- FR/NFR-specific implementation guidance + +--- + +## Tips + +- Focus on decisions that prevent agent conflicts +- Use ADRs for every significant technology choice +- Keep it practical - don't over-architect +- Architecture is living - update as you learn + +--- + +## Next Steps + +After architecture: + +1. **Create Epics and Stories** - Work breakdown informed by architecture +2. **Implementation Readiness** - Gate check before Phase 4 + +--- + +## Related + +- [Create PRD](./create-prd.md) - Requirements before architecture +- [Create Epics and Stories](./create-epics-and-stories.md) - Next step +- [Run Implementation Readiness](./run-implementation-readiness.md) - Gate check +- [Why Solutioning Matters](../../explanation/architecture/why-solutioning-matters.md) diff --git a/docs/how-to/workflows/create-epics-and-stories.md b/docs/how-to/workflows/create-epics-and-stories.md new file mode 100644 index 00000000..4fde46a2 --- /dev/null +++ b/docs/how-to/workflows/create-epics-and-stories.md @@ -0,0 +1,136 @@ +--- +title: "How to Create Epics and Stories" +description: How to break PRD requirements into epics and stories using BMad Method +--- + + +Use the `create-epics-and-stories` workflow to transform PRD requirements into bite-sized stories organized into deliverable epics. + +--- + +## When to Use This + +- After architecture workflow completes +- When PRD contains FRs/NFRs ready for implementation breakdown +- Before implementation-readiness gate check + +--- + +## Prerequisites + +- BMad Method installed +- PM agent available +- PRD completed +- Architecture completed + +--- + +## Why After Architecture? + +This workflow runs AFTER architecture because: + +1. **Informed Story Sizing** - Architecture decisions affect story complexity +2. **Dependency Awareness** - Architecture reveals technical dependencies +3. **Technical Feasibility** - Stories can be properly scoped knowing the tech stack +4. **Consistency** - All stories align with documented architectural patterns + +--- + +## Steps + +### 1. Load the PM Agent + +Start a fresh chat and load the PM agent. + +### 2. Run the Workflow + +``` +*create-epics-and-stories +``` + +### 3. Provide Context + +Point the agent to: +- Your PRD (FRs/NFRs) +- Your architecture document +- Optional: UX design artifacts + +### 4. Review Epic Breakdown + +The agent organizes requirements into logical epics with user stories. + +### 5. Validate Story Quality + +Ensure each story has: +- Clear acceptance criteria +- Appropriate priority +- Identified dependencies +- Technical notes from architecture + +--- + +## What You Get + +Epic files (one per epic) containing: + +1. **Epic objective and scope** +2. **User stories with acceptance criteria** +3. **Story priorities** (P0/P1/P2/P3) +4. **Dependencies between stories** +5. **Technical notes** referencing architecture decisions + +--- + +## Example + +E-commerce PRD with FR-001 (User Registration), FR-002 (Product Catalog) produces: + +- **Epic 1: User Management** (3 stories) + - Story 1.1: User registration form + - Story 1.2: Email verification + - Story 1.3: Login/logout + +- **Epic 2: Product Display** (4 stories) + - Story 2.1: Product listing page + - Story 2.2: Product detail page + - Story 2.3: Search functionality + - Story 2.4: Category filtering + +Each story references relevant ADRs from architecture. + +--- + +## Story Priority Levels + +| Priority | Meaning | +|----------|---------| +| **P0** | Critical - Must have for MVP | +| **P1** | High - Important for release | +| **P2** | Medium - Nice to have | +| **P3** | Low - Future consideration | + +--- + +## Tips + +- Keep stories small enough to complete in a session +- Ensure acceptance criteria are testable +- Document dependencies clearly +- Reference architecture decisions in technical notes + +--- + +## Next Steps + +After creating epics and stories: + +1. **Implementation Readiness** - Validate alignment before Phase 4 +2. **Sprint Planning** - Organize work for implementation + +--- + +## Related + +- [Create Architecture](./create-architecture.md) - Do this first +- [Run Implementation Readiness](./run-implementation-readiness.md) - Gate check +- [Run Sprint Planning](./run-sprint-planning.md) - Start implementation diff --git a/docs/how-to/workflows/create-prd.md b/docs/how-to/workflows/create-prd.md new file mode 100644 index 00000000..2a0221f1 --- /dev/null +++ b/docs/how-to/workflows/create-prd.md @@ -0,0 +1,130 @@ +--- +title: "How to Create a PRD" +description: How to create a Product Requirements Document using the BMad Method +--- + + +Use the `prd` workflow to create a strategic Product Requirements Document with Functional Requirements (FRs) and Non-Functional Requirements (NFRs). + +--- + +## When to Use This + +- Medium to large feature sets +- Multi-screen user experiences +- Complex business logic +- Multiple system integrations +- Phased delivery required + +--- + +## Prerequisites + +- BMad Method installed +- PM agent available +- Optional: Product brief from Phase 1 + +--- + +## Steps + +### 1. Load the PM Agent + +Start a fresh chat and load the PM agent. + +### 2. Run the PRD Workflow + +``` +*create-prd +``` + +### 3. Provide Context + +The workflow will: +- Load any existing product brief +- Ask about your project scope +- Gather requirements through conversation + +### 4. Define Requirements + +Work with the agent to define: +- Functional Requirements (FRs) - What the system should do +- Non-Functional Requirements (NFRs) - How well it should do it + +### 5. Review the PRD + +The agent produces a comprehensive PRD scaled to your project. + +--- + +## What You Get + +A `PRD.md` document containing: + +- Executive summary +- Problem statement +- User personas +- Functional requirements (FRs) +- Non-functional requirements (NFRs) +- Success metrics +- Risks and assumptions + +--- + +## Scale-Adaptive Structure + +The PRD adapts to your project complexity: + +| Scale | Pages | Focus | +|-------|-------|-------| +| **Light** | 10-15 | Focused FRs/NFRs, simplified analysis | +| **Standard** | 20-30 | Comprehensive FRs/NFRs, thorough analysis | +| **Comprehensive** | 30-50+ | Extensive FRs/NFRs, multi-phase, stakeholder analysis | + +--- + +## V6 Improvement + +In V6, the PRD focuses on **WHAT** to build (requirements). Epic and Stories are created **AFTER** architecture via the `create-epics-and-stories` workflow for better quality. + +--- + +## Example + +E-commerce checkout → PRD with: +- 15 FRs (user account, cart management, payment flow) +- 8 NFRs (performance, security, scalability) + +--- + +## Best Practices + +### 1. Do Product Brief First + +Run product-brief from Phase 1 to kickstart the PRD for better results. + +### 2. Focus on "What" Not "How" + +Planning defines **what** to build and **why**. Leave **how** (technical design) to Phase 3 (Solutioning). + +### 3. Document-Project First for Brownfield + +Always run `document-project` before planning brownfield projects. AI agents need existing codebase context. + +--- + +## Next Steps + +After PRD: + +1. **Create UX Design** (optional) - If UX is critical +2. **Create Architecture** - Technical design +3. **Create Epics and Stories** - After architecture + +--- + +## Related + +- [Create Product Brief](./create-product-brief.md) - Input for PRD +- [Create UX Design](./create-ux-design.md) - Optional UX workflow +- [Create Architecture](./create-architecture.md) - Next step after PRD diff --git a/docs/how-to/workflows/create-product-brief.md b/docs/how-to/workflows/create-product-brief.md new file mode 100644 index 00000000..3b813f6c --- /dev/null +++ b/docs/how-to/workflows/create-product-brief.md @@ -0,0 +1,117 @@ +--- +title: "How to Create a Product Brief" +description: How to create a product brief using the BMad Method +--- + + +Use the `product-brief` workflow to define product vision and strategy through an interactive process. + +--- + +## When to Use This + +- Starting new product or major feature initiative +- Aligning stakeholders before detailed planning +- Transitioning from exploration to strategy +- Need executive-level product documentation + +--- + +## Prerequisites + +- BMad Method installed +- Analyst agent available +- Optional: Research documents from previous workflows + +--- + +## Steps + +### 1. Load the Analyst Agent + +Start a fresh chat and load the Analyst agent. + +### 2. Run the Product Brief Workflow + +``` +*product-brief +``` + +### 3. Answer the Interactive Questions + +The workflow guides you through strategic product vision definition: + +- What problem are you solving? +- Who are your target users? +- What makes this solution different? +- What's the MVP scope? + +### 4. Review and Refine + +The agent will draft sections and let you refine them interactively. + +--- + +## What You Get + +The `product-brief.md` document includes: + +- **Executive summary** - High-level overview +- **Problem statement** - With evidence +- **Proposed solution** - And differentiators +- **Target users** - Segmented +- **MVP scope** - Ruthlessly defined +- **Financial impact** - And ROI +- **Strategic alignment** - With business goals +- **Risks and open questions** - Documented upfront + +--- + +## Integration with Other Workflows + +The product brief feeds directly into the PRD workflow: + +| Analysis Output | Planning Input | +|-----------------|----------------| +| product-brief.md | **prd** workflow | +| market-research.md | **prd** context | +| technical-research.md | **architecture** (Phase 3) | + +Planning workflows automatically load the product brief if it exists. + +--- + +## Common Patterns + +### Greenfield Software (Full Analysis) + +``` +1. brainstorm-project - explore approaches +2. research (market/technical/domain) - validate viability +3. product-brief - capture strategic vision +4. → Phase 2: prd +``` + +### Skip Analysis (Clear Requirements) + +``` +→ Phase 2: prd or tech-spec directly +``` + +--- + +## Tips + +- Be specific about the problem you're solving +- Ruthlessly prioritize MVP scope +- Document assumptions and risks +- Use research findings as evidence +- This is recommended for greenfield projects + +--- + +## Related + +- [Run Brainstorming Session](./run-brainstorming-session.md) - Explore ideas first +- [Conduct Research](./conduct-research.md) - Validate ideas +- [Create PRD](./create-prd.md) - Next step after product brief diff --git a/docs/how-to/workflows/create-story.md b/docs/how-to/workflows/create-story.md new file mode 100644 index 00000000..9e75f920 --- /dev/null +++ b/docs/how-to/workflows/create-story.md @@ -0,0 +1,119 @@ +--- +title: "How to Create a Story" +description: How to create implementation-ready stories from epic backlog +--- + + +Use the `create-story` workflow to prepare the next story from the epic backlog for implementation. + +--- + +## When to Use This + +- Before implementing each story +- When moving to the next story in an epic +- After sprint-planning has been run + +--- + +## Prerequisites + +- BMad Method installed +- SM (Scrum Master) agent available +- Sprint-status.yaml created by sprint-planning +- Architecture and PRD available for context + +--- + +## Steps + +### 1. Load the SM Agent + +Start a fresh chat and load the SM (Scrum Master) agent. + +### 2. Run the Workflow + +``` +*create-story +``` + +### 3. Specify the Story + +The agent will: +- Read the sprint-status.yaml +- Identify the next story to work on +- Or let you specify a particular story + +### 4. Review the Story File + +The agent creates a comprehensive story file ready for development. + +--- + +## What You Get + +A `story-[slug].md` file containing: + +- Story objective and scope +- Acceptance criteria (specific, testable) +- Technical implementation notes +- References to architecture decisions +- Dependencies on other stories +- Definition of Done + +--- + +## Story Content Sources + +The create-story workflow pulls from: + +- **PRD** - Requirements and acceptance criteria +- **Architecture** - Technical approach and ADRs +- **Epic file** - Story context and dependencies +- **Existing code** - Patterns to follow (brownfield) + +--- + +## Example Output + +```markdown + +## Objective +Implement email verification flow for new user registrations. + +## Acceptance Criteria +- [ ] User receives verification email within 30 seconds +- [ ] Email contains unique verification link +- [ ] Link expires after 24 hours +- [ ] User can request new verification email + +## Technical Notes +- Use SendGrid API per ADR-003 +- Store verification tokens in Redis per architecture +- Follow existing email template patterns in /templates + +## Dependencies +- Story 1.1 (User Registration) - DONE ✅ + +## Definition of Done +- All acceptance criteria pass +- Tests written and passing +- Code review approved +``` + +--- + +## Tips + +- Complete one story before creating the next +- Ensure dependencies are marked DONE before starting +- Review technical notes for architecture alignment +- Use the story file as context for dev-story + +--- + +## Related + +- [Run Sprint Planning](./run-sprint-planning.md) - Initialize tracking +- [Implement Story](./implement-story.md) - Next step +- [Run Code Review](./run-code-review.md) - After implementation diff --git a/docs/how-to/workflows/create-tech-spec.md b/docs/how-to/workflows/create-tech-spec.md new file mode 100644 index 00000000..cbc4f1c0 --- /dev/null +++ b/docs/how-to/workflows/create-tech-spec.md @@ -0,0 +1,159 @@ +--- +title: "How to Create a Tech Spec" +description: How to create a technical specification using Quick Spec Flow +--- + + +Use the `tech-spec` workflow for Quick Flow projects to go directly from idea to implementation-ready specification. + +--- + +## When to Use This + +- Bug fixes and small enhancements +- Small features with clear scope (1-15 stories) +- Rapid prototyping +- Adding to existing brownfield codebase +- Quick Flow track projects + +--- + +## Prerequisites + +- BMad Method installed +- PM agent or Quick Flow Solo Dev agent available +- Project directory (can be empty for greenfield) + +--- + +## Steps + +### 1. Load the PM Agent + +Start a fresh chat and load the PM agent (or Quick Flow Solo Dev agent). + +### 2. Run the Tech Spec Workflow + +``` +*create-tech-spec +``` + +Or simply describe what you want to build: + +``` +I want to fix the login validation bug +``` + +### 3. Answer Discovery Questions + +The workflow will ask: +- What problem are you solving? +- What's the scope of the change? +- Any specific constraints? + +### 4. Review Detected Context + +For brownfield projects, the agent will: +- Detect your project stack +- Analyze existing code patterns +- Detect test frameworks +- Ask: "Should I follow these existing conventions?" + +### 5. Get Your Tech Spec + +The agent generates a comprehensive tech-spec with ready-to-implement stories. + +--- + +## What You Get + +### tech-spec.md + +- Problem statement and solution +- Detected framework versions and dependencies +- Brownfield code patterns (if applicable) +- Existing test patterns to follow +- Specific file paths to modify +- Complete implementation guidance + +### Story Files + +For single changes: +- `story-[slug].md` - Single user story ready for development + +For small features: +- `epics.md` - Epic organization +- `story-[epic-slug]-1.md`, `story-[epic-slug]-2.md`, etc. + +--- + +## Example: Bug Fix (Single Change) + +**You:** "I want to fix the login validation bug that allows empty passwords" + +**Agent:** +1. Asks clarifying questions about the issue +2. Detects your Node.js stack (Express 4.18.2, Jest for testing) +3. Analyzes existing UserService code patterns +4. Asks: "Should I follow your existing conventions?" → Yes +5. Generates tech-spec.md with specific file paths +6. Creates story-login-fix.md + +**Total time:** 15-30 minutes (mostly implementation) + +--- + +## Example: Small Feature (Multi-Story) + +**You:** "I want to add OAuth social login (Google, GitHub)" + +**Agent:** +1. Asks about feature scope +2. Detects your stack (Next.js 13.4, NextAuth.js already installed!) +3. Analyzes existing auth patterns +4. Confirms conventions +5. Generates: + - tech-spec.md (comprehensive implementation guide) + - epics.md (OAuth Integration epic) + - story-oauth-1.md (Backend OAuth setup) + - story-oauth-2.md (Frontend login buttons) + +**Total time:** 1-3 hours (mostly implementation) + +--- + +## Implementing After Tech Spec + +```bash +# Single change: +# Load DEV agent and run dev-story + +# Multi-story feature: +# Optional: Load SM agent and run sprint-planning +# Then: Load DEV agent and run dev-story for each story +``` + +--- + +## Tips + +### Be Specific in Discovery + +- ✅ "Fix email validation in UserService to allow plus-addressing" +- ❌ "Fix validation bug" + +### Trust Convention Detection + +If it detects your patterns correctly, say yes! It's faster than establishing new conventions. + +### Keep Single Changes Atomic + +If your "single change" needs 3+ files, it might be a multi-story feature. Let the workflow guide you. + +--- + +## Related + +- [Quick Flow](../../explanation/features/quick-flow.md) - Understanding Quick Spec Flow +- [Implement Story](./implement-story.md) - After tech spec +- [Create PRD](./create-prd.md) - For larger projects needing full BMad Method diff --git a/docs/how-to/workflows/create-ux-design.md b/docs/how-to/workflows/create-ux-design.md new file mode 100644 index 00000000..a91e2195 --- /dev/null +++ b/docs/how-to/workflows/create-ux-design.md @@ -0,0 +1,117 @@ +--- +title: "How to Create a UX Design" +description: How to create UX specifications using the BMad Method +--- + + +Use the `create-ux-design` workflow to create UX specifications for projects where user experience is a primary differentiator. + +--- + +## When to Use This + +- UX is primary competitive advantage +- Complex user workflows needing design thinking +- Innovative interaction patterns +- Design system creation +- Accessibility-critical experiences + +--- + +## When to Skip This + +- Simple CRUD interfaces +- Internal tools with standard patterns +- Changes to existing screens you're happy with +- Quick Flow projects + +--- + +## Prerequisites + +- BMad Method installed +- UX Designer agent available +- PRD completed + +--- + +## Steps + +### 1. Load the UX Designer Agent + +Start a fresh chat and load the UX Designer agent. + +### 2. Run the UX Design Workflow + +``` +*create-ux-design +``` + +### 3. Provide Context + +Point the agent to your PRD and describe: +- Key user journeys +- UX priorities +- Any existing design patterns + +### 4. Collaborate on Design + +The workflow uses a collaborative approach: + +1. **Visual exploration** - Generate multiple options +2. **Informed decisions** - Evaluate with user needs +3. **Collaborative design** - Refine iteratively +4. **Living documentation** - Evolves with project + +### 5. Review the UX Spec + +The agent produces comprehensive UX documentation. + +--- + +## What You Get + +The `ux-spec.md` document includes: + +- User journeys +- Wireframes and mockups +- Interaction specifications +- Design system (components, patterns, tokens) +- Epic breakdown (UX stories) + +--- + +## Example + +Dashboard redesign produces: +- Card-based layout with split-pane toggle +- 5 card components +- 12 color tokens +- Responsive grid +- 3 epics (Layout, Visualization, Accessibility) + +--- + +## Integration + +The UX spec feeds into: +- PRD updates +- Epic and story creation +- Architecture decisions (Phase 3) + +--- + +## Tips + +- Focus on user problems, not solutions first +- Generate multiple options before deciding +- Consider accessibility from the start +- Document component reusability + +--- + +## Related + +- [Create PRD](./create-prd.md) - Create requirements first +- [Create Architecture](./create-architecture.md) - Technical design +- [Create Epics and Stories](./create-epics-and-stories.md) - Work breakdown diff --git a/docs/how-to/workflows/implement-story.md b/docs/how-to/workflows/implement-story.md new file mode 100644 index 00000000..a695a72c --- /dev/null +++ b/docs/how-to/workflows/implement-story.md @@ -0,0 +1,127 @@ +--- +title: "How to Implement a Story" +description: How to implement a story using the dev-story workflow +--- + + +Use the `dev-story` workflow to implement a story with tests following the architecture and conventions. + +--- + +## When to Use This + +- After create-story has prepared the story file +- When ready to write code for a story +- Story dependencies are marked DONE + +--- + +## Prerequisites + +- BMad Method installed +- DEV agent available +- Story file created by create-story +- Architecture and tech-spec available for context + +--- + +## Steps + +### 1. Load the DEV Agent + +Start a fresh chat and load the DEV agent. + +### 2. Run the Workflow + +``` +*dev-story +``` + +### 3. Provide Story Context + +Point the agent to the story file created by create-story. + +### 4. Implement with Guidance + +The DEV agent: +- Reads the story file and acceptance criteria +- References architecture decisions +- Follows existing code patterns +- Implements with tests + +### 5. Complete Implementation + +Work with the agent until all acceptance criteria are met. + +--- + +## What Happens + +The dev-story workflow: + +1. **Reads context** - Story file, architecture, existing patterns +2. **Plans implementation** - Identifies files to create/modify +3. **Writes code** - Following conventions and patterns +4. **Writes tests** - Unit, integration, or E2E as appropriate +5. **Validates** - Runs tests and checks acceptance criteria + +--- + +## Key Principles + +### One Story at a Time + +Complete each story's full lifecycle before starting the next. This prevents context switching and ensures quality. + +### Follow Architecture + +The DEV agent references: +- ADRs for technology decisions +- Standards for naming and structure +- Existing patterns in the codebase + +### Write Tests + +Every story includes appropriate tests: +- Unit tests for business logic +- Integration tests for API endpoints +- E2E tests for critical flows + +--- + +## After Implementation + +1. **Update sprint-status.yaml** - Mark story as READY FOR REVIEW +2. **Run code-review** - Quality assurance +3. **Address feedback** - If code review finds issues +4. **Mark DONE** - After code review passes + +--- + +## Tips + +- Keep the story file open for reference +- Ask the agent to explain decisions +- Run tests frequently during implementation +- Don't skip tests for "simple" changes + +--- + +## Troubleshooting + +**Q: Story needs significant changes mid-implementation?** +A: Run `correct-course` to analyze impact and route appropriately. + +**Q: Can I work on multiple stories in parallel?** +A: Not recommended. Complete one story's full lifecycle first. + +**Q: What if implementation reveals the story is too large?** +A: Split the story and document the change. + +--- + +## Related + +- [Create Story](./create-story.md) - Prepare the story first +- [Run Code Review](./run-code-review.md) - After implementation +- [Run Sprint Planning](./run-sprint-planning.md) - Sprint organization diff --git a/docs/how-to/workflows/run-brainstorming-session.md b/docs/how-to/workflows/run-brainstorming-session.md new file mode 100644 index 00000000..a914ce4f --- /dev/null +++ b/docs/how-to/workflows/run-brainstorming-session.md @@ -0,0 +1,94 @@ +--- +title: "How to Run a Brainstorming Session" +description: How to run a brainstorming session using the BMad Method +--- + + +Use the `brainstorm-project` workflow to explore solution approaches through parallel ideation tracks. + +--- + +## When to Use This + +- Very vague or seed kernel of an idea that needs exploration +- Consider alternatives or enhancements to an idea +- See your idea from different angles and viewpoints +- No idea what you want to build, but want to find some inspiration + +--- + +## Prerequisites + +- BMad Method installed +- Analyst agent available + +--- + +## Steps + +### 1. Load the Analyst Agent + +Start a fresh chat and load the Analyst agent. + +### 2. Run the Brainstorm Workflow + +``` +*brainstorm-project +``` + +### 3. Describe Your Idea + +Tell the agent about your project idea, even if it's vague: + +- "I want to build something that helps developers manage their context" +- "I have a game idea about resource management" +- "I need a tool for my team but I'm not sure what exactly" + +### 4. Explore the Tracks + +The workflow generates solution approaches through parallel ideation tracks: + +- **Architecture track** - Technical approaches and patterns +- **UX track** - User experience possibilities +- **Integration track** - How it connects with other systems +- **Value track** - Business value and differentiation + +### 5. Evaluate Options + +Review the generated options with rationale for each approach. + +--- + +## What You Get + +- Multiple solution approaches with trade-offs +- Different architectural options +- UX and integration considerations +- Clear rationale for each direction + +--- + +## Next Steps + +After brainstorming: + +1. **Research** - Validate ideas with market/technical research +2. **Product Brief** - Capture strategic vision +3. **PRD** - Move to formal planning + +--- + +## Tips + +- Don't worry about having a fully formed idea +- Let the agent guide the exploration +- Consider multiple tracks before deciding +- Use outputs as input for product-brief workflow + +--- + +## Related + +- [Conduct Research](./conduct-research.md) - Validate your ideas +- [Create Product Brief](./create-product-brief.md) - Capture strategic vision +- [Create PRD](./create-prd.md) - Move to formal planning diff --git a/docs/how-to/workflows/run-code-review.md b/docs/how-to/workflows/run-code-review.md new file mode 100644 index 00000000..db049331 --- /dev/null +++ b/docs/how-to/workflows/run-code-review.md @@ -0,0 +1,141 @@ +--- +title: "How to Run Code Review" +description: How to run code review for quality assurance +--- + + +Use the `code-review` workflow to perform a thorough quality review of implemented code. + +--- + +## When to Use This + +- After dev-story completes implementation +- Before marking a story as DONE +- Every story goes through code review - no exceptions + +--- + +## Prerequisites + +- BMad Method installed +- DEV agent available +- Story implementation complete +- Tests written and passing + +--- + +## Steps + +### 1. Load the DEV Agent + +Start a fresh chat (or continue from dev-story) and load the DEV agent. + +### 2. Run the Workflow + +``` +*code-review +``` + +### 3. Provide Context + +Point the agent to: +- The story file +- Files changed during implementation +- Test files + +### 4. Review Findings + +The agent performs a senior developer code review and reports findings. + +### 5. Address Issues + +If issues are found: +1. Fix issues using dev-story +2. Re-run tests +3. Run code-review again + +--- + +## What Gets Reviewed + +The code review checks: + +### Code Quality +- Clean, readable code +- Appropriate abstractions +- No code smells +- Proper error handling + +### Architecture Alignment +- Follows ADRs and architecture decisions +- Consistent with existing patterns +- Proper separation of concerns + +### Testing +- Adequate test coverage +- Tests are meaningful (not just for coverage) +- Edge cases handled +- Tests follow project patterns + +### Security +- No hardcoded secrets +- Input validation +- Authentication/authorization proper +- No common vulnerabilities + +### Performance +- No obvious performance issues +- Appropriate data structures +- Efficient queries + +--- + +## Review Outcomes + +### ✅ Approved + +- Code meets quality standards +- Tests pass +- **Action:** Mark story as DONE in sprint-status.yaml + +### 🔧 Changes Requested + +- Issues identified that need fixing +- **Action:** Fix issues in dev-story, then re-run code-review + +--- + +## Quality Gates + +Every story goes through code-review before being marked done. This ensures: + +- Consistent code quality +- Architecture adherence +- Test coverage +- Security review + +--- + +## Tips + +- Don't skip code review for "simple" changes +- Address all findings, not just critical ones +- Use findings as learning opportunities +- Re-run review after fixes + +--- + +## After Code Review + +1. **If approved:** Update sprint-status.yaml to mark story DONE +2. **If changes requested:** Fix issues and re-run review +3. **Move to next story:** Run create-story for the next item + +--- + +## Related + +- [Implement Story](./implement-story.md) - Before code review +- [Create Story](./create-story.md) - Move to next story +- [Run Sprint Planning](./run-sprint-planning.md) - Sprint organization diff --git a/docs/how-to/workflows/run-implementation-readiness.md b/docs/how-to/workflows/run-implementation-readiness.md new file mode 100644 index 00000000..d7904928 --- /dev/null +++ b/docs/how-to/workflows/run-implementation-readiness.md @@ -0,0 +1,162 @@ +--- +title: "How to Run Implementation Readiness" +description: How to validate planning and solutioning before implementation +--- + + +Use the `implementation-readiness` workflow to validate that planning and solutioning are complete and aligned before Phase 4 implementation. + +--- + +## When to Use This + +- **Always** before Phase 4 for BMad Method and Enterprise projects +- After create-epics-and-stories workflow completes +- Before sprint-planning workflow +- When stakeholders request readiness check + +--- + +## When to Skip This + +- Quick Flow (no solutioning phase) +- BMad Method Simple (no gate check required) + +--- + +## Prerequisites + +- BMad Method installed +- Architect agent available +- PRD, Architecture, and Epics completed + +--- + +## Steps + +### 1. Load the Architect Agent + +Start a fresh chat and load the Architect agent. + +### 2. Run the Workflow + +``` +*implementation-readiness +``` + +### 3. Let the Agent Validate + +The workflow systematically checks: +- PRD completeness +- Architecture completeness +- Epic/Story completeness +- Alignment between all documents + +### 4. Review the Gate Decision + +The agent produces a gate decision with rationale. + +--- + +## Gate Decision Outcomes + +### ✅ PASS + +- All critical criteria met +- Minor gaps acceptable with documented plan +- **Action:** Proceed to Phase 4 + +### ⚠️ CONCERNS + +- Some criteria not met but not blockers +- Gaps identified with clear resolution path +- **Action:** Proceed with caution, address gaps in parallel + +### ❌ FAIL + +- Critical gaps or contradictions +- Architecture missing key decisions +- Epics conflict with PRD/architecture +- **Action:** BLOCK Phase 4, resolve issues first + +--- + +## What Gets Checked + +### PRD/GDD Completeness +- Problem statement clear and evidence-based +- Success metrics defined +- User personas identified +- Functional requirements (FRs) complete +- Non-functional requirements (NFRs) specified +- Risks and assumptions documented + +### Architecture Completeness +- System architecture defined +- Data architecture specified +- API architecture decided +- Key ADRs documented +- Security architecture addressed +- FR/NFR-specific guidance provided +- Standards and conventions defined + +### Epic/Story Completeness +- All PRD features mapped to stories +- Stories have acceptance criteria +- Stories prioritized (P0/P1/P2/P3) +- Dependencies identified +- Story sequencing logical + +### Alignment Checks +- Architecture addresses all PRD FRs/NFRs +- Epics align with architecture decisions +- No contradictions between epics +- NFRs have technical approach +- Integration points clear + +--- + +## What You Get + +An `implementation-readiness.md` document containing: + +1. **Executive Summary** (PASS/CONCERNS/FAIL) +2. **Completeness Assessment** (scores for PRD, Architecture, Epics) +3. **Alignment Assessment** (PRD↔Architecture, Architecture↔Epics) +4. **Quality Assessment** (story quality, dependencies, risks) +5. **Gaps and Recommendations** (critical/minor gaps, remediation) +6. **Gate Decision** with rationale +7. **Next Steps** + +--- + +## Example + +E-commerce platform → CONCERNS ⚠️ + +**Gaps identified:** +- Missing security architecture section +- Undefined payment gateway + +**Recommendation:** +- Complete security section +- Add payment gateway ADR + +**Action:** Proceed with caution, address before payment epic. + +--- + +## Tips + +- Run this before every Phase 4 start +- Take FAIL decisions seriously - fix issues first +- Use CONCERNS as a checklist for parallel work +- Document why you proceed despite concerns + +--- + +## Related + +- [Create Architecture](./create-architecture.md) - Architecture workflow +- [Create Epics and Stories](./create-epics-and-stories.md) - Work breakdown +- [Run Sprint Planning](./run-sprint-planning.md) - Start implementation diff --git a/docs/how-to/workflows/run-sprint-planning.md b/docs/how-to/workflows/run-sprint-planning.md new file mode 100644 index 00000000..7f6c1224 --- /dev/null +++ b/docs/how-to/workflows/run-sprint-planning.md @@ -0,0 +1,111 @@ +--- +title: "How to Run Sprint Planning" +description: How to initialize sprint tracking for implementation +--- + + +Use the `sprint-planning` workflow to initialize the sprint tracking file and organize work for implementation. + +--- + +## When to Use This + +- Once at the start of Phase 4 (Implementation) +- After implementation-readiness gate passes +- When starting a new sprint cycle + +--- + +## Prerequisites + +- BMad Method installed +- SM (Scrum Master) agent available +- Epic files created from `create-epics-and-stories` +- Implementation-readiness passed (for BMad Method/Enterprise) + +--- + +## Steps + +### 1. Load the SM Agent + +Start a fresh chat and load the SM (Scrum Master) agent. + +### 2. Run the Workflow + +``` +*sprint-planning +``` + +### 3. Provide Context + +Point the agent to your epic files created during Phase 3. + +### 4. Review Sprint Organization + +The agent organizes stories into the sprint tracking file. + +--- + +## What You Get + +A `sprint-status.yaml` file containing: + +- All epics with their stories +- Story status tracking (TODO, IN PROGRESS, READY FOR REVIEW, DONE) +- Dependencies between stories +- Priority ordering + +--- + +## Story Lifecycle States + +Stories move through these states in the sprint status file: + +| State | Description | +|-------|-------------| +| **TODO** | Story identified but not started | +| **IN PROGRESS** | Story being implemented | +| **READY FOR REVIEW** | Implementation complete, awaiting code review | +| **DONE** | Accepted and complete | + +--- + +## Typical Sprint Flow + +### Sprint 0 (Planning Phase) +- Complete Phases 1-3 +- PRD/GDD + Architecture complete +- Epics+Stories created via create-epics-and-stories + +### Sprint 1+ (Implementation Phase) + +**Start of Phase 4:** +1. SM runs `sprint-planning` (once) + +**Per Story (repeat until epic complete):** +1. SM runs `create-story` +2. DEV runs `dev-story` +3. DEV runs `code-review` +4. Update sprint-status.yaml + +**After Epic Complete:** +- SM runs `retrospective` +- Move to next epic + +--- + +## Tips + +- Run sprint-planning only once at Phase 4 start +- Use `sprint-status` during Phase 4 to check current state +- Keep the sprint-status.yaml file as single source of truth +- Update story status after each stage + +--- + +## Related + +- [Create Story](./create-story.md) - Prepare stories for implementation +- [Implement Story](./implement-story.md) - Dev workflow +- [Run Code Review](./run-code-review.md) - Quality assurance diff --git a/docs/how-to/workflows/run-test-design.md b/docs/how-to/workflows/run-test-design.md new file mode 100644 index 00000000..db5303b1 --- /dev/null +++ b/docs/how-to/workflows/run-test-design.md @@ -0,0 +1,128 @@ +--- +title: "How to Run Test Design" +description: How to create comprehensive test plans using TEA's test-design workflow +--- + + +Use TEA's `*test-design` workflow to create comprehensive test plans with risk assessment and coverage strategies. + +--- + +## When to Use This + +**System-level (Phase 3):** +- After architecture is complete +- Before implementation-readiness gate +- To validate architecture testability + +**Epic-level (Phase 4):** +- At the start of each epic +- Before implementing stories in the epic +- To identify epic-specific testing needs + +--- + +## Prerequisites + +- BMad Method installed +- TEA agent available +- For system-level: Architecture document complete +- For epic-level: Epic defined with stories + +--- + +## Steps + +### 1. Load the TEA Agent + +Start a fresh chat and load the TEA (Test Architect) agent. + +### 2. Run the Test Design Workflow + +``` +*test-design +``` + +### 3. Specify the Mode + +TEA will ask if you want: + +- **System-level** - For architecture testability review (Phase 3) +- **Epic-level** - For epic-specific test planning (Phase 4) + +### 4. Provide Context + +For system-level: +- Point to your architecture document +- Reference any ADRs (Architecture Decision Records) + +For epic-level: +- Specify which epic you're planning +- Reference the epic file with stories + +### 5. Review the Output + +TEA generates a comprehensive test design document. + +--- + +## What You Get + +### System-Level Output (`test-design-system.md`) + +- Testability review of architecture +- ADR → test mapping +- Architecturally Significant Requirements (ASRs) +- Environment needs +- Test infrastructure recommendations + +### Epic-Level Output (`test-design-epic-N.md`) + +- Risk assessment for the epic +- Test priorities +- Coverage plan +- Regression hotspots (for brownfield) +- Integration risks +- Mitigation strategies + +--- + +## Test Design for Different Tracks + +### Greenfield - BMad Method + +| Stage | Test Design Focus | +|-------|-------------------| +| Phase 3 | System-level testability review | +| Phase 4 | Per-epic risk assessment and test plan | + +### Brownfield - BMad Method/Enterprise + +| Stage | Test Design Focus | +|-------|-------------------| +| Phase 3 | System-level + existing test baseline | +| Phase 4 | Regression hotspots, integration risks | + +### Enterprise + +| Stage | Test Design Focus | +|-------|-------------------| +| Phase 3 | Compliance-aware testability | +| Phase 4 | Security/performance/compliance focus | + +--- + +## Tips + +- Run system-level test-design right after architecture +- Run epic-level test-design at the start of each epic +- Update test design if ADRs change +- Use the output to guide `*atdd` and `*automate` workflows + +--- + +## Related + +- [TEA Overview](../../explanation/features/tea-overview.md) - Understanding the Test Architect +- [Setup Test Framework](./setup-test-framework.md) - Setting up testing infrastructure +- [Create Architecture](./create-architecture.md) - Architecture workflow diff --git a/docs/how-to/workflows/setup-party-mode.md b/docs/how-to/workflows/setup-party-mode.md new file mode 100644 index 00000000..adbc790d --- /dev/null +++ b/docs/how-to/workflows/setup-party-mode.md @@ -0,0 +1,117 @@ +--- +title: "How to Set Up Party Mode" +description: How to set up and use Party Mode for multi-agent collaboration +--- + + +Use Party Mode to orchestrate dynamic multi-agent conversations with your entire BMAD team. + +--- + +## When to Use This + +- Exploring complex topics that benefit from diverse expert perspectives +- Brainstorming with agents who can build on each other's ideas +- Getting comprehensive views across multiple domains +- Strategic decisions with trade-offs + +--- + +## Prerequisites + +- BMad Method installed with multiple agents +- Any agent loaded that supports party mode + +--- + +## Steps + +### 1. Load Any Agent + +Start with any agent that supports party mode (most do). + +### 2. Start Party Mode + +``` +*party-mode +``` + +Or use the full path: +``` +/bmad:core:workflows:party-mode +``` + +### 3. Introduce Your Topic + +Present a topic or question for the group to discuss: + +``` +I'm trying to decide between a monolithic architecture +and microservices for our new platform. +``` + +### 4. Engage with the Discussion + +The facilitator will: +- Select 2-3 most relevant agents based on expertise +- Let agents respond in character +- Enable natural cross-talk and debate +- Continue until you choose to exit + +### 5. Exit When Ready + +Type "exit" or "done" to conclude the session. Participating agents will say personalized farewells. + +--- + +## What Happens + +1. **Agent Roster** - Party Mode loads your complete agent roster +2. **Introduction** - Available team members are introduced +3. **Topic Analysis** - The facilitator analyzes your topic +4. **Agent Selection** - 2-3 most relevant agents are selected +5. **Discussion** - Agents respond, reference each other, engage in cross-talk +6. **Exit** - Session concludes with farewells + +--- + +## Example Party Compositions + +### Product Strategy +- PM + Innovation Strategist (CIS) + Analyst + +### Technical Design +- Architect + Creative Problem Solver (CIS) + Game Architect + +### User Experience +- UX Designer + Design Thinking Coach (CIS) + Storyteller (CIS) + +### Quality Assessment +- TEA + DEV + Architect + +--- + +## Key Features + +- **Intelligent agent selection** - Selects based on expertise needed +- **Authentic personalities** - Each agent maintains their unique voice +- **Natural cross-talk** - Agents reference and build on each other +- **Optional TTS** - Voice configurations for each agent +- **Graceful exit** - Personalized farewells + +--- + +## Tips + +- Be specific about your topic for better agent selection +- Let the conversation flow naturally +- Ask follow-up questions to go deeper +- Take notes on key insights +- Use for strategic decisions, not routine tasks + +--- + +## Related + +- [Party Mode](../../explanation/features/party-mode.md) - Understanding Party Mode +- [Agent Roles](../../explanation/core-concepts/agent-roles.md) - Available agents diff --git a/docs/how-to/workflows/setup-test-framework.md b/docs/how-to/workflows/setup-test-framework.md new file mode 100644 index 00000000..96ebf7a3 --- /dev/null +++ b/docs/how-to/workflows/setup-test-framework.md @@ -0,0 +1,113 @@ +--- +title: "How to Set Up a Test Framework" +description: How to set up a production-ready test framework using TEA +--- + + +Use TEA's `*framework` workflow to scaffold a production-ready test framework for your project. + +--- + +## When to Use This + +- No existing test framework in your project +- Current test setup isn't production-ready +- Starting a new project that needs testing infrastructure +- Phase 3 (Solutioning) after architecture is complete + +--- + +## Prerequisites + +- BMad Method installed +- Architecture completed (or at least tech stack decided) +- TEA agent available + +--- + +## Steps + +### 1. Load the TEA Agent + +Start a fresh chat and load the TEA (Test Architect) agent. + +### 2. Run the Framework Workflow + +``` +*framework +``` + +### 3. Answer TEA's Questions + +TEA will ask about: + +- Your tech stack (React, Node, etc.) +- Preferred test framework (Playwright, Cypress, Jest) +- Testing scope (E2E, integration, unit) +- CI/CD platform (GitHub Actions, etc.) + +### 4. Review Generated Output + +TEA generates: + +- **Test scaffold** - Directory structure and config files +- **Sample specs** - Example tests following best practices +- **`.env.example`** - Environment variable template +- **`.nvmrc`** - Node version specification +- **README updates** - Testing documentation + +--- + +## What You Get + +``` +tests/ +├── e2e/ +│ ├── example.spec.ts +│ └── fixtures/ +├── integration/ +├── unit/ +├── playwright.config.ts # or cypress.config.ts +└── README.md +``` + +--- + +## Optional: Playwright Utils Integration + +TEA can integrate with `@seontechnologies/playwright-utils` for advanced fixtures: + +```bash +npm install -D @seontechnologies/playwright-utils +``` + +Enable during BMad installation or set `tea_use_playwright_utils: true` in config. + +**Utilities available:** api-request, network-recorder, auth-session, intercept-network-call, recurse, log, file-utils, burn-in, network-error-monitor + +--- + +## Optional: MCP Enhancements + +TEA can use Playwright MCP servers for enhanced capabilities: + +- `playwright` - Browser automation +- `playwright-test` - Test runner with failure analysis + +Configure in your IDE's MCP settings. + +--- + +## Tips + +- Run `*framework` only once per repository +- Run after architecture is complete so framework aligns with tech stack +- Follow up with `*ci` to set up CI/CD pipeline + +--- + +## Related + +- [TEA Overview](../../explanation/features/tea-overview.md) - Understanding the Test Architect +- [Run Test Design](./run-test-design.md) - Creating test plans +- [Create Architecture](./create-architecture.md) - Architecture workflow diff --git a/docs/index.md b/docs/index.md index d9b22a2f..a43bddda 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,111 +1,65 @@ -# BMAD Documentation +--- +title: Welcome to BMad +--- -Complete documentation for the BMAD Method. +BMad (**B**uild **M**ore, **A**rchitect **D**reams) is an AI-driven development framework that helps you build software faster and smarter. It provides specialized AI agents, guided workflows, and intelligent planning that adapts to your project's complexity—whether you're fixing a bug or building an enterprise platform. -## Getting Started - -### New to BMAD? -Start with the core concepts to understand how BMAD works: - -- **[Core Concepts](./bmad-core-concepts/)** - Agents, workflows, and modules explained -- **[Installation Guide](./bmad-core-concepts/installing/)** - Set up BMAD in your project -- **[Quick Start Guide](./modules/bmm-bmad-method/quick-start)** - Build your first feature - -### Upgrading from v4? -- **[v4 to v6 Upgrade Guide](./bmad-core-concepts/installing/upgrading.md)** - Migration path for v4 users +If you're comfortable working with AI coding assistants like Claude, Cursor, or GitHub Copilot, you're ready to get started. --- -## Module Documentation +## New Here? Start with a Tutorial -### BMAD Method (BMM) - Software & Game Development +The fastest way to understand BMad is to try it. Choose a tutorial to walk through your first project in about 10 minutes. -The flagship module for agile AI-driven development. +- **[Get Started with v4 (Stable)](./tutorials/getting-started/getting-started-bmadv4.md)** — Production-ready version with battle-tested workflows +- **[Try v6 (Alpha)](./tutorials/getting-started/getting-started-bmadv6.md)** — Latest features, still in active development -- **[BMM Module Index](./modules/bmm-bmad-method/index)** - Module overview, agents, and documentation - - [Quick Start Guide](./modules/bmm-bmad-method/quick-start) - Step-by-step guide - - [Quick Spec Flow](./modules/bmm-bmad-method/quick-spec-flow) - Rapid Level 0-1 development - - [Brownfield Guide](./modules/bmm-bmad-method/brownfield-guide) - Working with existing codebases -- **[BMM Workflows Guide](./modules/bmm-bmad-method/index#-workflow-guides)** - Essential reading - -### BMAD Builder (BMB) - Create Custom Solutions - -Build your own agents, workflows, and modules. - -- **[BMB Module Overview](./modules/bmb-bmad-builder/index)** - Module overview and capabilities -- **[Agent Creation Guide](./modules/bmb-bmad-builder/agent-creation-guide.md)** - Create custom agents -- **[Custom Content Installation](./modules/bmb-bmad-builder/custom-content-installation.md)** - Share and install custom creations - -### Creative Intelligence Suite (CIS) - Innovation & Creativity - -- **[CIS Documentation](./modules/cis-creative-intelligence-suite/index)** - -### BMAD Game Dev (BMGD) - -- **[BMGD Documentation](./modules/bmgd-bmad-game-dev/index)** - Game development workflows +:::tip[Already familiar with AI-assisted development?] +Feel free to skip around. Use the sidebar to jump to any topic, or check out [What Are Agents?](./explanation/core-concepts/what-are-agents.md) to understand how BMad organizes its AI personas. +::: --- -## Core Module +## How to Use These Docs -### Global Core Entities +These docs are organized into four sections based on what you're trying to do: -- **[Core Module Index](./modules/core/index)** - Shared functionality available to all modules - - [Global Core Config](./modules/core/global-core-config.md) - Inheritable configuration - - [Core Workflows](./modules/core/core-workflows.md) - Domain-agnostic workflows - - [Party Mode](./modules/core/party-mode.md) - Multi-agent conversations - - [Brainstorming](./modules/core/brainstorming.md) - Structured creative sessions - - [Advanced Elicitation](./modules/core/advanced-elicitation.md) - LLM reasoning techniques - - [Core Tasks](./modules/core/core-tasks.md) - Common tasks across modules +| Section | Purpose | +|---------|---------| +| **[Tutorials](./tutorials/index.md)** | Learning-oriented. Step-by-step guides that walk you through building something. Start here if you're new. | +| **[How-To Guides](./how-to/index.md)** | Task-oriented. Practical guides for solving specific problems. "How do I customize an agent?" lives here. | +| **[Explanation](./explanation/index.md)** | Understanding-oriented. Deep dives into concepts and architecture. Read when you want to know *why*. | +| **[Reference](./reference/index.md)** | Information-oriented. Technical specifications for agents, workflows, and configuration. | --- -## Advanced Topics +## What You'll Need -### Customization +BMad works with any AI coding assistant that supports custom system prompts or project context. Popular options include: -- **[BMAD Customization](./bmad-core-concepts/bmad-customization/)** - Modify agents and workflows +- **[Claude Code](https://code.claude.com)** — Anthropic's CLI tool (recommended) +- **[Cursor](https://cursor.sh)** — AI-first code editor +- **[Windsurf](https://codeium.com/windsurf)** — Codeium's AI IDE +- **[Roo Code](https://roocode.com)** — VS Code extension -### Platform Guides - -- **[Web Bundles](./bmad-core-concepts/web-bundles/)** - Use BMAD in Gemini Gems and Custom GPTs +You should be comfortable with basic software development concepts like version control, project structure, and agile workflows. No prior experience with BMad-style agent systems is required—that's what these docs are for. --- -## Recommended Reading Paths +## Join the Community -### Path 1: Brand New to BMAD (Software Project) +Get help, share what you're building, or contribute to BMad: -1. [Core Concepts](./bmad-core-concepts/) - Understand agents and workflows -2. [Installation Guide](./bmad-core-concepts/installing/) - Set up BMAD -3. [Quick Start Guide](./modules/bmm-bmad-method/quick-start) - Get hands-on -4. [BMM Workflows Guide](./modules/bmm-bmad-method/index#-workflow-guides) - Master the methodology +- **[Discord](https://discord.gg/gk8jAdXWmj)** — Chat with other BMad users, ask questions, share ideas +- **[GitHub](https://github.com/bmad-code-org/BMAD-METHOD)** — Source code, issues, and contributions +- **[YouTube](https://www.youtube.com/@BMadCode)** — Video tutorials and walkthroughs -### Path 2: Game Development Project +--- -1. [Core Concepts](./bmad-core-concepts/) - Understand agents and workflows -2. [Installation Guide](./bmad-core-concepts/installing/) - Set up BMAD -3. [BMGD Workflows Guide](./modules/bmgd-bmad-game-dev/workflows-guide) - Game-specific workflows +## Next Step -### Path 3: Upgrading from v4 +Ready to dive in? Pick a tutorial and start building. -1. [v4 to v6 Upgrade Guide](./bmad-core-concepts/installing/upgrading.md) - Understand what changed -2. [Quick Start Guide](./modules/bmm-bmad-method/quick-start) - Reorient yourself -3. [BMM Workflows Guide](./modules/bmm-bmad-method/index#-workflow-guides) - Learn new v6 workflows - -### Path 4: Working with Existing Codebase (Brownfield) - -1. [Brownfield Guide](./modules/bmm-bmad-method/brownfield-guide) - Approach for legacy code -2. [Quick Start Guide](./modules/bmm-bmad-method/quick-start) - Follow the process -3. [BMM Workflows Guide](./modules/bmm-bmad-method/index#-workflow-guides) - Master the methodology - -### Path 5: Building Custom Agents - -1. [Core Concepts: Agents](./bmad-core-concepts/agents.md) - Understand Simple vs Expert -2. [Agent Creation Guide](./modules/bmb-bmad-builder/agent-creation-guide.md) - Build your first agent -3. [Agent Architecture](./modules/bmb-bmad-builder/index) - Deep technical details - -### Path 6: Contributing to BMAD - -1. [CONTRIBUTING.md](https://github.com/bmad-code-org/BMAD-METHOD/blob/main/CONTRIBUTING.md) - Contribution guidelines -2. Relevant module README - Understand the area you're contributing to +- **[Get Started with v4 (Stable)](./tutorials/getting-started/getting-started-bmadv4.md)** — Recommended for production projects +- **[Try v6 (Alpha)](./tutorials/getting-started/getting-started-bmadv6.md)** — Explore the latest features diff --git a/docs/modules/bmb-bmad-builder/agent-creation-guide.md b/docs/modules/bmb-bmad-builder/agent-creation-guide.md deleted file mode 100644 index cd661f22..00000000 --- a/docs/modules/bmb-bmad-builder/agent-creation-guide.md +++ /dev/null @@ -1,159 +0,0 @@ -# Agent Creation Guide - -Create your own custom agents using the BMAD Builder workflow. - -## Overview - -The BMAD Builder (BMB) module provides an interactive workflow that guides you through creating a custom agent from concept to completion. You define the agent's purpose, personality, capabilities, and menu - then the workflow generates a complete, ready-to-use agent file. - -## Before You Start - -**Prerequisites:** -- BMAD installed with the BMB module -- An idea for what you want your agent to do - -**Know Before You Go:** -- What problem should your agent solve? -- Who will use this agent? -- What should the agent be able to do? - -## Quick Start - -### 1. Start the Workflow - -In your IDE (Claude Code, Cursor, etc.), invoke the create-agent workflow with the agent-builder agent. - -### 2. Follow the Steps - -The workflow guides you through: - -| Step | What You'll Do | -| ------------------------- | -------------------------------------------- | -| **Brainstorm** (optional) | Explore ideas with creative techniques | -| **Discovery** | Define the agent's purpose and goals | -| **Type & Metadata** | Choose Simple or Expert, name your agent | -| **Persona** | Craft the agent's personality and principles | -| **Commands** | Define what the agent can do | -| **Activation** | Set up autonomous behaviors (optional) | -| **Build** | Generate the agent file | -| **Validation** | Review and verify everything works | - -### 3. Install Your Agent - -Once created, package your agent for installation: - -``` -my-custom-stuff/ -├── module.yaml # Contains: unitary: true -├── agents/ -│ └── {agent-name}/ -│ ├── {agent-name}.agent.yaml -│ └── _memory/ # Expert agents only -│ └── {sidecar-folder}/ -└── workflows/ # Optional: custom workflows -``` - -See [Custom Content Installation](./custom-content-installation.md) for details. - -## Choosing Your Agent Type - -The workflow will help you decide, but here's the quick reference: - -### Choose Simple Agent When: - -- Task is well-defined and focused -- Don't need persistent memory -- Want fast setup and deployment -- Single-purpose assistant (e.g., commit messages, code review) - -**Example:** A "Code Commenter" that reads files and adds helpful comments. - -### Choose Expert Agent When: - -- Domain requires specialized knowledge -- Need persistent memory across sessions -- Agent coordinates complex workflows -- Building ongoing project infrastructure - -**Example:** A "Security Architect" that remembers your design decisions and maintains security standards across the project. - -### Choose Module Agent When: - -- Agent builds other agents or workflows -- Need integration with module system -- Creating professional tooling - -**Example:** A "Team Builder" that helps set up agents for new team members. - -## The Persona System - -Your agent's personality is defined by four fields: - -| Field | Purpose | Example | -| ----------------------- | -------------- | ----------------------------------------------------------------- | -| **Role** | What they do | "Senior code reviewer who catches bugs and suggests improvements" | -| **Identity** | Who they are | "Friendly but exacting, believes clean code is a craft" | -| **Communication Style** | How they speak | "Direct, constructive, explains the 'why' behind suggestions" | -| **Principles** | Why they act | "Security first, clarity over cleverness, test what you fix" | - -**Key:** Keep each field focused on its purpose. The role isn't personality; the identity isn't job description. - -## Tips for Success - -### Start Small - -Your first agent should solve **one problem well**. You can always add more capabilities later. - -### Learn by Example - -Study the reference agents in `src/modules/bmb/reference/agents/`: -- **Simple:** [commit-poet](https://github.com/bmad-code-org/BMAD-METHOD/tree/main/src/modules/bmb/reference/agents/simple-examples/commit-poet.agent.yaml) -- **Expert:** [journal-keeper](https://github.com/bmad-code-org/BMAD-METHOD/tree/main/src/modules/bmb/reference/agents/expert-examples/journal-keeper) - -### Write Great Principles - -The first principle should "activate" the agent's expertise: - -❌ **Weak:** "Be helpful and accurate" -✅ **Strong:** "Channel decades of security expertise: threat modeling begins with trust boundaries, never trust client input, defense in depth is non-negotiable" - -### Use the Menu System - -The workflow provides options at each step: -- **[A] Advanced** - Get deeper insights and reasoning -- **[P] Party** - Get multiple agent perspectives -- **[C] Continue** - Move to the next step - -Use these when you need extra input or creative options. - -## After Creation - -### Test Your Agent - -1. Install your custom module using the BMAD installer -2. Invoke your new agent in your IDE -3. Try each menu command -4. Verify the personality feels right - -### Iterate - -If something isn't right: -1. Edit the agent YAML directly, or -2. Edit the customization file in `_bmad/_config/agents/` -3. Rebuild using `npx bmad-method build ` - -### Share - -Package your agent as a standalone module (see [Installation Guide](../../bmad-core-concepts/installing/)) and share it with your team or the community. - -## Further Reading - -- **[Agent Architecture](./index.md)** - Deep technical details on agent types -- **[Agent Customization](../../bmad-core-concepts/agent-customization/)** - Modify agents without editing core files -- **[Custom Content Installation](./custom-content-installation.md)** - Package and distribute your agents - ---- - -**Ready?** Start the workflow and create your first agent! - -[← Back to BMB Documentation](./index.md) diff --git a/docs/modules/bmb-bmad-builder/index.md b/docs/modules/bmb-bmad-builder/index.md deleted file mode 100644 index 13ea51cd..00000000 --- a/docs/modules/bmb-bmad-builder/index.md +++ /dev/null @@ -1,60 +0,0 @@ -# BMB Module Documentation - -Create custom agents, workflows, and modules for BMAD. - -## Quick Start - -- **[Agent Creation Guide](./agent-creation-guide.md)** - Step-by-step guide to building your first agent -- **[Understanding Agent Types](./understanding-agent-types.md)** - Learn the differences between Simple and Expert agents - -## Agent Architecture - -Comprehensive guides for each agent type (choose based on use case): - -- [Understanding Agent Types](./understanding-agent-types.md) - **START HERE** - Architecture vs capability, "The Same Agent, Three Ways" -- [Simple Agent Architecture](./simple-agent-architecture.md) - Self-contained, optimized, personality-driven -- [Expert Agent Architecture](./expert-agent-architecture.md) - Memory, sidecar files, domain restrictions -- Module Agent Architecture _(TODO)_ - Workflow integration, professional tools - -## Agent Design Patterns - -- [Agent Menu Patterns](./agent-menu-patterns.md) - Menu handlers, triggers, prompts, organization -- [Agent Compilation](./agent-compilation.md) - What compiler auto-injects (AVOID DUPLICATION) - -## Reference Examples - -Production-ready examples in [bmb/reference/agents/](https://github.com/bmad-code-org/BMAD-METHOD/tree/main/src/modules/bmb/reference/agents): - -**Simple Agents** ([simple-examples/](https://github.com/bmad-code-org/BMAD-METHOD/tree/main/src/modules/bmb/reference/agents/simple-examples)) - -- [commit-poet.agent.yaml](https://github.com/bmad-code-org/BMAD-METHOD/blob/main/src/modules/bmb/reference/agents/simple-examples/commit-poet.agent.yaml) - Commit message artisan with style customization - -**Expert Agents** ([expert-examples/](https://github.com/bmad-code-org/BMAD-METHOD/tree/main/src/modules/bmb/reference/agents/expert-examples)) - -- [journal-keeper/](https://github.com/bmad-code-org/BMAD-METHOD/tree/main/src/modules/bmb/reference/agents/expert-examples/journal-keeper) - Personal journal companion with memory and pattern recognition - -**Module Agents** ([module-examples/](https://github.com/bmad-code-org/BMAD-METHOD/tree/main/src/modules/bmb/reference/agents/module-examples)) - -- [security-engineer.agent.yaml](https://github.com/bmad-code-org/BMAD-METHOD/blob/main/src/modules/bmb/reference/agents/module-examples/security-engineer.agent.yaml) - BMM security specialist with threat modeling -- [trend-analyst.agent.yaml](https://github.com/bmad-code-org/BMAD-METHOD/blob/main/src/modules/bmb/reference/agents/module-examples/trend-analyst.agent.yaml) - CIS trend intelligence expert - -## Installation Guide - -For installing standalone simple and expert agents, see: - -- [Custom Agent Installation](/docs/modules/bmb-bmad-builder/custom-content-installation.md) - -## Key Concepts - -### YAML to XML Compilation - -Agents are authored in YAML with Handlebars templating. The compiler auto-injects: - -1. **Frontmatter** - Name and description from metadata -2. **Activation Block** - Steps, menu handlers, rules (YOU don't write this) -3. **Menu Enhancement** - `*help` and `*exit` commands added automatically -4. **Trigger Prefixing** - Your triggers auto-prefixed with `*` - -**Critical:** See [Agent Compilation](./agent-compilation.md) to avoid duplicating auto-injected content. - -Source: `tools/cli/lib/agent/compiler.js` diff --git a/docs/modules/bmgd-bmad-game-dev/glossary.md b/docs/modules/bmgd-bmad-game-dev/glossary.md deleted file mode 100644 index 92de3676..00000000 --- a/docs/modules/bmgd-bmad-game-dev/glossary.md +++ /dev/null @@ -1,293 +0,0 @@ -# BMGD Glossary - -Key game development terminology used in BMGD workflows. - ---- - -## A - -### Acceptance Criteria - -Specific conditions that must be met for a story to be considered complete. Defines "done" for implementation. - -### Act Structure - -Story organization into major sections (typically 3 acts: Setup, Confrontation, Resolution). - ---- - -## B - -### Backlog - -List of pending work items (epics, stories) waiting to be scheduled and implemented. - -### Boss Design - -Design of significant enemy encounters, typically featuring unique mechanics and increased challenge. - ---- - -## C - -### Character Arc - -The transformation a character undergoes through the story, from initial state to final state. - -### Core Fantasy - -The emotional experience players seek from your game. What they want to FEEL. - -### Core Loop - -The fundamental cycle of actions players repeat throughout gameplay. The heart of your game. - ---- - -## D - -### Definition of Done (DoD) - -Checklist of requirements that must be satisfied before work is considered complete. - -### Design Pillar - -Core principle that guides all design decisions. Typically 3-5 pillars define a game's identity. - ---- - -## E - -### Environmental Storytelling - -Narrative communicated through the game world itself—visual details, audio, found documents—rather than explicit dialogue. - -### Epic - -Large body of work that can be broken down into smaller stories. Represents a major feature or system. - ---- - -## F - -### Frame Data - -In fighting games, the precise timing information for moves (startup, active, recovery frames). - -### Frontmatter - -YAML metadata at the beginning of markdown files, used for workflow state tracking. - ---- - -## G - -### Game Brief - -Document capturing the game's core vision, pillars, target audience, and scope. Foundation for the GDD. - -### Game Design Document (GDD) - -Comprehensive document detailing all aspects of game design: mechanics, systems, content, and more. - -### Game Type - -Genre classification that determines which specialized GDD sections are included. - ---- - -## H - -### Hot Path - -Code that executes frequently (every frame). Must be optimized for performance. - ---- - -## I - -### Idle Progression - -Game mechanics where progress continues even when the player isn't actively playing. - ---- - -## K - -### Kishotenketsu - -Four-act story structure from East Asian narrative tradition (Introduction, Development, Twist, Conclusion). - ---- - -## L - -### Localization - -Adapting game content for different languages and cultures. - ---- - -## M - -### MDA Framework - -Mechanics → Dynamics → Aesthetics. Framework for analyzing and designing games. - -### Meta-Progression - -Persistent progression that carries between individual runs or sessions. - -### Metroidvania - -Genre featuring interconnected world exploration with ability-gated progression. - ---- - -## N - -### Narrative Complexity - -How central story is to the game experience (Critical, Heavy, Moderate, Light). - -### Netcode - -Networking code handling multiplayer communication and synchronization. - ---- - -## P - -### Permadeath - -Game mechanic where character death is permanent, typically requiring a new run. - -### Player Agency - -The degree to which players can make meaningful choices that affect outcomes. - -### Procedural Generation - -Algorithmic creation of game content (levels, items, characters) rather than hand-crafted. - ---- - -## R - -### Retrospective - -Team meeting after completing work to reflect on what went well and what to improve. - -### Roguelike - -Genre featuring procedural generation, permadeath, and run-based progression. - -### Run - -A single playthrough in a roguelike or run-based game, from start to death/completion. - ---- - -## S - -### Sprint - -Time-boxed period of development work, typically 1-2 weeks. - -### Sprint Status - -Tracking document showing current sprint progress, story states, and blockers. - -### Story - -Smallest unit of implementable work with clear acceptance criteria. Part of an epic. - -### Story Context - -Assembled documentation and code context needed to implement a specific story. - -### Story Gates - -Points where story progression is blocked until certain gameplay conditions are met. - ---- - -## T - -### Tech Spec - -Technical specification document detailing how a feature will be implemented. - -### TDD (Test-Driven Development) - -Development approach: write tests first, then implement code to pass them. - ---- - -## U - -### UI/UX - -User Interface / User Experience. How players interact with and experience the game. - ---- - -## V - -### Visual Novel - -Genre focused on narrative with static images, dialogue, and player choices. - -### Voice Acting - -Recorded spoken dialogue for game characters. - ---- - -## W - -### Workflow - -Structured process for completing a specific type of work (e.g., GDD creation, story implementation). - -### Workflow Status - -Current state of project workflows, tracking which phases and documents are complete. - -### World Building - -Creation of the game's setting, including history, culture, geography, and lore. - ---- - -## BMGD-Specific Terms - -### A/P/C Menu - -Options presented after content generation: - -- **A** - Advanced Elicitation (explore deeper) -- **P** - Party Mode (multi-agent discussion) -- **C** - Continue (save and proceed) - -### Narrative Complexity Levels - -- **Critical** - Story IS the game (visual novels) -- **Heavy** - Deep narrative with gameplay (RPGs) -- **Moderate** - Meaningful story supporting gameplay -- **Light** - Minimal story, gameplay-focused - -### Step-File Architecture - -BMGD workflow pattern using separate markdown files for each workflow step. - -### Workflow-Install Pattern - -Phase 4 workflows inherit from BMM base and add BMGD-specific overrides. - ---- - -## Next Steps - -- **[Quick Start Guide](./quick-start.md)** - Get started with BMGD -- **[Game Types Guide](./game-types-guide.md)** - Game genre reference diff --git a/docs/modules/bmgd-bmad-game-dev/index.md b/docs/modules/bmgd-bmad-game-dev/index.md deleted file mode 100644 index 9d53e295..00000000 --- a/docs/modules/bmgd-bmad-game-dev/index.md +++ /dev/null @@ -1,175 +0,0 @@ -# BMGD Documentation - -Complete guides for the BMad Game Development Module (BMGD) - AI-powered workflows for game design and development that adapt to your project's needs. - ---- - -## Getting Started - -**New to BMGD?** Start here: - -- **[Quick Start Guide](./quick-start.md)** - Get started building your first game - - Installation and setup - - Understanding the game development phases - - Running your first workflows - - Agent-based development flow - -**Quick Path:** Install BMGD module → Game Brief → GDD → Architecture → Build - ---- - -## Core Concepts - -Understanding how BMGD works: - -- **[Agents Guide](./agents-guide.md)** - Complete reference for game development agents - - Game Designer, Game Developer, Game Architect, Game Scrum Master, Game QA, Game Solo Dev - - Agent roles and when to use them - - Agent workflows and menus - -- **[Workflows Guide](./workflows-guide.md)** - Complete workflow reference - - Phase 1: Preproduction (Brainstorm, Game Brief) - - Phase 2: Design (GDD, Narrative) - - Phase 3: Technical (Architecture) - - Phase 4: Production (Sprint-based development) - -- **[Game Types Guide](./game-types-guide.md)** - Selecting and using game type templates - - 24 supported game types - - Genre-specific GDD sections - - Hybrid game type handling - -- **[Quick-Flow Guide](./quick-flow-guide.md)** - Fast-track workflows for rapid development - - Quick-Prototype for testing ideas - - Quick-Dev for flexible implementation - - When to use quick-flow vs full BMGD - ---- - -## Quick References - -Essential reference materials: - -- **[Glossary](./glossary.md)** - Key game development terminology - ---- - -## Choose Your Path - -### I need to... - -**Start a new game project** -→ Start with [Quick Start Guide](./quick-start.md) -→ Run `brainstorm-game` for ideation -→ Create a Game Brief with `create-brief` - -**Design my game** -→ Create a GDD with `create-gdd` -→ If story-heavy, add Narrative Design with `create-narrative` - -**Plan the technical architecture** -→ Run `create-architecture` with the Game Architect - -**Build my game** -→ Use Phase 4 production workflows -→ Follow the sprint-based development cycle - -**Quickly test an idea or implement a feature** -→ Use [Quick-Flow](./quick-flow-guide.md) for rapid prototyping and development -→ `quick-prototype` to test mechanics, `quick-dev` to implement - -**Set up testing and QA** -→ Use Game QA agent for test framework setup -→ Run `test-framework` to initialize testing for Unity/Unreal/Godot -→ Use `test-design` to create test scenarios -→ Plan playtests with `playtest-plan` - -**Understand game type templates** -→ See [Game Types Guide](./game-types-guide.md) - ---- - -## Game Development Phases - -BMGD follows four phases aligned with game development: - -![BMGD Workflow Overview](./workflow-overview.jpg) - -### Phase 1: Preproduction - -- **Brainstorm Game** - Ideation with game-specific techniques -- **Game Brief** - Capture vision, market, and fundamentals - -### Phase 2: Design - -- **GDD (Game Design Document)** - Comprehensive game design -- **Narrative Design** - Story, characters, world (for story-driven games) - -### Phase 3: Technical - -- **Game Architecture** - Engine, systems, patterns, structure - -### Phase 4: Production - -- **Sprint Planning** - Epic and story management -- **Story Development** - Implementation workflow -- **Code Review** - Quality assurance -- **Testing** - Automated tests, playtesting, performance -- **Retrospective** - Continuous improvement - ---- - -## BMGD vs BMM - -BMGD extends BMM with game-specific capabilities: - -| Aspect | BMM | BMGD | -| -------------- | ------------------------------------- | ------------------------------------------------------------------------ | -| **Focus** | General software | Game development | -| **Agents** | PM, Architect, Dev, SM, TEA, Solo Dev | Game Designer, Game Dev, Game Architect, Game SM, Game QA, Game Solo Dev | -| **Planning** | PRD, Tech Spec | Game Brief, GDD | -| **Types** | N/A | 24 game type templates | -| **Narrative** | N/A | Full narrative workflow | -| **Testing** | Web-focused testarch | Engine-specific (Unity, Unreal, Godot) | -| **Production** | Inherited from BMM | BMM workflows with game overrides | - -BMGD production workflows inherit from BMM and add game-specific checklists and templates. - ---- - -## Documentation Map - -``` -BMGD Documentation -├── README.md (this file) -├── quick-start.md # Getting started -├── agents-guide.md # Agent reference -├── workflows-guide.md # Workflow reference -├── quick-flow-guide.md # Rapid prototyping and development -├── game-types-guide.md # Game type templates -├── glossary.md # Terminology -``` - ---- - -## External Resources - -### Community and Support - -- **[Discord Community](https://discord.gg/gk8jAdXWmj)** - Get help from the community -- **[GitHub Issues](https://github.com/bmad-code-org/BMAD-METHOD/issues)** - Report bugs or request features -- **[YouTube Channel](https://www.youtube.com/@BMadCode)** - Video tutorials - -### Related Documentation - -- **[BMM Documentation](../bmm/index.md)** - Core BMad Method documentation - -## Tips for Using This Documentation - -1. **Start with Quick Start** if you're new to BMGD -2. **Check Game Types Guide** when creating your GDD -3. **Reference Glossary** for game development terminology -4. **Use Troubleshooting** when you encounter issues - ---- - -**Ready to make games?** → [Start with the Quick Start Guide](./quick-start.md) diff --git a/docs/modules/bmgd-bmad-game-dev/quick-start.md b/docs/modules/bmgd-bmad-game-dev/quick-start.md deleted file mode 100644 index 6e625d44..00000000 --- a/docs/modules/bmgd-bmad-game-dev/quick-start.md +++ /dev/null @@ -1,250 +0,0 @@ -# BMGD Quick Start Guide - -Get started building games with the BMad Game Development Module. - ---- - -## Prerequisites - -Before starting with BMGD, ensure you have: - -1. **BMAD-METHOD installed** - Follow the main installation guide -2. **A game idea** - Even a rough concept is enough to start -3. **Your preferred AI tool** - Claude Code, Cursor, or web-based chat - ---- - -## Installation - -BMGD is a custom module that extends BMM. Install it using the BMAD installer: - -```bash -# During installation, select BMGD when prompted for custom modules -npx bmad-cli install -``` - -Or add to an existing installation: - -```bash -npx bmad-cli install --add-module bmgd -``` - ---- - -## Understanding the Phases - -BMGD follows four game development phases: - -![BMGD Workflow Overview](./workflow-overview.jpg) - -### Phase 1: Preproduction - -**What happens:** Capture your game vision and core concept. - -**Workflows:** - -- `brainstorm-game` - Guided ideation with game-specific techniques -- `create-game-brief` - Document vision, market, pillars, and fundamentals - -**Output:** Game Brief document - -### Phase 2: Design - -**What happens:** Detail your game's mechanics, systems, and (optionally) narrative. - -**Workflows:** - -- `create-gdd` - Create comprehensive Game Design Document -- `narrative` - Create Narrative Design Document (for story-driven games) - -**Output:** GDD (and Narrative Design document if applicable) - -### Phase 3: Technical - -**What happens:** Plan how you'll build the game. - -**Workflows:** - -- `create-architecture` - Define engine, systems, patterns, and structure - -**Output:** Game Architecture document - -### Phase 4: Production - -**What happens:** Build your game in sprints. - -**Workflows:** - -- `sprint-planning` - Plan and track sprints -- `sprint-status` - View progress and get recommendations -- `create-story` - Create implementable stories -- `dev-story` - Implement stories -- `code-review` - Quality assurance -- `retrospective` - Learn and improve after epics - -**Output:** Working game code - ---- - -## Your First Game Project - -### Step 1: Start with Brainstorming (Optional) - -If you have a vague idea and want help developing it: - -``` -You: brainstorm-game -Agent: [Guides you through game-specific ideation techniques] -``` - -### Step 2: Create Your Game Brief - -Capture your game's core vision: - -``` -You: create-game-brief -Agent: [Walks you through game concept, pillars, market, and fundamentals] -``` - -**Output:** `{output_folder}/game-brief.md` - -### Step 3: Create Your GDD - -Detail your game's design: - -``` -You: create-gdd -Agent: [Guides you through mechanics, systems, and game-type-specific sections] -``` - -**Output:** `{output_folder}/gdd.md` (or sharded into `{output_folder}/gdd/`) - -### Step 4: Add Narrative Design (If Story-Driven) - -For games with significant story: - -``` -You: narrative -Agent: [Facilitates story, characters, world, and dialogue design] -``` - -**Output:** `{output_folder}/narrative-design.md` - -### Step 5: Create Architecture - -Plan your technical implementation: - -``` -You: create-architecture -Agent: [Guides engine selection, system design, and technical decisions] -``` - -**Output:** `{output_folder}/game-architecture.md` - -### Step 6: Start Building - -Begin sprint-based development: - -``` -You: sprint-planning -Agent: [Sets up sprint tracking and epic management] -``` - ---- - -## Choosing Your Agent - -BMGD provides six specialized agents: - -| Agent | Icon | When to Use | -| --------------------- | ---- | ----------------------------------------- | -| **Game Designer** | 🎲 | Brainstorming, Game Brief, GDD, Narrative | -| **Game Architect** | 🏛️ | Architecture, technical decisions | -| **Game Developer** | 🕹️ | Implementation, code reviews | -| **Game Scrum Master** | 🎯 | Sprint planning, story management | -| **Game QA** | 🧪 | Test framework, test design, automation | -| **Game Solo Dev** | 🎮 | Quick prototyping, indie development | - -### Typical Flow - -1. **Game Designer** (Phases 1-2): Brainstorm → Brief → GDD → Narrative -2. **Game Architect** (Phase 3): Architecture -3. **Game Scrum Master** (Phase 4): Sprint planning, story creation -4. **Game Developer** (Phase 4): Implementation, code reviews - ---- - -## Quick Command Reference - -### Phase 1: Preproduction - -- `brainstorm-game` - Ideation session -- `create-game-brief` - Create Game Brief - -### Phase 2: Design - -- `create-gdd` - Create GDD -- `narrative` - Create Narrative Design - -### Phase 3: Technical - -- `create-architecture` - Create Architecture - -### Phase 4: Production - -- `sprint-planning` - Plan sprints -- `sprint-status` - View progress and recommendations -- `create-story` - Create story -- `dev-story` - Implement story -- `code-review` - Review code -- `retrospective` - Team retrospective -- `correct-course` - Handle sprint changes - -### Quick-Flow (Fast-Track) - -- `quick-prototype` - Rapid prototyping (IDE only) -- `quick-dev` - Flexible development (IDE only) - -### Utility - -- `workflow-status` - Check project status -- `party-mode` - Multi-agent collaboration -- `advanced-elicitation` - Deep exploration - ---- - -## Tips for Success - -### 1. Start Small - -Begin with a simple game concept. You can always expand later. - -### 2. Use Game Type Templates - -When creating your GDD, BMGD offers 24 game type templates that provide genre-specific sections. - -### 3. Iterate - -Documents are living artifacts. Return to update them as your vision evolves. - -### 4. Trust the Process - -Each workflow builds on previous outputs. The Game Brief informs the GDD, which informs the Architecture, which informs implementation. - -### 5. Collaborate with Agents - -Use `party-mode` to get perspectives from multiple agents when facing complex decisions. - ---- - -## Next Steps - -- **[Agents Guide](./agents-guide.md)** - Learn about each agent's capabilities -- **[Workflows Guide](./workflows-guide.md)** - Detailed workflow reference -- **[Quick-Flow Guide](./quick-flow-guide.md)** - Rapid prototyping and development -- **[Game Types Guide](./game-types-guide.md)** - Understand game type templates -- **[Glossary](./glossary.md)** - Game development terminology - ---- - -**Ready to start?** Chat with the **Game Designer** agent and say `brainstorm-game` or `create-game-brief`! diff --git a/docs/modules/bmm-bmad-method/bmad-quick-flow.md b/docs/modules/bmm-bmad-method/bmad-quick-flow.md deleted file mode 100644 index 803f7de9..00000000 --- a/docs/modules/bmm-bmad-method/bmad-quick-flow.md +++ /dev/null @@ -1,506 +0,0 @@ -# BMAD Quick Flow - -**Track:** Quick Flow -**Primary Agent:** Quick Flow Solo Dev (Barry) -**Ideal For:** Bug fixes, small features, rapid prototyping - ---- - -## Overview - -BMAD Quick Flow is the fastest path from idea to production in the BMAD Method ecosystem. It's a streamlined 3-step process designed for rapid spec driven development without sacrificing quality. Perfect for experienced teams who need to move fast or for smaller features or 1 off efforts that don't require extensive planning. - -### When to Use Quick Flow - -**Perfect For:** - -- Bug fixes and patches -- Small feature additions -- Proof of concepts and prototypes -- Mid course corrections or additions of something missed in BMM full planning -- Performance optimizations -- API endpoint additions -- UI component enhancements -- Configuration changes -- Internal tools - -**Not Recommended For:** - -- Large-scale system redesigns -- Complex multi-team projects -- New product launches -- Projects requiring extensive UX design -- Enterprise-wide initiatives -- Mission-critical systems with compliance requirements -- Ideas with many 'moving pieces' - ---- - -## The Quick Flow Process - -Utilizing the Quick Flow Solo Dev, this one agent can do it all! - -1. Create an (option) Technical Specification -2. Develop with Tests -3. AI Driven Code Review - -That's it! Lets look at each step in more detail though. - -### Step 1: Optional Technical Specification - -The `create-tech-spec` workflow transforms requirements into implementation-ready specifications. - -**Key Features:** - -- Conversational spec engineering -- Automatic codebase pattern detection -- Context gathering from existing code -- Implementation-ready task breakdown -- Acceptance criteria definition - -**Process Flow:** - -1. **Problem Understanding** - - Greet user and gather requirements - - Ask clarifying questions about scope and constraints - - Check for existing project context - -2. **Code Investigation (Brownfield)** - - Analyze existing codebase patterns - - Document tech stack and conventions - - Identify files to modify and dependencies - -3. **Specification Generation** - - Create structured tech specification - - Define clear tasks and acceptance criteria - - Document technical decisions - - Include development context - -4. **Review and Finalize** - - Present spec for validation - - Make adjustments as needed - - Save to sprint artifacts - -**Output:** `{implementation_artifacts}/tech-spec-{slug}.md` - -### Step 2: Development - -The `quick-dev` workflow executes implementation with flexibility and speed. - -**Two Execution Modes:** - -**Mode A: Tech-Spec Driven** - -```bash -# Execute from tech spec -quick-dev tech-spec-feature-x.md -``` - -- Loads and parses technical specification -- Extracts tasks, context, and acceptance criteria -- Executes all tasks in sequence -- Updates spec status on completion - -**Mode B: Direct Instructions** - -```bash -# Direct development commands -quick-dev "Add password reset to auth service" -quick-dev "Fix the memory leak in image processing" -``` - -- Accepts direct development instructions -- Offers optional planning step -- Executes immediately with minimal friction - -**Development Process:** - -1. **Context Loading** - - Load project context if available - - Understand patterns and conventions - - Identify relevant files and dependencies - -2. **Implementation Loop** - For each task: - - Load relevant files and context - - Implement following established patterns - - Write appropriate tests - - Run and verify tests pass - - Mark task complete and continue - -3. **Continuous Execution** - - Works through all tasks without stopping - - Handles failures by requesting guidance - - Ensures tests pass before continuing - -4. **Verification** - - Confirms all tasks complete - - Validates acceptance criteria - - Updates tech spec status if used - -### Step 3: Optional Code Review - -The `code-review` workflow provides senior developer review of implemented code. - -**When to Use:** - -- Production-critical features -- Security-sensitive implementations -- Performance optimizations -- Team development scenarios -- Learning and knowledge transfer - -**Review Process:** - -1. Load story context and acceptance criteria -2. Analyze code implementation -3. Check against project patterns -4. Validate test coverage -5. Provide structured review notes -6. Suggest improvements if needed - ---- - -## Quick Flow vs Other Tracks - -| Aspect | Quick Flow | BMad Method | Enterprise Method | -| ----------------- | ---------------- | --------------- | ------------------ | -| **Planning** | Minimal/Optional | Structured | Comprehensive | -| **Documentation** | Essential only | Moderate | Extensive | -| **Team Size** | 1-2 developers | 3-7 specialists | 8+ enterprise team | -| **Timeline** | Hours to days | Weeks to months | Months to quarters | -| **Ceremony** | Minimal | Balanced | Full governance | -| **Flexibility** | High | Moderate | Structured | -| **Risk Profile** | Medium | Low | Very Low | - ---- - -## Best Practices - -### Before Starting Quick Flow - -1. **Validate Track Selection** - - Is the feature small enough? - - Do you have clear requirements? - - Is the team comfortable with rapid development? - -2. **Prepare Context** - - Have project documentation ready - - Know your codebase patterns - - Identify affected components upfront - -3. **Set Clear Boundaries** - - Define in-scope and out-of-scope items - - Establish acceptance criteria - - Identify dependencies - -### During Development - -1. **Maintain Velocity** - - Don't over-engineer solutions - - Follow existing patterns - - Keep tests proportional to risk - -2. **Stay Focused** - - Resist scope creep - - Handle edge cases later if possible - - Document decisions briefly - -3. **Communicate Progress** - - Update task status regularly - - Flag blockers immediately - - Share learning with team - -### After Completion - -1. **Quality Gates** - - Ensure tests pass - - Verify acceptance criteria - - Consider optional code review - -2. **Knowledge Transfer** - - Update relevant documentation - - Share key decisions - - Note any discovered patterns - -3. **Production Readiness** - - Verify deployment requirements - - Check monitoring needs - - Plan rollback strategy - ---- - -## Quick Flow Templates - -### Tech Spec Template - -```markdown -# Tech-Spec: {Feature Title} - -**Created:** {date} -**Status:** Ready for Development -**Estimated Effort:** Small (1-2 days) - -## Overview - -### Problem Statement - -{Clear description of what needs to be solved} - -### Solution - -{High-level approach to solving the problem} - -### Scope (In/Out) - -**In:** {What will be implemented} -**Out:** {Explicitly excluded items} - -## Context for Development - -### Codebase Patterns - -{Key patterns to follow, conventions} - -### Files to Reference - -{List of relevant files and their purpose} - -### Technical Decisions - -{Important technical choices and rationale} - -## Implementation Plan - -### Tasks - -- [ ] Task 1: {Specific implementation task} -- [ ] Task 2: {Specific implementation task} -- [ ] Task 3: {Testing and validation} - -### Acceptance Criteria - -- [ ] AC 1: {Given/When/Then format} -- [ ] AC 2: {Given/When/Then format} - -## Additional Context - -### Dependencies - -{External dependencies or prerequisites} - -### Testing Strategy - -{How the feature will be tested} - -### Notes - -{Additional considerations} -``` - -### Quick Dev Commands - -```bash -# From tech spec -quick-dev sprint-artifacts/tech-spec-user-auth.md - -# Direct development -quick-dev "Add CORS middleware to API endpoints" -quick-dev "Fix null pointer exception in user service" -quick-dev "Optimize database query for user list" - -# With optional planning -quick-dev "Implement file upload feature" --plan -``` - ---- - -## Integration with Other Workflows - -### Upgrading Tracks - -If a Quick Flow feature grows in complexity: - -```mermaid -flowchart LR - QF[Quick Flow] --> CHECK{Complexity Increases?} - CHECK -->|Yes| UPGRADE[Upgrade to BMad Method] - CHECK -->|No| CONTINUE[Continue Quick Flow] - - UPGRADE --> PRD[Create PRD] - PRD --> ARCH[Architecture Design] - ARCH --> STORIES[Create Epics/Stories] - STORIES --> SPRINT[Sprint Planning] - - style QF fill:#e1f5fe - style UPGRADE fill:#fff3e0 - style PRD fill:#f3e5f5 - style ARCH fill:#e8f5e9 - style STORIES fill:#f1f8e9 - style SPRINT fill:#e0f2f1 -``` - -### Using Party Mode - -For complex Quick Flow challenges: - -```bash -# Start Barry -/bmad:bmm:agents:quick-flow-solo-dev - -# Begin party mode for collaborative problem-solving -party-mode -``` - -Party mode brings in relevant experts: - -- **Architect** - For design decisions -- **Dev** - For implementation pairing -- **QA** - For test strategy -- **UX Designer** - For user experience -- **Analyst** - For requirements clarity - -### Quality Assurance Integration - -Quick Flow can integrate with TEA agent for automated testing: - -- Test case generation -- Automated test execution -- Coverage analysis -- Test healing - ---- - -## Common Quick Flow Scenarios - -### Scenario 1: Bug Fix - -``` -Requirement: "Users can't reset passwords" -Process: Direct development (no spec needed) -Steps: Investigate → Fix → Test → Deploy -Time: 2-4 hours -``` - -### Scenario 2: Small Feature - -``` -Requirement: "Add export to CSV functionality" -Process: Tech spec → Development → Code review -Steps: Spec → Implement → Test → Review → Deploy -Time: 1-2 days -``` - -### Scenario 3: Performance Fix - -``` -Requirement: "Optimize slow product search query" -Process: Tech spec → Development → Review -Steps: Analysis → Optimize → Benchmark → Deploy -Time: 1 day -``` - -### Scenario 4: API Addition - -``` -Requirement: "Add webhook endpoints for integrations" -Process: Tech spec → Development → Review -Steps: Design → Implement → Document → Deploy -Time: 2-3 days -``` - ---- - -## Metrics and KPIs - -Track these metrics to ensure Quick Flow effectiveness: - -**Velocity Metrics:** - -- Features completed per week -- Average cycle time (hours) -- Bug fix resolution time -- Code review turnaround - -**Quality Metrics:** - -- Defect escape rate -- Test coverage percentage -- Production incident rate -- Code review findings - -**Team Metrics:** - -- Developer satisfaction -- Knowledge sharing frequency -- Process adherence -- Autonomy index - ---- - -## Troubleshooting Quick Flow - -### Common Issues - -**Issue: Scope creep during development** -**Solution:** Refer back to tech spec, explicitly document new requirements - -**Issue: Unknown patterns or conventions** -**Solution:** Use party-mode to bring in architect or senior dev - -**Issue: Testing bottleneck** -**Solution:** Leverage TEA agent for automated test generation - -**Issue: Integration conflicts** -**Solution:** Document dependencies, coordinate with affected teams - -### Emergency Procedures - -**Production Hotfix:** - -1. Create branch from production -2. Quick dev with minimal changes -3. Deploy to staging -4. Quick regression test -5. Deploy to production -6. Merge to main - -**Critical Bug:** - -1. Immediate investigation -2. Party-mode if unclear -3. Quick fix with rollback plan -4. Post-mortem documentation - ---- - -## Related Documentation - -- **[Quick Flow Solo Dev Agent](./quick-flow-solo-dev.md)** - Primary agent for Quick Flow -- **[Agents Guide](./agents-guide.md)** - Complete agent reference -- **[Scale Adaptive System](./scale-adaptive-system.md)** - Track selection guidance -- **[Party Mode](./party-mode.md)** - Multi-agent collaboration -- **[Workflow Implementation](./workflows-implementation.md)** - Implementation details - ---- - -## FAQ - -**Q: How do I know if my feature is too big for Quick Flow?** -A: If it requires more than 3-5 days of work, affects multiple systems significantly, or needs extensive UX design, consider the BMad Method track. - -**Q: Can I switch from Quick Flow to BMad Method mid-development?** -A: Yes, you can upgrade. Create the missing artifacts (PRD, architecture) and transition to sprint-based development. - -**Q: Is Quick Flow suitable for production-critical features?** -A: Yes, with code review. Quick Flow doesn't sacrifice quality, just ceremony. - -**Q: How do I handle dependencies between Quick Flow features?** -A: Document dependencies clearly, consider batching related features, or upgrade to BMad Method for complex interdependencies. - -**Q: Can junior developers use Quick Flow?** -A: Yes, but they may benefit from the structure of BMad Method. Quick Flow assumes familiarity with patterns and autonomy. - ---- - -**Ready to ship fast?** → Start with `/bmad:bmm:agents:quick-flow-solo-dev` diff --git a/docs/modules/bmm-bmad-method/faq.md b/docs/modules/bmm-bmad-method/faq.md deleted file mode 100644 index 1849f6b9..00000000 --- a/docs/modules/bmm-bmad-method/faq.md +++ /dev/null @@ -1,540 +0,0 @@ -# BMM Frequently Asked Questions - -Quick answers to common questions about the BMad Method Module. - ---- - -## Table of Contents - -- [Getting Started](#getting-started) -- [Choosing the Right Level](#choosing-the-right-level) -- [Workflows and Phases](#workflows-and-phases) -- [Planning Documents](#planning-documents) -- [Implementation](#implementation) -- [Brownfield Development](#brownfield-development) -- [Tools and Technical](#tools-and-technical) - ---- - -## Getting Started - -### Q: Do I always need to run workflow-init? - -**A:** No, once you learn the flow you can go directly to workflows. However, workflow-init is helpful because it: - -- Determines your project's appropriate level automatically -- Creates the tracking status file -- Routes you to the correct starting workflow - -For experienced users: use the [Quick Reference](./quick-start.md#quick-reference-agent-document-mapping) to go directly to the right agent/workflow. - -### Q: Why do I need fresh chats for each workflow? - -**A:** Context-intensive workflows (like brainstorming, PRD creation, architecture design) can cause AI hallucinations if run in sequence within the same chat. Starting fresh ensures the agent has maximum context capacity for each workflow. This is particularly important for: - -- Planning workflows (PRD, architecture) -- Analysis workflows (brainstorming, research) -- Complex story implementation - -Quick workflows like status checks can reuse chats safely. - -### Q: Can I skip workflow-status and just start working? - -**A:** Yes, if you already know your project level and which workflow comes next. workflow-status is mainly useful for: - -- New projects (guides initial setup) -- When you're unsure what to do next -- After breaks in work (reminds you where you left off) -- Checking overall progress - -### Q: What's the minimum I need to get started? - -**A:** For the fastest path: - -1. Install BMad Method: `npx bmad-method@alpha install` -2. For small changes: Load PM agent → run tech-spec → implement -3. For larger projects: Load PM agent → run prd → architect → implement - -### Q: How do I know if I'm in Phase 1, 2, 3, or 4? - -**A:** Check your `bmm-workflow-status.md` file (created by workflow-init). It shows your current phase and progress. If you don't have this file, you can also tell by what you're working on: - -- **Phase 1** - Brainstorming, research, product brief (optional) -- **Phase 2** - Creating either a PRD or tech-spec (always required) -- **Phase 3** - Architecture design (Level 2-4 only) -- **Phase 4** - Actually writing code, implementing stories - ---- - -## Choosing the Right Level - -### Q: How do I know which level my project is? - -**A:** Use workflow-init for automatic detection, or self-assess using these keywords: - -- **Level 0:** "fix", "bug", "typo", "small change", "patch" → 1 story -- **Level 1:** "simple", "basic", "small feature", "add" → 2-10 stories -- **Level 2:** "dashboard", "several features", "admin panel" → 5-15 stories -- **Level 3:** "platform", "integration", "complex", "system" → 12-40 stories -- **Level 4:** "enterprise", "multi-tenant", "multiple products" → 40+ stories - -When in doubt, start smaller. You can always run create-prd later if needed. - -### Q: Can I change levels mid-project? - -**A:** Yes! If you started at Level 1 but realize it's Level 2, you can run create-prd to add proper planning docs. The system is flexible - your initial level choice isn't permanent. - -### Q: What if workflow-init suggests the wrong level? - -**A:** You can override it! workflow-init suggests a level but always asks for confirmation. If you disagree, just say so and choose the level you think is appropriate. Trust your judgment. - -### Q: Do I always need architecture for Level 2? - -**A:** No, architecture is **optional** for Level 2. Only create architecture if you need system-level design. Many Level 2 projects work fine with just PRD created during planning. - -### Q: What's the difference between Level 1 and Level 2? - -**A:** - -- **Level 1:** 1-10 stories, uses tech-spec (simpler, faster), no architecture -- **Level 2:** 5-15 stories, uses PRD (product-focused), optional architecture - -The overlap (5-10 stories) is intentional. Choose based on: - -- Need product-level planning? → Level 2 -- Just need technical plan? → Level 1 -- Multiple epics? → Level 2 -- Single epic? → Level 1 - ---- - -## Workflows and Phases - -### Q: What's the difference between workflow-status and workflow-init? - -**A:** - -- **workflow-status:** Checks existing status and tells you what's next (use when continuing work) -- **workflow-init:** Creates new status file and sets up project (use when starting new project) - -If status file exists, use workflow-status. If not, use workflow-init. - -### Q: Can I skip Phase 1 (Analysis)? - -**A:** Yes! Phase 1 is optional for all levels, though recommended for complex projects. Skip if: - -- Requirements are clear -- No research needed -- Time-sensitive work -- Small changes (Level 0-1) - -### Q: When is Phase 3 (Architecture) required? - -**A:** - -- **Level 0-1:** Never (skip entirely) -- **Level 2:** Optional (only if system design needed) -- **Level 3-4:** Required (comprehensive architecture mandatory) - -### Q: What happens if I skip a recommended workflow? - -**A:** Nothing breaks! Workflows are guidance, not enforcement. However, skipping recommended workflows (like architecture for Level 3) may cause: - -- Integration issues during implementation -- Rework due to poor planning -- Conflicting design decisions -- Longer development time overall - -### Q: How do I know when Phase 3 is complete and I can start Phase 4? - -**A:** For Level 3-4, run the implementation-readiness workflow. It validates PRD + Architecture + Epics + UX (optional) are aligned before implementation. Pass the gate check = ready for Phase 4. - -### Q: Can I run workflows in parallel or do they have to be sequential? - -**A:** Most workflows must be sequential within a phase: - -- Phase 1: brainstorm → research → product-brief (optional order) -- Phase 2: PRD must complete before moving forward -- Phase 3: architecture → epics+stories → implementation-readiness (sequential) -- Phase 4: Stories within an epic should generally be sequential, but stories in different epics can be parallel if you have capacity - ---- - -## Planning Documents - -### Q: Why no tech-spec at Level 2+? - -**A:** Level 2+ projects need product-level planning (PRD) and system-level design (Architecture), which tech-spec doesn't provide. Tech-spec is too narrow for coordinating multiple features. Instead, Level 2-4 uses: - -- PRD (product vision, functional requirements, non-functional requirements) -- Architecture (system design) -- Epics+Stories (created AFTER architecture is complete) - -### Q: Do I need a PRD for a bug fix? - -**A:** No! Bug fixes are typically Level 0 (single atomic change). Use Quick Spec Flow: - -- Load PM agent -- Run tech-spec workflow -- Implement immediately - -PRDs are for Level 2-4 projects with multiple features requiring product-level coordination. - -### Q: Can I skip the product brief? - -**A:** Yes, product brief is always optional. It's most valuable for: - -- Level 3-4 projects needing strategic direction -- Projects with stakeholders requiring alignment -- Novel products needing market research -- When you want to explore solution space before committing - ---- - -## Implementation - -### Q: Does create-story include implementation context? - -**A:** Yes! The create-story workflow generates story files that include implementation-specific guidance, references existing patterns from your documentation, and provides technical context. The workflow loads your architecture, PRD, and existing project documentation to create comprehensive stories. For Quick Flow projects using tech-spec, the tech-spec itself is already comprehensive, so stories can be simpler. - -### Q: How do I mark a story as done? - -**A:** After dev-story completes and code-review passes: - -1. Open `sprint-status.yaml` (created by sprint-planning) -2. Change the story status from `review` to `done` -3. Save the file - -### Q: Can I work on multiple stories at once? - -**A:** Yes, if you have capacity! Stories within different epics can be worked in parallel. However, stories within the same epic are usually sequential because they build on each other. - -### Q: What if my story takes longer than estimated? - -**A:** That's normal! Stories are estimates. If implementation reveals more complexity: - -1. Continue working until DoD is met -2. Consider if story should be split -3. Document learnings in retrospective -4. Adjust future estimates based on this learning - -### Q: When should I run retrospective? - -**A:** After completing all stories in an epic (when epic is done). Retrospectives capture: - -- What went well -- What could improve -- Technical insights -- Learnings for future epics - -Don't wait until project end - run after each epic for continuous improvement. - ---- - -## Brownfield Development - -### Q: What is brownfield vs greenfield? - -**A:** - -- **Greenfield:** New project, starting from scratch, clean slate -- **Brownfield:** Existing project, working with established codebase and patterns - -### Q: Do I have to run document-project for brownfield? - -**A:** Highly recommended, especially if: - -- No existing documentation -- Documentation is outdated -- AI agents need context about existing code -- Level 2-4 complexity - -You can skip it if you have comprehensive, up-to-date documentation including `docs/index.md`. - -### Q: What if I forget to run document-project on brownfield? - -**A:** Workflows will lack context about existing code. You may get: - -- Suggestions that don't match existing patterns -- Integration approaches that miss existing APIs -- Architecture that conflicts with current structure - -Run document-project and restart planning with proper context. - -### Q: Can I use Quick Spec Flow for brownfield projects? - -**A:** Yes! Quick Spec Flow works great for brownfield. It will: - -- Auto-detect your existing stack -- Analyze brownfield code patterns -- Detect conventions and ask for confirmation -- Generate context-rich tech-spec that respects existing code - -Perfect for bug fixes and small features in existing codebases. - -### Q: How does workflow-init handle brownfield with old planning docs? - -**A:** workflow-init asks about YOUR current work first, then uses old artifacts as context: - -1. Shows what it found (old PRD, epics, etc.) -2. Asks: "Is this work in progress, previous effort, or proposed work?" -3. If previous effort: Asks you to describe your NEW work -4. Determines level based on YOUR work, not old artifacts - -This prevents old Level 3 PRDs from forcing Level 3 workflow for new Level 0 bug fix. - -### Q: What if my existing code doesn't follow best practices? - -**A:** Quick Spec Flow detects your conventions and asks: "Should I follow these existing conventions?" You decide: - -- **Yes** → Maintain consistency with current codebase -- **No** → Establish new standards (document why in tech-spec) - -BMM respects your choice - it won't force modernization, but it will offer it. - ---- - -## Tools and Technical - -### Q: Why are my Mermaid diagrams not rendering? - -**A:** Common issues: - -1. Missing language tag: Use ` ```mermaid` not just ` ``` ` -2. Syntax errors in diagram (validate at mermaid.live) -3. Tool doesn't support Mermaid (check your Markdown renderer) - -All BMM docs use valid Mermaid syntax that should render in GitHub, VS Code, and most IDEs. - -### Q: Can I use BMM with GitHub Copilot / Cursor / other AI tools? - -**A:** Yes! BMM is complementary. BMM handles: - -- Project planning and structure -- Workflow orchestration -- Agent Personas and expertise -- Documentation generation -- Quality gates - -Your AI coding assistant handles: - -- Line-by-line code completion -- Quick refactoring -- Test generation - -Use them together for best results. - -### Q: What IDEs/tools support BMM? - -**A:** BMM requires tools with **agent mode** and access to **high-quality LLM models** that can load and follow complex workflows, then properly implement code changes. - -**Recommended Tools:** - -- **Claude Code** ⭐ **Best choice** - - Sonnet 4.5 (excellent workflow following, coding, reasoning) - - Opus (maximum context, complex planning) - - Native agent mode designed for BMM workflows - -- **Cursor** - - Supports Anthropic (Claude) and OpenAI models - - Agent mode with composer - - Good for developers who prefer Cursor's UX - -- **Windsurf** - - Multi-model support - - Agent capabilities - - Suitable for BMM workflows - -**What Matters:** - -1. **Agent mode** - Can load long workflow instructions and maintain context -2. **High-quality LLM** - Models ranked high on SWE-bench (coding benchmarks) -3. **Model selection** - Access to Claude Sonnet 4.5, Opus, or GPT-4o class models -4. **Context capacity** - Can handle large planning documents and codebases - -**Why model quality matters:** BMM workflows require LLMs that can follow multi-step processes, maintain context across phases, and implement code that adheres to specifications. Tools with weaker models will struggle with workflow adherence and code quality. - -### Q: Can I customize agents? - -**A:** Yes! Agents are installed as markdown files with XML-style content (optimized for LLMs, readable by any model). Create customization files in `_bmad/_config/agents/[agent-name].customize.yaml` to override default behaviors while keeping core functionality intact. See agent documentation for customization options. - -**Note:** While source agents in this repo are YAML, they install as `.md` files with XML-style tags - a format any LLM can read and follow. - -### Q: What happens to my planning docs after implementation? - -**A:** Keep them! They serve as: - -- Historical record of decisions -- Onboarding material for new team members -- Reference for future enhancements -- Audit trail for compliance - -For enterprise projects (Level 4), consider archiving completed planning artifacts to keep workspace clean. - -### Q: Can I use BMM for non-software projects? - -**A:** BMM is optimized for software development, but the methodology principles (scale-adaptive planning, just-in-time design, context injection) can apply to other complex project types. You'd need to adapt workflows and agents for your domain. - ---- - -## Advanced Questions - -### Q: What if my project grows from Level 1 to Level 3? - -**A:** Totally fine! When you realize scope has grown: - -1. Run create-prd to add product-level planning -2. Run create-architecture for system design -3. Use existing tech-spec as input for PRD -4. Continue with updated level - -The system is flexible - growth is expected. - -### Q: Can I mix greenfield and brownfield approaches? - -**A:** Yes! Common scenario: adding new greenfield feature to brownfield codebase. Approach: - -1. Run document-project for brownfield context -2. Use greenfield workflows for new feature planning -3. Explicitly document integration points between new and existing -4. Test integration thoroughly - -### Q: How do I handle urgent hotfixes during a sprint? - -**A:** Use correct-course workflow or just: - -1. Save your current work state -2. Load PM agent → quick tech-spec for hotfix -3. Implement hotfix (Level 0 flow) -4. Deploy hotfix -5. Return to original sprint work - -Level 0 Quick Spec Flow is perfect for urgent fixes. - -### Q: What if I disagree with the workflow's recommendations? - -**A:** Workflows are guidance, not enforcement. If a workflow recommends something that doesn't make sense for your context: - -- Explain your reasoning to the agent -- Ask for alternative approaches -- Skip the recommendation if you're confident -- Document why you deviated (for future reference) - -Trust your expertise - BMM supports your decisions. - -### Q: Can multiple developers work on the same BMM project? - -**A:** Yes! But the paradigm is fundamentally different from traditional agile teams. - -**Key Difference:** - -- **Traditional:** Multiple devs work on stories within one epic (months) -- **Agentic:** Each dev owns complete epics (days) - -**In traditional agile:** A team of 5 devs might spend 2-3 months on a single epic, with each dev owning different stories. - -**With BMM + AI agents:** A single dev can complete an entire epic in 1-3 days. What used to take months now takes days. - -**Team Work Distribution:** - -- **Recommended:** Split work by **epic** (not story) -- Each developer owns complete epics end-to-end -- Parallel work happens at epic level -- Minimal coordination needed - -**For full-stack apps:** - -- Frontend and backend can be separate epics (unusual in traditional agile) -- Frontend dev owns all frontend epics -- Backend dev owns all backend epics -- Works because delivery is so fast - -**Enterprise Considerations:** - -- Use **git submodules** for BMM installation (not .gitignore) -- Allows personal configurations without polluting main repo -- Teams may use different AI tools (Claude Code, Cursor, etc.) -- Developers may follow different methods or create custom agents/workflows - -**Quick Tips:** - -- Share `sprint-status.yaml` (single source of truth) -- Assign entire epics to developers (not individual stories) -- Coordinate at epic boundaries, not story level -- Use git submodules for BMM in enterprise settings - -**For comprehensive coverage of enterprise team collaboration, work distribution strategies, git submodule setup, and velocity expectations, see:** - -👉 **[Enterprise Agentic Development Guide](./enterprise-agentic-development.md)** - -### Q: What is party mode and when should I use it? - -**A:** Party mode is a unique multi-agent collaboration feature where ALL your installed agents (19+ from BMM, CIS, BMB, custom modules) discuss your challenges together in real-time. - -**How it works:** - -1. Run `/bmad:core:workflows:party-mode` (or `*party-mode` from any agent) -2. Introduce your topic -3. BMad Master selects 2-3 most relevant agents per message -4. Agents cross-talk, debate, and build on each other's ideas - -**Best for:** - -- Strategic decisions with trade-offs (architecture choices, tech stack, scope) -- Creative brainstorming (game design, product innovation, UX ideation) -- Cross-functional alignment (epic kickoffs, retrospectives, phase transitions) -- Complex problem-solving (multi-faceted challenges, risk assessment) - -**Example parties:** - -- **Product Strategy:** PM + Innovation Strategist (CIS) + Analyst -- **Technical Design:** Architect + Creative Problem Solver (CIS) + Game Architect -- **User Experience:** UX Designer + Design Thinking Coach (CIS) + Storyteller (CIS) - -**Why it's powerful:** - -- Diverse perspectives (technical, creative, strategic) -- Healthy debate reveals blind spots -- Emergent insights from agent interaction -- Natural collaboration across modules - -**For complete documentation:** - -👉 **[Party Mode Guide](./party-mode.md)** - How it works, when to use it, example compositions, best practices - ---- - -## Getting Help - -### Q: Where do I get help if my question isn't answered here? - -**A:** - -1. Search [Complete Documentation](https://github.com/bmad-code-org/BMAD-METHOD/blob/main/README.md) for related topics -2. Ask in [Discord Community](https://discord.gg/gk8jAdXWmj) (#general-dev) -3. Open a [GitHub Issue](https://github.com/bmad-code-org/BMAD-METHOD/issues) -4. Watch [YouTube Tutorials](https://www.youtube.com/@BMadCode) - -### Q: How do I report a bug or request a feature? - -**A:** Open a GitHub issue at: - -Please include: - -- BMM version (check your installed version) -- Steps to reproduce (for bugs) -- Expected vs actual behavior -- Relevant workflow or agent involved - ---- - -## Related Documentation - -- [Quick Start Guide](./quick-start.md) - Get started with BMM -- [Glossary](./glossary.md) - Terminology reference -- [Scale Adaptive System](./scale-adaptive-system.md) - Understanding levels -- [Brownfield Guide](./brownfield-guide.md) - Existing codebase workflows - ---- - -**Have a question not answered here?** Please [open an issue](https://github.com/bmad-code-org/BMAD-METHOD/issues) or ask in [Discord](https://discord.gg/gk8jAdXWmj) so we can add it! diff --git a/docs/modules/bmm-bmad-method/quick-spec-flow.md b/docs/modules/bmm-bmad-method/quick-spec-flow.md deleted file mode 100644 index fb1d3f73..00000000 --- a/docs/modules/bmm-bmad-method/quick-spec-flow.md +++ /dev/null @@ -1,622 +0,0 @@ -# BMad Quick Spec Flow - -**Perfect for:** Bug fixes, small features, rapid prototyping, and quick enhancements - -**Time to implementation:** Minutes, not hours - ---- - -## What is Quick Spec Flow? - -Quick Spec Flow is a **streamlined alternative** to the full BMad Method for Quick Flow track projects. Instead of going through Product Brief → PRD → Architecture, you go **straight to a context-aware technical specification** and start coding. - -### When to Use Quick Spec Flow - -✅ **Use Quick Flow track when:** - -- Single bug fix or small enhancement -- Small feature with clear scope (typically 1-15 stories) -- Rapid prototyping or experimentation -- Adding to existing brownfield codebase -- You know exactly what you want to build - -❌ **Use BMad Method or Enterprise tracks when:** - -- Building new products or major features -- Need stakeholder alignment -- Complex multi-team coordination -- Requires extensive planning and architecture - -💡 **Not sure?** Run `workflow-init` to get a recommendation based on your project's needs! - ---- - -## Quick Spec Flow Overview - -```mermaid -flowchart TD - START[Step 1: Run Tech-Spec Workflow] - DETECT[Detects project stack
package.json, requirements.txt, etc.] - ANALYZE[Analyzes brownfield codebase
if exists] - TEST[Detects test frameworks
and conventions] - CONFIRM[Confirms conventions
with you] - GENERATE[Generates context-rich
tech-spec] - STORIES[Creates ready-to-implement
stories] - - OPTIONAL[Step 2: Optional
Generate Story Context
SM Agent
For complex scenarios only] - - IMPL[Step 3: Implement
DEV Agent
Code, test, commit] - - DONE[DONE! 🚀] - - START --> DETECT - DETECT --> ANALYZE - ANALYZE --> TEST - TEST --> CONFIRM - CONFIRM --> GENERATE - GENERATE --> STORIES - STORIES --> OPTIONAL - OPTIONAL -.->|Optional| IMPL - STORIES --> IMPL - IMPL --> DONE - - style START fill:#bfb,stroke:#333,stroke-width:2px - style OPTIONAL fill:#ffb,stroke:#333,stroke-width:2px,stroke-dasharray: 5 5 - style IMPL fill:#bbf,stroke:#333,stroke-width:2px - style DONE fill:#f9f,stroke:#333,stroke-width:3px -``` - ---- - -## Single Atomic Change - -**Best for:** Bug fixes, single file changes, isolated improvements - -### What You Get - -1. **tech-spec.md** - Comprehensive technical specification with: - - Problem statement and solution - - Detected framework versions and dependencies - - Brownfield code patterns (if applicable) - - Existing test patterns to follow - - Specific file paths to modify - - Complete implementation guidance - -2. **story-[slug].md** - Single user story ready for development - -### Quick Spec Flow Commands - -```bash -# Start Quick Spec Flow (no workflow-init needed!) -# Load PM agent and run tech-spec - -# When complete, implement directly: -# Load DEV agent and run dev-story -``` - -### What Makes It Quick - -- ✅ No Product Brief needed -- ✅ No PRD needed -- ✅ No Architecture doc needed -- ✅ Auto-detects your stack -- ✅ Auto-analyzes brownfield code -- ✅ Auto-validates quality -- ✅ Story context optional (tech-spec is comprehensive!) - -### Example Single Change Scenarios - -- "Fix the login validation bug" -- "Add email field to user registration form" -- "Update API endpoint to return additional field" -- "Improve error handling in payment processing" - ---- - -## Coherent Small Feature - -**Best for:** Small features with 2-3 related user stories - -### What You Get - -1. **tech-spec.md** - Same comprehensive spec as single change projects -2. **epics.md** - Epic organization with story breakdown -3. **story-[epic-slug]-1.md** - First story -4. **story-[epic-slug]-2.md** - Second story -5. **story-[epic-slug]-3.md** - Third story (if needed) - -### Quick Spec Flow Commands - -```bash -# Start Quick Spec Flow -# Load PM agent and run tech-spec - -# Optional: Organize stories as a sprint -# Load SM agent and run sprint-planning - -# Implement story-by-story: -# Load DEV agent and run dev-story for each story -``` - -### Story Sequencing - -Stories are **automatically validated** to ensure proper sequence: - -- ✅ No forward dependencies (Story 2 can't depend on Story 3) -- ✅ Clear dependency documentation -- ✅ Infrastructure → Features → Polish order -- ✅ Backend → Frontend flow - -### Example Small Feature Scenarios - -- "Add OAuth social login (Google, GitHub, Twitter)" -- "Build user profile page with avatar upload" -- "Implement basic search with filters" -- "Add dark mode toggle to application" - ---- - -## Smart Context Discovery - -Quick Spec Flow automatically discovers and uses: - -### 1. Existing Documentation - -- Product briefs (if they exist) -- Research documents -- `document-project` output (brownfield codebase map) - -### 2. Project Stack - -- **Node.js:** package.json → frameworks, dependencies, scripts, test framework -- **Python:** requirements.txt, pyproject.toml → packages, tools -- **Ruby:** Gemfile → gems and versions -- **Java:** pom.xml, build.gradle → Maven/Gradle dependencies -- **Go:** go.mod → modules -- **Rust:** Cargo.toml → crates -- **PHP:** composer.json → packages - -### 3. Brownfield Code Patterns - -- Directory structure and organization -- Existing code patterns (class-based, functional, MVC) -- Naming conventions (camelCase, snake_case, PascalCase) -- Test frameworks and patterns -- Code style (semicolons, quotes, indentation) -- Linter/formatter configs -- Error handling patterns -- Logging conventions -- Documentation style - -### 4. Convention Confirmation - -**IMPORTANT:** Quick Spec Flow detects your conventions and **asks for confirmation**: - -``` -I've detected these conventions in your codebase: - -Code Style: -- ESLint with Airbnb config -- Prettier with single quotes, 2-space indent -- No semicolons - -Test Patterns: -- Jest test framework -- .test.js file naming -- expect() assertion style - -Should I follow these existing conventions? (yes/no) -``` - -**You decide:** Conform to existing patterns or establish new standards! - ---- - -## Modern Best Practices via WebSearch - -Quick Spec Flow stays current by using WebSearch when appropriate: - -### For Greenfield Projects - -- Searches for latest framework versions -- Recommends official starter templates -- Suggests modern best practices - -### For Outdated Dependencies - -- Detects if your dependencies are >2 years old -- Searches for migration guides -- Notes upgrade complexity - -### Starter Template Recommendations - -For greenfield projects, Quick Spec Flow recommends: - -**React:** - -- Vite (modern, fast) -- Next.js (full-stack) - -**Python:** - -- cookiecutter templates -- FastAPI starter - -**Node.js:** - -- NestJS CLI -- express-generator - -**Benefits:** - -- ✅ Modern best practices baked in -- ✅ Proper project structure -- ✅ Build tooling configured -- ✅ Testing framework set up -- ✅ Faster time to first feature - ---- - -## UX/UI Considerations - -For user-facing changes, Quick Spec Flow captures: - -- UI components affected (create vs modify) -- UX flow changes (current vs new) -- Responsive design needs (mobile, tablet, desktop) -- Accessibility requirements: - - Keyboard navigation - - Screen reader compatibility - - ARIA labels - - Color contrast standards -- User feedback patterns: - - Loading states - - Error messages - - Success confirmations - - Progress indicators - ---- - -## Auto-Validation and Quality Assurance - -Quick Spec Flow **automatically validates** everything: - -### Tech-Spec Validation (Always Runs) - -Checks: - -- ✅ Context gathering completeness -- ✅ Definitiveness (no "use X or Y" statements) -- ✅ Brownfield integration quality -- ✅ Stack alignment -- ✅ Implementation readiness - -Generates scores: - -``` -✅ Validation Passed! -- Context Gathering: Comprehensive -- Definitiveness: All definitive -- Brownfield Integration: Excellent -- Stack Alignment: Perfect -- Implementation Readiness: ✅ Ready -``` - -### Story Validation (Multi-Story Features) - -Checks: - -- ✅ Story sequence (no forward dependencies!) -- ✅ Acceptance criteria quality (specific, testable) -- ✅ Completeness (all tech spec tasks covered) -- ✅ Clear dependency documentation - -**Auto-fixes issues if found!** - ---- - -## Complete User Journey - -### Scenario 1: Bug Fix (Single Change) - -**Goal:** Fix login validation bug - -**Steps:** - -1. **Start:** Load PM agent, say "I want to fix the login validation bug" -2. **PM runs tech-spec workflow:** - - Asks: "What problem are you solving?" - - You explain the validation issue - - Detects your Node.js stack (Express 4.18.2, Jest for testing) - - Analyzes existing UserService code patterns - - Asks: "Should I follow your existing conventions?" → You say yes - - Generates tech-spec.md with specific file paths and patterns - - Creates story-login-fix.md -3. **Implement:** Load DEV agent, run `dev-story` - - DEV reads tech-spec (has all context!) - - Implements fix following existing patterns - - Runs tests (following existing Jest patterns) - - Done! - -**Total time:** 15-30 minutes (mostly implementation) - ---- - -### Scenario 2: Small Feature (Multi-Story) - -**Goal:** Add OAuth social login (Google, GitHub) - -**Steps:** - -1. **Start:** Load PM agent, say "I want to add OAuth social login" -2. **PM runs tech-spec workflow:** - - Asks about the feature scope - - You specify: Google and GitHub OAuth - - Detects your stack (Next.js 13.4, NextAuth.js already installed!) - - Analyzes existing auth patterns - - Confirms conventions with you - - Generates: - - tech-spec.md (comprehensive implementation guide) - - epics.md (OAuth Integration epic) - - story-oauth-1.md (Backend OAuth setup) - - story-oauth-2.md (Frontend login buttons) -3. **Optional Sprint Planning:** Load SM agent, run `sprint-planning` -4. **Implement Story 1:** - - Load DEV agent, run `dev-story` for story 1 - - DEV implements backend OAuth -5. **Implement Story 2:** - - DEV agent, run `dev-story` for story 2 - - DEV implements frontend - - Done! - -**Total time:** 1-3 hours (mostly implementation) - -## Integration with Phase 4 Workflows - -Quick Spec Flow works seamlessly with all Phase 4 implementation workflows: - -### create-story (SM Agent) - -- ✅ Can work with tech-spec.md instead of PRD -- ✅ Uses epics.md from tech-spec workflow -- ✅ Creates additional stories if needed - -### sprint-planning (SM Agent) - -- ✅ Works with epics.md from tech-spec -- ✅ Organizes multi-story features for coordinated implementation -- ✅ Tracks progress through sprint-status.yaml - -### dev-story (DEV Agent) - -- ✅ Reads stories generated by tech-spec -- ✅ Uses tech-spec.md as comprehensive context -- ✅ Implements following detected conventions - -## Comparison: Quick Spec vs Full BMM - -| Aspect | Quick Flow Track | BMad Method/Enterprise Tracks | -| --------------------- | ---------------------------- | ---------------------------------- | -| **Setup** | None (standalone) | workflow-init recommended | -| **Planning Docs** | tech-spec.md only | Product Brief → PRD → Architecture | -| **Time to Code** | Minutes | Hours to days | -| **Best For** | Bug fixes, small features | New products, major features | -| **Context Discovery** | Automatic | Manual + guided | -| **Story Context** | Optional (tech-spec is rich) | Required (generated from PRD) | -| **Validation** | Auto-validates everything | Manual validation steps | -| **Brownfield** | Auto-analyzes and conforms | Manual documentation required | -| **Conventions** | Auto-detects and confirms | Document in PRD/Architecture | - - -## When to Graduate from Quick Flow to BMad Method - -Start with Quick Flow, but switch to BMad Method when: - -- ❌ Project grows beyond initial scope -- ❌ Multiple teams need coordination -- ❌ Stakeholders need formal documentation -- ❌ Product vision is unclear -- ❌ Architectural decisions need deep analysis -- ❌ Compliance/regulatory requirements exist - -💡 **Tip:** You can always run `workflow-init` later to transition from Quick Flow to BMad Method! - -## Quick Spec Flow - Key Benefits - -### 🚀 **Speed** - -- No Product Brief -- No PRD -- No Architecture doc -- Straight to implementation - -### 🧠 **Intelligence** - -- Auto-detects stack -- Auto-analyzes brownfield -- Auto-validates quality -- WebSearch for current info - -### 📐 **Respect for Existing Code** - -- Detects conventions -- Asks for confirmation -- Follows patterns -- Adapts vs. changes - -### ✅ **Quality** - -- Auto-validation -- Definitive decisions (no "or" statements) -- Comprehensive context -- Clear acceptance criteria - -### 🎯 **Focus** - -- Single atomic changes -- Coherent small features -- No scope creep -- Fast iteration - -## Getting Started - -### Prerequisites - -- BMad Method installed (`npx bmad-method install`) -- Project directory with code (or empty for greenfield) - -### Quick Start Commands - -```bash -# For a quick bug fix or small change: -# 1. Load Quick Dev Solo agent -# 2. Say: "I want to [describe your change]" -# 3. Agent will ask if you want to run tech-spec -# 4. Answer questions about your change -# 5. Get tech-spec + story -# 6. Reload a fresh context with the solo agent and implement! - -# For a small feature with multiple stories: -# Same as above, but get epic + 2-3 stories -# Optionally use SM sprint-planning to organize -``` - -### No workflow-init Required! - -Quick Spec Flow is **fully standalone** - -## FAQ - -### Q: Can I use Quick Spec Flow on an existing project? - -**A:** Yes! It's perfect for brownfield projects. It will analyze your existing code, detect patterns, and ask if you want to follow them. - -### Q: What if I don't have a package.json or requirements.txt? - -**A:** Quick Spec Flow will work in greenfield mode, recommend starter templates, and use WebSearch for modern best practices. - -### Q: Do I need to run workflow-init first? - -**A:** No! Quick Spec Flow is standalone. But if you want guidance on which flow to use, workflow-init can help. - -### Q: Can I use this for frontend changes? - -**A:** Absolutely! Quick Spec Flow captures UX/UI considerations, component changes, and accessibility requirements. - -### Q: What if my Quick Flow project grows? - -**A:** No problem! You can always transition to BMad Method by running workflow-init and create-prd. Your tech-spec becomes input for the PRD. - -### Q: Can I skip validation? - -**A:** No, validation always runs automatically. But it's fast and catches issues early! - -### Q: Will it work with my team's code style? - -**A:** Yes! It detects your conventions and asks for confirmation. You control whether to follow existing patterns or establish new ones. - ---- - -## Tips and Best Practices - -### 1. **Be Specific in Discovery** - -When describing your change, provide specifics: - -- ✅ "Fix email validation in UserService to allow plus-addressing" -- ❌ "Fix validation bug" - -### 2. **Trust the Convention Detection** - -If it detects your patterns correctly, say yes! It's faster than establishing new conventions. - -### 3. **Use WebSearch Recommendations for Greenfield** - -Starter templates save hours of setup time. Let Quick Spec Flow find the best ones. - -### 4. **Review the Auto-Validation** - -When validation runs, read the scores. They tell you if your spec is production-ready. - -### 5. **Keep Single Changes Truly Atomic** - -If your "single change" needs 3+ files, it might be a multi-story feature. Let the workflow guide you. - -### 6. **Validate Story Sequence for Multi-Story Features** - -When you get multiple stories, check the dependency validation output. Proper sequence matters! - ---- - -## Real-World Examples - -### Example 1: Adding Logging (Single Change) - -**Input:** "Add structured logging to payment processing" - -**Tech-Spec Output:** - -- Detected: winston 3.8.2 already in package.json -- Analyzed: Existing services use winston with JSON format -- Confirmed: Follow existing logging patterns -- Generated: Specific file paths, log levels, format example -- Story: Ready to implement in 1-2 hours - -**Result:** Consistent logging added, following team patterns, no research needed. - ---- - -### Example 2: Search Feature (Multi-Story) - -**Input:** "Add search to product catalog with filters" - -**Tech-Spec Output:** - -- Detected: React 18.2.0, MUI component library, Express backend -- Analyzed: Existing ProductList component patterns -- Confirmed: Follow existing API and component structure -- Generated: - - Epic: Product Search Functionality - - Story 1: Backend search API with filters - - Story 2: Frontend search UI component -- Auto-validated: Story 1 → Story 2 sequence correct - -**Result:** Search feature implemented in 4-6 hours with proper architecture. - ---- - -## Summary - -Quick Spec Flow is your **fast path from idea to implementation** for: - -- 🐛 Bug fixes -- ✨ Small features -- 🚀 Rapid prototyping -- 🔧 Quick enhancements - -**Key Features:** - -- Auto-detects your stack -- Auto-analyzes brownfield code -- Auto-validates quality -- Respects existing conventions -- Uses WebSearch for modern practices -- Generates comprehensive tech-specs -- Creates implementation-ready stories - -**Time to code:** Minutes, not hours. - -**Ready to try it?** Load the PM agent and say what you want to build! 🚀 - ---- - -## Next Steps - -- **Try it now:** Load PM agent and describe a small change -- **Learn more:** See the [BMM Workflow Guides](./index.md#-workflow-guides) for comprehensive workflow documentation -- **Need help deciding?** Run `workflow-init` to get a recommendation -- **Have questions?** Join us on Discord: - ---- - -_Quick Spec Flow - Because not every change needs a Product Brief._ diff --git a/docs/modules/bmm-bmad-method/quick-start.md b/docs/modules/bmm-bmad-method/quick-start.md deleted file mode 100644 index 9358ba15..00000000 --- a/docs/modules/bmm-bmad-method/quick-start.md +++ /dev/null @@ -1,381 +0,0 @@ -# BMad Method V6 Quick Start Guide - -Get started with BMad Method v6 for your new greenfield project. This guide walks you through building software from scratch using AI-powered workflows. - -## TL;DR - The Quick Path - -1. **Install**: `npx bmad-method@alpha install` -2. **Initialize**: Load Analyst agent → Run "workflow-init" -3. **Plan**: Load PM agent to create a PRD -4. **Plan UX**: Load UX Expert to create a UX-Design if your application will have a UX/UI element -5. **Architect**: Load Architect agent → Run "create-architecture" -6. **Epic Plan**: The PM steps back in to help run the create-epics-and-stories -7. **Build**: Load SM agent → Run workflows for each story → Load DEV agent → Implement -8. **Always use fresh chats** for each workflow to avoid context issues - -## What is BMad Method? - -BMad Method (BMM) helps you build software through guided workflows with specialized AI agents. The process follows four phases: - -1. **Phase 1: Analysis** (Optional) - Brainstorming, Research, Product Brief -2. **Phase 2: Planning** (Required) - Create your requirements (tech-spec or PRD) -3. **Phase 3: Solutioning** (Track-dependent) - Design the architecture for BMad Method and Enterprise tracks -4. **Phase 4: Implementation** (Required) - Build your software Epic by Epic, Story by Story - -### Complete Workflow Visualization - -![BMad Method Workflow - Standard Greenfield](./images/workflow-method-greenfield.svg) - -_Complete visual flowchart showing all phases, workflows, agents (color-coded), and decision points for the BMad Method standard greenfield track. Each box is color-coded by the agent responsible for that workflow._ - -## Installation - -```bash -# Install v6 Alpha to your project -npx bmad-method@alpha install -``` - -The interactive installer will guide you through setup and create a `_bmad/` folder with all agents and workflows. - ---- - -## Getting Started - -### Step 1: Initialize Your Workflow - -1. **Load the Analyst agent** in your IDE - Generally this is done by typing `/` - if you are unsure, you can just start with /bmad and see all that is available, sorted by agents and workflows. -2. **Wait for the agent's menu** to appear -3. **Tell the agent**: "Run workflow-init" or type "\*workflow-init" or select the menu item number - -#### What happens during workflow-init? - -Workflows are interactive processes in V6 that replaced tasks and templates from prior versions. There are many types of workflows, and you can even create your own with the BMad Builder module. For the BMad Method, you'll be interacting with expert-designed workflows crafted to work with you to get the best out of both you and the LLM. - -During workflow-init, you'll describe: - -- Your project and its goals -- Whether there's an existing codebase or this is a new project -- The general size and complexity (you can adjust this later) - -#### Planning Tracks - -Based on your description, the workflow will suggest a track and let you choose from: - -**Three Planning Tracks:** - -- **Quick Flow** - Fast implementation (tech-spec only) - bug fixes, simple features, clear scope (typically 1-15 stories) -- **BMad Method** - Full planning (PRD + Architecture + UX) - products, platforms, complex features (typically 10-50+ stories) -- **Enterprise Method** - Extended planning (BMad Method + Security/DevOps/Test) - enterprise requirements, compliance, multi-tenant (typically 30+ stories) - -**Note**: Story counts are guidance, not definitions. Tracks are chosen based on planning needs, not story math. - -#### What gets created? - -Once you confirm your track, the `bmm-workflow-status.yaml` file will be created in your project's docs folder (assuming default install location). This file tracks your progress through all phases. - -**Important notes:** - -- Every track has different paths through the phases -- Story counts can still change based on overall complexity as you work -- For this guide, we'll assume a BMad Method track project -- This workflow will guide you through Phase 1 (optional), Phase 2 (required), and Phase 3 (required for BMad Method and Enterprise tracks) - -### Step 2: Work Through Phases 1-3 - -After workflow-init completes, you'll work through the planning phases. **Important: Use fresh chats for each workflow to avoid context limitations.** - -#### Checking Your Status - -If you're unsure what to do next: - -1. Load any agent in a new chat -2. Ask for "workflow-status" -3. The agent will tell you the next recommended or required workflow - -**Example response:** - -``` -Phase 1 (Analysis) is entirely optional. All workflows are optional or recommended: - - brainstorm-project - optional - - research - optional - - product-brief - RECOMMENDED (but not required) - -The next TRULY REQUIRED step is: - - PRD (Product Requirements Document) in Phase 2 - Planning - - Agent: pm - - Command: prd -``` - -#### How to Run Workflows in Phases 1-3 - -When an agent tells you to run a workflow (like `prd`): - -1. **Start a new chat** with the specified agent -2. **Wait for the menu** to appear -3. **Tell the agent** to run it using any of these formats: - - Type the shorthand: `*prd` - - Say it naturally: "Let's create a new PRD" - - Select the menu number for "create-prd" - -The agents in V6 are very good with fuzzy menu matching! - -#### Quick Reference: Agent → Document Mapping - -For v4 users or those who prefer to skip workflow-status guidance: - -- **Analyst** → Brainstorming, Product Brief -- **PM** → PRD (BMad Method/Enterprise tracks) OR tech-spec (Quick Flow track) -- **UX-Designer** → UX Design Document (if UI part of the project) -- **Architect** → Architecture (BMad Method/Enterprise tracks) - -#### Phase 2: Planning - Creating the PRD - -**For BMad Method and Enterprise tracks:** - -1. Load the **PM agent** in a new chat -2. Tell it to run the PRD workflow -3. Once complete, you'll have: - - **PRD.md** - Your Product Requirements Document - -**For Quick Flow track:** - -- Use **tech-spec** instead of PRD (no architecture needed) - -#### Phase 2 (Optional): UX Design - -If your project has a user interface: - -1. Load the **UX-Designer agent** in a new chat -2. Tell it to run the UX design workflow -3. After completion, you'll have your UX specification document - -#### Phase 3: Architecture - -**For BMad Method and Enterprise tracks:** - -1. Load the **Architect agent** in a new chat -2. Tell it to run the create-architecture workflow -3. After completion, you'll have your architecture document with technical decisions - -#### Phase 3: Create Epics and Stories (REQUIRED after Architecture) - -**V6 Improvement:** Epics and stories are now created AFTER architecture for better quality! - -1. Load the **PM agent** in a new chat -2. Tell it to run "create-epics-and-stories" -3. This breaks down your PRD's FRs/NFRs into implementable epics and stories -4. The workflow uses both PRD and Architecture to create technically-informed stories - -**Why after architecture?** Architecture decisions (database, API patterns, tech stack) directly affect how stories should be broken down and sequenced. - -#### Phase 3: Implementation Readiness Check (Highly Recommended) - -Once epics and stories are created: - -1. Load the **Architect agent** in a new chat -2. Tell it to run "implementation-readiness" -3. This validates cohesion across all your planning documents (PRD, UX, Architecture, Epics) -4. This was called the "PO Master Checklist" in v4 - -**Why run this?** It ensures all your planning assets align properly before you start building. - -#### Optional: TEA Engagement - -Testing is not mandated by BMad. Decide how you want to engage TEA: - -- **No TEA** - Use your existing team testing approach -- **TEA-only (Standalone)** - Use TEA workflows with your own requirements and environment -- **TEA-integrated** - Use TEA as part of the BMad Method or Enterprise flow - -See the [Test Architect Guide](./test-architecture.md) for the five TEA engagement models and recommended sequences. - -#### Context Management Tips - -- **Use 200k+ context models** for best results (Claude Sonnet 4.5, GPT-4, etc.) -- **Fresh chat for each workflow** - Brainstorming, Briefs, Research, and PRD generation are all context-intensive -- **No document sharding needed** - Unlike v4, you don't need to split documents -- **Web Bundles coming soon** - Will help save LLM tokens for users with limited plans - -### Step 3: Start Building (Phase 4 - Implementation) - -Once planning and architecture are complete, you'll move to Phase 4. **Important: Each workflow below should be run in a fresh chat to avoid context limitations and hallucinations.** - -#### 3.1 Initialize Sprint Planning - -1. **Start a new chat** with the **SM (Scrum Master) agent** -2. Wait for the menu to appear -3. Tell the agent: "Run sprint-planning" -4. This creates your `sprint-status.yaml` file that tracks all epics and stories - -#### 3.2 Create Your First Story - -1. **Start a new chat** with the **SM agent** -2. Wait for the menu -3. Tell the agent: "Run create-story" -4. This creates the story file from the epic - -#### 3.3 Implement the Story - -1. **Start a new chat** with the **DEV agent** -2. Wait for the menu -3. Tell the agent: "Run dev-story" -4. The DEV agent will implement the story and update the sprint status - -#### 3.4 Generate Guardrail Tests (Optional) - -1. **Start a new chat** with the **TEA agent** -2. Wait for the menu -3. Tell the agent: "Run automate" -4. The TEA agent generates or expands tests to act as guardrails - -#### 3.5 Review the Code (Optional but Recommended) - -1. **Start a new chat** with the **DEV agent** -2. Wait for the menu -3. Tell the agent: "Run code-review" -4. The DEV agent performs quality validation (this was called QA in v4) - -### Step 4: Keep Going - -For each subsequent story, repeat the cycle using **fresh chats** for each workflow: - -1. **New chat** → SM agent → "Run create-story" -2. **New chat** → DEV agent → "Run dev-story" -3. **New chat** → TEA agent → "Run automate" (optional) -4. **New chat** → DEV agent → "Run code-review" (optional but recommended) - -After completing all stories in an epic: - -1. **Start a new chat** with the **SM agent** -2. Tell the agent: "Run retrospective" - -**Why fresh chats?** Context-intensive workflows can cause hallucinations if you keep issuing commands in the same chat. Starting fresh ensures the agent has maximum context capacity for each workflow. - ---- - -## Understanding the Agents - -Each agent is a specialized AI persona: - -- **Analyst** - Initializes workflows and tracks progress -- **PM** - Creates requirements and specifications -- **UX-Designer** - If your project has a front end - this designer will help produce artifacts, come up with mock updates, and design a great look and feel with you giving it guidance. -- **Architect** - Designs system architecture -- **SM (Scrum Master)** - Manages sprints and creates stories -- **DEV** - Implements code and reviews work - -## How Workflows Work - -1. **Load an agent** - Open the agent file in your IDE to activate it -2. **Wait for the menu** - The agent will present its available workflows -3. **Tell the agent what to run** - Say "Run [workflow-name]" -4. **Follow the prompts** - The agent guides you through each step - -The agent creates documents, asks questions, and helps you make decisions throughout the process. - -## Project Tracking Files - -BMad creates two files to track your progress: - -**1. bmm-workflow-status.yaml** - -- Shows which phase you're in and what's next -- Created by workflow-init -- Updated automatically as you progress through phases - -**2. sprint-status.yaml** (Phase 4 only) - -- Tracks all your epics and stories during implementation -- Critical for SM and DEV agents to know what to work on next -- Created by sprint-planning workflow -- Updated automatically as stories progress - -**You don't need to edit these manually** - agents update them as you work. - ---- - -## The Complete Flow Visualized - -```mermaid -flowchart LR - subgraph P1["Phase 1 (Optional)
Analysis"] - direction TB - A1[Brainstorm] - A2[Research] - A3[Brief] - A4[Analyst] - A1 ~~~ A2 ~~~ A3 ~~~ A4 - end - - subgraph P2["Phase 2 (Required)
Planning"] - direction TB - B1[Quick Flow:
tech-spec] - B2[Method/Enterprise:
PRD] - B3[UX opt] - B4[PM, UX] - B1 ~~~ B2 ~~~ B3 ~~~ B4 - end - - subgraph P3["Phase 3 (Track-dependent)
Solutioning"] - direction TB - C1[Method/Enterprise:
architecture] - C2[gate-check] - C3[Architect] - C1 ~~~ C2 ~~~ C3 - end - - subgraph P4["Phase 4 (Required)
Implementation"] - direction TB - D1[Per Epic:
epic context] - D2[Per Story:
create-story] - D3[dev-story] - D4[code-review] - D5[SM, DEV] - D1 ~~~ D2 ~~~ D3 ~~~ D4 ~~~ D5 - end - - P1 --> P2 - P2 --> P3 - P3 --> P4 - - style P1 fill:#bbf,stroke:#333,stroke-width:2px,color:#000 - style P2 fill:#bfb,stroke:#333,stroke-width:2px,color:#000 - style P3 fill:#ffb,stroke:#333,stroke-width:2px,color:#000 - style P4 fill:#fbf,stroke:#333,stroke-width:2px,color:#000 -``` - -## Common Questions - -**Q: Do I always need architecture?** -A: Only for BMad Method and Enterprise tracks. Quick Flow projects skip straight from tech-spec to implementation. - -**Q: Can I change my plan later?** -A: Yes! The SM agent has a "correct-course" workflow for handling scope changes. - -**Q: What if I want to brainstorm first?** -A: Load the Analyst agent and tell it to "Run brainstorm-project" before running workflow-init. - -**Q: Why do I need fresh chats for each workflow?** -A: Context-intensive workflows can cause hallucinations if run in sequence. Fresh chats ensure maximum context capacity. - -**Q: Can I skip workflow-init and workflow-status?** -A: Yes, once you learn the flow. Use the Quick Reference in Step 2 to go directly to the workflows you need. - -## Getting Help - -- **During workflows**: Agents guide you with questions and explanations -- **Community**: [Discord](https://discord.gg/gk8jAdXWmj) - #general-dev, #bugs-issues -- **Complete guide**: [BMM Workflow Documentation](./index.md#-workflow-guides) -- **YouTube tutorials**: [BMad Code Channel](https://www.youtube.com/@BMadCode) - ---- - -## Key Takeaways - -✅ **Always use fresh chats** - Load agents in new chats for each workflow to avoid context issues -✅ **Let workflow-status guide you** - Load any agent and ask for status when unsure what's next -✅ **Track matters** - Quick Flow uses tech-spec, BMad Method/Enterprise need PRD and architecture -✅ **Tracking is automatic** - The status files update themselves, no manual editing needed -✅ **Agents are flexible** - Use menu numbers, shortcuts (\*prd), or natural language - -**Ready to start building?** Install BMad, load the Analyst, run workflow-init, and let the agents guide you! diff --git a/docs/modules/bmm-bmad-method/test-architecture.md b/docs/modules/bmm-bmad-method/test-architecture.md deleted file mode 100644 index 9d417a7a..00000000 --- a/docs/modules/bmm-bmad-method/test-architecture.md +++ /dev/null @@ -1,486 +0,0 @@ -# Test Architect (TEA) Agent Guide - -## Overview - -- **Persona:** Murat, Master Test Architect and Quality Advisor focused on risk-based testing, fixture architecture, ATDD, and CI/CD governance. -- **Mission:** Deliver actionable quality strategies, automation coverage, and gate decisions that scale with project complexity and compliance demands. -- **Use When:** BMad Method or Enterprise track projects, integration risk is non-trivial, brownfield regression risk exists, or compliance/NFR evidence is required. (Quick Flow projects typically don't require TEA) - -## Choose Your TEA Engagement Model - -BMad does not mandate TEA. There are five valid ways to use it (or skip it). Pick one intentionally. - -1. **No TEA** - - Skip all TEA workflows. Use your existing team testing approach. - -2. **TEA-only (Standalone)** - - Use TEA on a non-BMad project. Bring your own requirements, acceptance criteria, and environments. - - Typical sequence: `*test-design` (system or epic) -> `*atdd` and/or `*automate` -> optional `*test-review` -> `*trace` for coverage and gate decisions. - - Run `*framework` or `*ci` only if you want TEA to scaffold the harness or pipeline. - -3. **Integrated: Greenfield - BMad Method (Simple/Standard Work)** - - Phase 3: system-level `*test-design`, then `*framework` and `*ci`. - - Phase 4: per-epic `*test-design`, optional `*atdd`, then `*automate` and optional `*test-review`. - - Gate (Phase 2): `*trace`. - -4. **Integrated: Brownfield - BMad Method or Enterprise (Simple or Complex)** - - Phase 2: baseline `*trace`. - - Phase 3: system-level `*test-design`, then `*framework` and `*ci`. - - Phase 4: per-epic `*test-design` focused on regression and integration risks. - - Gate (Phase 2): `*trace`; `*nfr-assess` (if not done earlier). - - For brownfield BMad Method, follow the same flow with `*nfr-assess` optional. - -5. **Integrated: Greenfield - Enterprise Method (Enterprise/Compliance Work)** - - Phase 2: `*nfr-assess`. - - Phase 3: system-level `*test-design`, then `*framework` and `*ci`. - - Phase 4: per-epic `*test-design`, plus `*atdd`/`*automate`/`*test-review`. - - Gate (Phase 2): `*trace`; archive artifacts as needed. - -If you are unsure, default to the integrated path for your track and adjust later. - -## TEA Workflow Lifecycle - -TEA integrates into the BMad development lifecycle during Solutioning (Phase 3) and Implementation (Phase 4): - -```mermaid -%%{init: {'theme':'base', 'themeVariables': { 'primaryColor':'#fff','primaryTextColor':'#000','primaryBorderColor':'#000','lineColor':'#000','secondaryColor':'#fff','tertiaryColor':'#fff','fontSize':'16px','fontFamily':'arial'}}}%% -graph TB - subgraph Phase2["Phase 2: PLANNING"] - PM["PM: *prd (creates PRD with FRs/NFRs)"] - PlanNote["Business requirements phase"] - NFR2["TEA: *nfr-assess (optional, enterprise)"] - PM -.-> NFR2 - NFR2 -.-> PlanNote - PM -.-> PlanNote - end - - subgraph Phase3["Phase 3: SOLUTIONING"] - Architecture["Architect: *architecture"] - EpicsStories["PM/Architect: *create-epics-and-stories"] - TestDesignSys["TEA: *test-design (system-level)"] - Framework["TEA: *framework (optional if needed)"] - CI["TEA: *ci (optional if needed)"] - GateCheck["Architect: *implementation-readiness"] - Architecture --> EpicsStories - Architecture --> TestDesignSys - TestDesignSys --> Framework - EpicsStories --> Framework - Framework --> CI - CI --> GateCheck - Phase3Note["Epics created AFTER architecture,
then system-level test design and test infrastructure setup"] - EpicsStories -.-> Phase3Note - end - - subgraph Phase4["Phase 4: IMPLEMENTATION - Per Epic Cycle"] - SprintPlan["SM: *sprint-planning"] - TestDesign["TEA: *test-design (per epic)"] - CreateStory["SM: *create-story"] - ATDD["TEA: *atdd (optional, before dev)"] - DevImpl["DEV: implements story"] - Automate["TEA: *automate"] - TestReview1["TEA: *test-review (optional)"] - Trace1["TEA: *trace (refresh coverage)"] - - SprintPlan --> TestDesign - TestDesign --> CreateStory - CreateStory --> ATDD - ATDD --> DevImpl - DevImpl --> Automate - Automate --> TestReview1 - TestReview1 --> Trace1 - Trace1 -.->|next story| CreateStory - TestDesignNote["Test design: 'How do I test THIS epic?'
Creates test-design-epic-N.md per epic"] - TestDesign -.-> TestDesignNote - end - - subgraph Gate["EPIC/RELEASE GATE"] - NFR["TEA: *nfr-assess (if not done earlier)"] - TestReview2["TEA: *test-review (final audit, optional)"] - TraceGate["TEA: *trace - Phase 2: Gate"] - GateDecision{"Gate Decision"} - - NFR --> TestReview2 - TestReview2 --> TraceGate - TraceGate --> GateDecision - GateDecision -->|PASS| Pass["PASS ✅"] - GateDecision -->|CONCERNS| Concerns["CONCERNS ⚠️"] - GateDecision -->|FAIL| Fail["FAIL ❌"] - GateDecision -->|WAIVED| Waived["WAIVED ⏭️"] - end - - Phase2 --> Phase3 - Phase3 --> Phase4 - Phase4 --> Gate - - style Phase2 fill:#bbdefb,stroke:#0d47a1,stroke-width:3px,color:#000 - style Phase3 fill:#c8e6c9,stroke:#2e7d32,stroke-width:3px,color:#000 - style Phase4 fill:#e1bee7,stroke:#4a148c,stroke-width:3px,color:#000 - style Gate fill:#ffe082,stroke:#f57c00,stroke-width:3px,color:#000 - style Pass fill:#4caf50,stroke:#1b5e20,stroke-width:3px,color:#000 - style Concerns fill:#ffc107,stroke:#f57f17,stroke-width:3px,color:#000 - style Fail fill:#f44336,stroke:#b71c1c,stroke-width:3px,color:#000 - style Waived fill:#9c27b0,stroke:#4a148c,stroke-width:3px,color:#000 -``` - -**Phase Numbering Note:** BMad uses a 4-phase methodology with optional Phase 1 and documentation prerequisite: - -- **Documentation** (Optional for brownfield): Prerequisite using `*document-project` -- **Phase 1** (Optional): Discovery/Analysis (`*brainstorm`, `*research`, `*product-brief`) -- **Phase 2** (Required): Planning (`*prd` creates PRD with FRs/NFRs) -- **Phase 3** (Track-dependent): Solutioning (`*architecture` → `*test-design` (system-level) → `*create-epics-and-stories` → TEA: `*framework`, `*ci` → `*implementation-readiness`) -- **Phase 4** (Required): Implementation (`*sprint-planning` → per-epic: `*test-design` → per-story: dev workflows) - -**TEA workflows:** `*framework` and `*ci` run once in Phase 3 after architecture. `*test-design` is **dual-mode**: - -- **System-level (Phase 3):** Run immediately after architecture/ADR drafting to produce `test-design-system.md` (testability review, ADR → test mapping, Architecturally Significant Requirements (ASRs), environment needs). Feeds the implementation-readiness gate. -- **Epic-level (Phase 4):** Run per-epic to produce `test-design-epic-N.md` (risk, priorities, coverage plan). - -Quick Flow track skips Phases 1 and 3. -BMad Method and Enterprise use all phases based on project needs. -When an ADR or architecture draft is produced, run `*test-design` in **system-level** mode before the implementation-readiness gate. This ensures the ADR has an attached testability review and ADR → test mapping. Keep the test-design updated if ADRs change. - -### Why TEA is Different from Other BMM Agents - -TEA is the only BMM agent that operates in **multiple phases** (Phase 3 and Phase 4) and has its own **knowledge base architecture**. - -
-Cross-Phase Operation & Unique Architecture - -### Phase-Specific Agents (Standard Pattern) - -Most BMM agents work in a single phase: - -- **Phase 1 (Analysis)**: Analyst agent -- **Phase 2 (Planning)**: PM agent -- **Phase 3 (Solutioning)**: Architect agent -- **Phase 4 (Implementation)**: SM, DEV agents - -### TEA: Multi-Phase Quality Agent (Unique Pattern) - -TEA is **the only agent that operates in multiple phases**: - -``` -Phase 1 (Analysis) → [TEA not typically used] - ↓ -Phase 2 (Planning) → [PM defines requirements - TEA not active] - ↓ -Phase 3 (Solutioning) → TEA: *framework, *ci (test infrastructure AFTER architecture) - ↓ -Phase 4 (Implementation) → TEA: *test-design (per epic: "how do I test THIS feature?") - → TEA: *atdd, *automate, *test-review, *trace (per story) - ↓ -Epic/Release Gate → TEA: *nfr-assess, *trace Phase 2 (release decision) -``` - -### TEA's 8 Workflows Across Phases - -**Standard agents**: 1-3 workflows per phase -**TEA**: 8 workflows across Phase 3, Phase 4, and Release Gate - -| Phase | TEA Workflows | Frequency | Purpose | -| ----------- | --------------------------------------------------------- | ---------------- | ---------------------------------------------- | -| **Phase 2** | (none) | - | Planning phase - PM defines requirements | -| **Phase 3** | \*framework, \*ci | Once per project | Setup test infrastructure AFTER architecture | -| **Phase 4** | \*test-design, \*atdd, \*automate, \*test-review, \*trace | Per epic/story | Test planning per epic, then per-story testing | -| **Release** | \*nfr-assess, \*trace (Phase 2: gate) | Per epic/release | Go/no-go decision | - -**Note**: `*trace` is a two-phase workflow: Phase 1 (traceability) + Phase 2 (gate decision). This reduces cognitive load while maintaining natural workflow. - -### Why TEA Gets Special Treatment - -TEA uniquely requires: - -- **Extensive domain knowledge**: 32 fragments covering test patterns, CI/CD, fixtures, quality practices, healing strategies, and optional playwright-utils integration -- **Centralized reference system**: `tea-index.csv` for on-demand fragment loading during workflow execution -- **Cross-cutting concerns**: Domain-specific testing patterns (vs project-specific artifacts like PRDs/stories) -- **Optional integrations**: MCP capabilities (healing, exploratory, verification) and playwright-utils support - -This architecture enables TEA to maintain consistent, production-ready testing patterns across all BMad projects while operating across multiple development phases. - -### Playwright Utils Integration - -TEA optionally integrates with `@seontechnologies/playwright-utils`, an open-source library providing fixture-based utilities for Playwright tests. - -**Installation:** - -```bash -npm install -D @seontechnologies/playwright-utils -``` - -**Enable during BMAD installation** by answering "Yes" when prompted. - -**Supported utilities (10 total):** - -- api-request, network-recorder, auth-session, intercept-network-call, recurse -- log, file-utils, burn-in, network-error-monitor -- fixtures-composition (integration patterns) - -**Workflows adapt:** automate, framework, test-review, ci, atdd (+ light mention in test-design). - -**Knowledge base:** 32 total fragments (21 core patterns + 11 playwright-utils) - -
- -## High-Level Cheat Sheets - -These cheat sheets map TEA workflows to the **BMad Method and Enterprise tracks** across the **4-Phase Methodology** (Phase 1: Analysis, Phase 2: Planning, Phase 3: Solutioning, Phase 4: Implementation). - -**Note:** Quick Flow projects typically don't require TEA (covered in Overview). These cheat sheets focus on BMad Method and Enterprise tracks where TEA adds value. - -**Legend for Track Deltas:** - -- ➕ = New workflow or phase added (doesn't exist in baseline) -- 🔄 = Modified focus (same workflow, different emphasis or purpose) -- 📦 = Additional output or archival requirement - -### Greenfield - BMad Method (Simple/Standard Work) - -**Planning Track:** BMad Method (PRD + Architecture) -**Use Case:** New projects with standard complexity - -| Workflow Stage | Test Architect | Dev / Team | Outputs | -| -------------------------- | ----------------------------------------------------------------- | ----------------------------------------------------------------------------------- | ---------------------------------------------------------- | -| **Phase 1**: Discovery | - | Analyst `*product-brief` (optional) | `product-brief.md` | -| **Phase 2**: Planning | - | PM `*prd` (creates PRD with FRs/NFRs) | PRD with functional/non-functional requirements | -| **Phase 3**: Solutioning | Run `*framework`, `*ci` AFTER architecture and epic creation | Architect `*architecture`, `*create-epics-and-stories`, `*implementation-readiness` | Architecture, epics/stories, test scaffold, CI pipeline | -| **Phase 4**: Sprint Start | - | SM `*sprint-planning` | Sprint status file with all epics and stories | -| **Phase 4**: Epic Planning | Run `*test-design` for THIS epic (per-epic test plan) | Review epic scope | `test-design-epic-N.md` with risk assessment and test plan | -| **Phase 4**: Story Dev | (Optional) `*atdd` before dev, then `*automate` after | SM `*create-story`, DEV implements | Tests, story implementation | -| **Phase 4**: Story Review | Execute `*test-review` (optional), re-run `*trace` | Address recommendations, update code/tests | Quality report, refreshed coverage matrix | -| **Phase 4**: Release Gate | (Optional) `*test-review` for final audit, Run `*trace` (Phase 2) | Confirm Definition of Done, share release notes | Quality audit, Gate YAML + release summary | - -
-Execution Notes - -- Run `*framework` only once per repo or when modern harness support is missing. -- **Phase 3 (Solutioning)**: After architecture is complete, run `*framework` and `*ci` to setup test infrastructure based on architectural decisions. -- **Phase 4 starts**: After solutioning is complete, sprint planning loads all epics. -- **`*test-design` runs per-epic**: At the beginning of working on each epic, run `*test-design` to create a test plan for THAT specific epic/feature. Output: `test-design-epic-N.md`. -- Use `*atdd` before coding when the team can adopt ATDD; share its checklist with the dev agent. -- Post-implementation, keep `*trace` current, expand coverage with `*automate`, optionally review test quality with `*test-review`. For release gate, run `*trace` with Phase 2 enabled to get deployment decision. -- Use `*test-review` after `*atdd` to validate generated tests, after `*automate` to ensure regression quality, or before gate for final audit. -- Clarification: `*test-review` is optional and only audits existing tests; run it after `*atdd` or `*automate` when you want a quality review, not as a required step. -- Clarification: `*atdd` outputs are not auto-consumed; share the ATDD doc/tests with the dev workflow. `*trace` does not run `*atdd`—it evaluates existing artifacts for coverage and gate readiness. -- Clarification: `*ci` is a one-time setup; recommended early (Phase 3 or before feature work), but it can be done later if it was skipped. - -
- -
-Worked Example – “Nova CRM” Greenfield Feature - -1. **Planning (Phase 2):** Analyst runs `*product-brief`; PM executes `*prd` to produce PRD with FRs/NFRs. -2. **Solutioning (Phase 3):** Architect completes `*architecture` for the new module; `*create-epics-and-stories` generates epics/stories based on architecture; TEA sets up test infrastructure via `*framework` and `*ci` based on architectural decisions; gate check validates planning completeness. -3. **Sprint Start (Phase 4):** Scrum Master runs `*sprint-planning` to load all epics into sprint status. -4. **Epic 1 Planning (Phase 4):** TEA runs `*test-design` to create test plan for Epic 1, producing `test-design-epic-1.md` with risk assessment. -5. **Story Implementation (Phase 4):** For each story in Epic 1, SM generates story via `*create-story`; TEA optionally runs `*atdd`; Dev implements with guidance from failing tests. -6. **Post-Dev (Phase 4):** TEA runs `*automate`, optionally `*test-review` to audit test quality, re-runs `*trace` to refresh coverage. -7. **Release Gate:** TEA runs `*trace` with Phase 2 enabled to generate gate decision. - -
- -### Brownfield - BMad Method or Enterprise (Simple or Complex) - -**Planning Tracks:** BMad Method or Enterprise Method -**Use Case:** Existing codebases - simple additions (BMad Method) or complex enterprise requirements (Enterprise Method) - -**🔄 Brownfield Deltas from Greenfield:** - -- ➕ Documentation (Prerequisite) - Document existing codebase if undocumented -- ➕ Phase 2: `*trace` - Baseline existing test coverage before planning -- 🔄 Phase 4: `*test-design` - Focus on regression hotspots and brownfield risks -- 🔄 Phase 4: Story Review - May include `*nfr-assess` if not done earlier - -| Workflow Stage | Test Architect | Dev / Team | Outputs | -| --------------------------------- | --------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- | ---------------------------------------------------------------------- | -| **Documentation**: Prerequisite ➕ | - | Analyst `*document-project` (if undocumented) | Comprehensive project documentation | -| **Phase 1**: Discovery | - | Analyst/PM/Architect rerun planning workflows | Updated planning artifacts in `{output_folder}` | -| **Phase 2**: Planning | Run ➕ `*trace` (baseline coverage) | PM `*prd` (creates PRD with FRs/NFRs) | PRD with FRs/NFRs, ➕ coverage baseline | -| **Phase 3**: Solutioning | Run `*framework`, `*ci` AFTER architecture and epic creation | Architect `*architecture`, `*create-epics-and-stories`, `*implementation-readiness` | Architecture, epics/stories, test framework, CI pipeline | -| **Phase 4**: Sprint Start | - | SM `*sprint-planning` | Sprint status file with all epics and stories | -| **Phase 4**: Epic Planning | Run `*test-design` for THIS epic 🔄 (regression hotspots) | Review epic scope and brownfield risks | `test-design-epic-N.md` with brownfield risk assessment and mitigation | -| **Phase 4**: Story Dev | (Optional) `*atdd` before dev, then `*automate` after | SM `*create-story`, DEV implements | Tests, story implementation | -| **Phase 4**: Story Review | Apply `*test-review` (optional), re-run `*trace`, ➕ `*nfr-assess` if needed | Resolve gaps, update docs/tests | Quality report, refreshed coverage matrix, NFR report | -| **Phase 4**: Release Gate | (Optional) `*test-review` for final audit, Run `*trace` (Phase 2) | Capture sign-offs, share release notes | Quality audit, Gate YAML + release summary | - -
-Execution Notes - -- Lead with `*trace` during Planning (Phase 2) to baseline existing test coverage before architecture work begins. -- **Phase 3 (Solutioning)**: After architecture is complete, run `*framework` and `*ci` to modernize test infrastructure. For brownfield, framework may need to integrate with or replace existing test setup. -- **Phase 4 starts**: After solutioning is complete and sprint planning loads all epics. -- **`*test-design` runs per-epic**: At the beginning of working on each epic, run `*test-design` to identify regression hotspots, integration risks, and mitigation strategies for THAT specific epic/feature. Output: `test-design-epic-N.md`. -- Use `*atdd` when stories benefit from ATDD; otherwise proceed to implementation and rely on post-dev automation. -- After development, expand coverage with `*automate`, optionally review test quality with `*test-review`, re-run `*trace` (Phase 2 for gate decision). Run `*nfr-assess` now if non-functional risks weren't addressed earlier. -- Use `*test-review` to validate existing brownfield tests or audit new tests before gate. - -
- -
-Worked Example – “Atlas Payments” Brownfield Story - -1. **Planning (Phase 2):** PM executes `*prd` to create PRD with FRs/NFRs; TEA runs `*trace` to baseline existing coverage. -2. **Solutioning (Phase 3):** Architect triggers `*architecture` capturing legacy payment flows and integration architecture; `*create-epics-and-stories` generates Epic 1 (Payment Processing) based on architecture; TEA sets up `*framework` and `*ci` based on architectural decisions; gate check validates planning. -3. **Sprint Start (Phase 4):** Scrum Master runs `*sprint-planning` to load Epic 1 into sprint status. -4. **Epic 1 Planning (Phase 4):** TEA runs `*test-design` for Epic 1 (Payment Processing), producing `test-design-epic-1.md` that flags settlement edge cases, regression hotspots, and mitigation plans. -5. **Story Implementation (Phase 4):** For each story in Epic 1, SM generates story via `*create-story`; TEA runs `*atdd` producing failing Playwright specs; Dev implements with guidance from tests and checklist. -6. **Post-Dev (Phase 4):** TEA applies `*automate`, optionally `*test-review` to audit test quality, re-runs `*trace` to refresh coverage. -7. **Release Gate:** TEA performs `*nfr-assess` to validate SLAs, runs `*trace` with Phase 2 enabled to generate gate decision (PASS/CONCERNS/FAIL). - -
- -### Greenfield - Enterprise Method (Enterprise/Compliance Work) - -**Planning Track:** Enterprise Method (BMad Method + extended security/devops/test strategies) -**Use Case:** New enterprise projects with compliance, security, or complex regulatory requirements - -**🏢 Enterprise Deltas from BMad Method:** - -- ➕ Phase 1: `*research` - Domain and compliance research (recommended) -- ➕ Phase 2: `*nfr-assess` - Capture NFR requirements early (security/performance/reliability) -- 🔄 Phase 4: `*test-design` - Enterprise focus (compliance, security architecture alignment) -- 📦 Release Gate - Archive artifacts and compliance evidence for audits - -| Workflow Stage | Test Architect | Dev / Team | Outputs | -| -------------------------- | ----------------------------------------------------------------------- | ----------------------------------------------------------------------------------- | ------------------------------------------------------------------ | -| **Phase 1**: Discovery | - | Analyst ➕ `*research`, `*product-brief` | Domain research, compliance analysis, product brief | -| **Phase 2**: Planning | Run ➕ `*nfr-assess` | PM `*prd` (creates PRD with FRs/NFRs), UX `*create-ux-design` | Enterprise PRD with FRs/NFRs, UX design, ➕ NFR documentation | -| **Phase 3**: Solutioning | Run `*framework`, `*ci` AFTER architecture and epic creation | Architect `*architecture`, `*create-epics-and-stories`, `*implementation-readiness` | Architecture, epics/stories, test framework, CI pipeline | -| **Phase 4**: Sprint Start | - | SM `*sprint-planning` | Sprint plan with all epics | -| **Phase 4**: Epic Planning | Run `*test-design` for THIS epic 🔄 (compliance focus) | Review epic scope and compliance requirements | `test-design-epic-N.md` with security/performance/compliance focus | -| **Phase 4**: Story Dev | (Optional) `*atdd`, `*automate`, `*test-review`, `*trace` per story | SM `*create-story`, DEV implements | Tests, fixtures, quality reports, coverage matrices | -| **Phase 4**: Release Gate | Final `*test-review` audit, Run `*trace` (Phase 2), 📦 archive artifacts | Capture sign-offs, 📦 compliance evidence | Quality audit, updated assessments, gate YAML, 📦 audit trail | - -
-Execution Notes - -- `*nfr-assess` runs early in Planning (Phase 2) to capture compliance, security, and performance requirements upfront. -- **Phase 3 (Solutioning)**: After architecture is complete, run `*framework` and `*ci` with enterprise-grade configurations (selective testing, burn-in jobs, caching, notifications). -- **Phase 4 starts**: After solutioning is complete and sprint planning loads all epics. -- **`*test-design` runs per-epic**: At the beginning of working on each epic, run `*test-design` to create an enterprise-focused test plan for THAT specific epic, ensuring alignment with security architecture, performance targets, and compliance requirements. Output: `test-design-epic-N.md`. -- Use `*atdd` for stories when feasible so acceptance tests can lead implementation. -- Use `*test-review` per story or sprint to maintain quality standards and ensure compliance with testing best practices. -- Prior to release, rerun coverage (`*trace`, `*automate`), perform final quality audit with `*test-review`, and formalize the decision with `*trace` Phase 2 (gate decision); archive artifacts for compliance audits. - -
- -
-Worked Example – “Helios Ledger” Enterprise Release - -1. **Planning (Phase 2):** Analyst runs `*research` and `*product-brief`; PM completes `*prd` creating PRD with FRs/NFRs; TEA runs `*nfr-assess` to establish NFR targets. -2. **Solutioning (Phase 3):** Architect completes `*architecture` with enterprise considerations; `*create-epics-and-stories` generates epics/stories based on architecture; TEA sets up `*framework` and `*ci` with enterprise-grade configurations based on architectural decisions; gate check validates planning completeness. -3. **Sprint Start (Phase 4):** Scrum Master runs `*sprint-planning` to load all epics into sprint status. -4. **Per-Epic (Phase 4):** For each epic, TEA runs `*test-design` to create epic-specific test plan (e.g., `test-design-epic-1.md`, `test-design-epic-2.md`) with compliance-focused risk assessment. -5. **Per-Story (Phase 4):** For each story, TEA uses `*atdd`, `*automate`, `*test-review`, and `*trace`; Dev teams iterate on the findings. -6. **Release Gate:** TEA re-checks coverage, performs final quality audit with `*test-review`, and logs the final gate decision via `*trace` Phase 2, archiving artifacts for compliance. - -
- -## Command Catalog - -
-Optional Playwright MCP Enhancements - -**Two Playwright MCP servers** (actively maintained, continuously updated): - -- `playwright` - Browser automation (`npx @playwright/mcp@latest`) -- `playwright-test` - Test runner with failure analysis (`npx playwright run-test-mcp-server`) - -**How MCP Enhances TEA Workflows**: - -MCP provides additional capabilities on top of TEA's default AI-based approach: - -1. `*test-design`: - - Default: Analysis + documentation - - **+ MCP**: Interactive UI discovery with `browser_navigate`, `browser_click`, `browser_snapshot`, behavior observation - - Benefit: Discover actual functionality, edge cases, undocumented features - -2. `*atdd`, `*automate`: - - Default: Infers selectors and interactions from requirements and knowledge fragments - - **+ MCP**: Generates tests **then** verifies with `generator_setup_page`, `browser_*` tools, validates against live app - - Benefit: Accurate selectors from real DOM, verified behavior, refined test code - -3. `*automate`: - - Default: Pattern-based fixes from error messages + knowledge fragments - - **+ MCP**: Pattern fixes **enhanced with** `browser_snapshot`, `browser_console_messages`, `browser_network_requests`, `browser_generate_locator` - - Benefit: Visual failure context, live DOM inspection, root cause discovery - -**Config example**: - -```json -{ - "mcpServers": { - "playwright": { - "command": "npx", - "args": ["@playwright/mcp@latest"] - }, - "playwright-test": { - "command": "npx", - "args": ["playwright", "run-test-mcp-server"] - } - } -} -``` - -**To disable**: Set `tea_use_mcp_enhancements: false` in `_bmad/bmm/config.yaml` OR remove MCPs from IDE config. - -
- -
-Optional Playwright Utils Integration - -**Open-source Playwright utilities** from SEON Technologies (production-tested, npm published): - -- **Package**: `@seontechnologies/playwright-utils` ([npm](https://www.npmjs.com/package/@seontechnologies/playwright-utils) | [GitHub](https://github.com/seontechnologies/playwright-utils)) -- **Install**: `npm install -D @seontechnologies/playwright-utils` - -**How Playwright Utils Enhances TEA Workflows**: - -Provides fixture-based utilities that integrate into TEA's test generation and review workflows: - -1. `*framework`: - - Default: Basic Playwright scaffold - - **+ playwright-utils**: Scaffold with api-request, network-recorder, auth-session, burn-in, network-error-monitor fixtures pre-configured - - Benefit: Production-ready patterns from day one - -2. `*automate`, `*atdd`: - - Default: Standard test patterns - - **+ playwright-utils**: Tests using api-request (schema validation), intercept-network-call (mocking), recurse (polling), log (structured logging), file-utils (CSV/PDF) - - Benefit: Advanced patterns without boilerplate - -3. `*test-review`: - - Default: Reviews against core knowledge base (21 fragments) - - **+ playwright-utils**: Reviews against expanded knowledge base (32 fragments: 21 core + 11 playwright-utils) - - Benefit: Reviews include fixture composition, auth patterns, network recording best practices - -4. `*ci`: - - Default: Standard CI workflow - - **+ playwright-utils**: CI workflow with burn-in script (smart test selection) and network-error-monitor integration - - Benefit: Faster CI feedback, HTTP error detection - -**Utilities available** (10 total): api-request, network-recorder, auth-session, intercept-network-call, recurse, log, file-utils, burn-in, network-error-monitor, fixtures-composition - -**Enable during BMAD installation** by answering "Yes" when prompted, or manually set `tea_use_playwright_utils: true` in `_bmad/bmm/config.yaml`. - -**To disable**: Set `tea_use_playwright_utils: false` in `_bmad/bmm/config.yaml`. - -
- -

- -| Command | Primary Outputs | Notes | With Playwright MCP Enhancements | -| -------------- | --------------------------------------------------------------------------------------------- | ---------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ | -| `*framework` | Playwright/Cypress scaffold, `.env.example`, `.nvmrc`, sample specs | Use when no production-ready harness exists | - | -| `*ci` | CI workflow, selective test scripts, secrets checklist | Platform-aware (GitHub Actions default) | - | -| `*test-design` | Combined risk assessment, mitigation plan, and coverage strategy | Risk scoring + optional exploratory mode | **+ Exploratory**: Interactive UI discovery with browser automation (uncover actual functionality) | -| `*atdd` | Failing acceptance tests + implementation checklist | TDD red phase + optional recording mode | **+ Recording**: AI generation verified with live browser (accurate selectors from real DOM) | -| `*automate` | Prioritized specs, fixtures, README/script updates, DoD summary | Optional healing/recording, avoid duplicate coverage | **+ Healing**: Pattern fixes enhanced with visual debugging + **+ Recording**: AI verified with live browser | -| `*test-review` | Test quality review report with 0-100 score, violations, fixes | Reviews tests against knowledge base patterns | - | -| `*nfr-assess` | NFR assessment report with actions | Focus on security/performance/reliability | - | -| `*trace` | Phase 1: Coverage matrix, recommendations. Phase 2: Gate decision (PASS/CONCERNS/FAIL/WAIVED) | Two-phase workflow: traceability + gate decision | - | diff --git a/docs/modules/bmm-bmad-method/troubleshooting.md b/docs/modules/bmm-bmad-method/troubleshooting.md deleted file mode 100644 index 99ce15a8..00000000 --- a/docs/modules/bmm-bmad-method/troubleshooting.md +++ /dev/null @@ -1,3 +0,0 @@ -# BMM Troubleshooting Guide - -Common issues and solutions for the BMad Method Module will be listed here as needed. \ No newline at end of file diff --git a/docs/modules/bmm-bmad-method/workflows-analysis.md b/docs/modules/bmm-bmad-method/workflows-analysis.md deleted file mode 100644 index 89736808..00000000 --- a/docs/modules/bmm-bmad-method/workflows-analysis.md +++ /dev/null @@ -1,199 +0,0 @@ -# BMM Analysis Workflows (Phase 1) - -## Overview - -Phase 1 (Analysis) workflows are **optional** exploration and discovery tools that help validate ideas, understand markets, and generate strategic context before planning begins. - -**Key principle:** Analysis workflows help you think strategically before committing to implementation. Skip them if your requirements are already clear. - -**When to use:** Starting new projects, exploring opportunities, validating market fit, generating ideas, understanding problem spaces. - -**When to skip:** Continuing existing projects with clear requirements, well-defined features with known solutions, strict constraints where discovery is complete. - ---- - -## Phase 1 Analysis Workflow Overview - -Phase 1 Analysis consists of three categories of optional workflows: - -### Discovery & Ideation (Optional) - -- **brainstorm-project** - Multi-track solution exploration for software projects - -### Research & Validation (Optional) - -- **research** - Market, technical, competitive, user, domain, and AI research -- **domain-research** - Industry-specific deep dive research - -### Strategic Capture (Recommended for Greenfield) - -- **product-brief** - Product vision and strategy definition - -These workflows feed into Phase 2 (Planning) workflows, particularly the `prd` workflow. - ---- - -## Quick Reference - -| Workflow | Agent | Required | Purpose | Output | -| ---------------------- | ------- | ----------- | -------------------------------------------------------------- | ---------------------------- | -| **brainstorm-project** | Analyst | No | Explore solution approaches and architectures | Solution options + rationale | -| **research** | Analyst | No | Multi-type research (market/technical/competitive/user/domain) | Research reports | -| **product-brief** | Analyst | Recommended | Define product vision and strategy (interactive) | Product Brief document | - ---- - -## Workflow Descriptions - -### brainstorm-project - -**Purpose:** Generate multiple solution approaches through parallel ideation tracks (architecture, UX, integration, value). - -**Agent:** Analyst - -**When to Use:** - -- Very vague or seed kernal of an idea that needs exploration -- Consider alternatives or enhancements to an idea -- See your idea from different angles and viewpoints -- No idea what you want to build, but want to find some inspiration - ---- - -### research - -**Purpose:** Comprehensive multi-type research system consolidating market, technical, competitive, user, and domain analysis. - -**Agent:** Analyst - -**Research Types:** - -| Type | Purpose | Use When | -| --------------- | ------------------------------------------------------ | ----------------------------------- | -| **market** | TAM/SAM/SOM, competitive analysis | Need market viability validation | -| **technical** | Technology evaluation, ADRs | Choosing frameworks/platforms | -| **competitive** | Deep competitor analysis | Understanding competitive landscape | -| **user** | Customer insights, personas, JTBD | Need user understanding | -| **domain** | Industry deep dives, trends | Understanding domain/industry | -| **deep_prompt** | Generate AI research prompts (ChatGPT, Claude, Gemini) | Need deeper AI-assisted research | - -**Key Features:** - -- Real-time web research -- Multiple analytical frameworks (Porter's Five Forces, SWOT, Technology Adoption Lifecycle) -- Platform-specific optimization for deep_prompt type -- Configurable research depth (quick/standard/comprehensive) - -**Example (market):** "SaaS project management tool" → TAM $50B, SAM $5B, SOM $50M, top competitors (Asana, Monday), positioning recommendation. - ---- - -### product-brief - -**Purpose:** Interactive product brief creation that guides strategic product vision definition. - -**Agent:** Analyst - -**When to Use:** - -- Starting new product/major feature initiative -- Aligning stakeholders before detailed planning -- Transitioning from exploration to strategy -- Need executive-level product documentation - -**Key Outputs:** - -- Executive summary -- Problem statement with evidence -- Proposed solution and differentiators -- Target users (segmented) -- MVP scope (ruthlessly defined) -- Financial impact and ROI -- Strategic alignment -- Risks and open questions - -**Integration:** Feeds directly into PRD workflow (Phase 2). - ---- - -## Decision Guide - -### Starting a Software Project - -``` -brainstorm-project (if unclear) → research (market/technical) → product-brief → Phase 2 (prd) -``` - -### Validating an Idea - -``` -research (market type) → product-brief → Phase 2 -``` - -### Technical Decision Only - -``` -research (technical type) → Use findings in Phase 3 (architecture) -``` - -### Understanding Market - -``` -research (market/competitive type) → product-brief → Phase 2 -``` - -### Domain Research for Complex Industries - -``` -domain-research → research (compliance/regulatory) → product-brief → Phase 2 -``` - ---- - -## Integration with Phase 2 (Planning) - -Analysis outputs feed directly into Planning: - -| Analysis Output | Planning Input | -| --------------------------- | -------------------------- | -| product-brief.md | **prd** workflow | -| market-research.md | **prd** context | -| domain-research.md | **prd** context | -| technical-research.md | **architecture** (Phase 3) | -| competitive-intelligence.md | **prd** positioning | - -Planning workflows automatically load these documents if they exist in the output folder. - -## Common Patterns - -### Greenfield Software (Full Analysis) - -``` -1. brainstorm-project - explore approaches -2. research (market/technical/domain) - validate viability -3. product-brief - capture strategic vision -4. → Phase 2: prd -``` - -### Skip Analysis (Clear Requirements) - -``` -→ Phase 2: prd or tech-spec directly -``` - -### Technical Research Only - -``` -1. research (technical) - evaluate technologies -2. → Phase 3: architecture (use findings in ADRs) -``` - ---- - -## Related Documentation - -- [Phase 2: Planning Workflows](../../../../docs/modules/bmm-bmad-method/workflows-planning.md) - Next phase -- [Phase 3: Solutioning Workflows](../../../../docs/modules/bmm-bmad-method/workflows-solutioning.md) -- [Phase 4: Implementation Workflows](../../../../docs/modules/bmm-bmad-method/workflows-implementation.md) -- [Scale Adaptive System](./scale-adaptive-system.md) - Understanding project complexity -- [Agents Guide](../../../../docs/modules/bmm-bmad-method/agents-guide.md) - Complete agent reference diff --git a/docs/modules/bmm-bmad-method/workflows-implementation.md b/docs/modules/bmm-bmad-method/workflows-implementation.md deleted file mode 100644 index 02d9c471..00000000 --- a/docs/modules/bmm-bmad-method/workflows-implementation.md +++ /dev/null @@ -1,211 +0,0 @@ -# BMM Implementation Workflows (Phase 4) - -## Overview - -Phase 4 (Implementation) workflows manage the iterative sprint-based development cycle using a **story-centric workflow** where each story moves through a defined lifecycle from creation to completion. - -**Key principle:** One story at a time, move it through the entire lifecycle before starting the next. - ---- - -## Complete Workflow Context - -Phase 4 is the final phase of the BMad Method workflow. To see how implementation fits into the complete methodology: - -The BMad Method consists of four phases working in sequence: - -1. **Phase 1 (Analysis)** - Optional exploration and discovery workflows -2. **Phase 2 (Planning)** - Required requirements definition using scale-adaptive system -3. **Phase 3 (Solutioning)** - Technical architecture and design decisions -4. **Phase 4 (Implementation)** - Iterative sprint-based development with story-centric workflow - -Phase 4 focuses on the iterative epic and story cycles where stories are implemented, reviewed, and completed one at a time. - -For a visual representation of the complete workflow, see: [workflow-method-greenfield.excalidraw](./images/workflow-method-greenfield.excalidraw) - ---- - -## Quick Reference - -| Workflow | Agent | When | Purpose | -| ------------------- | ----- | --------------------- | ------------------------------------- | -| **sprint-planning** | SM | Once at Phase 4 start | Initialize sprint tracking file | -| **create-story** | SM | Per story | Create next story from epic backlog | -| **dev-story** | DEV | Per story | Implement story with tests | -| **code-review** | DEV | Per story | Senior dev quality review | -| **retrospective** | SM | After epic complete | Review lessons and extract insights | -| **correct-course** | SM | When issues arise | Handle significant mid-sprint changes | - ---- - -## Agent Roles - -### SM (Scrum Master) - Primary Implementation Orchestrator - -**Workflows:** sprint-planning, create-story, retrospective, correct-course - -**Responsibilities:** - -- Initialize and maintain sprint tracking -- Create stories from epic backlog -- Handle course corrections when issues arise -- Facilitate retrospectives after epic completion -- Orchestrate overall implementation flow - -### DEV (Developer) - Implementation and Quality - -**Workflows:** dev-story, code-review - -**Responsibilities:** - -- Implement stories with tests -- Perform senior developer code reviews -- Ensure quality and adherence to standards -- Complete story implementation lifecycle - ---- - -## Story Lifecycle States - -Stories move through these states in the sprint status file: - -1. **TODO** - Story identified but not started -2. **IN PROGRESS** - Story being implemented (create-story → dev-story) -3. **READY FOR REVIEW** - Implementation complete, awaiting code review -4. **DONE** - Accepted and complete - ---- - -## Typical Sprint Flow - -### Sprint 0 (Planning Phase) - -- Complete Phases 1-3 (Analysis, Planning, Solutioning) -- PRD/GDD + Architecture complete -- **V6: Epics+Stories created via create-epics-and-stories workflow (runs AFTER architecture)** - -### Sprint 1+ (Implementation Phase) - -**Start of Phase 4:** - -1. SM runs `sprint-planning` (once) - -**Per Epic:** - -- Epic context and stories are already prepared from Phase 3 - -**Per Story (repeat until epic complete):** - -1. SM runs `create-story` -2. DEV runs `dev-story` -3. (Optional) TEA runs `*automate` to generate or expand guardrail tests -4. DEV runs `code-review` -5. If code review fails: DEV fixes issues in `dev-story`, then re-runs `code-review` - -**After Epic Complete:** - -- SM runs `retrospective` -- Move to next epic - -**As Needed:** - -- Run `sprint-status` anytime in Phase 4 to inspect sprint-status.yaml and get the next implementation command -- Run `workflow-status` for cross-phase routing and project-level paths -- Run `correct-course` if significant changes needed - ---- - -## Key Principles - -### One Story at a Time - -Complete each story's full lifecycle before starting the next. This prevents context switching and ensures quality. - -### Quality Gates - -Every story goes through `code-review` before being marked done. No exceptions. - -### Continuous Tracking - -The `sprint-status.yaml` file is the single source of truth for all implementation progress. - ---- - -### (BMad Method / Enterprise) - -``` -PRD (PM) → Architecture (Architect) - → create-epics-and-stories (PM) ← V6: After architecture! - → implementation-readiness (Architect) - → sprint-planning (SM, once) - → [Per Epic]: - → story loop (SM/DEV) - → retrospective (SM) - → [Next Epic] -Current Phase: 4 (Implementation) -Current Epic: Epic 1 (Authentication) -Current Sprint: Sprint 1 - -Next Story: Story 1.3 (Email Verification) -Status: TODO -Dependencies: Story 1.2 (DONE) ✅ - -**Recommendation:** Run `create-story` to generate Story 1.3 - -After create-story: -1. Run dev-story -2. Run code-review -3. Update sprint-status.yaml to mark story done -``` - -See: [workflow-status instructions](../workflows/workflow-status/instructions.md) - ---- - -### document-project - -**Purpose:** Analyze and document brownfield projects by scanning codebase, architecture, and patterns. - -**Agent:** Analyst -**Duration:** 1-3 hours -**When to Use:** Brownfield projects without documentation - -**How It Works:** - -1. Scans codebase structure -2. Identifies architecture patterns -3. Documents technology stack -4. Creates reference documentation -5. Generates PRD-like document from existing code - -**Output:** `project-documentation-{date}.md` - -**When to Run:** - -- Before starting work on legacy project -- When inheriting undocumented codebase -- Creating onboarding documentation - -See: [document-project reference](./workflow-document-project-reference.md) - -## Related Documentation - -- [Phase 1: Analysis Workflows](./workflows-analysis.md) -- [Phase 2: Planning Workflows](./workflows-planning.md) -- [Phase 3: Solutioning Workflows](./workflows-solutioning.md) - -## Troubleshooting - -**Q: Which workflow should I run next?** -A: Run `workflow-status` - it reads the sprint status file and tells you exactly what to do. During implementation (Phase 4) run `sprint-status` (fast check against sprint-status.yaml). - -**Q: Story needs significant changes mid-implementation?** -A: Run `correct-course` to analyze impact and route appropriately. - -**Q: Can I work on multiple stories in parallel?** -A: Not recommended. Complete one story's full lifecycle before starting the next. Prevents context switching and ensures quality. - -**Q: What if code review finds issues?** -A: DEV runs `dev-story` to make fixes, re-runs tests, then runs `code-review` again until it passes. - -_Phase 4 Implementation - One story at a time, done right._ diff --git a/docs/modules/bmm-bmad-method/workflows-planning.md b/docs/modules/bmm-bmad-method/workflows-planning.md deleted file mode 100644 index b826ae44..00000000 --- a/docs/modules/bmm-bmad-method/workflows-planning.md +++ /dev/null @@ -1,89 +0,0 @@ -# BMM Planning Workflows (Phase 2) - -## Phase 2 Planning Workflow Overview - - -## Quick Reference - -| Workflow | Agent | Track | Purpose | -| -------------------- | ----------- | ----------------------- | ------------------------------------- | -| **prd** | PM | BMad Method, Enterprise | Strategic PRD with FRs/NFRs | -| **create-ux-design** | UX Designer | BMad Method, Enterprise | Optional UX specification (after PRD) | - -### prd (Product Requirements Document) - -**Purpose:** Strategic PRD with Functional Requirements (FRs) and Non-Functional Requirements (NFRs) for software products (BMad Method track). - -**Agent:** PM (with Architect and Analyst support) - -**When to Use:** - -- Medium to large feature sets -- Multi-screen user experiences -- Complex business logic -- Multiple system integrations -- Phased delivery required - -**Scale-Adaptive Structure:** - -- **Light:** Focused FRs/NFRs, simplified analysis (10-15 pages) -- **Standard:** Comprehensive FRs/NFRs, thorough analysis (20-30 pages) -- **Comprehensive:** Extensive FRs/NFRs, multi-phase, stakeholder analysis (30-50+ pages) - -**Key Outputs:** - -- PRD.md (complete requirements with FRs and NFRs) - -**Note:** V6 improvement - PRD focuses on WHAT to build (requirements). Epic+Stories are created AFTER architecture via `create-epics-and-stories` workflow for better quality. - -**Integration:** Feeds into Architecture (Phase 3) - -**Example:** E-commerce checkout → PRD with 15 FRs (user account, cart management, payment flow) and 8 NFRs (performance, security, scalability). - ---- - -### create-ux-design (UX Design) - -**Purpose:** UX specification for projects where user experience is the primary differentiator (BMad Method track). - -**Agent:** UX Designer - -**When to Use:** - -- UX is primary competitive advantage -- Complex user workflows needing design thinking -- Innovative interaction patterns -- Design system creation -- Accessibility-critical experiences - -**Collaborative Approach:** - -1. Visual exploration (generate multiple options) -2. Informed decisions (evaluate with user needs) -3. Collaborative design (refine iteratively) -4. Living documentation (evolves with project) - -**Key Outputs:** - -- ux-spec.md (complete UX specification) -- User journeys -- Wireframes and mockups -- Interaction specifications -- Design system (components, patterns, tokens) -- Epic breakdown (UX stories) - -**Integration:** Feeds PRD or updates epics, then Architecture (Phase 3) - -**Example:** Dashboard redesign → Card-based layout with split-pane toggle, 5 card components, 12 color tokens, responsive grid, 3 epics (Layout, Visualization, Accessibility). - -## Best Practices - -### 1. Do Product Brief from Phase 1 to kickstart the PRD for better results - -### 2. Focus on "What" Not "How" - -Planning defines **what** to build and **why**. Leave **how** (technical design) to Phase 3 (Solutioning). - -### 3. Document-Project First for Brownfield - -Always run `document-project` before planning brownfield projects. AI agents need existing codebase context and will make a large quality difference. If you are adding a small addition to an existing project, you might want to consider instead after using document-project to use the quick flow solo dev process instead. diff --git a/docs/modules/bmm-bmad-method/workflows-solutioning.md b/docs/modules/bmm-bmad-method/workflows-solutioning.md deleted file mode 100644 index 8cd61852..00000000 --- a/docs/modules/bmm-bmad-method/workflows-solutioning.md +++ /dev/null @@ -1,509 +0,0 @@ -# BMM Solutioning Workflows (Phase 3) - -## Overview - -Phase 3 (Solutioning) workflows translate **what** to build (from Planning) into **how** to build it (technical design). This phase prevents agent conflicts in multi-epic projects by documenting architectural decisions before implementation begins. - -**Key principle:** Make technical decisions explicit and documented so all agents implement consistently. Prevent one agent choosing REST while another chooses GraphQL. - -**Required for:** BMad Method (complex projects), Enterprise Method - -**Optional for:** BMad Method (simple projects), Quick Flow (skip entirely) - ---- - -## Phase 3 Solutioning Workflow Overview - -Phase 3 Solutioning has different paths based on the planning track selected: - -### Quick Flow Path - -- From Planning: tech-spec complete -- Action: Skip Phase 3 entirely -- Next: Phase 4 (Implementation) - -### BMad Method & Enterprise Path - -- From Planning: PRD with FRs/NFRs complete -- Optional: create-ux-design (if UX is critical) -- Required: architecture - System design with ADRs -- Required: create-epics-and-stories - Break requirements into implementable stories -- Required: implementation-readiness - Gate check validation -- Enterprise additions: Optional security-architecture and devops-strategy (future workflows) - -### Gate Check Results - -- **PASS** - All criteria met, proceed to Phase 4 -- **CONCERNS** - Minor gaps identified, proceed with caution -- **FAIL** - Critical issues, must resolve before Phase 4 - ---- - -## Quick Reference - -| Workflow | Agent | Track | Purpose | -| ---------------------------- | ----------- | ------------------------ | -------------------------------------------- | -| **create-ux-design** | UX Designer | BMad Method, Enterprise | Optional UX design (after PRD, before arch) | -| **architecture** | Architect | BMad Method, Enterprise | Technical architecture and design decisions | -| **create-epics-and-stories** | PM | BMad Method, Enterprise | Break FRs/NFRs into epics after architecture | -| **implementation-readiness** | Architect | BMad Complex, Enterprise | Validate planning/solutioning completeness | - -**When to Skip Solutioning:** - -- **Quick Flow:** Simple changes don't need architecture → Skip to Phase 4 - -**When Solutioning is Required:** - -- **BMad Method:** Multi-epic projects need architecture to prevent conflicts -- **Enterprise:** Same as BMad Method, plus optional extended workflows (test architecture, security architecture, devops strategy) added AFTER architecture but BEFORE gate check - ---- - -## Why Solutioning Matters - -### The Problem Without Solutioning - -``` -Agent 1 implements Epic 1 using REST API -Agent 2 implements Epic 2 using GraphQL -Result: Inconsistent API design, integration nightmare -``` - -### The Solution With Solutioning - -``` -architecture workflow decides: "Use GraphQL for all APIs" -All agents follow architecture decisions -Result: Consistent implementation, no conflicts -``` - -### Solutioning vs Planning - -| Aspect | Planning (Phase 2) | Solutioning (Phase 3) | -| -------- | ----------------------- | --------------------------------- | -| Question | What and Why? | How? Then What units of work? | -| Output | FRs/NFRs (Requirements) | Architecture + Epics/Stories | -| Agent | PM | Architect → PM | -| Audience | Stakeholders | Developers | -| Document | PRD (FRs/NFRs) | Architecture + Epic Files | -| Level | Business logic | Technical design + Work breakdown | - ---- - -## Workflow Descriptions - -### architecture - -**Purpose:** Make technical decisions explicit to prevent agent conflicts. Produces decision-focused architecture document optimized for AI consistency. - -**Agent:** Architect - -**When to Use:** - -- Multi-epic projects (BMad Complex, Enterprise) -- Cross-cutting technical concerns -- Multiple agents implementing different parts -- Integration complexity exists -- Technology choices need alignment - -**When to Skip:** - -- Quick Flow (simple changes) -- BMad Method Simple with straightforward tech stack -- Single epic with clear technical approach - -**Adaptive Conversation Approach:** - -This is NOT a template filler. The architecture workflow: - -1. **Discovers** technical needs through conversation -2. **Proposes** architectural options with trade-offs -3. **Documents** decisions that prevent agent conflicts -4. **Focuses** on decision points, not exhaustive documentation - -**Key Outputs:** - -**architecture.md** containing: - -1. **Architecture Overview** - System context, principles, style -2. **System Architecture** - High-level diagram, component interactions, communication patterns -3. **Data Architecture** - Database design, state management, caching, data flow -4. **API Architecture** - API style (REST/GraphQL/gRPC), auth, versioning, error handling -5. **Frontend Architecture** (if applicable) - Framework, state management, component architecture, routing -6. **Integration Architecture** - Third-party integrations, message queuing, event-driven patterns -7. **Security Architecture** - Auth/authorization, data protection, security boundaries -8. **Deployment Architecture** - Deployment model, CI/CD, environment strategy, monitoring -9. **Architecture Decision Records (ADRs)** - Key decisions with context, options, trade-offs, rationale -10. **FR/NFR-Specific Guidance** - Technical approach per functional requirement, implementation priorities, dependencies -11. **Standards and Conventions** - Directory structure, naming conventions, code organization, testing - -**ADR Format (Brief):** - -```markdown -## ADR-001: Use GraphQL for All APIs - -**Status:** Accepted | **Date:** 2025-11-02 - -**Context:** PRD requires flexible querying across multiple epics - -**Decision:** Use GraphQL for all client-server communication - -**Options Considered:** - -1. REST - Familiar but requires multiple endpoints -2. GraphQL - Flexible querying, learning curve -3. gRPC - High performance, poor browser support - -**Rationale:** - -- PRD requires flexible data fetching (Epic 1, 3) -- Mobile app needs bandwidth optimization (Epic 2) -- Team has GraphQL experience - -**Consequences:** - -- Positive: Flexible querying, reduced versioning -- Negative: Caching complexity, N+1 query risk -- Mitigation: Use DataLoader for batching - -**Implications for FRs:** - -- FR-001: User Management → GraphQL mutations -- FR-002: Mobile App → Optimized queries -``` - -**Example:** E-commerce platform → Monolith + PostgreSQL + Redis + Next.js + GraphQL, with ADRs explaining each choice and FR/NFR-specific guidance. - -**Integration:** Feeds into create-epics-and-stories workflow. Architecture provides the technical context needed for breaking FRs/NFRs into implementable epics and stories. All dev agents reference architecture during Phase 4 implementation. - ---- - -### create-epics-and-stories - -**Purpose:** Transform PRD's functional and non-functional requirements into bite-sized stories organized into deliverable functional epics. This workflow runs AFTER architecture so epics/stories are informed by technical decisions. - -**Agent:** PM (Product Manager) - -**When to Use:** - -- After architecture workflow completes -- When PRD contains FRs/NFRs ready for implementation breakdown -- Before implementation-readiness gate check - -**Key Inputs:** - -- PRD (FRs/NFRs) from Phase 2 Planning -- architecture.md with ADRs and technical decisions -- Optional: UX design artifacts - -**Why After Architecture:** - -The create-epics-and-stories workflow runs AFTER architecture because: - -1. **Informed Story Sizing:** Architecture decisions (database choice, API style, etc.) affect story complexity -2. **Dependency Awareness:** Architecture reveals technical dependencies between stories -3. **Technical Feasibility:** Stories can be properly scoped knowing the tech stack -4. **Consistency:** All stories align with documented architectural patterns - -**Key Outputs:** - -Epic files (one per epic) containing: - -1. Epic objective and scope -2. User stories with acceptance criteria -3. Story priorities (P0/P1/P2/P3) -4. Dependencies between stories -5. Technical notes referencing architecture decisions - -**Example:** E-commerce PRD with FR-001 (User Registration), FR-002 (Product Catalog) → Epic 1: User Management (3 stories), Epic 2: Product Display (4 stories), each story referencing relevant ADRs. - ---- - -### implementation-readiness - -**Purpose:** Systematically validate that planning and solutioning are complete and aligned before Phase 4 implementation. Ensures PRD, architecture, and epics are cohesive with no gaps. - -**Agent:** Architect - -**When to Use:** - -- **Always** before Phase 4 for BMad Complex and Enterprise projects -- After create-epics-and-stories workflow completes -- Before sprint-planning workflow -- When stakeholders request readiness check - -**When to Skip:** - -- Quick Flow (no solutioning) -- BMad Simple (no gate check required) - -**Purpose of Gate Check:** - -**Prevents:** - -- ❌ Architecture doesn't address all FRs/NFRs -- ❌ Epics conflict with architecture decisions -- ❌ Requirements ambiguous or contradictory -- ❌ Missing critical dependencies - -**Ensures:** - -- ✅ PRD → Architecture → Epics alignment -- ✅ All epics have clear technical approach -- ✅ No contradictions or gaps -- ✅ Team ready to implement - -**Check Criteria:** - -**PRD/GDD Completeness:** - -- Problem statement clear and evidence-based -- Success metrics defined -- User personas identified -- Functional requirements (FRs) complete -- Non-functional requirements (NFRs) specified -- Risks and assumptions documented - -**Architecture Completeness:** - -- System architecture defined -- Data architecture specified -- API architecture decided -- Key ADRs documented -- Security architecture addressed -- FR/NFR-specific guidance provided -- Standards and conventions defined - -**Epic/Story Completeness:** - -- All PRD features mapped to stories -- Stories have acceptance criteria -- Stories prioritized (P0/P1/P2/P3) -- Dependencies identified -- Story sequencing logical - -**Alignment Checks:** - -- Architecture addresses all PRD FRs/NFRs -- Epics align with architecture decisions -- No contradictions between epics -- NFRs have technical approach -- Integration points clear - -**Gate Decision Logic:** - -**✅ PASS** - -- All critical criteria met -- Minor gaps acceptable with documented plan -- **Action:** Proceed to Phase 4 - -**⚠️ CONCERNS** - -- Some criteria not met but not blockers -- Gaps identified with clear resolution path -- **Action:** Proceed with caution, address gaps in parallel - -**❌ FAIL** - -- Critical gaps or contradictions -- Architecture missing key decisions -- Epics conflict with PRD/architecture -- **Action:** BLOCK Phase 4, resolve issues first - -**Key Outputs:** - -**implementation-readiness.md** containing: - -1. Executive Summary (PASS/CONCERNS/FAIL) -2. Completeness Assessment (scores for PRD, Architecture, Epics) -3. Alignment Assessment (PRD↔Architecture, Architecture↔Epics/Stories, cross-epic consistency) -4. Quality Assessment (story quality, dependencies, risks) -5. Gaps and Recommendations (critical/minor gaps, remediation) -6. Gate Decision with rationale -7. Next Steps - -**Example:** E-commerce platform → CONCERNS ⚠️ due to missing security architecture and undefined payment gateway. Recommendation: Complete security section and add payment gateway ADR before proceeding. - ---- - -## Integration with Planning and Implementation - -### Planning → Solutioning Flow - -**Quick Flow:** - -``` -Planning (tech-spec by PM) - → Skip Solutioning - → Phase 4 (Implementation) -``` - -**BMad Method:** - -``` -Planning (prd by PM - FRs/NFRs only) - → Optional: create-ux-design (UX Designer) - → architecture (Architect) - → create-epics-and-stories (PM) - → implementation-readiness (Architect) - → Phase 4 (Implementation) -``` - -**Enterprise:** - -``` -Planning (prd by PM - FRs/NFRs only) - → Optional: create-ux-design (UX Designer) - → architecture (Architect) - → Optional: security-architecture (Architect, future) - → Optional: devops-strategy (Architect, future) - → create-epics-and-stories (PM) - → implementation-readiness (Architect) - → Phase 4 (Implementation) -``` - -**Note on TEA (Test Architect):** TEA is fully operational with 8 workflows across all phases. TEA validates architecture testability during Phase 3 reviews but does not have a dedicated solutioning workflow. TEA's primary setup occurs after architecture in Phase 3 (`*framework`, `*ci`, system-level `*test-design`), with optional Phase 2 baseline `*trace`. Testing execution happens in Phase 4 (`*atdd`, `*automate`, `*test-review`, `*trace`, `*nfr-assess`). - -**Note:** Enterprise uses the same planning and architecture as BMad Method. The only difference is optional extended workflows added AFTER architecture but BEFORE create-epics-and-stories. - -### Solutioning → Implementation Handoff - -**Documents Produced:** - -1. **architecture.md** → Guides all dev agents during implementation -2. **ADRs** (in architecture) → Referenced by agents for technical decisions -3. **Epic files** (from create-epics-and-stories) → Work breakdown into implementable units -4. **implementation-readiness.md** → Confirms readiness for Phase 4 - -**How Implementation Uses Solutioning:** - -- **sprint-planning** - Loads architecture and epic files for sprint organization -- **dev-story** - References architecture decisions and ADRs -- **code-review** - Validates code follows architectural standards - ---- - -## Best Practices - -### 1. Make Decisions Explicit - -Don't leave technology choices implicit. Document decisions with rationale in ADRs so agents understand context. - -### 2. Focus on Agent Conflicts - -Architecture's primary job is preventing conflicting implementations. Focus on cross-cutting concerns. - -### 3. Use ADRs for Key Decisions - -Every significant technology choice should have an ADR explaining "why", not just "what". - -### 4. Keep It Practical - -Don't over-architect simple projects. BMad Simple projects need simple architecture. - -### 5. Run Gate Check Before Implementation - -Catching alignment issues in solutioning is 10× faster than discovering them mid-implementation. - -### 6. Iterate Architecture - -Architecture documents are living. Update them as you learn during implementation. - ---- - -## Decision Guide - -### Quick Flow - -- **Planning:** tech-spec (PM) -- **Solutioning:** Skip entirely -- **Implementation:** sprint-planning → dev-story - -### BMad Method - -- **Planning:** prd (PM) - creates FRs/NFRs only, NOT epics -- **Solutioning:** Optional UX → architecture (Architect) → create-epics-and-stories (PM) → implementation-readiness (Architect) -- **Implementation:** sprint-planning → create-story → dev-story - -### Enterprise - -- **Planning:** prd (PM) - creates FRs/NFRs only (same as BMad Method) -- **Solutioning:** Optional UX → architecture (Architect) → Optional extended workflows (security-architecture, devops-strategy) → create-epics-and-stories (PM) → implementation-readiness (Architect) -- **Implementation:** sprint-planning → create-story → dev-story - -**Key Difference:** Enterprise adds optional extended workflows AFTER architecture but BEFORE create-epics-and-stories. Everything else is identical to BMad Method. - -**Note:** TEA (Test Architect) operates across all phases and validates architecture testability but is not a Phase 3-specific workflow. See [Test Architecture Guide](./test-architecture.md) for TEA's full lifecycle integration. - ---- - -## Common Anti-Patterns - -### ❌ Skipping Architecture for Complex Projects - -"Architecture slows us down, let's just start coding." -**Result:** Agent conflicts, inconsistent design, massive rework - -### ❌ Over-Engineering Simple Projects - -"Let me design this simple feature like a distributed system." -**Result:** Wasted time, over-engineering, analysis paralysis - -### ❌ Template-Driven Architecture - -"Fill out every section of this architecture template." -**Result:** Documentation theater, no real decisions made - -### ❌ Skipping Gate Check - -"PRD and architecture look good enough, let's start." -**Result:** Gaps discovered mid-sprint, wasted implementation time - -### ✅ Correct Approach - -- Use architecture for BMad Method and Enterprise (both required) -- Focus on decisions, not documentation volume -- Enterprise: Add optional extended workflows (test/security/devops) after architecture -- Always run gate check before implementation - ---- - -## Related Documentation - -- [Phase 2: Planning Workflows](../../../../docs/modules/bmm-bmad-method/workflows-planning.md) - Previous phase -- [Phase 4: Implementation Workflows](../../../../docs/modules/bmm-bmad-method/workflows-implementation.md) - Next phase -- [Scale Adaptive System](./scale-adaptive-system.md) - Understanding tracks -- [Agents Guide](../../../../docs/modules/bmm-bmad-method/agents-guide.md) - Complete agent reference - ---- - -## Troubleshooting - -**Q: Do I always need architecture?** -A: No. Quick Flow skips it. BMad Method and Enterprise both require it. - -**Q: How do I know if I need architecture?** -A: If you chose BMad Method or Enterprise track in planning (workflow-init), you need architecture to prevent agent conflicts. - -**Q: What's the difference between architecture and tech-spec?** -A: Tech-spec is implementation-focused for simple changes. Architecture is system design for complex multi-epic projects. - -**Q: Can I skip gate check?** -A: Only for Quick Flow. BMad Method and Enterprise both require gate check before Phase 4. - -**Q: What if gate check fails?** -A: Resolve the identified gaps (missing architecture sections, conflicting requirements) and re-run gate check. - -**Q: How long should architecture take?** -A: BMad Method: 1-2 days for architecture. Enterprise: 2-3 days total (1-2 days architecture + 0.5-1 day optional extended workflows). If taking longer, you may be over-documenting. - -**Q: Do ADRs need to be perfect?** -A: No. ADRs capture key decisions with rationale. They should be concise (1 page max per ADR). - -**Q: Can I update architecture during implementation?** -A: Yes! Architecture is living. Update it as you learn. Use `correct-course` workflow for significant changes. - ---- - -_Phase 3 Solutioning - Technical decisions before implementation._ diff --git a/docs/modules/core/index.md b/docs/modules/core/index.md deleted file mode 100644 index 07d0b9fd..00000000 --- a/docs/modules/core/index.md +++ /dev/null @@ -1,15 +0,0 @@ -# Core Module - -The Core Module is installed with all installations of BMAD modules and provides common functionality that any module, workflow, or agent can take advantage of. - -## Core Module Components - -- **[Global Core Config](global-core-config.md)** — Inheritable configuration that impacts all modules and custom content -- **[Core Workflows](core-workflows.md)** — Domain-agnostic workflows usable by any module - - [Party Mode](party-mode.md) — Multi-agent conversation orchestration - - [Brainstorming](brainstorming.md) — Structured creative sessions with 60+ techniques - - [Advanced Elicitation](advanced-elicitation.md) — LLM rethinking with 50+ reasoning methods -- **[Core Tasks](core-tasks.md)** — Common tasks available across modules - - [Index Docs](core-tasks.md#index-docs) — Generate directory index files - - [Adversarial Review](core-tasks.md#adversarial-review-general) — Critical content review - - [Shard Document](core-tasks.md#shard-document) — Split large documents into sections diff --git a/docs/modules/core/party-mode.md b/docs/modules/core/party-mode.md deleted file mode 100644 index b9ba929b..00000000 --- a/docs/modules/core/party-mode.md +++ /dev/null @@ -1,50 +0,0 @@ -# Party Mode - -**Orchestrate dynamic multi-agent conversations with your entire BMAD team.** - -Party Mode brings together all your installed BMAD agents for collaborative discussions. Instead of working with a single agent, you can engage with multiple specialized perspectives simultaneously—each agent maintaining their unique personality, expertise, and communication style. - ---- - -## When to Use It - -- Exploring complex topics that would benefit from diverse expert perspectives -- Brainstorming with agents who can build on each other's ideas -- Getting a comprehensive view across multiple domains (technical, business, creative, strategic) -- Enjoying dynamic, agent-to-agent conversations where experts challenge and complement each other - ---- - -## How It Works - -1. Party Mode loads your complete agent roster and introduces the available team members -2. You present a topic or question -3. The facilitator intelligently selects 2-3 most relevant agents based on expertise needed -4. Agents respond in character, can reference each other, and engage in natural cross-talk -5. The conversation continues until you choose to exit - ---- - -## Key Features - -- **Intelligent agent selection** — The system analyzes your topic and selects the most relevant agents based on their expertise, capabilities, and principles -- **Authentic personalities** — Each agent maintains their unique voice, communication style, and domain knowledge throughout the conversation -- **Natural cross-talk** — Agents can reference each other, build on previous points, ask questions, and even respectfully disagree -- **Optional TTS integration** — Each agent response can be read aloud with voice configurations matching their personalities -- **Graceful exit** — Sessions conclude with personalized farewells from participating agents - ---- - -## Workflow Integration - -Party Mode is a core workflow designed to be invoked and configured by other modules. When called from another workflow, it accepts contextual parameters: - -| Parameter | Description | -|-----------|-------------| -| **Topic focus** | Prebias the discussion toward a specific domain or question | -| **Additional personas** | Inject expert agents into the roster at runtime for specialized perspectives | -| **Participation constraints** | Limit which agents can contribute based on relevance | - -### Example - -A medical module workflow could invoke Party Mode with expert doctor personas added to the roster, and the conversation pre-focused on a specific diagnosis or treatment decision. The agents would then discuss the medical case with appropriate domain expertise while maintaining their distinct personalities and perspectives. diff --git a/docs/modules/bmm-bmad-method/agents-guide.md b/docs/reference/agents/index.md similarity index 71% rename from docs/modules/bmm-bmad-method/agents-guide.md rename to docs/reference/agents/index.md index 53a7db2d..1348c7a3 100644 --- a/docs/modules/bmm-bmad-method/agents-guide.md +++ b/docs/reference/agents/index.md @@ -1,98 +1,91 @@ -# BMM Agents Reference +--- +title: "Agents Reference" +description: Complete reference for BMad Method agents and their commands +--- -Quick reference of what each agent can do based on their available commands. + +Quick reference of all BMad Method agents and their available commands. --- -## Analyst (Mary) | `/bmad:bmm:agents:analyst` +## Analyst (Mary) Business analysis and research. -**Capabilities:** - +**Commands:** - `*workflow-status` - Get workflow status or initialize tracking - `*brainstorm-project` - Guided brainstorming session - `*research` - Market, domain, competitive, or technical research - `*product-brief` - Create a product brief (input for PRD) - `*document-project` - Document existing brownfield projects -- Party mode and advanced elicitation --- -## PM (John) | `/bmad:bmm:agents:pm` +## PM (John) Product requirements and planning. -**Capabilities:** - +**Commands:** - `*workflow-status` - Get workflow status or initialize tracking - `*create-prd` - Create Product Requirements Document - `*create-epics-and-stories` - Break PRD into epics and user stories (after Architecture) - `*implementation-readiness` - Validate PRD, UX, Architecture, Epics alignment - `*correct-course` - Course correction during implementation -- Party mode and advanced elicitation --- -## Architect (Winston) | `/bmad:bmm:agents:architect` +## Architect (Winston) System architecture and technical design. -**Capabilities:** - +**Commands:** - `*workflow-status` - Get workflow status or initialize tracking - `*create-architecture` - Create architecture document to guide development - `*implementation-readiness` - Validate PRD, UX, Architecture, Epics alignment - `*create-excalidraw-diagram` - System architecture or technical diagrams - `*create-excalidraw-dataflow` - Data flow diagrams -- Party mode and advanced elicitation --- -## SM (Bob) | `/bmad:bmm:agents:sm` +## SM (Bob) Sprint planning and story preparation. -**Capabilities:** - +**Commands:** - `*sprint-planning` - Generate sprint-status.yaml from epic files - `*create-story` - Create story from epic (prep for development) - `*validate-create-story` - Validate story quality - `*epic-retrospective` - Team retrospective after epic completion - `*correct-course` - Course correction during implementation -- Party mode and advanced elicitation --- -## DEV (Amelia) | `/bmad:bmm:agents:dev` +## DEV (Amelia) Story implementation and code review. -**Capabilities:** - +**Commands:** - `*dev-story` - Execute story workflow (implementation with tests) - `*code-review` - Thorough code review --- -## Quick Flow Solo Dev (Barry) | `/bmad:bmm:agents:quick-flow-solo-dev` +## Quick Flow Solo Dev (Barry) Fast solo development without handoffs. -**Capabilities:** - +**Commands:** - `*create-tech-spec` - Architect technical spec with implementation-ready stories - `*quick-dev` - Implement tech spec end-to-end solo - `*code-review` - Review and improve code --- -## TEA (Murat) | `/bmad:bmm:agents:tea` +## TEA (Murat) Test architecture and quality strategy. -**Capabilities:** - +**Commands:** - `*framework` - Initialize production-ready test framework - `*atdd` - Generate E2E tests first (before implementation) - `*automate` - Comprehensive test automation @@ -104,33 +97,31 @@ Test architecture and quality strategy. --- -## UX Designer (Sally) | `/bmad:bmm:agents:ux-designer` +## UX Designer (Sally) User experience and UI design. -**Capabilities:** - +**Commands:** - `*create-ux-design` - Generate UX design and UI plan from PRD - `*validate-design` - Validate UX specification and design artifacts - `*create-excalidraw-wireframe` - Create website or app wireframe --- -## Technical Writer (Paige) | `/bmad:bmm:agents:tech-writer` +## Technical Writer (Paige) Technical documentation and diagrams. -**Capabilities:** - -- `*document-project` - Comprehensive project documentation (brownfield analysis) -- `*generate-mermaid` - Generate Mermaid diagrams (architecture, sequence, flow, ER, class, state) +**Commands:** +- `*document-project` - Comprehensive project documentation +- `*generate-mermaid` - Generate Mermaid diagrams - `*create-excalidraw-flowchart` - Process and logic flow visualizations - `*create-excalidraw-diagram` - System architecture or technical diagrams - `*create-excalidraw-dataflow` - Data flow visualizations - `*validate-doc` - Review documentation against standards - `*improve-readme` - Review and improve README files -- `*explain-concept` - Create clear technical explanations with examples -- `*standards-guide` - Show BMAD documentation standards reference +- `*explain-concept` - Create clear technical explanations +- `*standards-guide` - Show BMAD documentation standards --- @@ -140,5 +131,11 @@ Available to all agents: - `*menu` - Redisplay menu options - `*dismiss` - Dismiss agent +- `*party-mode` - Multi-agent collaboration (most agents) -Party mode is available to most agents for multi-agent collaboration. +--- + +## Related + +- [Agent Roles](../../explanation/core-concepts/agent-roles.md) - Understanding agent responsibilities +- [What Are Agents](../../explanation/core-concepts/what-are-agents.md) - Foundational concepts diff --git a/docs/modules/core/core-tasks.md b/docs/reference/configuration/core-tasks.md similarity index 99% rename from docs/modules/core/core-tasks.md rename to docs/reference/configuration/core-tasks.md index 1d72d3a5..a5963369 100644 --- a/docs/modules/core/core-tasks.md +++ b/docs/reference/configuration/core-tasks.md @@ -1,4 +1,7 @@ -# Core Tasks +--- +title: "Core Tasks" +--- + Core Tasks are reusable task definitions that can be invoked by any BMAD module, workflow, or agent. These tasks provide standardized functionality for common operations. diff --git a/docs/modules/core/global-core-config.md b/docs/reference/configuration/global-config.md similarity index 95% rename from docs/modules/core/global-core-config.md rename to docs/reference/configuration/global-config.md index 0fc27c2e..31e3ddeb 100644 --- a/docs/modules/core/global-core-config.md +++ b/docs/reference/configuration/global-config.md @@ -1,4 +1,7 @@ -# Core Module Global Inheritable Config +--- +title: "Core Module Global Inheritable Config" +--- + The Core Modules module.yaml file defines configuration values that are useful and unique for all other modules to utilize, and by default all other modules installed will clone the values defined in the core module yaml.config into their own. It is possible for other modules to override these values, but the general intent it to accept the core module values and define their own values as needed, or extend the core values. diff --git a/docs/modules/bmm-bmad-method/glossary.md b/docs/reference/glossary/index.md similarity index 81% rename from docs/modules/bmm-bmad-method/glossary.md rename to docs/reference/glossary/index.md index d611b96c..3a36b4cd 100644 --- a/docs/modules/bmm-bmad-method/glossary.md +++ b/docs/reference/glossary/index.md @@ -1,6 +1,9 @@ -# BMM Glossary +--- +title: "BMAD Glossary" +--- -Comprehensive terminology reference for the BMad Method Module. + +Comprehensive terminology reference for the BMAD Method. --- @@ -14,11 +17,16 @@ Comprehensive terminology reference for the BMad Method Module. - [Status and Tracking](#status-and-tracking) - [Project Types](#project-types) - [Implementation Terms](#implementation-terms) +- [Game Development Terms](#game-development-terms) --- ## Core Concepts +### BMAD (Build More, Architect Dreams) + +AI-driven agile development framework with specialized agents, guided workflows, and scale-adaptive intelligence. + ### BMM (BMad Method Module) Core orchestration system for AI-driven agile development, providing comprehensive lifecycle management through specialized agents and workflows. @@ -89,7 +97,11 @@ Optional strategic planning document created in Phase 1 (Analysis) that captures ### GDD (Game Design Document) -Game development equivalent of PRD, created by Game Designer agent for game projects. +Game development equivalent of PRD, created by Game Designer agent for game projects. Comprehensive document detailing all aspects of game design: mechanics, systems, content, and more. + +### Game Brief + +Document capturing the game's core vision, pillars, target audience, and scope. Foundation for the GDD. --- @@ -115,10 +127,6 @@ Architecture design phase. Required for BMad Method and Enterprise Method tracks Sprint-based development through story-by-story iteration. Uses sprint-planning, create-story, dev-story, code-review, and retrospective workflows. -### Documentation (Prerequisite for Brownfield) - -**Conditional prerequisite for brownfield projects.** Creates comprehensive codebase documentation before planning. Only required if existing documentation is insufficient for AI agents. Uses the `document-project` workflow. - ### Quick Spec Flow Fast-track workflow system for Quick Flow track projects that goes straight from idea to tech-spec to implementation, bypassing heavy planning. Designed for bug fixes, small features, and rapid prototyping. @@ -153,7 +161,7 @@ Agent responsible for test strategy, quality gates, NFR assessment, and comprehe ### Technical Writer -Agent specialized in creating and maintaining high-quality technical documentation. Expert in documentation standards, information architecture, and professional technical writing. The agent's internal name is "paige" but is presented as "Technical Writer" to users. +Agent specialized in creating and maintaining high-quality technical documentation. Expert in documentation standards, information architecture, and professional technical writing. ### UX Designer @@ -163,13 +171,17 @@ Agent that creates UX design documents, interaction patterns, and visual specifi Specialized agent for game development projects. Creates game design documents (GDD) and game-specific workflows. +### Game Architect + +Agent that designs game system architecture, creates technical architecture for games, and validates game-specific designs. + ### BMad Master Meta-level orchestrator agent from BMad Core. Facilitates party mode, lists available tasks and workflows, and provides high-level guidance across all modules. ### Party Mode -Multi-agent collaboration feature where all installed agents (19+ from BMM, CIS, BMB, custom modules) discuss challenges together in real-time. BMad Master orchestrates, selecting 2-3 relevant agents per message for natural cross-talk and debate. Best for strategic decisions, creative brainstorming, cross-functional alignment, and complex problem-solving. See [Party Mode Guide](./party-mode.md). +Multi-agent collaboration feature where all installed agents discuss challenges together in real-time. BMad Master orchestrates, selecting 2-3 relevant agents per message for natural cross-talk and debate. Best for strategic decisions, creative brainstorming, cross-functional alignment, and complex problem-solving. --- @@ -190,7 +202,7 @@ backlog → ready-for-dev → in-progress → review → done ``` - **backlog** - Story exists in epic but not yet created -- **ready-for-dev** - Story file created via create-story; validation is optional (run `validate-create-story` for quality check before dev picks it up) +- **ready-for-dev** - Story file created via create-story; validation is optional - **in-progress** - DEV is implementing via dev-story - **review** - Implementation complete, awaiting code-review - **done** - Completed with DoD met @@ -247,6 +259,10 @@ Implementation guidance embedded within story files during the create-story work Workflow that initializes Phase 4 implementation by creating sprint-status.yaml, extracting all epics/stories from planning docs, and setting up tracking infrastructure. +### Sprint + +Time-boxed period of development work, typically 1-2 weeks. + ### Gate Check Validation workflow (implementation-readiness) run before Phase 4 to ensure PRD + Architecture + Epics + UX (optional) are aligned with no gaps or contradictions. Required for BMad Method and Enterprise Method tracks. @@ -261,6 +277,66 @@ Criteria that must be met before marking a story as done. Typically includes: im --- +## Game Development Terms + +### Core Fantasy + +The emotional experience players seek from your game. What they want to FEEL. + +### Core Loop + +The fundamental cycle of actions players repeat throughout gameplay. The heart of your game. + +### Design Pillar + +Core principle that guides all design decisions. Typically 3-5 pillars define a game's identity. + +### Game Type + +Genre classification that determines which specialized GDD sections are included. + +### Narrative Complexity + +How central story is to the game experience: +- **Critical** - Story IS the game (visual novels) +- **Heavy** - Deep narrative with gameplay (RPGs) +- **Moderate** - Meaningful story supporting gameplay +- **Light** - Minimal story, gameplay-focused + +### Environmental Storytelling + +Narrative communicated through the game world itself—visual details, audio, found documents—rather than explicit dialogue. + +### MDA Framework + +Mechanics → Dynamics → Aesthetics. Framework for analyzing and designing games. + +### Procedural Generation + +Algorithmic creation of game content (levels, items, characters) rather than hand-crafted. + +### Roguelike + +Genre featuring procedural generation, permadeath, and run-based progression. + +### Metroidvania + +Genre featuring interconnected world exploration with ability-gated progression. + +### Meta-Progression + +Persistent progression that carries between individual runs or sessions. + +### Permadeath + +Game mechanic where character death is permanent, typically requiring a new run. + +### Player Agency + +The degree to which players can make meaningful choices that affect outcomes. + +--- + ## Additional Terms ### Workflow Status @@ -279,10 +355,6 @@ Automatic analysis by workflow-init that uses keyword analysis, complexity indic Workflow run during Phase 4 when significant changes or issues arise. Analyzes impact, proposes solutions, and routes to appropriate remediation workflows. -### Migration Strategy - -Plan for handling changes to existing data, schemas, APIs, or patterns during brownfield development. Critical for ensuring backward compatibility and smooth rollout. - ### Feature Flags Implementation technique for brownfield projects that allows gradual rollout of new functionality, easy rollback, and A/B testing. Recommended for BMad Method and Enterprise brownfield changes. @@ -294,13 +366,3 @@ Specific locations where new code connects with existing systems. Must be docume ### Convention Detection Quick Spec Flow feature that automatically detects existing code style, naming conventions, patterns, and frameworks from brownfield codebases, then asks user to confirm before proceeding. - ---- - -## Related Documentation - -- [Quick Start Guide](./quick-start.md) - Learn BMM basics -- [Scale Adaptive System](./scale-adaptive-system.md) - Deep dive on tracks and complexity -- [Brownfield Guide](./brownfield-guide.md) - Working with existing codebases -- [Quick Spec Flow](./quick-spec-flow.md) - Fast-track for Quick Flow track -- [FAQ](./faq.md) - Common questions diff --git a/docs/reference/index.md b/docs/reference/index.md new file mode 100644 index 00000000..d1b3c449 --- /dev/null +++ b/docs/reference/index.md @@ -0,0 +1,26 @@ +--- +title: "Reference" +--- + + +Information-oriented documentation for looking up facts, specifications, and details. + +## Agents + +Technical reference for all BMAD agents. + +## Workflows + +Technical reference for all BMAD workflows. + +## Configuration + +Configuration options and settings. + +## Glossary + +Definitions of BMAD terminology. + +## FAQ + +Frequently asked questions organized by topic. diff --git a/docs/modules/bmgd-bmad-game-dev/workflows-guide.md b/docs/reference/workflows/bmgd-workflows.md similarity index 94% rename from docs/modules/bmgd-bmad-game-dev/workflows-guide.md rename to docs/reference/workflows/bmgd-workflows.md index d649bc09..bd96d03e 100644 --- a/docs/modules/bmgd-bmad-game-dev/workflows-guide.md +++ b/docs/reference/workflows/bmgd-workflows.md @@ -1,4 +1,7 @@ -# BMGD Workflows Guide +--- +title: "BMGD Workflows Guide" +--- + Complete reference for all BMGD workflows organized by development phase. @@ -8,7 +11,7 @@ Complete reference for all BMGD workflows organized by development phase. BMGD workflows are organized into four phases: -![BMGD Workflow Overview](./workflow-overview.jpg) +![BMGD Workflow Overview](../../tutorials/getting-started/images/workflow-overview.jpg) --- @@ -259,7 +262,7 @@ Checks current project status across all phases. Shows completed documents, curr ## Quick-Flow Workflows -Fast-track workflows that skip full planning phases. See **[Quick-Flow Guide](../../../../docs/modules/bmgd-bmad-game-dev/quick-flow-guide.md)** for detailed usage. +Fast-track workflows that skip full planning phases. See **[Quick-Flow Guide](../../how-to/workflows/bmgd-quick-flow.md)** for detailed usage. ### Quick-Prototype @@ -457,7 +460,7 @@ This means: ## Next Steps -- **[Quick Start Guide](../../../../docs/modules/bmgd-bmad-game-dev/quick-start.md)** - Get started with BMGD -- **[Quick-Flow Guide](../../../../docs/modules/bmgd-bmad-game-dev/quick-flow-guide.md)** - Rapid prototyping and development -- **[Agents Guide](../../../../docs/modules/bmgd-bmad-game-dev/agents-guide.md)** - Agent reference -- **[Game Types Guide](../../../../docs/modules/bmgd-bmad-game-dev/game-types-guide.md)** - Game type templates +- **[Quick Start Guide](../../tutorials/getting-started/quick-start-bmgd.md)** - Get started with BMGD +- **[Quick-Flow Guide](../../how-to/workflows/bmgd-quick-flow.md)** - Rapid prototyping and development +- **[Agents Guide](../../explanation/game-dev/agents.md)** - Agent reference +- **[Game Types Guide](../../explanation/game-dev/game-types.md)** - Game type templates diff --git a/docs/modules/core/core-workflows.md b/docs/reference/workflows/core-workflows.md similarity index 86% rename from docs/modules/core/core-workflows.md rename to docs/reference/workflows/core-workflows.md index a0e5d42d..46852179 100644 --- a/docs/modules/core/core-workflows.md +++ b/docs/reference/workflows/core-workflows.md @@ -1,18 +1,21 @@ -# Core Workflows +--- +title: "Core Workflows" +--- + Core Workflows are domain-agnostic workflows that can be utilized by any BMAD-compliant module, workflow, or agent. These workflows are installed by default and available at any time. ## Available Core Workflows -### [Party Mode](party-mode.md) +### [Party Mode](../../explanation/features/party-mode.md) Orchestrate dynamic multi-agent conversations with your entire BMAD team. Engage with multiple specialized perspectives simultaneously—each agent maintaining their unique personality, expertise, and communication style. -### [Brainstorming](brainstorming.md) +### [Brainstorming](../../explanation/features/brainstorming-techniques.md) Facilitate structured creative sessions using 60+ proven ideation techniques. The AI acts as coach and guide, using proven creativity methods to draw out ideas and insights that are already within you. -### [Advanced Elicitation](advanced-elicitation.md) +### [Advanced Elicitation](../../explanation/features/advanced-elicitation.md) Push the LLM to rethink its work through 50+ reasoning methods—the inverse of brainstorming. The LLM applies sophisticated techniques to re-examine and enhance content it has just generated, essentially "LLM brainstorming" to find better approaches and uncover improvements. diff --git a/docs/modules/bmm-bmad-method/workflow-document-project-reference.md b/docs/reference/workflows/document-project.md similarity index 90% rename from docs/modules/bmm-bmad-method/workflow-document-project-reference.md rename to docs/reference/workflows/document-project.md index c835607f..de803f75 100644 --- a/docs/modules/bmm-bmad-method/workflow-document-project-reference.md +++ b/docs/reference/workflows/document-project.md @@ -1,4 +1,7 @@ -# Document Project Workflow - Technical Reference +--- +title: "Document Project Workflow - Technical Reference" +--- + **Module:** BMM (BMAD Method Module) @@ -67,5 +70,5 @@ The workflow can be interrupted and resumed without losing progress: **Related Documentation:** -- [Brownfield Development Guide](./brownfield-guide.md) -- [Implementation Workflows](./workflows-implementation.md) +- [Brownfield Development Guide](../../how-to/brownfield/index.md) +- [Implementation Workflows](../../how-to/workflows/run-sprint-planning.md) diff --git a/docs/reference/workflows/index.md b/docs/reference/workflows/index.md new file mode 100644 index 00000000..bebce541 --- /dev/null +++ b/docs/reference/workflows/index.md @@ -0,0 +1,16 @@ +--- +title: "Workflows Reference" +description: Reference documentation for BMad Method workflows +--- + + +Complete reference documentation for all BMad Method workflows. + +## Core Workflows + +- [Core Workflows](./core-workflows.md) - Domain-agnostic workflows available to all modules +- [Document Project](./document-project.md) - Brownfield project documentation workflow + +## Module-Specific Workflows + +- [BMGD Workflows](./bmgd-workflows.md) - Game development workflows diff --git a/docs/tutorials/advanced/create-custom-agent.md b/docs/tutorials/advanced/create-custom-agent.md new file mode 100644 index 00000000..d68e22dc --- /dev/null +++ b/docs/tutorials/advanced/create-custom-agent.md @@ -0,0 +1,171 @@ +--- +title: "Create a Custom Agent" +--- + + +Build your own AI agent with a unique personality, specialized commands, and optional persistent memory using the BMad Builder workflow. + +:::note[BMB Module] +This tutorial uses the **BMad Builder (BMB)** module. Make sure you have BMAD installed with the BMB module enabled. +::: + +## What You'll Learn + +- How to run the `create-agent` workflow +- Choose between Simple, Expert, and Module agent types +- Define your agent's persona (role, identity, communication style, principles) +- Package and install your custom agent +- Test and iterate on your agent's behavior + +:::note[Prerequisites] +- BMAD installed with the BMB module +- An idea for what you want your agent to do +- About 15-30 minutes for your first agent +::: + +:::tip[Quick Path] +Run `create-agent` workflow → Follow the guided steps → Install your agent module → Test and iterate. +::: + +## Understanding Agent Types + +Before creating your agent, understand the three types available: + +| Type | Best For | Memory | Complexity | +| ---------- | ------------------------------------- | ---------- | ---------- | +| **Simple** | Focused tasks, quick setup | None | Low | +| **Expert** | Specialized domains, ongoing projects | Persistent | Medium | +| **Module** | Building other agents/workflows | Persistent | High | + +**Simple Agent** - Use when your task is well-defined and focused. Perfect for single-purpose assistants like commit message generators or code reviewers. + +**Expert Agent** - Use when your domain requires specialized knowledge or you need memory across sessions. Great for roles like Security Architect or Documentation Lead. + +**Module Agent** - Use when your agent builds other agents or needs deep integration with the module system. + +## Step 1: Start the Workflow + +In your IDE (Claude Code, Cursor, etc.), invoke the create-agent workflow with the agent-builder agent. + +The workflow guides you through eight steps: + +| Step | What You'll Do | +| --------------------------- | -------------------------------------------- | +| **Brainstorm** *(optional)* | Explore ideas with creative techniques | +| **Discovery** | Define the agent's purpose and goals | +| **Type & Metadata** | Choose Simple or Expert, name your agent | +| **Persona** | Craft the agent's personality and principles | +| **Commands** | Define what the agent can do | +| **Activation** | Set up autonomous behaviors *(optional)* | +| **Build** | Generate the agent file | +| **Validation** | Review and verify everything works | + +:::tip[Workflow Options] +At each step, the workflow provides options: +- **[A] Advanced** - Get deeper insights and reasoning +- **[P] Party** - Get multiple agent perspectives +- **[C] Continue** - Move to the next step +::: + +## Step 2: Define the Persona + +Your agent's personality is defined by four fields: + +| Field | Purpose | Example | +| ----------------------- | -------------- | ----------------------------------------------------------------- | +| **Role** | What they do | "Senior code reviewer who catches bugs and suggests improvements" | +| **Identity** | Who they are | "Friendly but exacting, believes clean code is a craft" | +| **Communication Style** | How they speak | "Direct, constructive, explains the 'why' behind suggestions" | +| **Principles** | Why they act | "Security first, clarity over cleverness, test what you fix" | + +Keep each field focused on its purpose. The role isn't personality; the identity isn't job description. + +:::note[Writing Great Principles] +The first principle should "activate" the agent's expertise: + +- **Weak:** "Be helpful and accurate" +- **Strong:** "Channel decades of security expertise: threat modeling begins with trust boundaries, never trust client input, defense in depth is non-negotiable" +::: + +## Step 3: Install Your Agent + +Once created, package your agent for installation: + +``` +my-custom-stuff/ +├── module.yaml # Contains: unitary: true +├── agents/ +│ └── {agent-name}/ +│ ├── {agent-name}.agent.yaml +│ └── _memory/ # Expert agents only +│ └── {sidecar-folder}/ +└── workflows/ # Optional: custom workflows +``` + +Install using the BMAD installer, then invoke your new agent in your IDE. + +## What You've Accomplished + +You've created a custom AI agent with: + +- A defined purpose and role in your workflow +- A unique persona with communication style and principles +- Custom menu commands for your specific tasks +- Optional persistent memory for ongoing context + +Your project now includes: + +``` +_bmad/ +├── _config/ +│ └── agents/ +│ └── {your-agent}/ # Your agent customizations +└── {module}/ + └── agents/ + └── {your-agent}/ + └── {your-agent}.agent.yaml +``` + +## Quick Reference + +| Action | How | +| ------------------- | ---------------------------------------------- | +| Start workflow | `"Run the BMAD Builder create-agent workflow"` | +| Edit agent directly | Modify `{agent-name}.agent.yaml` | +| Edit customization | Modify `_bmad/_config/agents/{agent-name}` | +| Rebuild agent | `npx bmad-method build ` | +| Study examples | Check `src/modules/bmb/reference/agents/` | + +## Common Questions + +**Should I start with Simple or Expert?** +Start with Simple for your first agent. You can always upgrade to Expert later if you need persistent memory. + +**How do I add more commands later?** +Edit the agent YAML directly or use the customization file in `_bmad/_config/agents/`. Then rebuild. + +**Can I share my agent with others?** +Yes. Package your agent as a standalone module and share it with your team or the community. + +**Where can I see example agents?** +Study the reference agents in `src/modules/bmb/reference/agents/`: +- [commit-poet](https://github.com/bmad-code-org/BMAD-METHOD/tree/main/src/modules/bmb/reference/agents/simple-examples/commit-poet.agent.yaml) (Simple) +- [journal-keeper](https://github.com/bmad-code-org/BMAD-METHOD/tree/main/src/modules/bmb/reference/agents/expert-examples/journal-keeper) (Expert) + +## Getting Help + +- **[Discord Community](https://discord.gg/gk8jAdXWmj)** - Ask in #general-dev or #bugs-issues +- **[GitHub Issues](https://github.com/bmad-code-org/BMAD-METHOD/issues)** - Report bugs or request features + +## Further Reading + +- **[What Are Agents](../../explanation/core-concepts/what-are-agents.md)** - Deep technical details on agent types +- **[Agent Customization](../../how-to/customization/customize-agents.md)** - Modify agents without editing core files +- **[Custom Content Installation](../../how-to/installation/install-custom-modules.md)** - Package and distribute your agents + +:::tip[Key Takeaways] +- **Start small** - Your first agent should solve one problem well +- **Persona matters** - Strong principles activate the agent's expertise +- **Iterate often** - Test your agent and refine based on behavior +- **Learn from examples** - Study reference agents before building your own +::: diff --git a/docs/tutorials/getting-started/getting-started-bmadv4.md b/docs/tutorials/getting-started/getting-started-bmadv4.md new file mode 100644 index 00000000..40bb9cb4 --- /dev/null +++ b/docs/tutorials/getting-started/getting-started-bmadv4.md @@ -0,0 +1,247 @@ +--- +title: "Getting Started with BMad v4" +description: Install BMad and create your first planning document +--- + + +Build software faster using AI-powered workflows with specialized agents that guide you through planning, architecture, and implementation. + +:::note[Stable Release] +This tutorial covers BMad v4, the current stable release. For the latest features (with potential breaking changes), see the [BMad v6 Alpha tutorial](./getting-started-bmadv6.md). +::: + +## What You'll Learn + +- Install and configure BMad for your IDE +- Understand how BMad organizes work into phases and agents +- Initialize a project and choose a planning track +- Create your first requirements document + +:::note[Prerequisites] +- **Node.js 20+** — Required for the installer +- **Git** — Recommended for version control +- **AI-powered IDE** — Claude Code, Cursor, Windsurf, or similar +- **A project idea** — Even a simple one works for learning +::: + +:::tip[Quick Path] +**Install** → `npx bmad-method install` +**Initialize** → Load Analyst agent, run `workflow-init` +**Plan** → PM creates PRD, Architect creates architecture +**Build** → SM manages sprints, DEV implements stories +**Always use fresh chats** for each workflow to avoid context issues. +::: + +## Understanding BMad + +BMad helps you build software through guided workflows with specialized AI agents. The process follows four phases: + +| Phase | Name | What Happens | +|-------|------|--------------| +| 1 | Analysis | Brainstorm, research *(optional)* | +| 2 | Planning | Requirements — PRD or tech-spec *(required)* | +| 3 | Solutioning | Architecture, design decisions *(varies by track)* | +| 4 | Implementation | Build code story by story *(required)* | + +Based on your project's complexity, BMad offers three planning tracks: + +| Track | Best For | Documents Created | +|-------|----------|-------------------| +| **Quick Flow** | Bug fixes, simple features, clear scope | Tech-spec only | +| **BMad Method** | Products, platforms, complex features | PRD + Architecture + UX | +| **Enterprise** | Compliance, multi-tenant, enterprise needs | PRD + Architecture + Security + DevOps | + +## Installation + +Open a terminal in your project directory and run: + +```bash +npx bmad-method install +``` + +The interactive installer guides you through setup: + +- **Choose Installation Location** — Select current directory (recommended), subdirectory, or custom path +- **Select Your AI Tool** — Claude Code, Cursor, Windsurf, or other +- **Choose Modules** — Select **BMM** (BMad Method) for this tutorial +- **Accept Defaults** — Customize later in `_bmad/[module]/config.yaml` + +Verify your installation: + +``` +your-project/ +├── _bmad/ +│ ├── bmm/ # Method module +│ │ ├── agents/ # Agent files +│ │ ├── workflows/ # Workflow files +│ │ └── config.yaml # Module config +│ └── core/ # Core utilities +├── _bmad-output/ # Generated artifacts (created later) +└── .claude/ # IDE configuration (if using Claude Code) +``` + +:::tip[Troubleshooting] +Having issues? See [Install BMad](../../how-to/installation/install-bmad.md) for common solutions. +::: + +## Step 1: Initialize Your Project + +Load the **Analyst agent** in your IDE: +- **Claude Code**: Type `/analyst` or load the agent file directly +- **Cursor/Windsurf**: Open the agent file from `_bmad/bmm/agents/` + +Wait for the agent's menu to appear, then run: + +``` +Run workflow-init +``` + +Or use the shorthand: `*workflow-init` + +The workflow asks you to describe: +- **Your project and goals** — What are you building? What problem does it solve? +- **Existing codebase** — Is this new (greenfield) or existing code (brownfield)? +- **Size and complexity** — Roughly how big is this? (adjustable later) + +Based on your description, the workflow suggests a planning track. For this tutorial, choose **BMad Method**. + +Once you confirm, the workflow creates `bmm-workflow-status.yaml` to track your progress. + +:::caution[Fresh Chats] +Always start a fresh chat for each workflow. This prevents context limitations from causing issues. +::: + +## Step 2: Create Your Plan + +With your project initialized, work through the planning phases. + +### Phase 1: Analysis (Optional) + +If you want to brainstorm or research first: +- **brainstorm-project** — Guided ideation with the Analyst +- **research** — Market and technical research +- **product-brief** — Recommended foundation document + +### Phase 2: Planning (Required) + +**Start a fresh chat** and load the **PM agent**. + +``` +Run prd +``` + +Or use shortcuts: `*prd`, select "create-prd" from the menu, or say "Let's create a PRD". + +The PM agent guides you through: +1. **Project overview** — Refine your project description +2. **Goals and success metrics** — What does success look like? +3. **User personas** — Who uses this product? +4. **Functional requirements** — What must the system do? +5. **Non-functional requirements** — Performance, security, scalability needs + +When complete, you'll have `PRD.md` in your `_bmad-output/` folder. + +:::note[UX Design (Optional)] +If your project has a user interface, load the **UX-Designer agent** and run the UX design workflow after creating your PRD. +::: + +### Phase 3: Solutioning (Required for BMad Method) + +**Start a fresh chat** and load the **Architect agent**. + +``` +Run create-architecture +``` + +The architect guides you through technical decisions: tech stack, database design, API patterns, and system structure. + +:::tip[Check Your Status] +Unsure what's next? Load any agent and run `workflow-status`. It tells you the next recommended or required workflow. +::: + +## Step 3: Build Your Project + +Once planning is complete, move to implementation. + +### Initialize Sprint Planning + +Load the **SM agent** and run `sprint-planning`. This creates `sprint-status.yaml` to track all epics and stories. + +### The Build Cycle + +For each story, repeat this cycle with fresh chats: + +| Step | Agent | Workflow | Purpose | +|------|-------|----------|---------| +| 1 | SM | `create-story` | Create story file from epic | +| 2 | DEV | `dev-story` | Implement the story | +| 3 | DEV | `code-review` | Quality validation *(recommended)* | + +After completing all stories in an epic, load the **SM agent** and run `retrospective`. + +## What You've Accomplished + +You've learned the foundation of building with BMad: + +- Installed BMad and configured it for your IDE +- Initialized a project with your chosen planning track +- Created planning documents (PRD, Architecture) +- Understood the build cycle for implementation + +Your project now has: + +``` +your-project/ +├── _bmad/ # BMad configuration +├── _bmad-output/ +│ ├── PRD.md # Your requirements document +│ ├── architecture.md # Technical decisions +│ └── bmm-workflow-status.yaml # Progress tracking +└── ... +``` + +## Quick Reference + +| Command | Agent | Purpose | +|---------|-------|---------| +| `*workflow-init` | Analyst | Initialize a new project | +| `*workflow-status` | Any | Check progress and next steps | +| `*prd` | PM | Create Product Requirements Document | +| `*create-architecture` | Architect | Create architecture document | +| `*sprint-planning` | SM | Initialize sprint tracking | +| `*create-story` | SM | Create a story file | +| `*dev-story` | DEV | Implement a story | +| `*code-review` | DEV | Review implemented code | + +## Common Questions + +**Do I need to create a PRD for every project?** +Only for BMad Method and Enterprise tracks. Quick Flow projects use a simpler tech-spec instead. + +**Can I skip Phase 1 (Analysis)?** +Yes, Phase 1 is optional. If you already know what you're building, start with Phase 2 (Planning). + +**What if I want to brainstorm first?** +Load the Analyst agent and run `*brainstorm-project` before `workflow-init`. + +**Why start fresh chats for each workflow?** +Workflows are context-intensive. Reusing chats can cause the AI to hallucinate or lose track of details. Fresh chats ensure maximum context capacity. + +## Getting Help + +- **During workflows** — Agents guide you with questions and explanations +- **Check status** — Run `workflow-status` with any agent +- **Community** — [Discord](https://discord.gg/gk8jAdXWmj) (#general-dev, #bugs-issues) +- **Video tutorials** — [BMad Code YouTube](https://www.youtube.com/@BMadCode) + +## Key Takeaways + +:::tip[Remember These] +- **Always use fresh chats** — Load agents in new chats for each workflow +- **Let workflow-status guide you** — Ask any agent for status when unsure +- **Track matters** — Quick Flow uses tech-spec; Method/Enterprise need PRD and architecture +- **Tracking is automatic** — Status files update themselves +- **Agents are flexible** — Use menu numbers, shortcuts (`*prd`), or natural language +::: + +Ready to start? Install BMad, load the Analyst, run `workflow-init`, and let the agents guide you. diff --git a/docs/tutorials/getting-started/getting-started-bmadv6.md b/docs/tutorials/getting-started/getting-started-bmadv6.md new file mode 100644 index 00000000..4679f893 --- /dev/null +++ b/docs/tutorials/getting-started/getting-started-bmadv6.md @@ -0,0 +1,247 @@ +--- +title: "Getting Started with BMad v6 Alpha" +description: Install BMad v6 Alpha and build your first project +--- + + +Build software faster using AI-powered workflows with specialized agents that guide you through planning, architecture, and implementation. + +:::caution[Alpha Software] +BMad v6 is currently in **alpha**. Expect breaking changes, incomplete features, and evolving documentation. For a stable experience, use the [BMad v4 tutorial](./getting-started-bmadv4.md) instead. +::: + +## What You'll Learn + +- Install and initialize BMad Method for a new project +- Choose the right planning track for your project size +- Progress through phases from requirements to working code +- Use agents and workflows effectively + +:::note[Prerequisites] +- **Node.js 20+** — Required for the installer +- **Git** — Recommended for version control +- **AI-powered IDE** — Claude Code, Cursor, Windsurf, or similar +- **A project idea** — Even a simple one works for learning +::: + +:::tip[Quick Path] +**Install** → `npx bmad-method@alpha install` +**Initialize** → Load Analyst agent, run `workflow-init` +**Plan** → PM creates PRD, Architect creates architecture +**Build** → SM manages sprints, DEV implements stories +**Always use fresh chats** for each workflow to avoid context issues. +::: + +## Understanding BMad + +BMad helps you build software through guided workflows with specialized AI agents. The process follows four phases: + +| Phase | Name | What Happens | +|-------|------|--------------| +| 1 | Analysis | Brainstorming, research, product brief *(optional)* | +| 2 | Planning | Create requirements (PRD or tech-spec) | +| 3 | Solutioning | Design architecture *(BMad Method/Enterprise only)* | +| 4 | Implementation | Build epic by epic, story by story | + +![BMad Method Workflow - Standard Greenfield](./images/workflow-method-greenfield.svg) + +*Complete visual flowchart showing all phases, workflows, and agents for the standard greenfield track.* + +Based on your project's complexity, BMad offers three planning tracks: + +| Track | Best For | Documents Created | +|-------|----------|-------------------| +| **Quick Flow** | Bug fixes, simple features, clear scope (1-15 stories) | Tech-spec only | +| **BMad Method** | Products, platforms, complex features (10-50+ stories) | PRD + Architecture + UX | +| **Enterprise** | Compliance, multi-tenant systems (30+ stories) | PRD + Architecture + Security + DevOps | + +:::note +Story counts are guidance, not definitions. Choose your track based on planning needs, not story math. +::: + +## Installation + +Open a terminal in your project directory and run: + +```bash +npx bmad-method@alpha install +``` + +The interactive installer guides you through setup and creates a `_bmad/` folder with all agents and workflows. + +Verify your installation: + +``` +your-project/ +├── _bmad/ +│ ├── bmm/ # Method module +│ │ ├── agents/ # Agent files +│ │ ├── workflows/ # Workflow files +│ │ └── config.yaml # Module config +│ └── core/ # Core utilities +├── _bmad-output/ # Generated artifacts (created later) +└── .claude/ # IDE configuration (if using Claude Code) +``` + +:::tip[Troubleshooting] +Having issues? See [Install BMad](../../how-to/installation/install-bmad.md) for common solutions. +::: + +## Step 1: Initialize Your Project + +Load the **Analyst agent** in your IDE, wait for the menu, then run `workflow-init`. + +:::note[How to Load Agents] +Type `/` in your IDE and use autocomplete. Not sure what's available? Start with `/bmad` to see all agents and workflows. +::: + +The workflow asks you to describe your project, whether it's new or existing, and the general complexity. Based on your description, it recommends a planning track. + +Once you confirm, the workflow creates `bmm-workflow-status.yaml` to track your progress through all phases. + +:::caution[Fresh Chats] +Always start a fresh chat for each workflow. This prevents context limitations from causing issues. +::: + +## Step 2: Create Your Plan + +After initialization, work through phases 1-3. **Use fresh chats for each workflow.** + +:::tip[Check Your Status] +Unsure what's next? Load any agent and ask for `workflow-status`. It tells you the next recommended or required workflow. +::: + +### Phase 1: Analysis (Optional) + +All workflows in this phase are optional: +- **brainstorm-project** — Guided ideation +- **research** — Market and technical research +- **product-brief** — Recommended foundation document + +### Phase 2: Planning (Required) + +**For BMad Method and Enterprise tracks:** +1. Load the **PM agent** in a new chat +2. Run the PRD workflow: `*prd` +3. Output: `PRD.md` + +**For Quick Flow track:** +- Use `tech-spec` instead of PRD, then skip to implementation + +:::note[UX Design (Optional)] +If your project has a user interface, load the **UX-Designer agent** and run the UX design workflow after creating your PRD. +::: + +### Phase 3: Solutioning (BMad Method/Enterprise) + +**Create Architecture** +1. Load the **Architect agent** in a new chat +2. Run `create-architecture` +3. Output: Architecture document with technical decisions + +**Create Epics and Stories** + +:::tip[V6 Improvement] +Epics and stories are now created *after* architecture. This produces better quality stories because architecture decisions (database, API patterns, tech stack) directly affect how work should be broken down. +::: + +1. Load the **PM agent** in a new chat +2. Run `create-epics-and-stories` +3. The workflow uses both PRD and Architecture to create technically-informed stories + +**Implementation Readiness Check** *(Highly Recommended)* +1. Load the **Architect agent** in a new chat +2. Run `implementation-readiness` +3. Validates cohesion across all planning documents + +## Step 3: Build Your Project + +Once planning is complete, move to implementation. **Each workflow should run in a fresh chat.** + +### Initialize Sprint Planning + +Load the **SM agent** and run `sprint-planning`. This creates `sprint-status.yaml` to track all epics and stories. + +### The Build Cycle + +For each story, repeat this cycle with fresh chats: + +| Step | Agent | Workflow | Purpose | +|------|-------|----------|---------| +| 1 | SM | `create-story` | Create story file from epic | +| 2 | DEV | `dev-story` | Implement the story | +| 3 | TEA | `automate` | Generate guardrail tests *(optional)* | +| 4 | DEV | `code-review` | Quality validation *(recommended)* | + +After completing all stories in an epic, load the **SM agent** and run `retrospective`. + +## What You've Accomplished + +You've learned the foundation of building with BMad: + +- Installed BMad and configured it for your IDE +- Initialized a project with your chosen planning track +- Created planning documents (PRD, Architecture, Epics & Stories) +- Understood the build cycle for implementation + +Your project now has: + +``` +your-project/ +├── _bmad/ # BMad configuration +├── _bmad-output/ +│ ├── PRD.md # Your requirements document +│ ├── architecture.md # Technical decisions +│ ├── epics/ # Epic and story files +│ ├── bmm-workflow-status.yaml # Phase progress tracking +│ └── sprint-status.yaml # Sprint tracking +└── ... +``` + +## Quick Reference + +| Command | Agent | Purpose | +|---------|-------|---------| +| `*workflow-init` | Analyst | Initialize a new project | +| `*workflow-status` | Any | Check progress and next steps | +| `*prd` | PM | Create Product Requirements Document | +| `*create-architecture` | Architect | Create architecture document | +| `*create-epics-and-stories` | PM | Break down PRD into epics | +| `*implementation-readiness` | Architect | Validate planning cohesion | +| `*sprint-planning` | SM | Initialize sprint tracking | +| `*create-story` | SM | Create a story file | +| `*dev-story` | DEV | Implement a story | +| `*code-review` | DEV | Review implemented code | + +## Common Questions + +**Do I always need architecture?** +Only for BMad Method and Enterprise tracks. Quick Flow skips from tech-spec to implementation. + +**Can I change my plan later?** +Yes. The SM agent has a `correct-course` workflow for handling scope changes. + +**What if I want to brainstorm first?** +Load the Analyst agent and run `brainstorm-project` before `workflow-init`. + +**Can I skip workflow-init and workflow-status?** +Yes, once you learn the flow. Use the Quick Reference to go directly to needed workflows. + +## Getting Help + +- **During workflows** — Agents guide you with questions and explanations +- **Community** — [Discord](https://discord.gg/gk8jAdXWmj) (#general-dev, #bugs-issues) +- **Documentation** — [BMM Workflow Reference](../../reference/workflows/index.md) +- **Video tutorials** — [BMad Code YouTube](https://www.youtube.com/@BMadCode) + +## Key Takeaways + +:::tip[Remember These] +- **Always use fresh chats** — Load agents in new chats for each workflow +- **Let workflow-status guide you** — Ask any agent for status when unsure +- **Track matters** — Quick Flow uses tech-spec; Method/Enterprise need PRD and architecture +- **Tracking is automatic** — Status files update themselves +- **Agents are flexible** — Use menu numbers, shortcuts (`*prd`), or natural language +::: + +Ready to start? Install BMad, load the Analyst, run `workflow-init`, and let the agents guide you. diff --git a/docs/modules/bmm-bmad-method/images/workflow-method-greenfield.excalidraw b/docs/tutorials/getting-started/images/workflow-method-greenfield.excalidraw similarity index 100% rename from docs/modules/bmm-bmad-method/images/workflow-method-greenfield.excalidraw rename to docs/tutorials/getting-started/images/workflow-method-greenfield.excalidraw diff --git a/docs/modules/bmm-bmad-method/images/workflow-method-greenfield.svg b/docs/tutorials/getting-started/images/workflow-method-greenfield.svg similarity index 100% rename from docs/modules/bmm-bmad-method/images/workflow-method-greenfield.svg rename to docs/tutorials/getting-started/images/workflow-method-greenfield.svg diff --git a/docs/modules/bmgd-bmad-game-dev/workflow-overview.jpg b/docs/tutorials/getting-started/images/workflow-overview.jpg similarity index 100% rename from docs/modules/bmgd-bmad-game-dev/workflow-overview.jpg rename to docs/tutorials/getting-started/images/workflow-overview.jpg diff --git a/docs/tutorials/getting-started/quick-start-bmgd.md b/docs/tutorials/getting-started/quick-start-bmgd.md new file mode 100644 index 00000000..a67c7d78 --- /dev/null +++ b/docs/tutorials/getting-started/quick-start-bmgd.md @@ -0,0 +1,260 @@ +--- +title: "Getting Started with BMad Game Development" +description: Build games with BMad's Game Development Module +--- + + +Build games faster using AI-powered workflows with specialized game development agents that guide you through preproduction, design, architecture, and implementation. + +:::note[Module Extension] +BMGD (BMad Game Development) is a module that extends BMad Method. You'll need BMad installed first—see the [BMad v4 tutorial](./getting-started-bmadv4.md) or [BMad v6 tutorial](./getting-started-bmadv6.md) if you haven't installed it yet. +::: + +## What You'll Learn + +- Install and configure the BMGD module +- Understand game development phases and specialized agents +- Create a Game Brief and Game Design Document (GDD) +- Progress from concept to working game code + +:::note[Prerequisites] +- **BMad Method installed** — Follow the main installation guide first +- **A game idea** — Even a rough concept is enough to start +- **AI-powered IDE** — Claude Code, Cursor, Windsurf, or similar +::: + +:::tip[Quick Path] +**Install** → `npx bmad-method install` (select BMGD module) +**Preproduction** → Game Designer creates Game Brief +**Design** → Game Designer creates GDD (and Narrative if story-driven) +**Technical** → Game Architect creates Architecture +**Production** → Game SM manages sprints, Game Dev implements +**Always use fresh chats** for each workflow to avoid context issues. +::: + +## Understanding BMGD + +BMGD follows four game development phases with specialized agents for each: + +| Phase | Name | What Happens | +|-------|------|--------------| +| 1 | Preproduction | Capture game vision, create Game Brief *(optional brainstorming)* | +| 2 | Design | Detail mechanics, systems, narrative in GDD | +| 3 | Technical | Plan engine, architecture, technical decisions | +| 4 | Production | Build game in sprints, story by story | + +![BMGD Workflow Overview](./images/workflow-overview.jpg) + +*Complete visual flowchart showing all phases, workflows, and agents for game development.* + +### Game Development Agents + +| Agent | When to Use | +|-------|-------------| +| **Game Designer** | Brainstorming, Game Brief, GDD, Narrative | +| **Game Architect** | Architecture, technical decisions | +| **Game Developer** | Implementation, code reviews | +| **Game Scrum Master** | Sprint planning, story management | +| **Game QA** | Test framework, test design, automation | +| **Game Solo Dev** | Quick prototyping, indie development | + +## Installation + +If you haven't installed BMad yet: + +```bash +npx bmad-method install +``` + +Or add BMGD to an existing installation: + +```bash +npx bmad-method install --add-module bmgd +``` + +Verify your installation: + +``` +your-project/ +├── _bmad/ +│ ├── bmgd/ # Game development module +│ │ ├── agents/ # Game-specific agents +│ │ ├── workflows/ # Game-specific workflows +│ │ └── config.yaml # Module config +│ ├── bmm/ # Core method module +│ └── core/ # Core utilities +├── _bmad-output/ # Generated artifacts (created later) +└── .claude/ # IDE configuration (if using Claude Code) +``` + +## Step 1: Create Your Game Brief (Preproduction) + +Load the **Game Designer** agent in your IDE, wait for the menu, then start with your game concept. + +### Optional: Brainstorm First + +If you have a vague idea and want help developing it: + +``` +Run brainstorm-game +``` + +The agent guides you through game-specific ideation techniques to refine your concept. + +### Create the Game Brief + +``` +Run create-game-brief +``` + +The Game Designer walks you through: +- **Game concept** — Core idea and unique selling points +- **Design pillars** — The 3-5 principles that guide all decisions +- **Target market** — Who plays this game? +- **Fundamentals** — Platform, genre, scope, team size + +When complete, you'll have `game-brief.md` in your `_bmad-output/` folder. + +:::caution[Fresh Chats] +Always start a fresh chat for each workflow. This prevents context limitations from causing issues. +::: + +## Step 2: Design Your Game + +With your Game Brief complete, detail your game's design. + +### Create the GDD + +**Start a fresh chat** with the **Game Designer** agent. + +``` +Run create-gdd +``` + +The agent guides you through mechanics, systems, and game-type-specific sections. BMGD offers 24 game type templates that provide genre-specific structure. + +When complete, you'll have `gdd.md` (or sharded into `gdd/` for large documents). + +:::note[Narrative Design (Optional)] +For story-driven games, start a fresh chat and run `narrative` to create a Narrative Design Document covering story, characters, world, and dialogue. +::: + +:::tip[Check Your Status] +Unsure what's next? Load any agent and run `workflow-status`. It tells you the next recommended workflow. +::: + +## Step 3: Plan Your Architecture + +**Start a fresh chat** with the **Game Architect** agent. + +``` +Run create-architecture +``` + +The architect guides you through: +- **Engine selection** — Unity, Unreal, Godot, custom, etc. +- **System design** — Core game systems and how they interact +- **Technical patterns** — Architecture patterns suited to your game +- **Structure** — Project organization and conventions + +When complete, you'll have `game-architecture.md`. + +## Step 4: Build Your Game + +Once planning is complete, move to production. **Each workflow should run in a fresh chat.** + +### Initialize Sprint Planning + +Load the **Game Scrum Master** agent and run `sprint-planning`. This creates `sprint-status.yaml` to track all epics and stories. + +### The Build Cycle + +For each story, repeat this cycle with fresh chats: + +| Step | Agent | Workflow | Purpose | +|------|-------|----------|---------| +| 1 | Game SM | `create-story` | Create story file from epic | +| 2 | Game Dev | `dev-story` | Implement the story | +| 3 | Game QA | `automate` | Generate tests *(optional)* | +| 4 | Game Dev | `code-review` | Quality validation *(recommended)* | + +After completing all stories in an epic, load the **Game SM** and run `retrospective`. + +### Quick Prototyping Alternative + +For rapid iteration or indie development, load the **Game Solo Dev** agent: +- `quick-prototype` — Rapid prototyping +- `quick-dev` — Flexible development without full sprint structure + +## What You've Accomplished + +You've learned the foundation of building games with BMad: + +- Installed the BMGD module +- Created a Game Brief capturing your vision +- Detailed your design in a GDD +- Planned your technical architecture +- Understood the build cycle for implementation + +Your project now has: + +``` +your-project/ +├── _bmad/ # BMad configuration +├── _bmad-output/ +│ ├── game-brief.md # Your game vision +│ ├── gdd.md # Game Design Document +│ ├── narrative-design.md # Story design (if applicable) +│ ├── game-architecture.md # Technical decisions +│ ├── epics/ # Epic and story files +│ └── sprint-status.yaml # Sprint tracking +└── ... +``` + +## Quick Reference + +| Command | Agent | Purpose | +|---------|-------|---------| +| `*brainstorm-game` | Game Designer | Guided game ideation | +| `*create-game-brief` | Game Designer | Create Game Brief | +| `*create-gdd` | Game Designer | Create Game Design Document | +| `*narrative` | Game Designer | Create Narrative Design | +| `*create-architecture` | Game Architect | Create game architecture | +| `*sprint-planning` | Game SM | Initialize sprint tracking | +| `*create-story` | Game SM | Create a story file | +| `*dev-story` | Game Dev | Implement a story | +| `*code-review` | Game Dev | Review implemented code | +| `*workflow-status` | Any | Check progress and next steps | + +## Common Questions + +**Do I need to create all documents?** +At minimum, create a Game Brief and GDD. Architecture is highly recommended. Narrative Design is only needed for story-driven games. + +**Can I use the Game Solo Dev for everything?** +Yes, for smaller projects or rapid prototyping. For larger games, the specialized agents provide more thorough guidance. + +**What game types are supported?** +BMGD includes 24 game type templates (RPG, platformer, puzzle, strategy, etc.) that provide genre-specific GDD sections. + +**Can I change my design later?** +Yes. Documents are living artifacts—return to update them as your vision evolves. The SM agent has `correct-course` for scope changes. + +## Getting Help + +- **During workflows** — Agents guide you with questions and explanations +- **Community** — [Discord](https://discord.gg/gk8jAdXWmj) (#general-dev, #bugs-issues) +- **Documentation** — [BMGD Workflow Reference](../../reference/workflows/bmgd-workflows.md) +- **Video tutorials** — [BMad Code YouTube](https://www.youtube.com/@BMadCode) + +## Key Takeaways + +:::tip[Remember These] +- **Always use fresh chats** — Load agents in new chats for each workflow +- **Game Brief first** — It informs everything that follows +- **Use game type templates** — 24 templates provide genre-specific GDD structure +- **Documents evolve** — Return to update them as your vision grows +- **Solo Dev for speed** — Use Game Solo Dev for rapid prototyping +::: + +Ready to start? Load the **Game Designer** agent and run `create-game-brief` to capture your game vision. diff --git a/docs/tutorials/getting-started/workflow-overview.jpg b/docs/tutorials/getting-started/workflow-overview.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3f61b3c57ead3dd17c698955f2823805d59f9fcf GIT binary patch literal 205271 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

ryZpMA!sIiG603WN2Dho5s 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

&OSN@%DuBx2phZcfV=F00{ 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 z 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 literal 0 HcmV?d00001 diff --git a/docs/tutorials/index.md b/docs/tutorials/index.md new file mode 100644 index 00000000..bd24d5a6 --- /dev/null +++ b/docs/tutorials/index.md @@ -0,0 +1,21 @@ +--- +title: "Tutorials" +--- + + +Learning-oriented guides that walk you through building something real with BMad. Perfect for getting hands-on experience. + +## Getting Started + +Start your journey with BMad by choosing a version that fits your needs: + +- [Get Started with v4 (Stable)](./getting-started/getting-started-bmadv4.md) — Production-ready version with battle-tested workflows +- [Try v6 (Alpha)](./getting-started/getting-started-bmadv6.md) — Latest features, still in active development + +## First Project + +Your first end-to-end project with BMad. + +## Advanced + +More complex scenarios and advanced patterns. diff --git a/eslint.config.mjs b/eslint.config.mjs index 0fbaa510..e361b1cd 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -18,9 +18,9 @@ export default [ 'test/fixtures/**/*.yaml', '_bmad/**', '_bmad*/**', - // Docusaurus build artifacts - '.docusaurus/**', + // Build output 'build/**', + // Website uses ESM/Astro - separate linting ecosystem 'website/**', // Gitignored patterns 'z*/**', // z-samples, z1, z2, etc. diff --git a/package-lock.json b/package-lock.json index c2bb1e40..d6ea4f26 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,10 +32,11 @@ "bmad-method": "tools/bmad-npx-wrapper.js" }, "devDependencies": { - "@docusaurus/core": "^3.6.0", - "@docusaurus/preset-classic": "^3.6.0", + "@astrojs/sitemap": "^3.6.0", + "@astrojs/starlight": "^0.37.0", "@eslint/js": "^9.33.0", "archiver": "^7.0.1", + "astro": "^5.16.0", "c8": "^10.1.3", "eslint": "^9.33.0", "eslint-config-prettier": "^10.1.8", @@ -48,355 +49,168 @@ "markdownlint-cli2": "^0.19.1", "prettier": "^3.5.3", "prettier-plugin-packagejson": "^2.5.19", - "prism-react-renderer": "^2.4.1", - "react": "^18.3.1", - "react-dom": "^18.3.1", + "sharp": "^0.33.5", "yaml-eslint-parser": "^1.2.3", - "yaml-lint": "^1.7.0", - "zod": "^4.1.12" + "yaml-lint": "^1.7.0" }, "engines": { "node": ">=20.0.0" } }, - "node_modules/@ai-sdk/gateway": { - "version": "2.0.22", - "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-2.0.22.tgz", - "integrity": "sha512-6fHjDfCbjfj4vyMExuLei7ir2///E5sNwNZaobdJsJIxJjDSsjzSLGO/aUI7p9eOnB8XctDrDSF5ilwDGpi6eg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@ai-sdk/provider": "2.0.0", - "@ai-sdk/provider-utils": "3.0.19", - "@vercel/oidc": "3.0.5" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "zod": "^3.25.76 || ^4.1.8" - } - }, - "node_modules/@ai-sdk/provider": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-2.0.0.tgz", - "integrity": "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "json-schema": "^0.4.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@ai-sdk/provider-utils": { - "version": "3.0.19", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.19.tgz", - "integrity": "sha512-W41Wc9/jbUVXVwCN/7bWa4IKe8MtxO3EyA0Hfhx6grnmiYlCvpI8neSYWFE0zScXJkgA/YK3BRybzgyiXuu6JA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@ai-sdk/provider": "2.0.0", - "@standard-schema/spec": "^1.0.0", - "eventsource-parser": "^3.0.6" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "zod": "^3.25.76 || ^4.1.8" - } - }, - "node_modules/@ai-sdk/react": { - "version": "2.0.117", - "resolved": "https://registry.npmjs.org/@ai-sdk/react/-/react-2.0.117.tgz", - "integrity": "sha512-qfwz4p1ev+i/M9rsOUEe53UgzxMUz7e4wrImWdkuFrpD78MBIj53eE/LtyCeAYSCFVSz3JfIDvtdk5MjTrNcbA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@ai-sdk/provider-utils": "3.0.19", - "ai": "5.0.115", - "swr": "^2.2.5", - "throttleit": "2.1.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "react": "^18 || ~19.0.1 || ~19.1.2 || ^19.2.1", - "zod": "^3.25.76 || ^4.1.8" - }, - "peerDependenciesMeta": { - "zod": { - "optional": true - } - } - }, - "node_modules/@algolia/abtesting": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.12.1.tgz", - "integrity": "sha512-Y+7e2uPe376OH5O73OB1+vR40ZhbV2kzGh/AR/dPCWguoBOp1IK0o+uZQLX+7i32RMMBEKl3pj6KVEav100Kvg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.46.1", - "@algolia/requester-browser-xhr": "5.46.1", - "@algolia/requester-fetch": "5.46.1", - "@algolia/requester-node-http": "5.46.1" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/autocomplete-core": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.19.2.tgz", - "integrity": "sha512-mKv7RyuAzXvwmq+0XRK8HqZXt9iZ5Kkm2huLjgn5JoCPtDy+oh9yxUMfDDaVCw0oyzZ1isdJBc7l9nuCyyR7Nw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/autocomplete-plugin-algolia-insights": "1.19.2", - "@algolia/autocomplete-shared": "1.19.2" - } - }, - "node_modules/@algolia/autocomplete-plugin-algolia-insights": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.19.2.tgz", - "integrity": "sha512-TjxbcC/r4vwmnZaPwrHtkXNeqvlpdyR+oR9Wi2XyfORkiGkLTVhX2j+O9SaCCINbKoDfc+c2PB8NjfOnz7+oKg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/autocomplete-shared": "1.19.2" - }, - "peerDependencies": { - "search-insights": ">= 1 < 3" - } - }, - "node_modules/@algolia/autocomplete-shared": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.19.2.tgz", - "integrity": "sha512-jEazxZTVD2nLrC+wYlVHQgpBoBB5KPStrJxLzsIFl6Kqd1AlG9sIAGl39V5tECLpIQzB3Qa2T6ZPJ1ChkwMK/w==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@algolia/client-search": ">= 4.9.1 < 6", - "algoliasearch": ">= 4.9.1 < 6" - } - }, - "node_modules/@algolia/client-abtesting": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.46.1.tgz", - "integrity": "sha512-5SWfl0UGuKxMBYlU2Y9BnlIKKEyhFU5jHE9F9jAd8nbhxZNLk0y7fXE+AZeFtyK1lkVw6O4B/e6c3XIVVCkmqw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.46.1", - "@algolia/requester-browser-xhr": "5.46.1", - "@algolia/requester-fetch": "5.46.1", - "@algolia/requester-node-http": "5.46.1" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-analytics": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.46.1.tgz", - "integrity": "sha512-496K6B1l/0Jvyp3MbW/YIgmm1a6nkTrKXBM7DoEy9YAOJ8GywGpa2UYjNCW1UrOTt+em1ECzDjRx7PIzTR9YvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.46.1", - "@algolia/requester-browser-xhr": "5.46.1", - "@algolia/requester-fetch": "5.46.1", - "@algolia/requester-node-http": "5.46.1" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-common": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.46.1.tgz", - "integrity": "sha512-3u6AuZ1Kiss6V5JPuZfVIUYfPi8im06QBCgKqLg82GUBJ3SwhiTdSZFIEgz2mzFuitFdW1PQi3c/65zE/3FgIw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-insights": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.46.1.tgz", - "integrity": "sha512-LwuWjdO35HHl1rxtdn48t920Xl26Dl0SMxjxjFeAK/OwK/pIVfYjOZl/f3Pnm7Kixze+6HjpByVxEaqhTuAFaw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.46.1", - "@algolia/requester-browser-xhr": "5.46.1", - "@algolia/requester-fetch": "5.46.1", - "@algolia/requester-node-http": "5.46.1" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-personalization": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.46.1.tgz", - "integrity": "sha512-6LvJAlfEsn9SVq63MYAFX2iUxztUK2Q7BVZtI1vN87lDiJ/tSVFKgKS/jBVO03A39ePxJQiFv6EKv7lmoGlWtQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.46.1", - "@algolia/requester-browser-xhr": "5.46.1", - "@algolia/requester-fetch": "5.46.1", - "@algolia/requester-node-http": "5.46.1" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-query-suggestions": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.46.1.tgz", - "integrity": "sha512-9GLUCyGGo7YOXHcNqbzca82XYHJTbuiI6iT0FTGc0BrnV2N4OcrznUuVKic/duiLSun5gcy/G2Bciw5Sav9f9w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.46.1", - "@algolia/requester-browser-xhr": "5.46.1", - "@algolia/requester-fetch": "5.46.1", - "@algolia/requester-node-http": "5.46.1" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-search": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.46.1.tgz", - "integrity": "sha512-NL76o/BoEgU4ObY5oBEC3o6KSPpuXsnSta00tAxTm1iKUWOGR34DQEKhUt8xMHhMKleUNPM/rLPFiIVtfsGU8w==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@algolia/client-common": "5.46.1", - "@algolia/requester-browser-xhr": "5.46.1", - "@algolia/requester-fetch": "5.46.1", - "@algolia/requester-node-http": "5.46.1" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/events": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz", - "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==", + "node_modules/@astrojs/compiler": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-2.13.0.tgz", + "integrity": "sha512-mqVORhUJViA28fwHYaWmsXSzLO9osbdZ5ImUfxBarqsYdMlPbqAqGJCxsNzvppp1BEzc1mJNjOVvQqeDN8Vspw==", "dev": true, "license": "MIT" }, - "node_modules/@algolia/ingestion": { - "version": "1.46.1", - "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.46.1.tgz", - "integrity": "sha512-52Nc8WKC1FFXsdlXlTMl1Re/pTAbd2DiJiNdYmgHiikZcfF96G+Opx4qKiLUG1q7zp9e+ahNwXF6ED0XChMywg==", + "node_modules/@astrojs/internal-helpers": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.7.5.tgz", + "integrity": "sha512-vreGnYSSKhAjFJCWAwe/CNhONvoc5lokxtRoZims+0wa3KbHBdPHSSthJsKxPd8d/aic6lWKpRTYGY/hsgK6EA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@astrojs/markdown-remark": { + "version": "6.3.10", + "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-6.3.10.tgz", + "integrity": "sha512-kk4HeYR6AcnzC4QV8iSlOfh+N8TZ3MEStxPyenyCtemqn8IpEATBFMTJcfrNW32dgpt6MY3oCkMM/Tv3/I4G3A==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.46.1", - "@algolia/requester-browser-xhr": "5.46.1", - "@algolia/requester-fetch": "5.46.1", - "@algolia/requester-node-http": "5.46.1" - }, - "engines": { - "node": ">= 14.0.0" + "@astrojs/internal-helpers": "0.7.5", + "@astrojs/prism": "3.3.0", + "github-slugger": "^2.0.0", + "hast-util-from-html": "^2.0.3", + "hast-util-to-text": "^4.0.2", + "import-meta-resolve": "^4.2.0", + "js-yaml": "^4.1.1", + "mdast-util-definitions": "^6.0.0", + "rehype-raw": "^7.0.0", + "rehype-stringify": "^10.0.1", + "remark-gfm": "^4.0.1", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.1.2", + "remark-smartypants": "^3.0.2", + "shiki": "^3.19.0", + "smol-toml": "^1.5.2", + "unified": "^11.0.5", + "unist-util-remove-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "unist-util-visit-parents": "^6.0.2", + "vfile": "^6.0.3" } }, - "node_modules/@algolia/monitoring": { - "version": "1.46.1", - "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.46.1.tgz", - "integrity": "sha512-1x2/2Y/eqz6l3QcEZ8u/zMhSCpjlhePyizJd3sXrmg031HjayYT5+IxikjpqkdF7TU/deCTd/TFUcxLJ2ZHXiQ==", + "node_modules/@astrojs/mdx": { + "version": "4.3.13", + "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-4.3.13.tgz", + "integrity": "sha512-IHDHVKz0JfKBy3//52JSiyWv089b7GVSChIXLrlUOoTLWowG3wr2/8hkaEgEyd/vysvNQvGk+QhysXpJW5ve6Q==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.46.1", - "@algolia/requester-browser-xhr": "5.46.1", - "@algolia/requester-fetch": "5.46.1", - "@algolia/requester-node-http": "5.46.1" + "@astrojs/markdown-remark": "6.3.10", + "@mdx-js/mdx": "^3.1.1", + "acorn": "^8.15.0", + "es-module-lexer": "^1.7.0", + "estree-util-visit": "^2.0.0", + "hast-util-to-html": "^9.0.5", + "piccolore": "^0.1.3", + "rehype-raw": "^7.0.0", + "remark-gfm": "^4.0.1", + "remark-smartypants": "^3.0.2", + "source-map": "^0.7.6", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.3" }, "engines": { - "node": ">= 14.0.0" + "node": "18.20.8 || ^20.3.0 || >=22.0.0" + }, + "peerDependencies": { + "astro": "^5.0.0" } }, - "node_modules/@algolia/recommend": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.46.1.tgz", - "integrity": "sha512-SSd3KlQuplxV3aRs5+Z09XilFesgpPjtCG7BGRxLTVje5hn9BLmhjO4W3gKw01INUt44Z1r0Fwx5uqnhAouunA==", + "node_modules/@astrojs/prism": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-3.3.0.tgz", + "integrity": "sha512-q8VwfU/fDZNoDOf+r7jUnMC2//H2l0TuQ6FkGJL8vD8nw/q5KiL3DS1KKBI3QhI9UQhpJ5dc7AtqfbXWuOgLCQ==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.46.1", - "@algolia/requester-browser-xhr": "5.46.1", - "@algolia/requester-fetch": "5.46.1", - "@algolia/requester-node-http": "5.46.1" + "prismjs": "^1.30.0" }, "engines": { - "node": ">= 14.0.0" + "node": "18.20.8 || ^20.3.0 || >=22.0.0" } }, - "node_modules/@algolia/requester-browser-xhr": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.46.1.tgz", - "integrity": "sha512-3GfCwudeW6/3caKSdmOP6RXZEL4F3GiemCaXEStkTt2Re8f7NcGYAAZnGlHsCzvhlNEuDzPYdYxh4UweY8l/2w==", + "node_modules/@astrojs/sitemap": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@astrojs/sitemap/-/sitemap-3.6.0.tgz", + "integrity": "sha512-4aHkvcOZBWJigRmMIAJwRQXBS+ayoP5z40OklTXYXhUDhwusz+DyDl+nSshY6y9DvkVEavwNcFO8FD81iGhXjg==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.46.1" - }, - "engines": { - "node": ">= 14.0.0" + "sitemap": "^8.0.0", + "stream-replace-string": "^2.0.0", + "zod": "^3.25.76" } }, - "node_modules/@algolia/requester-fetch": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.46.1.tgz", - "integrity": "sha512-JUAxYfmnLYTVtAOFxVvXJ4GDHIhMuaP7JGyZXa/nCk3P8RrN5FCNTdRyftSnxyzwSIAd8qH3CjdBS9WwxxqcHQ==", + "node_modules/@astrojs/starlight": { + "version": "0.37.2", + "resolved": "https://registry.npmjs.org/@astrojs/starlight/-/starlight-0.37.2.tgz", + "integrity": "sha512-DGeaaKizwxHDsz72FdxyIBZ32eY8OdUoH6b757BGZlLEDq82O4uipFWoh+kz7+aKg1QoFu/rDq6fqtw+58tpRQ==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.46.1" + "@astrojs/markdown-remark": "^6.3.1", + "@astrojs/mdx": "^4.2.3", + "@astrojs/sitemap": "^3.3.0", + "@pagefind/default-ui": "^1.3.0", + "@types/hast": "^3.0.4", + "@types/js-yaml": "^4.0.9", + "@types/mdast": "^4.0.4", + "astro-expressive-code": "^0.41.1", + "bcp-47": "^2.1.0", + "hast-util-from-html": "^2.0.1", + "hast-util-select": "^6.0.2", + "hast-util-to-string": "^3.0.0", + "hastscript": "^9.0.0", + "i18next": "^23.11.5", + "js-yaml": "^4.1.0", + "klona": "^2.0.6", + "magic-string": "^0.30.17", + "mdast-util-directive": "^3.0.0", + "mdast-util-to-markdown": "^2.1.0", + "mdast-util-to-string": "^4.0.0", + "pagefind": "^1.3.0", + "rehype": "^13.0.1", + "rehype-format": "^5.0.0", + "remark-directive": "^3.0.0", + "ultrahtml": "^1.6.0", + "unified": "^11.0.5", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.2" }, - "engines": { - "node": ">= 14.0.0" + "peerDependencies": { + "astro": "^5.5.0" } }, - "node_modules/@algolia/requester-node-http": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.46.1.tgz", - "integrity": "sha512-VwbhV1xvTGiek3d2pOS6vNBC4dtbNadyRT+i1niZpGhOJWz1XnfhxNboVbXPGAyMJYz7kDrolbDvEzIDT93uUA==", + "node_modules/@astrojs/telemetry": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.3.0.tgz", + "integrity": "sha512-UFBgfeldP06qu6khs/yY+q1cDAaArM2/7AEIqQ9Cuvf7B1hNLq0xDrZkct+QoIGyjq56y8IaE2I3CTvG99mlhQ==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.46.1" + "ci-info": "^4.2.0", + "debug": "^4.4.0", + "dlv": "^1.1.3", + "dset": "^3.1.4", + "is-docker": "^3.0.0", + "is-wsl": "^3.1.0", + "which-pm-runs": "^1.1.0" }, "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" + "node": "18.20.8 || ^20.3.0 || >=22.0.0" } }, "node_modules/@babel/code-frame": { @@ -425,23 +239,23 @@ } }, "node_modules/@babel/core": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.3.tgz", - "integrity": "sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", + "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.3", + "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", - "@babel/helpers": "^7.28.3", - "@babel/parser": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.3", - "@babel/types": "^7.28.2", + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -483,19 +297,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", - "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.27.3" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-compilation-targets": { "version": "7.27.2", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", @@ -523,83 +324,6 @@ "semver": "bin/semver.js" } }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.5.tgz", - "integrity": "sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-member-expression-to-functions": "^7.28.5", - "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/traverse": "^7.28.5", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz", - "integrity": "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "regexpu-core": "^6.3.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz", - "integrity": "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-plugin-utils": "^7.27.1", - "debug": "^4.4.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.22.10" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, "node_modules/@babel/helper-globals": { "version": "7.28.0", "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", @@ -610,20 +334,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", - "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.28.5", - "@babel/types": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-module-imports": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", @@ -656,19 +366,6 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", - "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-plugin-utils": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", @@ -679,56 +376,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", - "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-wrap-function": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", - "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.27.1", - "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", - "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-string-parser": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", @@ -759,30 +406,15 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz", - "integrity": "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.3", - "@babel/types": "^7.28.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helpers": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.3.tgz", - "integrity": "sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", "dev": true, "license": "MIT", "dependencies": { "@babel/template": "^7.27.2", - "@babel/types": "^7.28.2" + "@babel/types": "^7.28.4" }, "engines": { "node": ">=6.9.0" @@ -804,103 +436,6 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz", - "integrity": "sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", - "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", - "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", - "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/plugin-transform-optional-chaining": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.3.tgz", - "integrity": "sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", @@ -956,35 +491,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", - "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-import-attributes": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", @@ -1169,1166 +675,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", - "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz", - "integrity": "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-remap-async-to-generator": "^7.27.1", - "@babel/traverse": "^7.28.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", - "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-remap-async-to-generator": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", - "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.5.tgz", - "integrity": "sha512-45DmULpySVvmq9Pj3X9B+62Xe+DJGov27QravQJU1LLcapR6/10i+gYVAucGGJpHBp5mYxIMK4nDAT/QDLr47g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", - "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.3.tgz", - "integrity": "sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.28.3", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz", - "integrity": "sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-globals": "^7.28.0", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1", - "@babel/traverse": "^7.28.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", - "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/template": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz", - "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", - "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", - "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", - "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", - "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-explicit-resource-management": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz", - "integrity": "sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.28.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.5.tgz", - "integrity": "sha512-D4WIMaFtwa2NizOp+dnoFjRez/ClKiC2BqqImwKd1X28nqBtZEyCYJ2ozQrrzlxAFrcrjxo39S6khe9RNDlGzw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", - "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", - "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", - "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", - "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", - "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.5.tgz", - "integrity": "sha512-axUuqnUTBuXyHGcJEVVh9pORaN6wC5bYfE7FGzPiaWa3syib9m7g+/IT/4VgCOe2Upef43PHzeAvcrVek6QuuA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", - "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", - "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", - "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.28.5.tgz", - "integrity": "sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.28.3", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", - "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", - "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", - "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", - "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", - "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.4.tgz", - "integrity": "sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.28.0", - "@babel/plugin-transform-parameters": "^7.27.7", - "@babel/traverse": "^7.28.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", - "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", - "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.5.tgz", - "integrity": "sha512-N6fut9IZlPnjPwgiQkXNhb+cT8wQKFlJNqcZkWlcTqkcqx6/kU4ynGmLFoa4LViBSirn05YAwk+sQBbPfxtYzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", - "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", - "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", - "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", - "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-constant-elements": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.27.1.tgz", - "integrity": "sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz", - "integrity": "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz", - "integrity": "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-syntax-jsx": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz", - "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz", - "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.4.tgz", - "integrity": "sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regexp-modifiers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", - "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", - "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.28.5.tgz", - "integrity": "sha512-20NUVgOrinudkIBzQ2bNxP08YpKprUkRTiRSd2/Z5GOdPImJGkoN4Z7IQe1T5AdyKI1i5L6RBmluqdSzvaq9/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "babel-plugin-polyfill-corejs2": "^0.4.14", - "babel-plugin-polyfill-corejs3": "^0.13.0", - "babel-plugin-polyfill-regenerator": "^0.6.5", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", - "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", - "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", - "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", - "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", - "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.5.tgz", - "integrity": "sha512-x2Qa+v/CuEoX7Dr31iAfr0IhInrVOWZU/2vJMJ00FOR/2nM0BcBEclpaf9sWCDc+v5e9dMrhSH8/atq/kX7+bA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-create-class-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/plugin-syntax-typescript": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", - "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", - "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", - "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", - "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.5.tgz", - "integrity": "sha512-S36mOoi1Sb6Fz98fBfE+UZSpYw5mJm0NUHtIKrOuNcqeFauy1J6dIvXm2KRVKobOSaGq4t/hBXdN4HGU3wL9Wg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.28.5", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.3", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-import-assertions": "^7.27.1", - "@babel/plugin-syntax-import-attributes": "^7.27.1", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.27.1", - "@babel/plugin-transform-async-generator-functions": "^7.28.0", - "@babel/plugin-transform-async-to-generator": "^7.27.1", - "@babel/plugin-transform-block-scoped-functions": "^7.27.1", - "@babel/plugin-transform-block-scoping": "^7.28.5", - "@babel/plugin-transform-class-properties": "^7.27.1", - "@babel/plugin-transform-class-static-block": "^7.28.3", - "@babel/plugin-transform-classes": "^7.28.4", - "@babel/plugin-transform-computed-properties": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.28.5", - "@babel/plugin-transform-dotall-regex": "^7.27.1", - "@babel/plugin-transform-duplicate-keys": "^7.27.1", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", - "@babel/plugin-transform-dynamic-import": "^7.27.1", - "@babel/plugin-transform-explicit-resource-management": "^7.28.0", - "@babel/plugin-transform-exponentiation-operator": "^7.28.5", - "@babel/plugin-transform-export-namespace-from": "^7.27.1", - "@babel/plugin-transform-for-of": "^7.27.1", - "@babel/plugin-transform-function-name": "^7.27.1", - "@babel/plugin-transform-json-strings": "^7.27.1", - "@babel/plugin-transform-literals": "^7.27.1", - "@babel/plugin-transform-logical-assignment-operators": "^7.28.5", - "@babel/plugin-transform-member-expression-literals": "^7.27.1", - "@babel/plugin-transform-modules-amd": "^7.27.1", - "@babel/plugin-transform-modules-commonjs": "^7.27.1", - "@babel/plugin-transform-modules-systemjs": "^7.28.5", - "@babel/plugin-transform-modules-umd": "^7.27.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", - "@babel/plugin-transform-new-target": "^7.27.1", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", - "@babel/plugin-transform-numeric-separator": "^7.27.1", - "@babel/plugin-transform-object-rest-spread": "^7.28.4", - "@babel/plugin-transform-object-super": "^7.27.1", - "@babel/plugin-transform-optional-catch-binding": "^7.27.1", - "@babel/plugin-transform-optional-chaining": "^7.28.5", - "@babel/plugin-transform-parameters": "^7.27.7", - "@babel/plugin-transform-private-methods": "^7.27.1", - "@babel/plugin-transform-private-property-in-object": "^7.27.1", - "@babel/plugin-transform-property-literals": "^7.27.1", - "@babel/plugin-transform-regenerator": "^7.28.4", - "@babel/plugin-transform-regexp-modifiers": "^7.27.1", - "@babel/plugin-transform-reserved-words": "^7.27.1", - "@babel/plugin-transform-shorthand-properties": "^7.27.1", - "@babel/plugin-transform-spread": "^7.27.1", - "@babel/plugin-transform-sticky-regex": "^7.27.1", - "@babel/plugin-transform-template-literals": "^7.27.1", - "@babel/plugin-transform-typeof-symbol": "^7.27.1", - "@babel/plugin-transform-unicode-escapes": "^7.27.1", - "@babel/plugin-transform-unicode-property-regex": "^7.27.1", - "@babel/plugin-transform-unicode-regex": "^7.27.1", - "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.14", - "babel-plugin-polyfill-corejs3": "^0.13.0", - "babel-plugin-polyfill-regenerator": "^0.6.5", - "core-js-compat": "^3.43.0", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/preset-react": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.28.5.tgz", - "integrity": "sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-transform-react-display-name": "^7.28.0", - "@babel/plugin-transform-react-jsx": "^7.27.1", - "@babel/plugin-transform-react-jsx-development": "^7.27.1", - "@babel/plugin-transform-react-pure-annotations": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-typescript": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.28.5.tgz", - "integrity": "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-syntax-jsx": "^7.27.1", - "@babel/plugin-transform-modules-commonjs": "^7.27.1", - "@babel/plugin-transform-typescript": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/runtime": { "version": "7.28.4", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", @@ -2339,19 +685,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/runtime-corejs3": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.28.4.tgz", - "integrity": "sha512-h7iEYiW4HebClDEhtvFObtPmIvrd1SSfpI9EhOeKk4CtIK/ngBWFpuhCzhdmRKtg71ylcue+9I6dv54XYO1epQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "core-js-pure": "^3.43.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/template": { "version": "7.27.2", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", @@ -2401,11 +734,27 @@ } }, "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz", + "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@capsizecss/unpack": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@capsizecss/unpack/-/unpack-3.0.1.tgz", + "integrity": "sha512-8XqW8xGn++Eqqbz3e9wKuK7mxryeRjs4LOHLxbh2lwKeSbuNR4NFifDZT4KzvjU6HMOPbiNTsWpniK5EJfTWkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fontkit": "^2.0.2" + }, + "engines": { + "node": ">=18" + } }, "node_modules/@colors/colors": { "version": "1.5.0", @@ -2417,2320 +766,32 @@ "node": ">=0.1.90" } }, - "node_modules/@csstools/cascade-layer-name-parser": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.5.tgz", - "integrity": "sha512-p1ko5eHgV+MgXFVa4STPKpvPxr6ReS8oS2jzTukjR74i5zJNyWO1ZM1m8YKBXnzDKWfBN1ztLYlHxbVemDD88A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - } - }, - "node_modules/@csstools/color-helpers": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", - "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - } - }, - "node_modules/@csstools/css-calc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", - "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - } - }, - "node_modules/@csstools/css-color-parser": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", - "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "@csstools/color-helpers": "^5.1.0", - "@csstools/css-calc": "^2.1.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - } - }, - "node_modules/@csstools/css-parser-algorithms": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", - "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "peer": true, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-tokenizer": "^3.0.4" - } - }, - "node_modules/@csstools/css-tokenizer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", - "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@csstools/media-query-list-parser": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz", - "integrity": "sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - } - }, - "node_modules/@csstools/postcss-alpha-function": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-alpha-function/-/postcss-alpha-function-1.0.1.tgz", - "integrity": "sha512-isfLLwksH3yHkFXfCI2Gcaqg7wGGHZZwunoJzEZk0yKYIokgre6hYVFibKL3SYAoR1kBXova8LB+JoO5vZzi9w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-cascade-layers": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-5.0.2.tgz", - "integrity": "sha512-nWBE08nhO8uWl6kSAeCx4im7QfVko3zLrtgWZY4/bP87zrSPpSyN/3W3TDqz1jJuH+kbKOHXg5rJnK+ZVYcFFg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/selector-specificity": "^5.0.0", - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-cascade-layers/node_modules/@csstools/selector-specificity": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", - "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss-selector-parser": "^7.0.0" - } - }, - "node_modules/@csstools/postcss-cascade-layers/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@csstools/postcss-color-function": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-4.0.12.tgz", - "integrity": "sha512-yx3cljQKRaSBc2hfh8rMZFZzChaFgwmO2JfFgFr1vMcF3C/uyy5I4RFIBOIWGq1D+XbKCG789CGkG6zzkLpagA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-color-function-display-p3-linear": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function-display-p3-linear/-/postcss-color-function-display-p3-linear-1.0.1.tgz", - "integrity": "sha512-E5qusdzhlmO1TztYzDIi8XPdPoYOjoTY6HBYBCYSj+Gn4gQRBlvjgPQXzfzuPQqt8EhkC/SzPKObg4Mbn8/xMg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-color-mix-function": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.12.tgz", - "integrity": "sha512-4STERZfCP5Jcs13P1U5pTvI9SkgLgfMUMhdXW8IlJWkzOOOqhZIjcNhWtNJZes2nkBDsIKJ0CJtFtuaZ00moag==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-color-mix-variadic-function-arguments": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-variadic-function-arguments/-/postcss-color-mix-variadic-function-arguments-1.0.2.tgz", - "integrity": "sha512-rM67Gp9lRAkTo+X31DUqMEq+iK+EFqsidfecmhrteErxJZb6tUoJBVQca1Vn1GpDql1s1rD1pKcuYzMsg7Z1KQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-content-alt-text": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-2.0.8.tgz", - "integrity": "sha512-9SfEW9QCxEpTlNMnpSqFaHyzsiRpZ5J5+KqCu1u5/eEJAWsMhzT40qf0FIbeeglEvrGRMdDzAxMIz3wqoGSb+Q==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-contrast-color-function": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-contrast-color-function/-/postcss-contrast-color-function-2.0.12.tgz", - "integrity": "sha512-YbwWckjK3qwKjeYz/CijgcS7WDUCtKTd8ShLztm3/i5dhh4NaqzsbYnhm4bjrpFpnLZ31jVcbK8YL77z3GBPzA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-exponential-functions": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-2.0.9.tgz", - "integrity": "sha512-abg2W/PI3HXwS/CZshSa79kNWNZHdJPMBXeZNyPQFbbj8sKO3jXxOt/wF7juJVjyDTc6JrvaUZYFcSBZBhaxjw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-calc": "^2.1.4", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-font-format-keywords": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-4.0.0.tgz", - "integrity": "sha512-usBzw9aCRDvchpok6C+4TXC57btc4bJtmKQWOHQxOVKen1ZfVqBUuCZ/wuqdX5GHsD0NRSr9XTP+5ID1ZZQBXw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-gamut-mapping": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.11.tgz", - "integrity": "sha512-fCpCUgZNE2piVJKC76zFsgVW1apF6dpYsqGyH8SIeCcM4pTEsRTWTLCaJIMKFEundsCKwY1rwfhtrio04RJ4Dw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-gradients-interpolation-method": { - "version": "5.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.12.tgz", - "integrity": "sha512-jugzjwkUY0wtNrZlFeyXzimUL3hN4xMvoPnIXxoZqxDvjZRiSh+itgHcVUWzJ2VwD/VAMEgCLvtaJHX+4Vj3Ow==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-hwb-function": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.12.tgz", - "integrity": "sha512-mL/+88Z53KrE4JdePYFJAQWFrcADEqsLprExCM04GDNgHIztwFzj0Mbhd/yxMBngq0NIlz58VVxjt5abNs1VhA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-ic-unit": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-4.0.4.tgz", - "integrity": "sha512-yQ4VmossuOAql65sCPppVO1yfb7hDscf4GseF0VCA/DTDaBc0Wtf8MTqVPfjGYlT5+2buokG0Gp7y0atYZpwjg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-initial": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-initial/-/postcss-initial-2.0.1.tgz", - "integrity": "sha512-L1wLVMSAZ4wovznquK0xmC7QSctzO4D0Is590bxpGqhqjboLXYA16dWZpfwImkdOgACdQ9PqXsuRroW6qPlEsg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-is-pseudo-class": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-5.0.3.tgz", - "integrity": "sha512-jS/TY4SpG4gszAtIg7Qnf3AS2pjcUM5SzxpApOrlndMeGhIbaTzWBzzP/IApXoNWEW7OhcjkRT48jnAUIFXhAQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/selector-specificity": "^5.0.0", - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-is-pseudo-class/node_modules/@csstools/selector-specificity": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", - "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss-selector-parser": "^7.0.0" - } - }, - "node_modules/@csstools/postcss-is-pseudo-class/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@csstools/postcss-light-dark-function": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.11.tgz", - "integrity": "sha512-fNJcKXJdPM3Lyrbmgw2OBbaioU7yuKZtiXClf4sGdQttitijYlZMD5K7HrC/eF83VRWRrYq6OZ0Lx92leV2LFA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-logical-float-and-clear": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-float-and-clear/-/postcss-logical-float-and-clear-3.0.0.tgz", - "integrity": "sha512-SEmaHMszwakI2rqKRJgE+8rpotFfne1ZS6bZqBoQIicFyV+xT1UF42eORPxJkVJVrH9C0ctUgwMSn3BLOIZldQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-logical-overflow": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overflow/-/postcss-logical-overflow-2.0.0.tgz", - "integrity": "sha512-spzR1MInxPuXKEX2csMamshR4LRaSZ3UXVaRGjeQxl70ySxOhMpP2252RAFsg8QyyBXBzuVOOdx1+bVO5bPIzA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-logical-overscroll-behavior": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overscroll-behavior/-/postcss-logical-overscroll-behavior-2.0.0.tgz", - "integrity": "sha512-e/webMjoGOSYfqLunyzByZj5KKe5oyVg/YSbie99VEaSDE2kimFm0q1f6t/6Jo+VVCQ/jbe2Xy+uX+C4xzWs4w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-logical-resize": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-resize/-/postcss-logical-resize-3.0.0.tgz", - "integrity": "sha512-DFbHQOFW/+I+MY4Ycd/QN6Dg4Hcbb50elIJCfnwkRTCX05G11SwViI5BbBlg9iHRl4ytB7pmY5ieAFk3ws7yyg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-logical-viewport-units": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-3.0.4.tgz", - "integrity": "sha512-q+eHV1haXA4w9xBwZLKjVKAWn3W2CMqmpNpZUk5kRprvSiBEGMgrNH3/sJZ8UA3JgyHaOt3jwT9uFa4wLX4EqQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-media-minmax": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-2.0.9.tgz", - "integrity": "sha512-af9Qw3uS3JhYLnCbqtZ9crTvvkR+0Se+bBqSr7ykAnl9yKhk6895z9rf+2F4dClIDJWxgn0iZZ1PSdkhrbs2ig==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "@csstools/css-calc": "^2.1.4", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/media-query-list-parser": "^4.0.3" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-media-queries-aspect-ratio-number-values": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-3.0.5.tgz", - "integrity": "sha512-zhAe31xaaXOY2Px8IYfoVTB3wglbJUVigGphFLj6exb7cjZRH9A6adyE22XfFK3P2PzwRk0VDeTJmaxpluyrDg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/media-query-list-parser": "^4.0.3" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-nested-calc": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-4.0.0.tgz", - "integrity": "sha512-jMYDdqrQQxE7k9+KjstC3NbsmC063n1FTPLCgCRS2/qHUbHM0mNy9pIn4QIiQGs9I/Bg98vMqw7mJXBxa0N88A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-normalize-display-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.0.tgz", - "integrity": "sha512-HlEoG0IDRoHXzXnkV4in47dzsxdsjdz6+j7MLjaACABX2NfvjFS6XVAnpaDyGesz9gK2SC7MbNwdCHusObKJ9Q==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-oklab-function": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.12.tgz", - "integrity": "sha512-HhlSmnE1NKBhXsTnNGjxvhryKtO7tJd1w42DKOGFD6jSHtYOrsJTQDKPMwvOfrzUAk8t7GcpIfRyM7ssqHpFjg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-position-area-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-position-area-property/-/postcss-position-area-property-1.0.0.tgz", - "integrity": "sha512-fUP6KR8qV2NuUZV3Cw8itx0Ep90aRjAZxAEzC3vrl6yjFv+pFsQbR18UuQctEKmA72K9O27CoYiKEgXxkqjg8Q==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-progressive-custom-properties": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.2.1.tgz", - "integrity": "sha512-uPiiXf7IEKtUQXsxu6uWtOlRMXd2QWWy5fhxHDnPdXKCQckPP3E34ZgDoZ62r2iT+UOgWsSbM4NvHE5m3mAEdw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-random-function": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-random-function/-/postcss-random-function-2.0.1.tgz", - "integrity": "sha512-q+FQaNiRBhnoSNo+GzqGOIBKoHQ43lYz0ICrV+UudfWnEF6ksS6DsBIJSISKQT2Bvu3g4k6r7t0zYrk5pDlo8w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-calc": "^2.1.4", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-relative-color-syntax": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.12.tgz", - "integrity": "sha512-0RLIeONxu/mtxRtf3o41Lq2ghLimw0w9ByLWnnEVuy89exmEEq8bynveBxNW3nyHqLAFEeNtVEmC1QK9MZ8Huw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-scope-pseudo-class": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-scope-pseudo-class/-/postcss-scope-pseudo-class-4.0.1.tgz", - "integrity": "sha512-IMi9FwtH6LMNuLea1bjVMQAsUhFxJnyLSgOp/cpv5hrzWmrUYU5fm0EguNDIIOHUqzXode8F/1qkC/tEo/qN8Q==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-scope-pseudo-class/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@csstools/postcss-sign-functions": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@csstools/postcss-sign-functions/-/postcss-sign-functions-1.1.4.tgz", - "integrity": "sha512-P97h1XqRPcfcJndFdG95Gv/6ZzxUBBISem0IDqPZ7WMvc/wlO+yU0c5D/OCpZ5TJoTt63Ok3knGk64N+o6L2Pg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-calc": "^2.1.4", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-stepped-value-functions": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-4.0.9.tgz", - "integrity": "sha512-h9btycWrsex4dNLeQfyU3y3w40LMQooJWFMm/SK9lrKguHDcFl4VMkncKKoXi2z5rM9YGWbUQABI8BT2UydIcA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-calc": "^2.1.4", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-system-ui-font-family": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-system-ui-font-family/-/postcss-system-ui-font-family-1.0.0.tgz", - "integrity": "sha512-s3xdBvfWYfoPSBsikDXbuorcMG1nN1M6GdU0qBsGfcmNR0A/qhloQZpTxjA3Xsyrk1VJvwb2pOfiOT3at/DuIQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-text-decoration-shorthand": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-4.0.3.tgz", - "integrity": "sha512-KSkGgZfx0kQjRIYnpsD7X2Om9BUXX/Kii77VBifQW9Ih929hK0KNjVngHDH0bFB9GmfWcR9vJYJJRvw/NQjkrA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/color-helpers": "^5.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-trigonometric-functions": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-4.0.9.tgz", - "integrity": "sha512-Hnh5zJUdpNrJqK9v1/E3BbrQhaDTj5YiX7P61TOvUhoDHnUmsNNxcDAgkQ32RrcWx9GVUvfUNPcUkn8R3vIX6A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-calc": "^2.1.4", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-unset-value": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-4.0.0.tgz", - "integrity": "sha512-cBz3tOCI5Fw6NIFEwU3RiwK6mn3nKegjpJuzCndoGq3BZPkUjnsq7uQmIeMNeMbMk7YD2MfKcgCpZwX5jyXqCA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/utilities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@csstools/utilities/-/utilities-2.0.0.tgz", - "integrity": "sha512-5VdOr0Z71u+Yp3ozOx8T11N703wIFGVRgOWbOZMKgglPJsWA54MRIoMNVMa7shUToIhx5J8vX4sOZgD2XiihiQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "node_modules/@ctrl/tinycolor": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-4.2.0.tgz", + "integrity": "sha512-kzyuwOAQnXJNLS9PSyrk0CWk35nWJW/zl/6KvnTBMFK65gm7U1/Z5BqjxeapjZCIhQcM/DsrEmcbRwDyXyXK4A==", "dev": true, "license": "MIT", "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@docsearch/core": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@docsearch/core/-/core-4.3.1.tgz", - "integrity": "sha512-ktVbkePE+2h9RwqCUMbWXOoebFyDOxHqImAqfs+lC8yOU+XwEW4jgvHGJK079deTeHtdhUNj0PXHSnhJINvHzQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": ">= 16.8.0 < 20.0.0", - "react": ">= 16.8.0 < 20.0.0", - "react-dom": ">= 16.8.0 < 20.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } - } - }, - "node_modules/@docsearch/css": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-4.3.2.tgz", - "integrity": "sha512-K3Yhay9MgkBjJJ0WEL5MxnACModX9xuNt3UlQQkDEDZJZ0+aeWKtOkxHNndMRkMBnHdYvQjxkm6mdlneOtU1IQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@docsearch/react": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-4.3.2.tgz", - "integrity": "sha512-74SFD6WluwvgsOPqifYOviEEVwDxslxfhakTlra+JviaNcs7KK/rjsPj89kVEoQc9FUxRkAofaJnHIR7pb4TSQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ai-sdk/react": "^2.0.30", - "@algolia/autocomplete-core": "1.19.2", - "@docsearch/core": "4.3.1", - "@docsearch/css": "4.3.2", - "ai": "^5.0.30", - "algoliasearch": "^5.28.0", - "marked": "^16.3.0", - "zod": "^4.1.8" - }, - "peerDependencies": { - "@types/react": ">= 16.8.0 < 20.0.0", - "react": ">= 16.8.0 < 20.0.0", - "react-dom": ">= 16.8.0 < 20.0.0", - "search-insights": ">= 1 < 3" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - }, - "search-insights": { - "optional": true - } - } - }, - "node_modules/@docusaurus/babel": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/babel/-/babel-3.9.2.tgz", - "integrity": "sha512-GEANdi/SgER+L7Japs25YiGil/AUDnFFHaCGPBbundxoWtCkA2lmy7/tFmgED4y1htAy6Oi4wkJEQdGssnw9MA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.25.9", - "@babel/generator": "^7.25.9", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-transform-runtime": "^7.25.9", - "@babel/preset-env": "^7.25.9", - "@babel/preset-react": "^7.25.9", - "@babel/preset-typescript": "^7.25.9", - "@babel/runtime": "^7.25.9", - "@babel/runtime-corejs3": "^7.25.9", - "@babel/traverse": "^7.25.9", - "@docusaurus/logger": "3.9.2", - "@docusaurus/utils": "3.9.2", - "babel-plugin-dynamic-import-node": "^2.3.3", - "fs-extra": "^11.1.1", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" - } - }, - "node_modules/@docusaurus/bundler": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/bundler/-/bundler-3.9.2.tgz", - "integrity": "sha512-ZOVi6GYgTcsZcUzjblpzk3wH1Fya2VNpd5jtHoCCFcJlMQ1EYXZetfAnRHLcyiFeBABaI1ltTYbOBtH/gahGVA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.25.9", - "@docusaurus/babel": "3.9.2", - "@docusaurus/cssnano-preset": "3.9.2", - "@docusaurus/logger": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils": "3.9.2", - "babel-loader": "^9.2.1", - "clean-css": "^5.3.3", - "copy-webpack-plugin": "^11.0.0", - "css-loader": "^6.11.0", - "css-minimizer-webpack-plugin": "^5.0.1", - "cssnano": "^6.1.2", - "file-loader": "^6.2.0", - "html-minifier-terser": "^7.2.0", - "mini-css-extract-plugin": "^2.9.2", - "null-loader": "^4.0.1", - "postcss": "^8.5.4", - "postcss-loader": "^7.3.4", - "postcss-preset-env": "^10.2.1", - "terser-webpack-plugin": "^5.3.9", - "tslib": "^2.6.0", - "url-loader": "^4.1.1", - "webpack": "^5.95.0", - "webpackbar": "^6.0.1" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "@docusaurus/faster": "*" - }, - "peerDependenciesMeta": { - "@docusaurus/faster": { - "optional": true - } - } - }, - "node_modules/@docusaurus/core": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.9.2.tgz", - "integrity": "sha512-HbjwKeC+pHUFBfLMNzuSjqFE/58+rLVKmOU3lxQrpsxLBOGosYco/Q0GduBb0/jEMRiyEqjNT/01rRdOMWq5pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@docusaurus/babel": "3.9.2", - "@docusaurus/bundler": "3.9.2", - "@docusaurus/logger": "3.9.2", - "@docusaurus/mdx-loader": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-common": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "boxen": "^6.2.1", - "chalk": "^4.1.2", - "chokidar": "^3.5.3", - "cli-table3": "^0.6.3", - "combine-promises": "^1.1.0", - "commander": "^5.1.0", - "core-js": "^3.31.1", - "detect-port": "^1.5.1", - "escape-html": "^1.0.3", - "eta": "^2.2.0", - "eval": "^0.1.8", - "execa": "5.1.1", - "fs-extra": "^11.1.1", - "html-tags": "^3.3.1", - "html-webpack-plugin": "^5.6.0", - "leven": "^3.1.0", - "lodash": "^4.17.21", - "open": "^8.4.0", - "p-map": "^4.0.0", - "prompts": "^2.4.2", - "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", - "react-loadable": "npm:@docusaurus/react-loadable@6.0.0", - "react-loadable-ssr-addon-v5-slorber": "^1.0.1", - "react-router": "^5.3.4", - "react-router-config": "^5.1.1", - "react-router-dom": "^5.3.4", - "semver": "^7.5.4", - "serve-handler": "^6.1.6", - "tinypool": "^1.0.2", - "tslib": "^2.6.0", - "update-notifier": "^6.0.2", - "webpack": "^5.95.0", - "webpack-bundle-analyzer": "^4.10.2", - "webpack-dev-server": "^5.2.2", - "webpack-merge": "^6.0.1" - }, - "bin": { - "docusaurus": "bin/docusaurus.mjs" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "@mdx-js/react": "^3.0.0", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/core/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@docusaurus/core/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@docusaurus/core/node_modules/boxen": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz", - "integrity": "sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-align": "^3.0.1", - "camelcase": "^6.2.0", - "chalk": "^4.1.2", - "cli-boxes": "^3.0.0", - "string-width": "^5.0.1", - "type-fest": "^2.5.0", - "widest-line": "^4.0.1", - "wrap-ansi": "^8.0.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@docusaurus/core/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@docusaurus/core/node_modules/cli-boxes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", - "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@docusaurus/core/node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/@docusaurus/core/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@docusaurus/core/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@docusaurus/core/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@docusaurus/core/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@docusaurus/core/node_modules/widest-line": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", - "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", - "dev": true, - "license": "MIT", - "dependencies": { - "string-width": "^5.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@docusaurus/core/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@docusaurus/cssnano-preset": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.9.2.tgz", - "integrity": "sha512-8gBKup94aGttRduABsj7bpPFTX7kbwu+xh3K9NMCF5K4bWBqTFYW+REKHF6iBVDHRJ4grZdIPbvkiHd/XNKRMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssnano-preset-advanced": "^6.1.2", - "postcss": "^8.5.4", - "postcss-sort-media-queries": "^5.2.0", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" - } - }, - "node_modules/@docusaurus/logger": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.9.2.tgz", - "integrity": "sha512-/SVCc57ByARzGSU60c50rMyQlBuMIJCjcsJlkphxY6B0GV4UH3tcA1994N8fFfbJ9kX3jIBe/xg3XP5qBtGDbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.2", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" - } - }, - "node_modules/@docusaurus/mdx-loader": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.9.2.tgz", - "integrity": "sha512-wiYoGwF9gdd6rev62xDU8AAM8JuLI/hlwOtCzMmYcspEkzecKrP8J8X+KpYnTlACBUUtXNJpSoCwFWJhLRevzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@docusaurus/logger": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "@mdx-js/mdx": "^3.0.0", - "@slorber/remark-comment": "^1.0.0", - "escape-html": "^1.0.3", - "estree-util-value-to-estree": "^3.0.1", - "file-loader": "^6.2.0", - "fs-extra": "^11.1.1", - "image-size": "^2.0.2", - "mdast-util-mdx": "^3.0.0", - "mdast-util-to-string": "^4.0.0", - "rehype-raw": "^7.0.0", - "remark-directive": "^3.0.0", - "remark-emoji": "^4.0.0", - "remark-frontmatter": "^5.0.0", - "remark-gfm": "^4.0.0", - "stringify-object": "^3.3.0", - "tslib": "^2.6.0", - "unified": "^11.0.3", - "unist-util-visit": "^5.0.0", - "url-loader": "^4.1.1", - "vfile": "^6.0.1", - "webpack": "^5.88.1" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/module-type-aliases": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.9.2.tgz", - "integrity": "sha512-8qVe2QA9hVLzvnxP46ysuofJUIc/yYQ82tvA/rBTrnpXtCjNSFLxEZfd5U8cYZuJIVlkPxamsIgwd5tGZXfvew==", - "dev": true, - "license": "MIT", - "dependencies": { - "@docusaurus/types": "3.9.2", - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router-config": "*", - "@types/react-router-dom": "*", - "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", - "react-loadable": "npm:@docusaurus/react-loadable@6.0.0" - }, - "peerDependencies": { - "react": "*", - "react-dom": "*" - } - }, - "node_modules/@docusaurus/plugin-content-blog": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.9.2.tgz", - "integrity": "sha512-3I2HXy3L1QcjLJLGAoTvoBnpOwa6DPUa3Q0dMK19UTY9mhPkKQg/DYhAGTiBUKcTR0f08iw7kLPqOhIgdV3eVQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.9.2", - "@docusaurus/logger": "3.9.2", - "@docusaurus/mdx-loader": "3.9.2", - "@docusaurus/theme-common": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-common": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "cheerio": "1.0.0-rc.12", - "feed": "^4.2.2", - "fs-extra": "^11.1.1", - "lodash": "^4.17.21", - "schema-dts": "^1.1.2", - "srcset": "^4.0.0", - "tslib": "^2.6.0", - "unist-util-visit": "^5.0.0", - "utility-types": "^3.10.0", - "webpack": "^5.88.1" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "@docusaurus/plugin-content-docs": "*", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-content-docs": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.9.2.tgz", - "integrity": "sha512-C5wZsGuKTY8jEYsqdxhhFOe1ZDjH0uIYJ9T/jebHwkyxqnr4wW0jTkB72OMqNjsoQRcb0JN3PcSeTwFlVgzCZg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@docusaurus/core": "3.9.2", - "@docusaurus/logger": "3.9.2", - "@docusaurus/mdx-loader": "3.9.2", - "@docusaurus/module-type-aliases": "3.9.2", - "@docusaurus/theme-common": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-common": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "@types/react-router-config": "^5.0.7", - "combine-promises": "^1.1.0", - "fs-extra": "^11.1.1", - "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "schema-dts": "^1.1.2", - "tslib": "^2.6.0", - "utility-types": "^3.10.0", - "webpack": "^5.88.1" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-content-pages": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.9.2.tgz", - "integrity": "sha512-s4849w/p4noXUrGpPUF0BPqIAfdAe76BLaRGAGKZ1gTDNiGxGcpsLcwJ9OTi1/V8A+AzvsmI9pkjie2zjIQZKA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.9.2", - "@docusaurus/mdx-loader": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "fs-extra": "^11.1.1", - "tslib": "^2.6.0", - "webpack": "^5.88.1" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-css-cascade-layers": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-css-cascade-layers/-/plugin-css-cascade-layers-3.9.2.tgz", - "integrity": "sha512-w1s3+Ss+eOQbscGM4cfIFBlVg/QKxyYgj26k5AnakuHkKxH6004ZtuLe5awMBotIYF2bbGDoDhpgQ4r/kcj4rQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" - } - }, - "node_modules/@docusaurus/plugin-debug": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.9.2.tgz", - "integrity": "sha512-j7a5hWuAFxyQAkilZwhsQ/b3T7FfHZ+0dub6j/GxKNFJp2h9qk/P1Bp7vrGASnvA9KNQBBL1ZXTe7jlh4VdPdA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils": "3.9.2", - "fs-extra": "^11.1.1", - "react-json-view-lite": "^2.3.0", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-google-analytics": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.9.2.tgz", - "integrity": "sha512-mAwwQJ1Us9jL/lVjXtErXto4p4/iaLlweC54yDUK1a97WfkC6Z2k5/769JsFgwOwOP+n5mUQGACXOEQ0XDuVUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-google-gtag": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.9.2.tgz", - "integrity": "sha512-YJ4lDCphabBtw19ooSlc1MnxtYGpjFV9rEdzjLsUnBCeis2djUyCozZaFhCg6NGEwOn7HDDyMh0yzcdRpnuIvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "@types/gtag.js": "^0.0.12", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-google-tag-manager": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.9.2.tgz", - "integrity": "sha512-LJtIrkZN/tuHD8NqDAW1Tnw0ekOwRTfobWPsdO15YxcicBo2ykKF0/D6n0vVBfd3srwr9Z6rzrIWYrMzBGrvNw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-sitemap": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.9.2.tgz", - "integrity": "sha512-WLh7ymgDXjG8oPoM/T4/zUP7KcSuFYRZAUTl8vR6VzYkfc18GBM4xLhcT+AKOwun6kBivYKUJf+vlqYJkm+RHw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.9.2", - "@docusaurus/logger": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-common": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "fs-extra": "^11.1.1", - "sitemap": "^7.1.1", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/plugin-svgr": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-svgr/-/plugin-svgr-3.9.2.tgz", - "integrity": "sha512-n+1DE+5b3Lnf27TgVU5jM1d4x5tUh2oW5LTsBxJX4PsAPV0JGcmI6p3yLYtEY0LRVEIJh+8RsdQmRE66wSV8mw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "@svgr/core": "8.1.0", - "@svgr/webpack": "^8.1.0", - "tslib": "^2.6.0", - "webpack": "^5.88.1" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/preset-classic": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.9.2.tgz", - "integrity": "sha512-IgyYO2Gvaigi21LuDIe+nvmN/dfGXAiMcV/murFqcpjnZc7jxFAxW+9LEjdPt61uZLxG4ByW/oUmX/DDK9t/8w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.9.2", - "@docusaurus/plugin-content-blog": "3.9.2", - "@docusaurus/plugin-content-docs": "3.9.2", - "@docusaurus/plugin-content-pages": "3.9.2", - "@docusaurus/plugin-css-cascade-layers": "3.9.2", - "@docusaurus/plugin-debug": "3.9.2", - "@docusaurus/plugin-google-analytics": "3.9.2", - "@docusaurus/plugin-google-gtag": "3.9.2", - "@docusaurus/plugin-google-tag-manager": "3.9.2", - "@docusaurus/plugin-sitemap": "3.9.2", - "@docusaurus/plugin-svgr": "3.9.2", - "@docusaurus/theme-classic": "3.9.2", - "@docusaurus/theme-common": "3.9.2", - "@docusaurus/theme-search-algolia": "3.9.2", - "@docusaurus/types": "3.9.2" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/theme-classic": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.9.2.tgz", - "integrity": "sha512-IGUsArG5hhekXd7RDb11v94ycpJpFdJPkLnt10fFQWOVxAtq5/D7hT6lzc2fhyQKaaCE62qVajOMKL7OiAFAIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.9.2", - "@docusaurus/logger": "3.9.2", - "@docusaurus/mdx-loader": "3.9.2", - "@docusaurus/module-type-aliases": "3.9.2", - "@docusaurus/plugin-content-blog": "3.9.2", - "@docusaurus/plugin-content-docs": "3.9.2", - "@docusaurus/plugin-content-pages": "3.9.2", - "@docusaurus/theme-common": "3.9.2", - "@docusaurus/theme-translations": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-common": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "@mdx-js/react": "^3.0.0", - "clsx": "^2.0.0", - "infima": "0.2.0-alpha.45", - "lodash": "^4.17.21", - "nprogress": "^0.2.0", - "postcss": "^8.5.4", - "prism-react-renderer": "^2.3.0", - "prismjs": "^1.29.0", - "react-router-dom": "^5.3.4", - "rtlcss": "^4.1.0", - "tslib": "^2.6.0", - "utility-types": "^3.10.0" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/theme-common": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.9.2.tgz", - "integrity": "sha512-6c4DAbR6n6nPbnZhY2V3tzpnKnGL+6aOsLvFL26VRqhlczli9eWG0VDUNoCQEPnGwDMhPS42UhSAnz5pThm5Ag==", - "dev": true, - "license": "MIT", - "dependencies": { - "@docusaurus/mdx-loader": "3.9.2", - "@docusaurus/module-type-aliases": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-common": "3.9.2", - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router-config": "*", - "clsx": "^2.0.0", - "parse-numeric-range": "^1.3.0", - "prism-react-renderer": "^2.3.0", - "tslib": "^2.6.0", - "utility-types": "^3.10.0" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "@docusaurus/plugin-content-docs": "*", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/theme-search-algolia": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.9.2.tgz", - "integrity": "sha512-GBDSFNwjnh5/LdkxCKQHkgO2pIMX1447BxYUBG2wBiajS21uj64a+gH/qlbQjDLxmGrbrllBrtJkUHxIsiwRnw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@docsearch/react": "^3.9.0 || ^4.1.0", - "@docusaurus/core": "3.9.2", - "@docusaurus/logger": "3.9.2", - "@docusaurus/plugin-content-docs": "3.9.2", - "@docusaurus/theme-common": "3.9.2", - "@docusaurus/theme-translations": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-validation": "3.9.2", - "algoliasearch": "^5.37.0", - "algoliasearch-helper": "^3.26.0", - "clsx": "^2.0.0", - "eta": "^2.2.0", - "fs-extra": "^11.1.1", - "lodash": "^4.17.21", - "tslib": "^2.6.0", - "utility-types": "^3.10.0" - }, - "engines": { - "node": ">=20.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/theme-translations": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.9.2.tgz", - "integrity": "sha512-vIryvpP18ON9T9rjgMRFLr2xJVDpw1rtagEGf8Ccce4CkTrvM/fRB8N2nyWYOW5u3DdjkwKw5fBa+3tbn9P4PA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fs-extra": "^11.1.1", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" - } - }, - "node_modules/@docusaurus/types": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.2.tgz", - "integrity": "sha512-Ux1JUNswg+EfUEmajJjyhIohKceitY/yzjRUpu04WXgvVz+fbhVC0p+R0JhvEu4ytw8zIAys2hrdpQPBHRIa8Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@mdx-js/mdx": "^3.0.0", - "@types/history": "^4.7.11", - "@types/mdast": "^4.0.2", - "@types/react": "*", - "commander": "^5.1.0", - "joi": "^17.9.2", - "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", - "utility-types": "^3.10.0", - "webpack": "^5.95.0", - "webpack-merge": "^5.9.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@docusaurus/types/node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/@docusaurus/types/node_modules/webpack-merge": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@docusaurus/utils": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.9.2.tgz", - "integrity": "sha512-lBSBiRruFurFKXr5Hbsl2thmGweAPmddhF3jb99U4EMDA5L+e5Y1rAkOS07Nvrup7HUMBDrCV45meaxZnt28nQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@docusaurus/logger": "3.9.2", - "@docusaurus/types": "3.9.2", - "@docusaurus/utils-common": "3.9.2", - "escape-string-regexp": "^4.0.0", - "execa": "5.1.1", - "file-loader": "^6.2.0", - "fs-extra": "^11.1.1", - "github-slugger": "^1.5.0", - "globby": "^11.1.0", - "gray-matter": "^4.0.3", - "jiti": "^1.20.0", - "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "micromatch": "^4.0.5", - "p-queue": "^6.6.2", - "prompts": "^2.4.2", - "resolve-pathname": "^3.0.0", - "tslib": "^2.6.0", - "url-loader": "^4.1.1", - "utility-types": "^3.10.0", - "webpack": "^5.88.1" - }, - "engines": { - "node": ">=20.0" - } - }, - "node_modules/@docusaurus/utils-common": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.9.2.tgz", - "integrity": "sha512-I53UC1QctruA6SWLvbjbhCpAw7+X7PePoe5pYcwTOEXD/PxeP8LnECAhTHHwWCblyUX5bMi4QLRkxvyZ+IT8Aw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@docusaurus/types": "3.9.2", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" - } - }, - "node_modules/@docusaurus/utils-validation": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.9.2.tgz", - "integrity": "sha512-l7yk3X5VnNmATbwijJkexdhulNsQaNDwoagiwujXoxFbWLcxHQqNQ+c/IAlzrfMMOfa/8xSBZ7KEKDesE/2J7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@docusaurus/logger": "3.9.2", - "@docusaurus/utils": "3.9.2", - "@docusaurus/utils-common": "3.9.2", - "fs-extra": "^11.2.0", - "joi": "^17.9.2", - "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=20.0" + "node": ">=14" } }, "node_modules/@emnapi/core": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.5.tgz", - "integrity": "sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.8.1.tgz", + "integrity": "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==", "dev": true, "license": "MIT", "optional": true, "dependencies": { - "@emnapi/wasi-threads": "1.0.4", + "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" } }, "node_modules/@emnapi/runtime": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.5.tgz", - "integrity": "sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", + "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", "dev": true, "license": "MIT", "optional": true, @@ -4739,9 +800,9 @@ } }, "node_modules/@emnapi/wasi-threads": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.4.tgz", - "integrity": "sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", + "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", "dev": true, "license": "MIT", "optional": true, @@ -4749,10 +810,452 @@ "tslib": "^2.4.0" } }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", - "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4782,9 +1285,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, "license": "MIT", "engines": { @@ -4792,13 +1295,13 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", - "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/object-schema": "^2.1.6", + "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.2" }, @@ -4807,19 +1310,22 @@ } }, "node_modules/@eslint/config-helpers": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz", - "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", "dev": true, "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@eslint/core": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", - "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -4830,9 +1336,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", - "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", + "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4842,7 +1348,7 @@ "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", + "js-yaml": "^4.1.1", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" }, @@ -4864,9 +1370,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.34.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.34.0.tgz", - "integrity": "sha512-EoyvqQnBNsV1CWaEJ559rxXL4c8V92gxirbawSmVUOWXlsRxxQXl6LmCpdUblgxgSkDIqKnhzba2SjRTI/A5Rw==", + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", + "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", "dev": true, "license": "MIT", "engines": { @@ -4877,9 +1383,9 @@ } }, "node_modules/@eslint/object-schema": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", - "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -4887,34 +1393,66 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", - "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.15.2", + "@eslint/core": "^0.17.0", "levn": "^0.4.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", + "node_modules/@expressive-code/core": { + "version": "0.41.5", + "resolved": "https://registry.npmjs.org/@expressive-code/core/-/core-0.41.5.tgz", + "integrity": "sha512-II5TEy5eOoXiqPwqtpSqwamUd7lZS3YH3ofxR1ZyQMmygqORZn8/7SzgfF8G0kB7uKCBzFZT6RgKgCuHcJuPpA==", "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@hapi/topo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", - "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", - "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { - "@hapi/hoek": "^9.0.0" + "@ctrl/tinycolor": "^4.0.4", + "hast-util-select": "^6.0.2", + "hast-util-to-html": "^9.0.1", + "hast-util-to-text": "^4.0.1", + "hastscript": "^9.0.0", + "postcss": "^8.4.38", + "postcss-nested": "^6.0.1", + "unist-util-visit": "^5.0.0", + "unist-util-visit-parents": "^6.0.1" + } + }, + "node_modules/@expressive-code/plugin-frames": { + "version": "0.41.5", + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-frames/-/plugin-frames-0.41.5.tgz", + "integrity": "sha512-qU0cvAQGfRLX7XwGf3/+hqIVmAc/mNNTlqVLR0iBfJF6EKvtP3R7/uAlPrAxnxQxn0meTazCz8D+PsPyOpHKrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.41.5" + } + }, + "node_modules/@expressive-code/plugin-shiki": { + "version": "0.41.5", + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-shiki/-/plugin-shiki-0.41.5.tgz", + "integrity": "sha512-gw6OWvnmDmvcKJ5AZSzl2VkuixJMQ/zWSwPLFNzitqCa8aPfIFunb0K8IIOsE43LELgOWkie9lRFspOxwDVwrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.41.5", + "shiki": "^3.2.2" + } + }, + "node_modules/@expressive-code/plugin-text-markers": { + "version": "0.41.5", + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-text-markers/-/plugin-text-markers-0.41.5.tgz", + "integrity": "sha512-0DSiTsjWFEz6/iuLOGNNy2GaeCW41OwnVJMKx1tS+XKeQxAL89UkZP3egWNzxjWNHNMzEv3ZWWWYqbonEQlv/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.41.5" } }, "node_modules/@humanfs/core": { @@ -4928,33 +1466,19 @@ } }, "node_modules/@humanfs/node": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", - "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", "dev": true, "license": "Apache-2.0", "dependencies": { "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.3.0" + "@humanwhocodes/retry": "^0.4.0" }, "engines": { "node": ">=18.18.0" } }, - "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", - "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -4983,6 +1507,497 @@ "url": "https://github.com/sponsors/nzakas" } }, + "node_modules/@img/colour": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", + "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", + "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", + "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", + "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", + "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", + "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", + "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", + "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", + "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", + "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", + "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", + "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.0.5" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", + "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", + "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.0.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", + "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", + "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", + "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", + "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.2.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", + "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", + "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, "node_modules/@inquirer/external-editor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", @@ -5052,9 +2067,9 @@ } }, "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.0.tgz", - "integrity": "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "license": "MIT", "engines": { "node": ">=12" @@ -5064,9 +2079,9 @@ } }, "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "license": "MIT", "engines": { "node": ">=12" @@ -5099,9 +2114,9 @@ } }, "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" @@ -5157,6 +2172,16 @@ "sprintf-js": "~1.0.2" } }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -5248,17 +2273,17 @@ } }, "node_modules/@jest/console": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-30.0.5.tgz", - "integrity": "sha512-xY6b0XiL0Nav3ReresUarwl2oIz1gTnxGbGpho9/rbUWsLH0f1OD/VT84xs8c7VmH7MChnLb0pag6PhZhAdDiA==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-30.2.0.tgz", + "integrity": "sha512-+O1ifRjkvYIkBqASKWgLxrpEhQAAE7hY77ALLUufSk5717KfOShg6IbqLmdsLMPdUiFvA2kTs0R7YZy+l0IzZQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.0.5", + "@jest/types": "30.2.0", "@types/node": "*", "chalk": "^4.1.2", - "jest-message-util": "30.0.5", - "jest-util": "30.0.5", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", "slash": "^3.0.0" }, "engines": { @@ -5266,39 +2291,39 @@ } }, "node_modules/@jest/core": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-30.0.5.tgz", - "integrity": "sha512-fKD0OulvRsXF1hmaFgHhVJzczWzA1RXMMo9LTPuFXo9q/alDbME3JIyWYqovWsUBWSoBcsHaGPSLF9rz4l9Qeg==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-30.2.0.tgz", + "integrity": "sha512-03W6IhuhjqTlpzh/ojut/pDB2LPRygyWX8ExpgHtQA8H/3K7+1vKmcINx5UzeOX1se6YEsBsOHQ1CRzf3fOwTQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/console": "30.0.5", + "@jest/console": "30.2.0", "@jest/pattern": "30.0.1", - "@jest/reporters": "30.0.5", - "@jest/test-result": "30.0.5", - "@jest/transform": "30.0.5", - "@jest/types": "30.0.5", + "@jest/reporters": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", "@types/node": "*", "ansi-escapes": "^4.3.2", "chalk": "^4.1.2", "ci-info": "^4.2.0", "exit-x": "^0.2.2", "graceful-fs": "^4.2.11", - "jest-changed-files": "30.0.5", - "jest-config": "30.0.5", - "jest-haste-map": "30.0.5", - "jest-message-util": "30.0.5", + "jest-changed-files": "30.2.0", + "jest-config": "30.2.0", + "jest-haste-map": "30.2.0", + "jest-message-util": "30.2.0", "jest-regex-util": "30.0.1", - "jest-resolve": "30.0.5", - "jest-resolve-dependencies": "30.0.5", - "jest-runner": "30.0.5", - "jest-runtime": "30.0.5", - "jest-snapshot": "30.0.5", - "jest-util": "30.0.5", - "jest-validate": "30.0.5", - "jest-watcher": "30.0.5", + "jest-resolve": "30.2.0", + "jest-resolve-dependencies": "30.2.0", + "jest-runner": "30.2.0", + "jest-runtime": "30.2.0", + "jest-snapshot": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", + "jest-watcher": "30.2.0", "micromatch": "^4.0.8", - "pretty-format": "30.0.5", + "pretty-format": "30.2.0", "slash": "^3.0.0" }, "engines": { @@ -5324,70 +2349,70 @@ } }, "node_modules/@jest/environment": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-30.0.5.tgz", - "integrity": "sha512-aRX7WoaWx1oaOkDQvCWImVQ8XNtdv5sEWgk4gxR6NXb7WBUnL5sRak4WRzIQRZ1VTWPvV4VI4mgGjNL9TeKMYA==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-30.2.0.tgz", + "integrity": "sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g==", "dev": true, "license": "MIT", "dependencies": { - "@jest/fake-timers": "30.0.5", - "@jest/types": "30.0.5", + "@jest/fake-timers": "30.2.0", + "@jest/types": "30.2.0", "@types/node": "*", - "jest-mock": "30.0.5" + "jest-mock": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/expect": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-30.0.5.tgz", - "integrity": "sha512-6udac8KKrtTtC+AXZ2iUN/R7dp7Ydry+Fo6FPFnDG54wjVMnb6vW/XNlf7Xj8UDjAE3aAVAsR4KFyKk3TCXmTA==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-30.2.0.tgz", + "integrity": "sha512-V9yxQK5erfzx99Sf+7LbhBwNWEZ9eZay8qQ9+JSC0TrMR1pMDHLMY+BnVPacWU6Jamrh252/IKo4F1Xn/zfiqA==", "dev": true, "license": "MIT", "dependencies": { - "expect": "30.0.5", - "jest-snapshot": "30.0.5" + "expect": "30.2.0", + "jest-snapshot": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.0.5.tgz", - "integrity": "sha512-F3lmTT7CXWYywoVUGTCmom0vXq3HTTkaZyTAzIy+bXSBizB7o5qzlC9VCtq0arOa8GqmNsbg/cE9C6HLn7Szew==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.2.0.tgz", + "integrity": "sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/get-type": "30.0.1" + "@jest/get-type": "30.1.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/fake-timers": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.0.5.tgz", - "integrity": "sha512-ZO5DHfNV+kgEAeP3gK3XlpJLL4U3Sz6ebl/n68Uwt64qFFs5bv4bfEEjyRGK5uM0C90ewooNgFuKMdkbEoMEXw==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.2.0.tgz", + "integrity": "sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.0.5", + "@jest/types": "30.2.0", "@sinonjs/fake-timers": "^13.0.0", "@types/node": "*", - "jest-message-util": "30.0.5", - "jest-mock": "30.0.5", - "jest-util": "30.0.5" + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-util": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/get-type": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.0.1.tgz", - "integrity": "sha512-AyYdemXCptSRFirI5EPazNxyPwAL0jXt3zceFjaj8NFiKP9pOi0bfXonf6qkf82z2t3QWPeLCWWw4stPBzctLw==", + "version": "30.1.0", + "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.1.0.tgz", + "integrity": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==", "dev": true, "license": "MIT", "engines": { @@ -5395,16 +2420,16 @@ } }, "node_modules/@jest/globals": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-30.0.5.tgz", - "integrity": "sha512-7oEJT19WW4oe6HR7oLRvHxwlJk2gev0U9px3ufs8sX9PoD1Eza68KF0/tlN7X0dq/WVsBScXQGgCldA1V9Y/jA==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-30.2.0.tgz", + "integrity": "sha512-b63wmnKPaK+6ZZfpYhz9K61oybvbI1aMcIs80++JI1O1rR1vaxHUCNqo3ITu6NU0d4V34yZFoHMn/uoKr/Rwfw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "30.0.5", - "@jest/expect": "30.0.5", - "@jest/types": "30.0.5", - "jest-mock": "30.0.5" + "@jest/environment": "30.2.0", + "@jest/expect": "30.2.0", + "@jest/types": "30.2.0", + "jest-mock": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" @@ -5425,17 +2450,17 @@ } }, "node_modules/@jest/reporters": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-30.0.5.tgz", - "integrity": "sha512-mafft7VBX4jzED1FwGC1o/9QUM2xebzavImZMeqnsklgcyxBto8mV4HzNSzUrryJ+8R9MFOM3HgYuDradWR+4g==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-30.2.0.tgz", + "integrity": "sha512-DRyW6baWPqKMa9CzeiBjHwjd8XeAyco2Vt8XbcLFjiwCOEKOvy82GJ8QQnJE9ofsxCMPjH4MfH8fCWIHHDKpAQ==", "dev": true, "license": "MIT", "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "30.0.5", - "@jest/test-result": "30.0.5", - "@jest/transform": "30.0.5", - "@jest/types": "30.0.5", + "@jest/console": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", "@jridgewell/trace-mapping": "^0.3.25", "@types/node": "*", "chalk": "^4.1.2", @@ -5448,9 +2473,9 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^5.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "30.0.5", - "jest-util": "30.0.5", - "jest-worker": "30.0.5", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", + "jest-worker": "30.2.0", "slash": "^3.0.0", "string-length": "^4.0.2", "v8-to-istanbul": "^9.0.1" @@ -5467,6 +2492,13 @@ } } }, + "node_modules/@jest/reporters/node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true, + "license": "MIT" + }, "node_modules/@jest/reporters/node_modules/brace-expansion": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", @@ -5568,13 +2600,13 @@ } }, "node_modules/@jest/snapshot-utils": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/snapshot-utils/-/snapshot-utils-30.0.5.tgz", - "integrity": "sha512-XcCQ5qWHLvi29UUrowgDFvV4t7ETxX91CbDczMnoqXPOIcZOxyNdSjm6kV5XMc8+HkxfRegU/MUmnTbJRzGrUQ==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/snapshot-utils/-/snapshot-utils-30.2.0.tgz", + "integrity": "sha512-0aVxM3RH6DaiLcjj/b0KrIBZhSX1373Xci4l3cW5xiUWPctZ59zQ7jj4rqcJQ/Z8JuN/4wX3FpJSa3RssVvCug==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.0.5", + "@jest/types": "30.2.0", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", "natural-compare": "^1.4.0" @@ -5599,14 +2631,14 @@ } }, "node_modules/@jest/test-result": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-30.0.5.tgz", - "integrity": "sha512-wPyztnK0gbDMQAJZ43tdMro+qblDHH1Ru/ylzUo21TBKqt88ZqnKKK2m30LKmLLoKtR2lxdpCC/P3g1vfKcawQ==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-30.2.0.tgz", + "integrity": "sha512-RF+Z+0CCHkARz5HT9mcQCBulb1wgCP3FBvl9VFokMX27acKphwyQsNuWH3c+ojd1LeWBLoTYoxF0zm6S/66mjg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/console": "30.0.5", - "@jest/types": "30.0.5", + "@jest/console": "30.2.0", + "@jest/types": "30.2.0", "@types/istanbul-lib-coverage": "^2.0.6", "collect-v8-coverage": "^1.0.2" }, @@ -5615,15 +2647,15 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-30.0.5.tgz", - "integrity": "sha512-Aea/G1egWoIIozmDD7PBXUOxkekXl7ueGzrsGGi1SbeKgQqCYCIf+wfbflEbf2LiPxL8j2JZGLyrzZagjvW4YQ==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-30.2.0.tgz", + "integrity": "sha512-wXKgU/lk8fKXMu/l5Hog1R61bL4q5GCdT6OJvdAFz1P+QrpoFuLU68eoKuVc4RbrTtNnTL5FByhWdLgOPSph+Q==", "dev": true, "license": "MIT", "dependencies": { - "@jest/test-result": "30.0.5", + "@jest/test-result": "30.2.0", "graceful-fs": "^4.2.11", - "jest-haste-map": "30.0.5", + "jest-haste-map": "30.2.0", "slash": "^3.0.0" }, "engines": { @@ -5631,23 +2663,23 @@ } }, "node_modules/@jest/transform": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-30.0.5.tgz", - "integrity": "sha512-Vk8amLQCmuZyy6GbBht1Jfo9RSdBtg7Lks+B0PecnjI8J+PCLQPGh7uI8Q/2wwpW2gLdiAfiHNsmekKlywULqg==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-30.2.0.tgz", + "integrity": "sha512-XsauDV82o5qXbhalKxD7p4TZYYdwcaEXC77PPD2HixEFF+6YGppjrAAQurTl2ECWcEomHBMMNS9AH3kcCFx8jA==", "dev": true, "license": "MIT", "dependencies": { "@babel/core": "^7.27.4", - "@jest/types": "30.0.5", + "@jest/types": "30.2.0", "@jridgewell/trace-mapping": "^0.3.25", - "babel-plugin-istanbul": "^7.0.0", + "babel-plugin-istanbul": "^7.0.1", "chalk": "^4.1.2", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.11", - "jest-haste-map": "30.0.5", + "jest-haste-map": "30.2.0", "jest-regex-util": "30.0.1", - "jest-util": "30.0.5", + "jest-util": "30.2.0", "micromatch": "^4.0.8", "pirates": "^4.0.7", "slash": "^3.0.0", @@ -5658,9 +2690,9 @@ } }, "node_modules/@jest/types": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.0.5.tgz", - "integrity": "sha512-aREYa3aku9SSnea4aX6bhKn4bgv3AXkgijoQgbYV3yvbiGt6z+MQ85+6mIhx9DsKW2BuB/cLR/A+tcMThx+KLQ==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.2.0.tgz", + "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", "dev": true, "license": "MIT", "dependencies": { @@ -5687,6 +2719,17 @@ "@jridgewell/trace-mapping": "^0.3.24" } }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", @@ -5697,17 +2740,6 @@ "node": ">=6.0.0" } }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.11", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", - "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", @@ -5716,9 +2748,9 @@ "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.30", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", - "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "license": "MIT", "dependencies": { @@ -5726,126 +2758,6 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@jsonjoy.com/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/buffers": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", - "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/codegen": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz", - "integrity": "sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/json-pack": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.21.0.tgz", - "integrity": "sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/base64": "^1.1.2", - "@jsonjoy.com/buffers": "^1.2.0", - "@jsonjoy.com/codegen": "^1.0.0", - "@jsonjoy.com/json-pointer": "^1.0.2", - "@jsonjoy.com/util": "^1.9.0", - "hyperdyperid": "^1.2.0", - "thingies": "^2.5.0", - "tree-dump": "^1.1.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/json-pointer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-1.0.2.tgz", - "integrity": "sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/codegen": "^1.0.0", - "@jsonjoy.com/util": "^1.9.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/util": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.9.0.tgz", - "integrity": "sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/buffers": "^1.0.0", - "@jsonjoy.com/codegen": "^1.0.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, "node_modules/@kayvan/markdown-tree-parser": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/@kayvan/markdown-tree-parser/-/markdown-tree-parser-1.6.1.tgz", @@ -5870,13 +2782,6 @@ "url": "https://github.com/sponsors/ksylvan" } }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", - "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", - "dev": true, - "license": "MIT" - }, "node_modules/@mdx-js/mdx": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.1.tgz", @@ -5915,35 +2820,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/@mdx-js/mdx/node_modules/source-map": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", - "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">= 12" - } - }, - "node_modules/@mdx-js/react": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", - "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/mdx": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "@types/react": ">=16", - "react": ">=16" - } - }, "node_modules/@napi-rs/wasm-runtime": { "version": "0.2.12", "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", @@ -5995,15 +2871,103 @@ "node": ">= 8" } }, - "node_modules/@opentelemetry/api": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", - "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", + "node_modules/@oslojs/encoding": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@oslojs/encoding/-/encoding-1.1.0.tgz", + "integrity": "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==", "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8.0.0" - } + "license": "MIT" + }, + "node_modules/@pagefind/darwin-arm64": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@pagefind/darwin-arm64/-/darwin-arm64-1.4.0.tgz", + "integrity": "sha512-2vMqkbv3lbx1Awea90gTaBsvpzgRs7MuSgKDxW0m9oV1GPZCZbZBJg/qL83GIUEN2BFlY46dtUZi54pwH+/pTQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@pagefind/darwin-x64": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@pagefind/darwin-x64/-/darwin-x64-1.4.0.tgz", + "integrity": "sha512-e7JPIS6L9/cJfow+/IAqknsGqEPjJnVXGjpGm25bnq+NPdoD3c/7fAwr1OXkG4Ocjx6ZGSCijXEV4ryMcH2E3A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@pagefind/default-ui": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@pagefind/default-ui/-/default-ui-1.4.0.tgz", + "integrity": "sha512-wie82VWn3cnGEdIjh4YwNESyS1G6vRHwL6cNjy9CFgNnWW/PGRjsLq300xjVH5sfPFK3iK36UxvIBymtQIEiSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@pagefind/freebsd-x64": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@pagefind/freebsd-x64/-/freebsd-x64-1.4.0.tgz", + "integrity": "sha512-WcJVypXSZ+9HpiqZjFXMUobfFfZZ6NzIYtkhQ9eOhZrQpeY5uQFqNWLCk7w9RkMUwBv1HAMDW3YJQl/8OqsV0Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@pagefind/linux-arm64": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@pagefind/linux-arm64/-/linux-arm64-1.4.0.tgz", + "integrity": "sha512-PIt8dkqt4W06KGmQjONw7EZbhDF+uXI7i0XtRLN1vjCUxM9vGPdtJc2mUyVPevjomrGz5M86M8bqTr6cgDp1Uw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@pagefind/linux-x64": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@pagefind/linux-x64/-/linux-x64-1.4.0.tgz", + "integrity": "sha512-z4oddcWwQ0UHrTHR8psLnVlz6USGJ/eOlDPTDYZ4cI8TK8PgwRUPQZp9D2iJPNIPcS6Qx/E4TebjuGJOyK8Mmg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@pagefind/windows-x64": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@pagefind/windows-x64/-/windows-x64-1.4.0.tgz", + "integrity": "sha512-NkT+YAdgS2FPCn8mIA9bQhiBs+xmniMGq1LFPDhcFn0+2yIUEiIG06t7bsZlhdjknEQRTSdT7YitP6fC5qwP0g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", @@ -6029,102 +2993,425 @@ "url": "https://opencollective.com/pkgr" } }, - "node_modules/@pnpm/config.env-replace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", - "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", - "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", + "node_modules/@rollup/pluginutils": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", "dev": true, "license": "MIT", "dependencies": { - "graceful-fs": "4.2.10" + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" }, "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true, - "license": "ISC" - }, - "node_modules/@pnpm/npm-conf": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz", - "integrity": "sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@pnpm/config.env-replace": "^1.1.0", - "@pnpm/network.ca-file": "^1.0.1", - "config-chain": "^1.1.11" + "node": ">=14.0.0" }, - "engines": { - "node": ">=12" + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } } }, - "node_modules/@polka/url": { - "version": "1.0.0-next.29", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", - "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true, "license": "MIT" }, - "node_modules/@sideway/address": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", - "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.54.0.tgz", + "integrity": "sha512-OywsdRHrFvCdvsewAInDKCNyR3laPA2mc9bRYJ6LBp5IyvF3fvXbbNR0bSzHlZVFtn6E0xw2oZlyjg4rKCVcng==", + "cpu": [ + "arm" + ], "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.54.0.tgz", + "integrity": "sha512-Skx39Uv+u7H224Af+bDgNinitlmHyQX1K/atIA32JP3JQw6hVODX5tkbi2zof/E69M1qH2UoN3Xdxgs90mmNYw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.54.0.tgz", + "integrity": "sha512-k43D4qta/+6Fq+nCDhhv9yP2HdeKeP56QrUUTW7E6PhZP1US6NDqpJj4MY0jBHlJivVJD5P8NxrjuobZBJTCRw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.54.0.tgz", + "integrity": "sha512-cOo7biqwkpawslEfox5Vs8/qj83M/aZCSSNIWpVzfU2CYHa2G3P1UN5WF01RdTHSgCkri7XOlTdtk17BezlV3A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.54.0.tgz", + "integrity": "sha512-miSvuFkmvFbgJ1BevMa4CPCFt5MPGw094knM64W9I0giUIMMmRYcGW/JWZDriaw/k1kOBtsWh1z6nIFV1vPNtA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.54.0.tgz", + "integrity": "sha512-KGXIs55+b/ZfZsq9aR026tmr/+7tq6VG6MsnrvF4H8VhwflTIuYh+LFUlIsRdQSgrgmtM3fVATzEAj4hBQlaqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.54.0.tgz", + "integrity": "sha512-EHMUcDwhtdRGlXZsGSIuXSYwD5kOT9NVnx9sqzYiwAc91wfYOE1g1djOEDseZJKKqtHAHGwnGPQu3kytmfaXLQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.54.0.tgz", + "integrity": "sha512-+pBrqEjaakN2ySv5RVrj/qLytYhPKEUwk+e3SFU5jTLHIcAtqh2rLrd/OkbNuHJpsBgxsD8ccJt5ga/SeG0JmA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.54.0.tgz", + "integrity": "sha512-NSqc7rE9wuUaRBsBp5ckQ5CVz5aIRKCwsoa6WMF7G01sX3/qHUw/z4pv+D+ahL1EIKy6Enpcnz1RY8pf7bjwng==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.54.0.tgz", + "integrity": "sha512-gr5vDbg3Bakga5kbdpqx81m2n9IX8M6gIMlQQIXiLTNeQW6CucvuInJ91EuCJ/JYvc+rcLLsDFcfAD1K7fMofg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.54.0.tgz", + "integrity": "sha512-gsrtB1NA3ZYj2vq0Rzkylo9ylCtW/PhpLEivlgWe0bpgtX5+9j9EZa0wtZiCjgu6zmSeZWyI/e2YRX1URozpIw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.54.0.tgz", + "integrity": "sha512-y3qNOfTBStmFNq+t4s7Tmc9hW2ENtPg8FeUD/VShI7rKxNW7O4fFeaYbMsd3tpFlIg1Q8IapFgy7Q9i2BqeBvA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.54.0.tgz", + "integrity": "sha512-89sepv7h2lIVPsFma8iwmccN7Yjjtgz0Rj/Ou6fEqg3HDhpCa+Et+YSufy27i6b0Wav69Qv4WBNl3Rs6pwhebQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.54.0.tgz", + "integrity": "sha512-ZcU77ieh0M2Q8Ur7D5X7KvK+UxbXeDHwiOt/CPSBTI1fBmeDMivW0dPkdqkT4rOgDjrDDBUed9x4EgraIKoR2A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.54.0.tgz", + "integrity": "sha512-2AdWy5RdDF5+4YfG/YesGDDtbyJlC9LHmL6rZw6FurBJ5n4vFGupsOBGfwMRjBYH7qRQowT8D/U4LoSvVwOhSQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.54.0.tgz", + "integrity": "sha512-WGt5J8Ij/rvyqpFexxk3ffKqqbLf9AqrTBbWDk7ApGUzaIs6V+s2s84kAxklFwmMF/vBNGrVdYgbblCOFFezMQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.54.0.tgz", + "integrity": "sha512-JzQmb38ATzHjxlPHuTH6tE7ojnMKM2kYNzt44LO/jJi8BpceEC8QuXYA908n8r3CNuG/B3BV8VR3Hi1rYtmPiw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.54.0.tgz", + "integrity": "sha512-huT3fd0iC7jigGh7n3q/+lfPcXxBi+om/Rs3yiFxjvSxbSB6aohDFXbWvlspaqjeOh+hx7DDHS+5Es5qRkWkZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.54.0.tgz", + "integrity": "sha512-c2V0W1bsKIKfbLMBu/WGBz6Yci8nJ/ZJdheE0EwB73N3MvHYKiKGs3mVilX4Gs70eGeDaMqEob25Tw2Gb9Nqyw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.54.0.tgz", + "integrity": "sha512-woEHgqQqDCkAzrDhvDipnSirm5vxUXtSKDYTVpZG3nUdW/VVB5VdCYA2iReSj/u3yCZzXID4kuKG7OynPnB3WQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.54.0.tgz", + "integrity": "sha512-dzAc53LOuFvHwbCEOS0rPbXp6SIhAf2txMP5p6mGyOXXw5mWY8NGGbPMPrs4P1WItkfApDathBj/NzMLUZ9rtQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.54.0.tgz", + "integrity": "sha512-hYT5d3YNdSh3mbCU1gwQyPgQd3T2ne0A3KG8KSBdav5TiBg6eInVmV+TeR5uHufiIgSFg0XsOWGW5/RhNcSvPg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@shikijs/core": { + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-3.20.0.tgz", + "integrity": "sha512-f2ED7HYV4JEk827mtMDwe/yQ25pRiXZmtHjWF8uzZKuKiEsJR7Ce1nuQ+HhV9FzDcbIo4ObBCD9GPTzNuy9S1g==", + "dev": true, + "license": "MIT", "dependencies": { - "@hapi/hoek": "^9.0.0" + "@shikijs/types": "3.20.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.5" } }, - "node_modules/@sideway/formula": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", - "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", + "node_modules/@shikijs/engine-javascript": { + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-3.20.0.tgz", + "integrity": "sha512-OFx8fHAZuk7I42Z9YAdZ95To6jDePQ9Rnfbw9uSRTSbBhYBp1kEOKv/3jOimcj3VRUKusDYM6DswLauwfhboLg==", "dev": true, - "license": "BSD-3-Clause" + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.20.0", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^4.3.4" + } }, - "node_modules/@sideway/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", + "node_modules/@shikijs/engine-oniguruma": { + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.20.0.tgz", + "integrity": "sha512-Yx3gy7xLzM0ZOjqoxciHjA7dAt5tyzJE3L4uQoM83agahy+PlW244XJSrmJRSBvGYELDhYXPacD4R/cauV5bzQ==", "dev": true, - "license": "BSD-3-Clause" + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.20.0", + "@shikijs/vscode-textmate": "^10.0.2" + } + }, + "node_modules/@shikijs/langs": { + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.20.0.tgz", + "integrity": "sha512-le+bssCxcSHrygCWuOrYJHvjus6zhQ2K7q/0mgjiffRbkhM4o1EWu2m+29l0yEsHDbWaWPNnDUTRVVBvBBeKaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.20.0" + } + }, + "node_modules/@shikijs/themes": { + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.20.0.tgz", + "integrity": "sha512-U1NSU7Sl26Q7ErRvJUouArxfM2euWqq1xaSrbqMu2iqa+tSp0D1Yah8216sDYbdDHw4C8b75UpE65eWorm2erQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.20.0" + } + }, + "node_modules/@shikijs/types": { + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.20.0.tgz", + "integrity": "sha512-lhYAATn10nkZcBQ0BlzSbJA3wcmL5MXUUF8d2Zzon6saZDlToKaiRX60n2+ZaHJCmXEcZRWNzn+k9vplr8Jhsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", + "dev": true, + "license": "MIT" }, "node_modules/@sinclair/typebox": { - "version": "0.34.40", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.40.tgz", - "integrity": "sha512-gwBNIP8ZAYev/ORDWW0QvxdwPXwxBtLsdsJgSc7eDIRt8ubP+rxUBzPsrwnu16fgEF8Bx4lh/+mvQvJzcTM6Kw==", + "version": "0.34.46", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.46.tgz", + "integrity": "sha512-kiW7CtS/NkdvTUjkjUJo7d5JsFfbJ14YjdhDk9KoEgK6nFjKNXZPrX0jfLA8ZlET4cFLHxOZ/0vFKOP+bOxIOQ==", "dev": true, "license": "MIT" }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, "node_modules/@sindresorhus/merge-streams": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", @@ -6158,413 +3445,20 @@ "@sinonjs/commons": "^3.0.1" } }, - "node_modules/@slorber/remark-comment": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@slorber/remark-comment/-/remark-comment-1.0.0.tgz", - "integrity": "sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA==", + "node_modules/@swc/helpers": { + "version": "0.5.18", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.18.tgz", + "integrity": "sha512-TXTnIcNJQEKwThMMqBXsZ4VGAza6bvN4pa41Rkqoio6QBKMvo+5lexeTMScGCIxtzgQJzElcvIltani+adC5PQ==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.1.0", - "micromark-util-symbol": "^1.0.1" - } - }, - "node_modules/@slorber/remark-comment/node_modules/micromark-factory-space": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", - "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/@slorber/remark-comment/node_modules/micromark-util-character": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", - "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/@slorber/remark-comment/node_modules/micromark-util-symbol": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", - "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/@slorber/remark-comment/node_modules/micromark-util-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", - "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/@standard-schema/spec": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", - "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@svgr/babel-plugin-add-jsx-attribute": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", - "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", - "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", - "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", - "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-svg-dynamic-title": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", - "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-svg-em-dimensions": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", - "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-transform-react-native-svg": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", - "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-transform-svg-component": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", - "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-preset": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", - "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", - "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", - "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", - "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", - "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", - "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", - "@svgr/babel-plugin-transform-svg-component": "8.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/core": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", - "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/core": "^7.21.3", - "@svgr/babel-preset": "8.1.0", - "camelcase": "^6.2.0", - "cosmiconfig": "^8.1.3", - "snake-case": "^3.0.4" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/core/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@svgr/hast-util-to-babel-ast": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", - "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.21.3", - "entities": "^4.4.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/plugin-jsx": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", - "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.21.3", - "@svgr/babel-preset": "8.1.0", - "@svgr/hast-util-to-babel-ast": "8.0.0", - "svg-parser": "^2.0.4" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@svgr/core": "*" - } - }, - "node_modules/@svgr/plugin-svgo": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz", - "integrity": "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==", - "dev": true, - "license": "MIT", - "dependencies": { - "cosmiconfig": "^8.1.3", - "deepmerge": "^4.3.1", - "svgo": "^3.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@svgr/core": "*" - } - }, - "node_modules/@svgr/webpack": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.1.0.tgz", - "integrity": "sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.21.3", - "@babel/plugin-transform-react-constant-elements": "^7.21.3", - "@babel/preset-env": "^7.20.2", - "@babel/preset-react": "^7.18.6", - "@babel/preset-typescript": "^7.21.0", - "@svgr/core": "8.1.0", - "@svgr/plugin-jsx": "8.1.0", - "@svgr/plugin-svgo": "8.1.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", - "dev": true, - "license": "MIT", - "dependencies": { - "defer-to-connect": "^2.0.1" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10.13.0" + "tslib": "^2.8.0" } }, "node_modules/@tybys/wasm-util": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.0.tgz", - "integrity": "sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==", + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", "dev": true, "license": "MIT", "optional": true, @@ -6617,48 +3511,6 @@ "@babel/types": "^7.28.2" } }, - "node_modules/@types/body-parser": { - "version": "1.19.6", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", - "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/bonjour": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", - "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect-history-api-fallback": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", - "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, "node_modules/@types/debug": { "version": "4.1.12", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", @@ -6668,28 +3520,6 @@ "@types/ms": "*" } }, - "node_modules/@types/eslint": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", - "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", @@ -6707,39 +3537,16 @@ "@types/estree": "*" } }, - "node_modules/@types/express": { - "version": "4.17.25", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", - "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==", + "node_modules/@types/fontkit": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/fontkit/-/fontkit-2.0.8.tgz", + "integrity": "sha512-wN+8bYxIpJf+5oZdrdtaX04qUuWHcKxcDEgRS9Qm9ZClSHjzEn13SxUC+5eRM+4yXIeTYk8mTzLAWGF64847ew==", "dev": true, "license": "MIT", "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "^1" + "@types/node": "*" } }, - "node_modules/@types/express-serve-static-core": { - "version": "4.19.7", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.7.tgz", - "integrity": "sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/gtag.js": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/@types/gtag.js/-/gtag.js-0.0.12.tgz", - "integrity": "sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/hast": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", @@ -6750,44 +3557,6 @@ "@types/unist": "*" } }, - "node_modules/@types/history": { - "version": "4.7.11", - "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", - "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", - "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/http-errors": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", - "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/http-proxy": { - "version": "1.17.17", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.17.tgz", - "integrity": "sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", @@ -6815,6 +3584,13 @@ "@types/istanbul-lib-report": "*" } }, + "node_modules/@types/js-yaml": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", + "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -6845,114 +3621,33 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/ms": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", "license": "MIT" }, + "node_modules/@types/nlcst": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/nlcst/-/nlcst-2.0.3.tgz", + "integrity": "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, "node_modules/@types/node": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.0.tgz", - "integrity": "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==", + "version": "25.0.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.3.tgz", + "integrity": "sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA==", "devOptional": true, "license": "MIT", "peer": true, "dependencies": { - "undici-types": "~7.10.0" + "undici-types": "~7.16.0" } }, - "node_modules/@types/node-forge": { - "version": "1.3.14", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.14.tgz", - "integrity": "sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/prismjs": { - "version": "1.26.5", - "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.5.tgz", - "integrity": "sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "19.2.7", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.7.tgz", - "integrity": "sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "csstype": "^3.2.2" - } - }, - "node_modules/@types/react-router": { - "version": "5.1.20", - "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", - "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*" - } - }, - "node_modules/@types/react-router-config": { - "version": "5.0.11", - "resolved": "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.11.tgz", - "integrity": "sha512-WmSAg7WgqW7m4x8Mt4N6ZyKz0BubSj/2tVUMsAHp+Yd2AMwcSbeFq9WympT19p5heCFmF97R9eD5uUR/t4HEqw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router": "^5.1.0" - } - }, - "node_modules/@types/react-router-dom": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", - "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router": "*" - } - }, - "node_modules/@types/retry": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", - "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/sax": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", @@ -6963,59 +3658,6 @@ "@types/node": "*" } }, - "node_modules/@types/send": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", - "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/serve-index": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", - "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.10", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz", - "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "<1" - } - }, - "node_modules/@types/serve-static/node_modules/@types/send": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz", - "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/sockjs": { - "version": "0.3.36", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", - "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/stack-utils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", @@ -7029,20 +3671,10 @@ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", "license": "MIT" }, - "node_modules/@types/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", + "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", "dev": true, "license": "MIT", "dependencies": { @@ -7332,191 +3964,6 @@ "win32" ] }, - "node_modules/@vercel/oidc": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@vercel/oidc/-/oidc-3.0.5.tgz", - "integrity": "sha512-fnYhv671l+eTTp48gB4zEsTW/YtRgRPnkI2nT7x6qw5rkI1Lq2hTmQIpHPgyThI0znLK+vX2n9XxKdXZ7BUbbw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">= 20" - } - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", - "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/helper-numbers": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", - "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", - "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", - "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", - "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.13.2", - "@webassemblyjs/helper-api-error": "1.13.2", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", - "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", - "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/wasm-gen": "1.14.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", - "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", - "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", - "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", - "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/helper-wasm-section": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-opt": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1", - "@webassemblyjs/wast-printer": "1.14.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", - "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", - "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", - "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-api-error": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", - "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true, - "license": "Apache-2.0" - }, "node_modules/abort-controller": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", @@ -7530,53 +3977,6 @@ "node": ">=6.5" } }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/accepts/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/accepts/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/accepts/node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/acorn": { "version": "8.15.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", @@ -7591,19 +3991,6 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-phases": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", - "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.13.0" - }, - "peerDependencies": { - "acorn": "^8.14.0" - } - }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -7614,79 +4001,12 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/address": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", - "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/aggregate-error/node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ai": { - "version": "5.0.115", - "resolved": "https://registry.npmjs.org/ai/-/ai-5.0.115.tgz", - "integrity": "sha512-aVuHx0orGxXvhyL7oXUyW8TnWQE6Al8f3Bl6VZjz0WHMV+WaACHPkSyvQ3wje2QCUGzdl5DBF5d+OaXyghPQyg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@ai-sdk/gateway": "2.0.22", - "@ai-sdk/provider": "2.0.0", - "@ai-sdk/provider-utils": "3.0.19", - "@opentelemetry/api": "1.9.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "zod": "^3.25.76 || ^4.1.8" - } - }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -7698,98 +4018,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "license": "MIT" - }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/algoliasearch": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.46.1.tgz", - "integrity": "sha512-39ol8Ulqb3MntofkXHlrcXKyU8BU0PXvQrXPBIX6eXj/EO4VT7651mhGVORI2oF8ydya9nFzT3fYDoqme/KL6w==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@algolia/abtesting": "1.12.1", - "@algolia/client-abtesting": "5.46.1", - "@algolia/client-analytics": "5.46.1", - "@algolia/client-common": "5.46.1", - "@algolia/client-insights": "5.46.1", - "@algolia/client-personalization": "5.46.1", - "@algolia/client-query-suggestions": "5.46.1", - "@algolia/client-search": "5.46.1", - "@algolia/ingestion": "1.46.1", - "@algolia/monitoring": "1.46.1", - "@algolia/recommend": "5.46.1", - "@algolia/requester-browser-xhr": "5.46.1", - "@algolia/requester-fetch": "5.46.1", - "@algolia/requester-node-http": "5.46.1" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/algoliasearch-helper": { - "version": "3.26.1", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.26.1.tgz", - "integrity": "sha512-CAlCxm4fYBXtvc5MamDzP6Svu8rW4z9me4DCBY1rQ2UDJ0u0flWmusQ8M3nOExZsLLRcUwUPoRAPMrhzOG3erw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/events": "^4.0.1" - }, - "peerDependencies": { - "algoliasearch": ">= 3.1 < 6" - } - }, "node_modules/ansi-align": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", @@ -7814,17 +4042,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "dev": true, - "engines": [ - "node >= 0.8.0" - ], - "license": "Apache-2.0", - "bin": { - "ansi-html": "bin/ansi-html" + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/ansi-regex": { @@ -7865,6 +4092,19 @@ "node": ">= 8" } }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/archiver": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", @@ -7913,31 +4153,6 @@ "balanced-match": "^1.0.0" } }, - "node_modules/archiver-utils/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, "node_modules/archiver-utils/node_modules/glob": { "version": "10.5.0", "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", @@ -8015,65 +4230,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/archiver-utils/node_modules/readable-stream": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", - "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", - "dev": true, - "license": "MIT", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/archiver/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/archiver/node_modules/readable-stream": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", - "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", - "dev": true, - "license": "MIT", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", @@ -8087,12 +4243,26 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "license": "Python-2.0" }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", "dev": true, - "license": "MIT" + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-iterate": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-2.0.1.tgz", + "integrity": "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, "node_modules/array-union": { "version": "2.1.0", @@ -8114,6 +4284,709 @@ "astring": "bin/astring" } }, + "node_modules/astro": { + "version": "5.16.6", + "resolved": "https://registry.npmjs.org/astro/-/astro-5.16.6.tgz", + "integrity": "sha512-6mF/YrvwwRxLTu+aMEa5pwzKUNl5ZetWbTyZCs9Um0F12HUmxUiF5UHiZPy4rifzU3gtpM3xP2DfdmkNX9eZRg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@astrojs/compiler": "^2.13.0", + "@astrojs/internal-helpers": "0.7.5", + "@astrojs/markdown-remark": "6.3.10", + "@astrojs/telemetry": "3.3.0", + "@capsizecss/unpack": "^3.0.1", + "@oslojs/encoding": "^1.1.0", + "@rollup/pluginutils": "^5.3.0", + "acorn": "^8.15.0", + "aria-query": "^5.3.2", + "axobject-query": "^4.1.0", + "boxen": "8.0.1", + "ci-info": "^4.3.1", + "clsx": "^2.1.1", + "common-ancestor-path": "^1.0.1", + "cookie": "^1.0.2", + "cssesc": "^3.0.0", + "debug": "^4.4.3", + "deterministic-object-hash": "^2.0.2", + "devalue": "^5.5.0", + "diff": "^5.2.0", + "dlv": "^1.1.3", + "dset": "^3.1.4", + "es-module-lexer": "^1.7.0", + "esbuild": "^0.25.0", + "estree-walker": "^3.0.3", + "flattie": "^1.1.1", + "fontace": "~0.3.1", + "github-slugger": "^2.0.0", + "html-escaper": "3.0.3", + "http-cache-semantics": "^4.2.0", + "import-meta-resolve": "^4.2.0", + "js-yaml": "^4.1.1", + "magic-string": "^0.30.21", + "magicast": "^0.5.1", + "mrmime": "^2.0.1", + "neotraverse": "^0.6.18", + "p-limit": "^6.2.0", + "p-queue": "^8.1.1", + "package-manager-detector": "^1.5.0", + "piccolore": "^0.1.3", + "picomatch": "^4.0.3", + "prompts": "^2.4.2", + "rehype": "^13.0.2", + "semver": "^7.7.3", + "shiki": "^3.15.0", + "smol-toml": "^1.5.2", + "svgo": "^4.0.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tsconfck": "^3.1.6", + "ultrahtml": "^1.6.0", + "unifont": "~0.6.0", + "unist-util-visit": "^5.0.0", + "unstorage": "^1.17.3", + "vfile": "^6.0.3", + "vite": "^6.4.1", + "vitefu": "^1.1.1", + "xxhash-wasm": "^1.1.0", + "yargs-parser": "^21.1.1", + "yocto-spinner": "^0.2.3", + "zod": "^3.25.76", + "zod-to-json-schema": "^3.25.0", + "zod-to-ts": "^1.2.0" + }, + "bin": { + "astro": "astro.js" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/astrodotbuild" + }, + "optionalDependencies": { + "sharp": "^0.34.0" + } + }, + "node_modules/astro-expressive-code": { + "version": "0.41.5", + "resolved": "https://registry.npmjs.org/astro-expressive-code/-/astro-expressive-code-0.41.5.tgz", + "integrity": "sha512-6jfABbPO0fkRD1ROAPBQtJR2p7gjbmk/GjfblOpo5Z7F+gwhL7+s8bEhLz9GdW10yfbn+gJvwEf7f9Lu2clh2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "rehype-expressive-code": "^0.41.5" + }, + "peerDependencies": { + "astro": "^4.0.0-beta || ^5.0.0-beta || ^3.3.0" + } + }, + "node_modules/astro/node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" + } + }, + "node_modules/astro/node_modules/@img/sharp-darwin-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.4" + } + }, + "node_modules/astro/node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/@img/sharp-linux-arm": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.4" + } + }, + "node_modules/astro/node_modules/@img/sharp-linux-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.4" + } + }, + "node_modules/astro/node_modules/@img/sharp-linux-s390x": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.4" + } + }, + "node_modules/astro/node_modules/@img/sharp-linux-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.4" + } + }, + "node_modules/astro/node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + } + }, + "node_modules/astro/node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + } + }, + "node_modules/astro/node_modules/@img/sharp-wasm32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.7.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/@img/sharp-win32-ia32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/@img/sharp-win32-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/astro/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/astro/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/astro/node_modules/boxen": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-8.0.1.tgz", + "integrity": "sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^8.0.0", + "chalk": "^5.3.0", + "cli-boxes": "^3.0.0", + "string-width": "^7.2.0", + "type-fest": "^4.21.0", + "widest-line": "^5.0.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/astro/node_modules/camelcase": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-8.0.0.tgz", + "integrity": "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/astro/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/astro/node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/astro/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" + }, + "node_modules/astro/node_modules/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" + } + }, + "node_modules/astro/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/astro/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/astro/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/astro/node_modules/widest-line": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-5.0.0.tgz", + "integrity": "sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/astro/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/async": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", @@ -8121,54 +4994,42 @@ "dev": true, "license": "MIT" }, - "node_modules/autoprefixer": { - "version": "10.4.23", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.23.tgz", - "integrity": "sha512-YYTXSFulfwytnjAPlw8QHncHJmlvFKtczb8InXaAx9Q0LbfDnfEYDE55omerIJKihhmU61Ft+cAOSzQVaBUmeA==", + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "browserslist": "^4.28.1", - "caniuse-lite": "^1.0.30001760", - "fraction.js": "^5.3.4", - "picocolors": "^1.1.1", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, + "license": "Apache-2.0", "engines": { - "node": "^10 || ^12 || >=14" - }, + "node": ">= 0.4" + } + }, + "node_modules/b4a": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz", + "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==", + "dev": true, + "license": "Apache-2.0", "peerDependencies": { - "postcss": "^8.1.0" + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } } }, "node_modules/babel-jest": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.0.5.tgz", - "integrity": "sha512-mRijnKimhGDMsizTvBTWotwNpzrkHr+VvZUQBof2AufXKB8NXrL1W69TG20EvOz7aevx6FTJIaBuBkYxS8zolg==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.2.0.tgz", + "integrity": "sha512-0YiBEOxWqKkSQWL9nNGGEgndoeL0ZpWrbLMNL5u/Kaxrli3Eaxlt3ZtIDktEvXt4L/R9r3ODr2zKwGM/2BjxVw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/transform": "30.0.5", + "@jest/transform": "30.2.0", "@types/babel__core": "^7.20.5", - "babel-plugin-istanbul": "^7.0.0", - "babel-preset-jest": "30.0.1", + "babel-plugin-istanbul": "^7.0.1", + "babel-preset-jest": "30.2.0", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", "slash": "^3.0.0" @@ -8177,43 +5038,18 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" }, "peerDependencies": { - "@babel/core": "^7.11.0" - } - }, - "node_modules/babel-loader": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", - "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-cache-dir": "^4.0.0", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0", - "webpack": ">=5" - } - }, - "node_modules/babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "object.assign": "^4.1.0" + "@babel/core": "^7.11.0 || ^8.0.0-0" } }, "node_modules/babel-plugin-istanbul": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-7.0.0.tgz", - "integrity": "sha512-C5OzENSx/A+gt7t4VH1I2XsflxyPUmXRFPKBxt33xncdOmq7oROVM3bZv9Ysjjkv8OJYDMa+tKuKMvqU/H3xdw==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-7.0.1.tgz", + "integrity": "sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==", "dev": true, "license": "BSD-3-Clause", + "workspaces": [ + "test/babel-8" + ], "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", @@ -8225,73 +5061,56 @@ "node": ">=12" } }, + "node_modules/babel-plugin-istanbul/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/babel-plugin-jest-hoist": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.0.1.tgz", - "integrity": "sha512-zTPME3pI50NsFW8ZBaVIOeAxzEY7XHlmWeXXu9srI+9kNfzCUTy8MFan46xOGZY8NZThMqq+e3qZUKsvXbasnQ==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.2.0.tgz", + "integrity": "sha512-ftzhzSGMUnOzcCXd6WHdBGMyuwy15Wnn0iyyWGKgBDLxf9/s5ABuraCSpBX2uG0jUg4rqJnxsLc5+oYBqoxVaA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.27.3", "@types/babel__core": "^7.20.5" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz", - "integrity": "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.27.7", - "@babel/helper-define-polyfill-provider": "^0.6.5", - "semver": "^6.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", - "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.5", - "core-js-compat": "^3.43.0" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz", - "integrity": "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.5" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, "node_modules/babel-preset-current-node-syntax": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", @@ -8320,20 +5139,20 @@ } }, "node_modules/babel-preset-jest": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-30.0.1.tgz", - "integrity": "sha512-+YHejD5iTWI46cZmcc/YtX4gaKBtdqCHCVfuVinizVpbmyjO3zYmeuyFdfA8duRqQZfgCAMlsfmkVbJ+e2MAJw==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-30.2.0.tgz", + "integrity": "sha512-US4Z3NOieAQumwFnYdUWKvUKh8+YSnS/gB3t6YBiz0bskpu7Pine8pPCheNxlPEW4wnUkma2a94YuW2q3guvCQ==", "dev": true, "license": "MIT", "dependencies": { - "babel-plugin-jest-hoist": "30.0.1", - "babel-preset-current-node-syntax": "^1.1.0" + "babel-plugin-jest-hoist": "30.2.0", + "babel-preset-current-node-syntax": "^1.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" }, "peerDependencies": { - "@babel/core": "^7.11.0" + "@babel/core": "^7.11.0 || ^8.0.0-beta.1" } }, "node_modules/bail": { @@ -8368,6 +5187,13 @@ } } }, + "node_modules/base-64": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base-64/-/base-64-1.0.0.tgz", + "integrity": "sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==", + "dev": true, + "license": "MIT" + }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -8389,43 +5215,40 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.9.10", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.10.tgz", - "integrity": "sha512-2VIKvDx8Z1a9rTB2eCkdPE5nSe28XnA+qivGnWHoB40hMMt/h1hSz0960Zqsn6ZyxWXUie0EBdElKv8may20AA==", + "version": "2.9.11", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.11.tgz", + "integrity": "sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==", "dev": true, "license": "Apache-2.0", "bin": { "baseline-browser-mapping": "dist/cli.js" } }, - "node_modules/batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "dev": true, - "license": "MIT" - }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "node_modules/bcp-47": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/bcp-47/-/bcp-47-2.1.0.tgz", + "integrity": "sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w==", "dev": true, "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/bcp-47-match": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/bcp-47-match/-/bcp-47-match-2.0.3.tgz", + "integrity": "sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, "node_modules/bl": { @@ -8439,80 +5262,18 @@ "readable-stream": "^3.4.0" } }, - "node_modules/body-parser": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", - "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", - "dev": true, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", "dependencies": { - "bytes": "~3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "~1.2.0", - "http-errors": "~2.0.1", - "iconv-lite": "~0.4.24", - "on-finished": "~2.4.1", - "qs": "~6.14.0", - "raw-body": "~2.5.3", - "type-is": "~1.6.18", - "unpipe": "~1.0.0" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, - "node_modules/bonjour-service": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", - "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" + "node": ">= 6" } }, "node_modules/boolbase": { @@ -8543,30 +5304,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/boxen/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/brace-expansion": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", @@ -8591,6 +5328,16 @@ "node": ">=8" } }, + "node_modules/brotli": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz", + "integrity": "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "base64-js": "^1.1.2" + } + }, "node_modules/browserslist": { "version": "4.28.1", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", @@ -8690,32 +5437,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/bundle-name": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", - "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "run-applescript": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/c8": { "version": "10.1.3", "resolved": "https://registry.npmjs.org/c8/-/c8-10.1.3.tgz", @@ -8750,197 +5471,6 @@ } } }, - "node_modules/c8/node_modules/@bcoe/v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz", - "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/c8/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/c8/node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/c8/node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/c8/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/c8/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/c8/node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/c8/node_modules/test-exclude": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", - "integrity": "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==", - "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^10.4.1", - "minimatch": "^9.0.4" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/cacheable-lookup": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", - "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.16" - } - }, - "node_modules/cacheable-request": { - "version": "10.2.14", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", - "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-cache-semantics": "^4.0.2", - "get-stream": "^6.0.1", - "http-cache-semantics": "^4.1.1", - "keyv": "^4.5.3", - "mimic-response": "^4.0.0", - "normalize-url": "^8.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -8951,44 +5481,22 @@ "node": ">=6" } }, - "node_modules/camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "license": "MIT", "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/caniuse-lite": { - "version": "1.0.30001761", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001761.tgz", - "integrity": "sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g==", + "version": "1.0.30001762", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001762.tgz", + "integrity": "sha512-PxZwGNvH7Ak8WX5iXzoK1KPZttBXNPuaOvI2ZYU7NrlM+d9Ov+TUvlLOBNGzVXAntMSMMlJPd+jY6ovrVjSmUw==", "dev": true, "funding": [ { @@ -9099,98 +5607,26 @@ "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==", "license": "MIT" }, - "node_modules/cheerio": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", - "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "cheerio-select": "^2.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "htmlparser2": "^8.0.1", - "parse5": "^7.0.0", - "parse5-htmlparser2-tree-adapter": "^7.0.0" - }, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/cheeriojs/cheerio?sponsor=1" - } - }, - "node_modules/cheerio-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", - "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-select": "^5.1.0", - "css-what": "^6.1.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "dev": true, "license": "MIT", "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "readdirp": "^4.0.1" }, "engines": { - "node": ">= 8.10.0" + "node": ">= 14.16.0" }, "funding": { "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/chrome-trace-event": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0" } }, "node_modules/ci-info": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.0.tgz", - "integrity": "sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz", + "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", "dev": true, "funding": [ { @@ -9204,25 +5640,12 @@ } }, "node_modules/cjs-module-lexer": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.1.0.tgz", - "integrity": "sha512-UX0OwmYRYQQetfrLEZeewIFFI+wSTofC+pMBLNuH3RUuu/xzG1oz84UCEDOSoQlN3fZ4+AzmV50ZYvGqkMh9yA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", + "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==", "dev": true, "license": "MIT" }, - "node_modules/clean-css": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", - "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 10.0" - } - }, "node_modules/clean-regexp": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", @@ -9246,16 +5669,6 @@ "node": ">=0.8.0" } }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/cli-boxes": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", @@ -9269,15 +5682,19 @@ } }, "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, "license": "MIT", "dependencies": { - "restore-cursor": "^3.1.0" + "restore-cursor": "^5.0.0" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cli-spinners": { @@ -9308,26 +5725,26 @@ } }, "node_modules/cli-truncate": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", - "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.1.1.tgz", + "integrity": "sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A==", "dev": true, "license": "MIT", "dependencies": { - "slice-ansi": "^5.0.0", - "string-width": "^7.0.0" + "slice-ansi": "^7.1.0", + "string-width": "^8.0.0" }, "engines": { - "node": ">=18" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cli-truncate/node_modules/ansi-regex": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.0.tgz", - "integrity": "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "license": "MIT", "engines": { @@ -9337,35 +5754,27 @@ "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/cli-truncate/node_modules/emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", - "dev": true, - "license": "MIT" - }, "node_modules/cli-truncate/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.0.tgz", + "integrity": "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==", "dev": true, "license": "MIT", "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", + "get-east-asian-width": "^1.3.0", "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=18" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cli-truncate/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "dev": true, "license": "MIT", "dependencies": { @@ -9403,29 +5812,15 @@ } }, "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.8" } }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/clsx": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", @@ -9459,12 +5854,26 @@ } }, "node_modules/collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", + "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", "dev": true, "license": "MIT" }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -9483,12 +5892,16 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, - "node_modules/colord": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } }, "node_modules/colorette": { "version": "2.0.20", @@ -9497,16 +5910,6 @@ "dev": true, "license": "MIT" }, - "node_modules/combine-promises": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/combine-promises/-/combine-promises-1.2.0.tgz", - "integrity": "sha512-VcQB1ziGD0NXrhKxiwyNbCDmRzs/OShMs2GqW2DlU2A/Sd0nQxE1oWDAE5O0ygSx5mgQOn9eIFh7yKPgFRVkPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, "node_modules/comma-separated-tokens": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", @@ -9519,18 +5922,18 @@ } }, "node_modules/commander": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.0.tgz", - "integrity": "sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA==", + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.2.tgz", + "integrity": "sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==", "license": "MIT", "engines": { "node": ">=20" } }, - "node_modules/common-path-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "node_modules/common-ancestor-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", + "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", "dev": true, "license": "ISC" }, @@ -9551,117 +5954,6 @@ "node": ">= 14" } }, - "node_modules/compress-commons/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/compress-commons/node_modules/readable-stream": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", - "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", - "dev": true, - "license": "MIT", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compressible/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", - "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "compressible": "~2.0.18", - "debug": "2.6.9", - "negotiator": "~0.6.4", - "on-headers": "~1.1.0", - "safe-buffer": "5.2.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/compression/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -9669,74 +5961,6 @@ "dev": true, "license": "MIT" }, - "node_modules/config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "node_modules/config-chain/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true, - "license": "ISC" - }, - "node_modules/configstore": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", - "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "dot-prop": "^6.0.1", - "graceful-fs": "^4.2.6", - "unique-string": "^3.0.0", - "write-file-atomic": "^3.0.3", - "xdg-basedir": "^5.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/yeoman/configstore?sponsor=1" - } - }, - "node_modules/configstore/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/configstore/node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, "node_modules/consola": { "version": "2.15.3", "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", @@ -9744,26 +5968,6 @@ "dev": true, "license": "MIT" }, - "node_modules/content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -9772,128 +5976,40 @@ "license": "MIT" }, "node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/cookie-signature": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", - "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", + "node_modules/cookie-es": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.2.2.tgz", + "integrity": "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==", "dev": true, "license": "MIT" }, - "node_modules/copy-webpack-plugin": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", - "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-glob": "^3.2.11", - "glob-parent": "^6.0.1", - "globby": "^13.1.1", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - } - }, - "node_modules/copy-webpack-plugin/node_modules/globby": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", - "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", - "dev": true, - "license": "MIT", - "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.3.0", - "ignore": "^5.2.4", - "merge2": "^1.4.1", - "slash": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/copy-webpack-plugin/node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/copy-webpack-plugin/node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/core-js": { - "version": "3.47.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.47.0.tgz", - "integrity": "sha512-c3Q2VVkGAUyupsjRnaNX6u8Dq2vAdzm9iuPj5FW0fRxzlxgq9Q39MDq10IvmQSpLgHQNyQzQmOo6bgGHmH3NNg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, "node_modules/core-js-compat": { - "version": "3.45.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.45.1.tgz", - "integrity": "sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA==", + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.47.0.tgz", + "integrity": "sha512-IGfuznZ/n7Kp9+nypamBhvwdwLsW6KC8IOaURw2doAK5e98AG3acVLdh0woOnEqCfUtS+Vu882JE4k/DAm3ItQ==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.25.3" + "browserslist": "^4.28.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, - "node_modules/core-js-pure": { - "version": "3.47.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.47.0.tgz", - "integrity": "sha512-BcxeDbzUrRnXGYIVAGFtcGQVNpFcUhVjr6W7F8XktvQW2iJP9e66GP6xdKotCRFlrxBvNIBrhwKteRXqMV86Nw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", @@ -9901,33 +6017,6 @@ "dev": true, "license": "MIT" }, - "node_modules/cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", - "dev": true, - "license": "MIT", - "dependencies": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, "node_modules/crc-32": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", @@ -9955,48 +6044,6 @@ "node": ">= 14" } }, - "node_modules/crc32-stream/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/crc32-stream/node_modules/readable-stream": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", - "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", - "dev": true, - "license": "MIT", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -10011,360 +6058,14 @@ "node": ">= 8" } }, - "node_modules/crypto-random-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", - "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", + "node_modules/crossws": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.3.5.tgz", + "integrity": "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==", "dev": true, "license": "MIT", "dependencies": { - "type-fest": "^1.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/crypto-random-string/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/css-blank-pseudo": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-7.0.1.tgz", - "integrity": "sha512-jf+twWGDf6LDoXDUode+nc7ZlrqfaNphrBIBrcmeP3D8yw1uPaix1gCC8LUQUGQ6CycuK2opkbFFWFuq/a94ag==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/css-blank-pseudo/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/css-declaration-sorter": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.3.0.tgz", - "integrity": "sha512-LQF6N/3vkAMYF4xoHLJfG718HRJh34Z8BnNhd6bosOMIVjMlhuZK5++oZa3uYAgrI5+7x2o27gUqTR2U/KjUOQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.0.9" - } - }, - "node_modules/css-has-pseudo": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-7.0.3.tgz", - "integrity": "sha512-oG+vKuGyqe/xvEMoxAQrhi7uY16deJR3i7wwhBerVrGQKSqUC5GiOVxTpM9F9B9hw0J+eKeOWLH7E9gZ1Dr5rA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/selector-specificity": "^5.0.0", - "postcss-selector-parser": "^7.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/css-has-pseudo/node_modules/@csstools/selector-specificity": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", - "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss-selector-parser": "^7.0.0" - } - }, - "node_modules/css-has-pseudo/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/css-loader": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", - "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", - "dev": true, - "license": "MIT", - "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.33", - "postcss-modules-extract-imports": "^3.1.0", - "postcss-modules-local-by-default": "^4.0.5", - "postcss-modules-scope": "^3.2.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/css-minimizer-webpack-plugin": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-5.0.1.tgz", - "integrity": "sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "cssnano": "^6.0.1", - "jest-worker": "^29.4.3", - "postcss": "^8.4.24", - "schema-utils": "^4.0.1", - "serialize-javascript": "^6.0.1" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@parcel/css": { - "optional": true - }, - "@swc/css": { - "optional": true - }, - "clean-css": { - "optional": true - }, - "csso": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "lightningcss": { - "optional": true - } - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true, - "license": "MIT" - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/css-prefers-color-scheme": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-10.0.0.tgz", - "integrity": "sha512-VCtXZAWivRglTZditUfB4StnsWr6YVZ2PRtuxQLKTNRdtAf8tpzaVPE9zXIF3VaSc7O70iK/j1+NXxyQCqdPjQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" + "uncrypto": "^0.1.3" } }, "node_modules/css-select": { @@ -10385,9 +6086,9 @@ } }, "node_modules/css-selector-parser": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-3.1.3.tgz", - "integrity": "sha512-gJMigczVZqYAk0hPVzx/M4Hm1D9QOtqkdQk9005TNzDIUGzo5cnHEDiKUT7jGPximL/oYb+LIitcHFQ4aKupxg==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-3.3.0.tgz", + "integrity": "sha512-Y2asgMGFqJKF4fq4xHDSlFYIkeVfRsm69lQC1q9kbEsH5XtnINTMrweLkjYMeaUgiXBy/uvKeO/a1JHTNnmB2g==", "funding": [ { "type": "github", @@ -10401,13 +6102,13 @@ "license": "MIT" }, "node_modules/css-tree": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", - "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", + "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", "dev": true, "license": "MIT", "dependencies": { - "mdn-data": "2.0.30", + "mdn-data": "2.12.2", "source-map-js": "^1.0.1" }, "engines": { @@ -10427,23 +6128,6 @@ "url": "https://github.com/sponsors/fb55" } }, - "node_modules/cssdb": { - "version": "8.5.2", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.5.2.tgz", - "integrity": "sha512-Pmoj9RmD8RIoIzA2EQWO4D4RMeDts0tgAH0VXdlNdxjuBGI3a9wMOIcUwaPNmD4r2qtIa06gqkIf7sECl+cBCg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - } - ], - "license": "MIT-0" - }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -10457,107 +6141,6 @@ "node": ">=4" } }, - "node_modules/cssnano": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.1.2.tgz", - "integrity": "sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssnano-preset-default": "^6.1.2", - "lilconfig": "^3.1.1" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/cssnano" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/cssnano-preset-advanced": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-6.1.2.tgz", - "integrity": "sha512-Nhao7eD8ph2DoHolEzQs5CfRpiEP0xa1HBdnFZ82kvqdmbwVBUr2r1QuQ4t1pi+D1ZpqpcO4T+wy/7RxzJ/WPQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "autoprefixer": "^10.4.19", - "browserslist": "^4.23.0", - "cssnano-preset-default": "^6.1.2", - "postcss-discard-unused": "^6.0.5", - "postcss-merge-idents": "^6.0.3", - "postcss-reduce-idents": "^6.0.3", - "postcss-zindex": "^6.0.2" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/cssnano-preset-default": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.1.2.tgz", - "integrity": "sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.0", - "css-declaration-sorter": "^7.2.0", - "cssnano-utils": "^4.0.2", - "postcss-calc": "^9.0.1", - "postcss-colormin": "^6.1.0", - "postcss-convert-values": "^6.1.0", - "postcss-discard-comments": "^6.0.2", - "postcss-discard-duplicates": "^6.0.3", - "postcss-discard-empty": "^6.0.3", - "postcss-discard-overridden": "^6.0.2", - "postcss-merge-longhand": "^6.0.5", - "postcss-merge-rules": "^6.1.1", - "postcss-minify-font-values": "^6.1.0", - "postcss-minify-gradients": "^6.0.3", - "postcss-minify-params": "^6.1.0", - "postcss-minify-selectors": "^6.0.4", - "postcss-normalize-charset": "^6.0.2", - "postcss-normalize-display-values": "^6.0.2", - "postcss-normalize-positions": "^6.0.2", - "postcss-normalize-repeat-style": "^6.0.2", - "postcss-normalize-string": "^6.0.2", - "postcss-normalize-timing-functions": "^6.0.2", - "postcss-normalize-unicode": "^6.1.0", - "postcss-normalize-url": "^6.0.2", - "postcss-normalize-whitespace": "^6.0.2", - "postcss-ordered-values": "^6.0.2", - "postcss-reduce-initial": "^6.1.0", - "postcss-reduce-transforms": "^6.0.2", - "postcss-svgo": "^6.0.3", - "postcss-unique-selectors": "^6.0.4" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/cssnano-utils": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.2.tgz", - "integrity": "sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, "node_modules/csso": { "version": "5.0.5", "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", @@ -10594,30 +6177,16 @@ "dev": true, "license": "CC0-1.0" }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "dev": true, - "license": "MIT" - }, "node_modules/csv-parse": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-6.1.0.tgz", "integrity": "sha512-CEE+jwpgLn+MmtCpVcPtiCZpVtB6Z2OKPTr34pycYYoL7sxdOkXDdQ4lRiw6ioC0q6BLqhc6cKweCVvral8yhw==", "license": "MIT" }, - "node_modules/debounce": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", - "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", - "dev": true, - "license": "MIT" - }, "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -10644,39 +6213,10 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/dedent": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.6.0.tgz", - "integrity": "sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.1.tgz", + "integrity": "sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg==", "dev": true, "license": "MIT", "peerDependencies": { @@ -10688,16 +6228,6 @@ } } }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -10715,36 +6245,6 @@ "node": ">=0.10.0" } }, - "node_modules/default-browser": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.4.0.tgz", - "integrity": "sha512-XDuvSq38Hr1MdN47EDvYtx3U0MTqpCEn+F6ft8z2vYDzMrvQhVp0ui9oQdqW3MvK3vqUETglt1tVGgjLuJ5izg==", - "dev": true, - "license": "MIT", - "dependencies": { - "bundle-name": "^4.1.0", - "default-browser-id": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser-id": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", - "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/defaults": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", @@ -10757,71 +6257,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "dev": true, + "node_modules/defaults/node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "license": "MIT", "engines": { - "node": ">=10" + "node": ">=0.8" } }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "node_modules/defu": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", + "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } + "license": "MIT" }, "node_modules/dequal": { "version": "2.0.3", @@ -10832,25 +6282,34 @@ "node": ">=6" } }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "node_modules/destr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", + "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } + "license": "MIT" }, "node_modules/detect-indent": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-7.0.1.tgz", - "integrity": "sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-7.0.2.tgz", + "integrity": "sha512-y+8xyqdGLL+6sh0tVeHcfP/QDd8gUgbasolJJpY7NgeQGSZ739bDtSiaiDgtoicy+mtYB81dKLxO9xRhCyIB3A==", "dev": true, "license": "MIT", "engines": { "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" } }, "node_modules/detect-newline": { @@ -10863,31 +6322,26 @@ "node": ">=8" } }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true, - "license": "MIT" - }, - "node_modules/detect-port": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.6.1.tgz", - "integrity": "sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==", + "node_modules/deterministic-object-hash": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/deterministic-object-hash/-/deterministic-object-hash-2.0.2.tgz", + "integrity": "sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==", "dev": true, "license": "MIT", "dependencies": { - "address": "^1.0.1", - "debug": "4" - }, - "bin": { - "detect": "bin/detect-port.js", - "detect-port": "bin/detect-port.js" + "base-64": "^1.0.0" }, "engines": { - "node": ">= 4.0.0" + "node": ">=18" } }, + "node_modules/devalue": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.6.1.tgz", + "integrity": "sha512-jDwizj+IlEZBunHcOuuFVBnIMPAEHvTsJj0BcIp94xYguLRVBcXO853px/MyIJvbVzWdsGvrRweIUWJw8hBP7A==", + "dev": true, + "license": "MIT" + }, "node_modules/devlop": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", @@ -10901,6 +6355,33 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/dfa": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/dfa/-/dfa-1.2.0.tgz", + "integrity": "sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", + "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -10914,29 +6395,37 @@ "node": ">=8" } }, - "node_modules/dns-packet": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", - "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "node_modules/dir-glob/node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, "license": "MIT", - "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "node_modules/direction": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/direction/-/direction-2.0.1.tgz", + "integrity": "sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==", "dev": true, "license": "MIT", - "dependencies": { - "utila": "~0.4" + "bin": { + "direction": "cli.js" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true, + "license": "MIT" + }, "node_modules/dom-serializer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", @@ -10996,78 +6485,22 @@ "url": "https://github.com/fb55/domutils?sponsor=1" } }, - "node_modules/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/dot-prop": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", - "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dot-prop/node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "node_modules/dset": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.4.tgz", + "integrity": "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true, - "license": "MIT" - }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "license": "MIT" }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true, - "license": "MIT" - }, "node_modules/electron-to-chromium": { "version": "1.5.267", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", @@ -11094,48 +6527,10 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "license": "MIT" }, - "node_modules/emojilib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", - "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==", - "dev": true, - "license": "MIT" - }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/emoticon": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-4.1.0.tgz", - "integrity": "sha512-VWZfnxqwNcc51hIy/sbOdEem6D+cVtpPzEEtVAFdaas30+1dgkyaOQ4sQ6Bp0tOMqWO1v+HQfYaoodOkdhK6SQ==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/enhanced-resolve": { - "version": "5.18.3", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", - "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", + "version": "5.18.4", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.4.tgz", + "integrity": "sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==", "dev": true, "license": "MIT", "dependencies": { @@ -11173,55 +6568,22 @@ } }, "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", "dev": true, "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, "node_modules/es-module-lexer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", - "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", "dev": true, "license": "MIT" }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/esast-util-from-estree": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz", @@ -11256,6 +6618,48 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -11266,26 +6670,6 @@ "node": ">=6" } }, - "node_modules/escape-goat": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", - "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true, - "license": "MIT" - }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -11300,26 +6684,25 @@ } }, "node_modules/eslint": { - "version": "9.34.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.34.0.tgz", - "integrity": "sha512-RNCHRX5EwdrESy3Jc9o8ie8Bog+PeYvvSR8sDGoZxNFTvZ4dlxUB3WzQ3bQMztFrSRODGrLLj8g6OFuGY/aiQg==", + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", + "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.0", - "@eslint/config-helpers": "^0.3.1", - "@eslint/core": "^0.15.2", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.34.0", - "@eslint/plugin-kit": "^0.3.5", + "@eslint/js": "9.39.2", + "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", @@ -11416,9 +6799,9 @@ } }, "node_modules/eslint-plugin-n": { - "version": "17.21.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.21.3.tgz", - "integrity": "sha512-MtxYjDZhMQgsWRm/4xYLL0i2EhusWT7itDxlJ80l1NND2AL2Vi5Mvneqv/ikG9+zpran0VsVRXTEHrpLmUZRNw==", + "version": "17.23.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.23.1.tgz", + "integrity": "sha512-68PealUpYoHOBh332JLLD9Sj7OQUDkFpmcfqt8R9sySfFSeuGJjMTJQvCRRB96zO3A/PELRLkPrzsHmzEFQQ5A==", "dev": true, "license": "MIT", "dependencies": { @@ -11501,10 +6884,37 @@ "eslint": ">=9.29.0" } }, + "node_modules/eslint-plugin-unicorn/node_modules/@eslint/core": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", + "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/eslint-plugin-unicorn/node_modules/@eslint/plugin-kit": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", + "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.15.2", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/eslint-plugin-unicorn/node_modules/globals": { - "version": "16.3.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-16.3.0.tgz", - "integrity": "sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==", + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz", + "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==", "dev": true, "license": "MIT", "engines": { @@ -11515,13 +6925,14 @@ } }, "node_modules/eslint-plugin-yml": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-1.18.0.tgz", - "integrity": "sha512-9NtbhHRN2NJa/s3uHchO3qVVZw0vyOIvWlXWGaKCr/6l3Go62wsvJK5byiI6ZoYztDsow4GnS69BZD3GnqH3hA==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-1.19.1.tgz", + "integrity": "sha512-bYkOxyEiXh9WxUhVYPELdSHxGG5pOjCSeJOVkfdIyj6tuiHDxrES2WAW1dBxn3iaZQey57XflwLtCYRcNPOiOg==", "dev": true, "license": "MIT", "dependencies": { "debug": "^4.3.2", + "diff-sequences": "^27.5.1", "escape-string-regexp": "4.0.0", "eslint-compat-utils": "^0.6.0", "natural-compare": "^1.4.0", @@ -11626,9 +7037,9 @@ } }, "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -11734,29 +7145,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/estree-util-to-js/node_modules/source-map": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", - "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">= 12" - } - }, - "node_modules/estree-util-value-to-estree": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.5.0.tgz", - "integrity": "sha512-aMV56R27Gv3QmfmF1MY12GWkGzzeAezAX+UplqHVASfjc9wNzI/X6hC0S9oxq61WT4aQesLGslWP9tKk6ghRZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/remcohaszing" - } - }, "node_modules/estree-util-visit": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", @@ -11792,42 +7180,6 @@ "node": ">=0.10.0" } }, - "node_modules/eta": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/eta/-/eta-2.2.0.tgz", - "integrity": "sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "url": "https://github.com/eta-dev/eta?sponsor=1" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/eval": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz", - "integrity": "sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==", - "dev": true, - "dependencies": { - "@types/node": "*", - "require-like": ">= 0.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/event-target-shim": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", @@ -11865,16 +7217,6 @@ "bare-events": "^2.7.0" } }, - "node_modules/eventsource-parser": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", - "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -11917,115 +7259,34 @@ } }, "node_modules/expect": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/expect/-/expect-30.0.5.tgz", - "integrity": "sha512-P0te2pt+hHI5qLJkIR+iMvS+lYUZml8rKKsohVHAGY+uClp9XVbdyYNJOIjSRpHVp8s8YqxJCiHUkSYZGr8rtQ==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-30.2.0.tgz", + "integrity": "sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/expect-utils": "30.0.5", - "@jest/get-type": "30.0.1", - "jest-matcher-utils": "30.0.5", - "jest-message-util": "30.0.5", - "jest-mock": "30.0.5", - "jest-util": "30.0.5" + "@jest/expect-utils": "30.2.0", + "@jest/get-type": "30.1.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-util": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/express": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", - "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", + "node_modules/expressive-code": { + "version": "0.41.5", + "resolved": "https://registry.npmjs.org/expressive-code/-/expressive-code-0.41.5.tgz", + "integrity": "sha512-iXl9BgDogQgzgE/WRSrcyU8upOcRZrXPMiu6tegEHML57YLQ65S0E3/sjAXmMZy0GXoPs60s9jbwoMo/mdEQOg==", "dev": true, "license": "MIT", "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "~1.20.3", - "content-disposition": "~0.5.4", - "content-type": "~1.0.4", - "cookie": "~0.7.1", - "cookie-signature": "~1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.3.1", - "fresh": "~0.5.2", - "http-errors": "~2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "~2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "~0.1.12", - "proxy-addr": "~2.0.7", - "qs": "~6.14.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "~0.19.0", - "serve-static": "~1.16.2", - "setprototypeof": "1.2.0", - "statuses": "~2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/express/node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, - "node_modules/express/node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/express/node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" + "@expressive-code/core": "^0.41.5", + "@expressive-code/plugin-frames": "^0.41.5", + "@expressive-code/plugin-shiki": "^0.41.5", + "@expressive-code/plugin-text-markers": "^0.41.5" } }, "node_modules/extend": { @@ -12034,19 +7295,6 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "license": "MIT" }, - "node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -12105,60 +7353,16 @@ "dev": true, "license": "MIT" }, - "node_modules/fast-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" - }, "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", "dev": true, "license": "ISC", "dependencies": { "reusify": "^1.0.4" } }, - "node_modules/fault": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", - "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "format": "^0.2.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/fb-watchman": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", @@ -12169,55 +7373,37 @@ "bser": "2.1.1" } }, - "node_modules/feed": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz", - "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==", + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, "license": "MIT", - "dependencies": { - "xml-js": "^1.6.11" - }, "engines": { - "node": ">=0.4.0" + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } } }, "node_modules/figlet": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/figlet/-/figlet-1.8.0.tgz", - "integrity": "sha512-chzvGjd+Sp7KUvPHZv6EXV5Ir3Q7kYNpCr4aHrRW79qFtTefmQZNny+W1pW9kf5zeE6dikku2W50W/wAH2xWgw==", + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/figlet/-/figlet-1.9.4.tgz", + "integrity": "sha512-uN6QE+TrzTAHC1IWTyrc4FfGo2KH/82J8Jl1tyKB7+z5DBit/m3D++Iu5lg91qJMnQQ3vpJrj5gxcK/pk4R9tQ==", "license": "MIT", + "dependencies": { + "commander": "^14.0.0" + }, "bin": { "figlet": "bin/index.js" }, "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/figures/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" + "node": ">= 17.0.0" } }, "node_modules/file-entry-cache": { @@ -12233,46 +7419,6 @@ "node": ">=16.0.0" } }, - "node_modules/file-loader": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", - "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/file-loader/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -12286,163 +7432,6 @@ "node": ">=8" } }, - "node_modules/finalhandler": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", - "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "~2.4.1", - "parseurl": "~1.3.3", - "statuses": "~2.0.2", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, - "node_modules/find-cache-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", - "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", - "dev": true, - "license": "MIT", - "dependencies": { - "common-path-prefix": "^3.0.0", - "pkg-dir": "^7.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-cache-dir/node_modules/find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-cache-dir/node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-cache-dir/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-cache-dir/node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-cache-dir/node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/find-cache-dir/node_modules/pkg-dir": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", - "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^6.3.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-cache-dir/node_modules/yocto-queue": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", - "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -12473,16 +7462,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, - "license": "BSD-3-Clause", - "bin": { - "flat": "cli.js" - } - }, "node_modules/flat-cache": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", @@ -12504,25 +7483,43 @@ "dev": true, "license": "ISC" }, - "node_modules/follow-redirects": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "node_modules/flattie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flattie/-/flattie-1.1.1.tgz", + "integrity": "sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], "license": "MIT", "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } + "node": ">=8" + } + }, + "node_modules/fontace": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/fontace/-/fontace-0.3.1.tgz", + "integrity": "sha512-9f5g4feWT1jWT8+SbL85aLIRLIXUaDygaM2xPXRmzPYxrOMNok79Lr3FGJoKVNKibE0WCunNiEVG2mwuE+2qEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/fontkit": "^2.0.8", + "fontkit": "^2.0.4" + } + }, + "node_modules/fontkit": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/fontkit/-/fontkit-2.0.4.tgz", + "integrity": "sha512-syetQadaUEDNdxdugga9CpEYVaQIxOwk7GlwZWWZ19//qW4zE5bknOKeMBDYAASwnpaSHKJITRLMF9m1fp3s6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@swc/helpers": "^0.5.12", + "brotli": "^1.3.2", + "clone": "^2.1.2", + "dfa": "^1.2.0", + "fast-deep-equal": "^3.1.3", + "restructure": "^3.0.0", + "tiny-inflate": "^1.0.3", + "unicode-properties": "^1.4.0", + "unicode-trie": "^2.0.0" } }, "node_modules/foreground-child": { @@ -12541,63 +7538,10 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/form-data-encoder": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", - "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.17" - } - }, - "node_modules/format": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", - "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", - "dev": true, - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fraction.js": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", - "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/fs-extra": { - "version": "11.3.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.1.tgz", - "integrity": "sha512-eXvGGwZ5CL17ZSwHWd3bbgk7UUpF6IFHtP57NYYakPvHOs8GDgDe5KJI36jIJzDkJ6eJjuzRA8eBQb6SkKue0g==", + "version": "11.3.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz", + "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", @@ -12630,16 +7574,6 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -12661,9 +7595,9 @@ } }, "node_modules/get-east-asian-width": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", - "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", + "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", "dev": true, "license": "MIT", "engines": { @@ -12673,38 +7607,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-own-enumerable-property-symbols": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", - "dev": true, - "license": "ISC" - }, "node_modules/get-package-type": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", @@ -12715,20 +7617,6 @@ "node": ">=8.0.0" } }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", @@ -12743,9 +7631,9 @@ } }, "node_modules/get-tsconfig": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz", - "integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", + "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12766,9 +7654,9 @@ } }, "node_modules/github-slugger": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", - "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", + "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", "dev": true, "license": "ISC" }, @@ -12808,30 +7696,6 @@ "node": ">=10.13.0" } }, - "node_modules/glob-to-regex.js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/glob-to-regex.js/-/glob-to-regex.js-1.2.0.tgz", - "integrity": "sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true, - "license": "BSD-2-Clause" - }, "node_modules/glob/node_modules/minimatch": { "version": "10.1.1", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", @@ -12847,22 +7711,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/global-dirs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", - "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ini": "2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/globals": { "version": "14.0.0", "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", @@ -12877,34 +7725,37 @@ } }, "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-15.0.0.tgz", + "integrity": "sha512-oB4vkQGqlMl682wL1IlWd02tXCbquGWM4voPEI85QmNKCaw8zGTm1f1rubFgkg3Eli2PtKlFgrnmUqasbQWlkw==", "dev": true, "license": "MIT", "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" + "@sindresorhus/merge-streams": "^4.0.0", + "fast-glob": "^3.3.3", + "ignore": "^7.0.5", + "path-type": "^6.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.3.0" }, "engines": { - "node": ">=10" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globby/node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "node_modules/globby/node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", "dev": true, "license": "MIT", "engines": { - "node": ">= 4" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/globrex": { @@ -12914,127 +7765,30 @@ "dev": true, "license": "MIT" }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/got": { - "version": "12.6.1", - "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", - "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sindresorhus/is": "^5.2.0", - "@szmarczak/http-timer": "^5.0.1", - "cacheable-lookup": "^7.0.0", - "cacheable-request": "^10.2.8", - "decompress-response": "^6.0.0", - "form-data-encoder": "^2.1.2", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/got/node_modules/@sindresorhus/is": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", - "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "license": "ISC" }, - "node_modules/gray-matter": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", - "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "node_modules/h3": { + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.4.tgz", + "integrity": "sha512-z5cFQWDffyOe4vQ9xIqNfCZdV4p//vy6fBnr8Q1AWnVZ0teurKMG66rLj++TKwKPUP3u7iMUvrvKaEUiQw2QWQ==", "dev": true, "license": "MIT", "dependencies": { - "js-yaml": "^3.13.1", - "kind-of": "^6.0.2", - "section-matter": "^1.0.0", - "strip-bom-string": "^1.0.0" - }, - "engines": { - "node": ">=6.0" + "cookie-es": "^1.2.2", + "crossws": "^0.3.5", + "defu": "^6.1.4", + "destr": "^2.0.5", + "iron-webcrypto": "^1.2.1", + "node-mock-http": "^1.0.2", + "radix3": "^1.1.2", + "ufo": "^1.6.1", + "uncrypto": "^0.1.3" } }, - "node_modules/gray-matter/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/gray-matter/node_modules/js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/gzip-size": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", - "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "duplexer": "^0.1.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true, - "license": "MIT" - }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -13044,56 +7798,58 @@ "node": ">=8" } }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-yarn": { + "node_modules/hast-util-embedded": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", - "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "resolved": "https://registry.npmjs.org/hast-util-embedded/-/hast-util-embedded-3.0.0.tgz", + "integrity": "sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==", "dev": true, "license": "MIT", "dependencies": { - "function-bind": "^1.1.2" + "@types/hast": "^3.0.0", + "hast-util-is-element": "^3.0.0" }, - "engines": { - "node": ">= 0.4" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-format": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hast-util-format/-/hast-util-format-1.1.0.tgz", + "integrity": "sha512-yY1UDz6bC9rDvCWHpx12aIBGRG7krurX0p0Fm6pT547LwDIZZiNr8a+IHDogorAdreULSEzP82Nlv5SZkHZcjA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-embedded": "^3.0.0", + "hast-util-minify-whitespace": "^1.0.0", + "hast-util-phrasing": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "html-whitespace-sensitive-tag-names": "^3.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-html": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.3.tgz", + "integrity": "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "devlop": "^1.1.0", + "hast-util-from-parse5": "^8.0.0", + "parse5": "^7.0.0", + "vfile": "^6.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, "node_modules/hast-util-from-parse5": { @@ -13117,6 +7873,66 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hast-util-has-property": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-3.0.0.tgz", + "integrity": "sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-is-body-ok-link": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/hast-util-is-body-ok-link/-/hast-util-is-body-ok-link-3.0.1.tgz", + "integrity": "sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-is-element": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", + "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-minify-whitespace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hast-util-minify-whitespace/-/hast-util-minify-whitespace-1.0.1.tgz", + "integrity": "sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-embedded": "^3.0.0", + "hast-util-is-element": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hast-util-parse-selector": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", @@ -13131,6 +7947,24 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hast-util-phrasing": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/hast-util-phrasing/-/hast-util-phrasing-3.0.1.tgz", + "integrity": "sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-embedded": "^3.0.0", + "hast-util-has-property": "^3.0.0", + "hast-util-is-body-ok-link": "^3.0.0", + "hast-util-is-element": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hast-util-raw": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", @@ -13157,6 +7991,34 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hast-util-select": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/hast-util-select/-/hast-util-select-6.0.4.tgz", + "integrity": "sha512-RqGS1ZgI0MwxLaKLDxjprynNzINEkRHY2i8ln4DDjgv9ZhcYVIHN9rlpiYsqtFwrgpYU361SyWDQcGNIBVu3lw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "bcp-47-match": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "css-selector-parser": "^3.0.0", + "devlop": "^1.0.0", + "direction": "^2.0.0", + "hast-util-has-property": "^3.0.0", + "hast-util-to-string": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "nth-check": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hast-util-to-estree": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz", @@ -13186,6 +8048,30 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hast-util-to-html": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hast-util-to-jsx-runtime": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", @@ -13234,6 +8120,37 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hast-util-to-string": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-3.0.1.tgz", + "integrity": "sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-text": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz", + "integrity": "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "hast-util-is-element": "^3.0.0", + "unist-util-find-after": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hast-util-whitespace": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", @@ -13266,153 +8183,13 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "license": "MIT", - "bin": { - "he": "bin/he" - } - }, - "node_modules/history": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", - "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.1.2", - "loose-envify": "^1.2.0", - "resolve-pathname": "^3.0.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0", - "value-equal": "^1.0.1" - } - }, - "node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "react-is": "^16.7.0" - } - }, - "node_modules/hoist-non-react-statics/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "node_modules/hpack.js/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/hpack.js/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/hpack.js/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT" - }, - "node_modules/hpack.js/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz", + "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==", "dev": true, "license": "MIT" }, - "node_modules/html-minifier-terser": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz", - "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==", - "dev": true, - "license": "MIT", - "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "~5.3.2", - "commander": "^10.0.0", - "entities": "^4.4.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.15.1" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": "^14.13.1 || >=16.0.0" - } - }, - "node_modules/html-minifier-terser/node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "node_modules/html-tags": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", - "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/html-void-elements": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", @@ -13424,89 +8201,15 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/html-webpack-plugin": { - "version": "5.6.5", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.5.tgz", - "integrity": "sha512-4xynFbKNNk+WlzXeQQ+6YYsH2g7mpfPszQZUi3ovKlj+pDmngQ7vRXjrrmGROabmKwyQkcgcX5hqfOwHbFmK5g==", + "node_modules/html-whitespace-sensitive-tag-names": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-whitespace-sensitive-tag-names/-/html-whitespace-sensitive-tag-names-3.0.1.tgz", + "integrity": "sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA==", "dev": true, "license": "MIT", - "dependencies": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" - }, - "engines": { - "node": ">=10.13.0" - }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/html-webpack-plugin" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.20.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/html-webpack-plugin/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "node_modules/html-webpack-plugin/node_modules/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", - "dev": true, - "license": "MIT", - "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", - "he": "^1.2.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.10.0" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/htmlparser2": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "entities": "^4.4.0" + "url": "https://opencollective.com/unified" } }, "node_modules/http-cache-semantics": { @@ -13516,115 +8219,6 @@ "dev": true, "license": "BSD-2-Clause" }, - "node_modules/http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "dev": true, - "license": "MIT" - }, - "node_modules/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/http-parser-js": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", - "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", - "dev": true, - "license": "MIT" - }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/http-proxy-middleware": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", - "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@types/express": "^4.17.13" - }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } - } - }, - "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/http-proxy/node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true, - "license": "MIT" - }, - "node_modules/http2-wrapper": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", - "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -13651,14 +8245,28 @@ "url": "https://github.com/sponsors/typicode" } }, - "node_modules/hyperdyperid": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", - "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", + "node_modules/i18next": { + "version": "23.16.8", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.16.8.tgz", + "integrity": "sha512-06r/TitrM88Mg5FdUXAKL96dJMzgqLE5dv3ryBAra4KCwD9mJ4ndOTS95ZuymIGoE+2hzfdaMak2X11/es7ZWg==", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://locize.com" + }, + { + "type": "individual", + "url": "https://locize.com/i18next.html" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + } + ], "license": "MIT", - "engines": { - "node": ">=10.18" + "dependencies": { + "@babel/runtime": "^7.23.2" } }, "node_modules/iconv-lite": { @@ -13677,19 +8285,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -13719,19 +8314,6 @@ "node": ">= 4" } }, - "node_modules/image-size": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-2.0.2.tgz", - "integrity": "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==", - "dev": true, - "license": "MIT", - "bin": { - "image-size": "bin/image-size.js" - }, - "engines": { - "node": ">=16.x" - } - }, "node_modules/import-fresh": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", @@ -13749,16 +8331,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-lazy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/import-local": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", @@ -13779,6 +8351,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/import-meta-resolve": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", + "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -13802,16 +8385,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/infima": { - "version": "0.2.0-alpha.45", - "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.45.tgz", - "integrity": "sha512-uyH0zfr1erU1OohLk0fT4Rrb94AOhguWNOcD9uGrSpRvNB+6gZXUoJX5J0NtvzBO10YZ9PgvA4NFgt+fYg8ojw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - } - }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -13884,24 +8457,14 @@ "node": ">=8" } }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "node_modules/iron-webcrypto": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz", + "integrity": "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==", "dev": true, "license": "MIT", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/ipaddr.js": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.3.0.tgz", - "integrity": "sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10" + "funding": { + "url": "https://github.com/sponsors/brc-dd" } }, "node_modules/is-alphabetical": { @@ -13937,19 +8500,6 @@ "dev": true, "license": "MIT" }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/is-builtin-module": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-5.0.0.tgz", @@ -13966,51 +8516,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-ci": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ci-info": "^3.2.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-ci/node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-decimal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", @@ -14023,31 +8528,21 @@ } }, "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", "dev": true, "license": "MIT", "bin": { "is-docker": "cli.js" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -14059,13 +8554,16 @@ } }, "node_modules/is-fullwidth-code-point": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", "dev": true, "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.1" + }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -14124,39 +8622,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-inside-container/node_modules/is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "dev": true, - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-interactive": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", @@ -14166,32 +8631,6 @@ "node": ">=8" } }, - "node_modules/is-network-error": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.3.0.tgz", - "integrity": "sha512-6oIwpsgRfnDiyEDLMay/GqCl3HoAtH5+RUKW29gYkL0QA+ipzpDLA16yQs7/RHCSu+BwgbJaOUqa4A99qNVQVw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-npm": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.1.0.tgz", - "integrity": "sha512-O2z4/kNgyjhQwVR1Wpkbfc19JIhggF97NZNCpWTnjH7kVcZMUrnut9XSN7txI7VdyIYk5ZatOq3zvSuWpU8hoA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -14202,26 +8641,6 @@ "node": ">=0.12.0" } }, - "node_modules/is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/is-plain-obj": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", @@ -14234,29 +8653,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "license": "MIT", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -14270,13 +8666,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true, - "license": "MIT" - }, "node_modules/is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", @@ -14290,32 +8679,25 @@ } }, "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", "dev": true, "license": "MIT", "dependencies": { - "is-docker": "^2.0.0" + "is-inside-container": "^1.0.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/is-yarn-global": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz", - "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true, "license": "MIT" }, @@ -14325,16 +8707,6 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "license": "ISC" }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", @@ -14406,6 +8778,13 @@ "node": ">=8" } }, + "node_modules/istanbul-reports/node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, "node_modules/jackspeak": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", @@ -14422,16 +8801,16 @@ } }, "node_modules/jest": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest/-/jest-30.0.5.tgz", - "integrity": "sha512-y2mfcJywuTUkvLm2Lp1/pFX8kTgMO5yyQGq/Sk/n2mN7XWYp4JsCZ/QXW34M8YScgk8bPZlREH04f6blPnoHnQ==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-30.2.0.tgz", + "integrity": "sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A==", "dev": true, "license": "MIT", "dependencies": { - "@jest/core": "30.0.5", - "@jest/types": "30.0.5", + "@jest/core": "30.2.0", + "@jest/types": "30.2.0", "import-local": "^3.2.0", - "jest-cli": "30.0.5" + "jest-cli": "30.2.0" }, "bin": { "jest": "bin/jest.js" @@ -14449,44 +8828,73 @@ } }, "node_modules/jest-changed-files": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-30.0.5.tgz", - "integrity": "sha512-bGl2Ntdx0eAwXuGpdLdVYVr5YQHnSZlQ0y9HVDu565lCUAe9sj6JOtBbMmBBikGIegne9piDDIOeiLVoqTkz4A==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-30.2.0.tgz", + "integrity": "sha512-L8lR1ChrRnSdfeOvTrwZMlnWV8G/LLjQ0nG9MBclwWZidA2N5FviRki0Bvh20WRMOX31/JYvzdqTJrk5oBdydQ==", "dev": true, "license": "MIT", "dependencies": { "execa": "^5.1.1", - "jest-util": "30.0.5", + "jest-util": "30.2.0", "p-limit": "^3.1.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/jest-circus": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-30.0.5.tgz", - "integrity": "sha512-h/sjXEs4GS+NFFfqBDYT7y5Msfxh04EwWLhQi0F8kuWpe+J/7tICSlswU8qvBqumR3kFgHbfu7vU6qruWWBPug==", + "node_modules/jest-changed-files/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "30.0.5", - "@jest/expect": "30.0.5", - "@jest/test-result": "30.0.5", - "@jest/types": "30.0.5", + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-changed-files/node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-circus": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-30.2.0.tgz", + "integrity": "sha512-Fh0096NC3ZkFx05EP2OXCxJAREVxj1BcW/i6EWqqymcgYKWjyyDpral3fMxVcHXg6oZM7iULer9wGRFvfpl+Tg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.2.0", + "@jest/expect": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/types": "30.2.0", "@types/node": "*", "chalk": "^4.1.2", "co": "^4.6.0", "dedent": "^1.6.0", "is-generator-fn": "^2.1.0", - "jest-each": "30.0.5", - "jest-matcher-utils": "30.0.5", - "jest-message-util": "30.0.5", - "jest-runtime": "30.0.5", - "jest-snapshot": "30.0.5", - "jest-util": "30.0.5", + "jest-each": "30.2.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-runtime": "30.2.0", + "jest-snapshot": "30.2.0", + "jest-util": "30.2.0", "p-limit": "^3.1.0", - "pretty-format": "30.0.5", + "pretty-format": "30.2.0", "pure-rand": "^7.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.6" @@ -14495,22 +8903,51 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/jest-cli": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-30.0.5.tgz", - "integrity": "sha512-Sa45PGMkBZzF94HMrlX4kUyPOwUpdZasaliKN3mifvDmkhLYqLLg8HQTzn6gq7vJGahFYMQjXgyJWfYImKZzOw==", + "node_modules/jest-circus/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/core": "30.0.5", - "@jest/test-result": "30.0.5", - "@jest/types": "30.0.5", + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-circus/node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-cli": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-30.2.0.tgz", + "integrity": "sha512-Os9ukIvADX/A9sLt6Zse3+nmHtHaE6hqOsjQtNiugFTbKRHYIYtZXNGNK9NChseXy7djFPjndX1tL0sCTlfpAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/types": "30.2.0", "chalk": "^4.1.2", "exit-x": "^0.2.2", "import-local": "^3.2.0", - "jest-config": "30.0.5", - "jest-util": "30.0.5", - "jest-validate": "30.0.5", + "jest-config": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", "yargs": "^17.7.2" }, "bin": { @@ -14529,34 +8966,34 @@ } }, "node_modules/jest-config": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-30.0.5.tgz", - "integrity": "sha512-aIVh+JNOOpzUgzUnPn5FLtyVnqc3TQHVMupYtyeURSb//iLColiMIR8TxCIDKyx9ZgjKnXGucuW68hCxgbrwmA==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-30.2.0.tgz", + "integrity": "sha512-g4WkyzFQVWHtu6uqGmQR4CQxz/CH3yDSlhzXMWzNjDx843gYjReZnMRanjRCq5XZFuQrGDxgUaiYWE8BRfVckA==", "dev": true, "license": "MIT", "dependencies": { "@babel/core": "^7.27.4", - "@jest/get-type": "30.0.1", + "@jest/get-type": "30.1.0", "@jest/pattern": "30.0.1", - "@jest/test-sequencer": "30.0.5", - "@jest/types": "30.0.5", - "babel-jest": "30.0.5", + "@jest/test-sequencer": "30.2.0", + "@jest/types": "30.2.0", + "babel-jest": "30.2.0", "chalk": "^4.1.2", "ci-info": "^4.2.0", "deepmerge": "^4.3.1", "glob": "^10.3.10", "graceful-fs": "^4.2.11", - "jest-circus": "30.0.5", - "jest-docblock": "30.0.1", - "jest-environment-node": "30.0.5", + "jest-circus": "30.2.0", + "jest-docblock": "30.2.0", + "jest-environment-node": "30.2.0", "jest-regex-util": "30.0.1", - "jest-resolve": "30.0.5", - "jest-runner": "30.0.5", - "jest-util": "30.0.5", - "jest-validate": "30.0.5", + "jest-resolve": "30.2.0", + "jest-runner": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", "micromatch": "^4.0.8", "parse-json": "^5.2.0", - "pretty-format": "30.0.5", + "pretty-format": "30.2.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -14668,25 +9105,25 @@ } }, "node_modules/jest-diff": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.0.5.tgz", - "integrity": "sha512-1UIqE9PoEKaHcIKvq2vbibrCog4Y8G0zmOxgQUVEiTqwR5hJVMCoDsN1vFvI5JvwD37hjueZ1C4l2FyGnfpE0A==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.2.0.tgz", + "integrity": "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==", "dev": true, "license": "MIT", "dependencies": { "@jest/diff-sequences": "30.0.1", - "@jest/get-type": "30.0.1", + "@jest/get-type": "30.1.0", "chalk": "^4.1.2", - "pretty-format": "30.0.5" + "pretty-format": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-docblock": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-30.0.1.tgz", - "integrity": "sha512-/vF78qn3DYphAaIc3jy4gA7XSAz167n9Bm/wn/1XhTLW7tTBIzXtCJpb/vcmc73NIIeeohCbdL94JasyXUZsGA==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-30.2.0.tgz", + "integrity": "sha512-tR/FFgZKS1CXluOQzZvNH3+0z9jXr3ldGSD8bhyuxvlVUwbeLOGynkunvlTMxchC5urrKndYiwCFC0DLVjpOCA==", "dev": true, "license": "MIT", "dependencies": { @@ -14697,56 +9134,56 @@ } }, "node_modules/jest-each": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-30.0.5.tgz", - "integrity": "sha512-dKjRsx1uZ96TVyejD3/aAWcNKy6ajMaN531CwWIsrazIqIoXI9TnnpPlkrEYku/8rkS3dh2rbH+kMOyiEIv0xQ==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-30.2.0.tgz", + "integrity": "sha512-lpWlJlM7bCUf1mfmuqTA8+j2lNURW9eNafOy99knBM01i5CQeY5UH1vZjgT9071nDJac1M4XsbyI44oNOdhlDQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/get-type": "30.0.1", - "@jest/types": "30.0.5", + "@jest/get-type": "30.1.0", + "@jest/types": "30.2.0", "chalk": "^4.1.2", - "jest-util": "30.0.5", - "pretty-format": "30.0.5" + "jest-util": "30.2.0", + "pretty-format": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-environment-node": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-30.0.5.tgz", - "integrity": "sha512-ppYizXdLMSvciGsRsMEnv/5EFpvOdXBaXRBzFUDPWrsfmog4kYrOGWXarLllz6AXan6ZAA/kYokgDWuos1IKDA==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-30.2.0.tgz", + "integrity": "sha512-ElU8v92QJ9UrYsKrxDIKCxu6PfNj4Hdcktcn0JX12zqNdqWHB0N+hwOnnBBXvjLd2vApZtuLUGs1QSY+MsXoNA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "30.0.5", - "@jest/fake-timers": "30.0.5", - "@jest/types": "30.0.5", + "@jest/environment": "30.2.0", + "@jest/fake-timers": "30.2.0", + "@jest/types": "30.2.0", "@types/node": "*", - "jest-mock": "30.0.5", - "jest-util": "30.0.5", - "jest-validate": "30.0.5" + "jest-mock": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-haste-map": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-30.0.5.tgz", - "integrity": "sha512-dkmlWNlsTSR0nH3nRfW5BKbqHefLZv0/6LCccG0xFCTWcJu8TuEwG+5Cm75iBfjVoockmO6J35o5gxtFSn5xeg==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-30.2.0.tgz", + "integrity": "sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.0.5", + "@jest/types": "30.2.0", "@types/node": "*", "anymatch": "^3.1.3", "fb-watchman": "^2.0.2", "graceful-fs": "^4.2.11", "jest-regex-util": "30.0.1", - "jest-util": "30.0.5", - "jest-worker": "30.0.5", + "jest-util": "30.2.0", + "jest-worker": "30.2.0", "micromatch": "^4.0.8", "walker": "^1.0.8" }, @@ -14758,49 +9195,49 @@ } }, "node_modules/jest-leak-detector": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-30.0.5.tgz", - "integrity": "sha512-3Uxr5uP8jmHMcsOtYMRB/zf1gXN3yUIc+iPorhNETG54gErFIiUhLvyY/OggYpSMOEYqsmRxmuU4ZOoX5jpRFg==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-30.2.0.tgz", + "integrity": "sha512-M6jKAjyzjHG0SrQgwhgZGy9hFazcudwCNovY/9HPIicmNSBuockPSedAP9vlPK6ONFJ1zfyH/M2/YYJxOz5cdQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/get-type": "30.0.1", - "pretty-format": "30.0.5" + "@jest/get-type": "30.1.0", + "pretty-format": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.0.5.tgz", - "integrity": "sha512-uQgGWt7GOrRLP1P7IwNWwK1WAQbq+m//ZY0yXygyfWp0rJlksMSLQAA4wYQC3b6wl3zfnchyTx+k3HZ5aPtCbQ==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.2.0.tgz", + "integrity": "sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/get-type": "30.0.1", + "@jest/get-type": "30.1.0", "chalk": "^4.1.2", - "jest-diff": "30.0.5", - "pretty-format": "30.0.5" + "jest-diff": "30.2.0", + "pretty-format": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-message-util": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.0.5.tgz", - "integrity": "sha512-NAiDOhsK3V7RU0Aa/HnrQo+E4JlbarbmI3q6Pi4KcxicdtjV82gcIUrejOtczChtVQR4kddu1E1EJlW6EN9IyA==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.2.0.tgz", + "integrity": "sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@jest/types": "30.0.5", + "@jest/types": "30.2.0", "@types/stack-utils": "^2.0.3", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", "micromatch": "^4.0.8", - "pretty-format": "30.0.5", + "pretty-format": "30.2.0", "slash": "^3.0.0", "stack-utils": "^2.0.6" }, @@ -14809,15 +9246,15 @@ } }, "node_modules/jest-mock": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.0.5.tgz", - "integrity": "sha512-Od7TyasAAQX/6S+QCbN6vZoWOMwlTtzzGuxJku1GhGanAjz9y+QsQkpScDmETvdc9aSXyJ/Op4rhpMYBWW91wQ==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.2.0.tgz", + "integrity": "sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.0.5", + "@jest/types": "30.2.0", "@types/node": "*", - "jest-util": "30.0.5" + "jest-util": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" @@ -14852,18 +9289,18 @@ } }, "node_modules/jest-resolve": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-30.0.5.tgz", - "integrity": "sha512-d+DjBQ1tIhdz91B79mywH5yYu76bZuE96sSbxj8MkjWVx5WNdt1deEFRONVL4UkKLSrAbMkdhb24XN691yDRHg==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-30.2.0.tgz", + "integrity": "sha512-TCrHSxPlx3tBY3hWNtRQKbtgLhsXa1WmbJEqBlTBrGafd5fiQFByy2GNCEoGR+Tns8d15GaL9cxEzKOO3GEb2A==", "dev": true, "license": "MIT", "dependencies": { "chalk": "^4.1.2", "graceful-fs": "^4.2.11", - "jest-haste-map": "30.0.5", + "jest-haste-map": "30.2.0", "jest-pnp-resolver": "^1.2.3", - "jest-util": "30.0.5", - "jest-validate": "30.0.5", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", "slash": "^3.0.0", "unrs-resolver": "^1.7.11" }, @@ -14872,46 +9309,46 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-30.0.5.tgz", - "integrity": "sha512-/xMvBR4MpwkrHW4ikZIWRttBBRZgWK4d6xt3xW1iRDSKt4tXzYkMkyPfBnSCgv96cpkrctfXs6gexeqMYqdEpw==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-30.2.0.tgz", + "integrity": "sha512-xTOIGug/0RmIe3mmCqCT95yO0vj6JURrn1TKWlNbhiAefJRWINNPgwVkrVgt/YaerPzY3iItufd80v3lOrFJ2w==", "dev": true, "license": "MIT", "dependencies": { "jest-regex-util": "30.0.1", - "jest-snapshot": "30.0.5" + "jest-snapshot": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-runner": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-30.0.5.tgz", - "integrity": "sha512-JcCOucZmgp+YuGgLAXHNy7ualBx4wYSgJVWrYMRBnb79j9PD0Jxh0EHvR5Cx/r0Ce+ZBC4hCdz2AzFFLl9hCiw==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-30.2.0.tgz", + "integrity": "sha512-PqvZ2B2XEyPEbclp+gV6KO/F1FIFSbIwewRgmROCMBo/aZ6J1w8Qypoj2pEOcg3G2HzLlaP6VUtvwCI8dM3oqQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/console": "30.0.5", - "@jest/environment": "30.0.5", - "@jest/test-result": "30.0.5", - "@jest/transform": "30.0.5", - "@jest/types": "30.0.5", + "@jest/console": "30.2.0", + "@jest/environment": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", "@types/node": "*", "chalk": "^4.1.2", "emittery": "^0.13.1", "exit-x": "^0.2.2", "graceful-fs": "^4.2.11", - "jest-docblock": "30.0.1", - "jest-environment-node": "30.0.5", - "jest-haste-map": "30.0.5", - "jest-leak-detector": "30.0.5", - "jest-message-util": "30.0.5", - "jest-resolve": "30.0.5", - "jest-runtime": "30.0.5", - "jest-util": "30.0.5", - "jest-watcher": "30.0.5", - "jest-worker": "30.0.5", + "jest-docblock": "30.2.0", + "jest-environment-node": "30.2.0", + "jest-haste-map": "30.2.0", + "jest-leak-detector": "30.2.0", + "jest-message-util": "30.2.0", + "jest-resolve": "30.2.0", + "jest-runtime": "30.2.0", + "jest-util": "30.2.0", + "jest-watcher": "30.2.0", + "jest-worker": "30.2.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -14919,33 +9356,62 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/jest-runtime": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-30.0.5.tgz", - "integrity": "sha512-7oySNDkqpe4xpX5PPiJTe5vEa+Ak/NnNz2bGYZrA1ftG3RL3EFlHaUkA1Cjx+R8IhK0Vg43RML5mJedGTPNz3A==", + "node_modules/jest-runner/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "30.0.5", - "@jest/fake-timers": "30.0.5", - "@jest/globals": "30.0.5", + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-runner/node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-runtime": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-30.2.0.tgz", + "integrity": "sha512-p1+GVX/PJqTucvsmERPMgCPvQJpFt4hFbM+VN3n8TMo47decMUcJbt+rgzwrEme0MQUA/R+1de2axftTHkKckg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.2.0", + "@jest/fake-timers": "30.2.0", + "@jest/globals": "30.2.0", "@jest/source-map": "30.0.1", - "@jest/test-result": "30.0.5", - "@jest/transform": "30.0.5", - "@jest/types": "30.0.5", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", "@types/node": "*", "chalk": "^4.1.2", "cjs-module-lexer": "^2.1.0", "collect-v8-coverage": "^1.0.2", "glob": "^10.3.10", "graceful-fs": "^4.2.11", - "jest-haste-map": "30.0.5", - "jest-message-util": "30.0.5", - "jest-mock": "30.0.5", + "jest-haste-map": "30.2.0", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", "jest-regex-util": "30.0.1", - "jest-resolve": "30.0.5", - "jest-snapshot": "30.0.5", - "jest-util": "30.0.5", + "jest-resolve": "30.2.0", + "jest-snapshot": "30.2.0", + "jest-util": "30.2.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -15041,9 +9507,9 @@ } }, "node_modules/jest-snapshot": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-30.0.5.tgz", - "integrity": "sha512-T00dWU/Ek3LqTp4+DcW6PraVxjk28WY5Ua/s+3zUKSERZSNyxTqhDXCWKG5p2HAJ+crVQ3WJ2P9YVHpj1tkW+g==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-30.2.0.tgz", + "integrity": "sha512-5WEtTy2jXPFypadKNpbNkZ72puZCa6UjSr/7djeecHWOu7iYhSXSnHScT8wBz3Rn8Ena5d5RYRcsyKIeqG1IyA==", "dev": true, "license": "MIT", "dependencies": { @@ -15052,20 +9518,20 @@ "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/plugin-syntax-typescript": "^7.27.1", "@babel/types": "^7.27.3", - "@jest/expect-utils": "30.0.5", - "@jest/get-type": "30.0.1", - "@jest/snapshot-utils": "30.0.5", - "@jest/transform": "30.0.5", - "@jest/types": "30.0.5", - "babel-preset-current-node-syntax": "^1.1.0", + "@jest/expect-utils": "30.2.0", + "@jest/get-type": "30.1.0", + "@jest/snapshot-utils": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "babel-preset-current-node-syntax": "^1.2.0", "chalk": "^4.1.2", - "expect": "30.0.5", + "expect": "30.2.0", "graceful-fs": "^4.2.11", - "jest-diff": "30.0.5", - "jest-matcher-utils": "30.0.5", - "jest-message-util": "30.0.5", - "jest-util": "30.0.5", - "pretty-format": "30.0.5", + "jest-diff": "30.2.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", + "pretty-format": "30.2.0", "semver": "^7.7.2", "synckit": "^0.11.8" }, @@ -15074,13 +9540,13 @@ } }, "node_modules/jest-util": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.0.5.tgz", - "integrity": "sha512-pvyPWssDZR0FlfMxCBoc0tvM8iUEskaRFALUtGQYzVEAqisAztmy+R8LnU14KT4XA0H/a5HMVTXat1jLne010g==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.2.0.tgz", + "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.0.5", + "@jest/types": "30.2.0", "@types/node": "*", "chalk": "^4.1.2", "ci-info": "^4.2.0", @@ -15091,64 +9557,38 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/jest-util/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/jest-validate": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-30.0.5.tgz", - "integrity": "sha512-ouTm6VFHaS2boyl+k4u+Qip4TSH7Uld5tyD8psQ8abGgt2uYYB8VwVfAHWHjHc0NWmGGbwO5h0sCPOGHHevefw==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-30.2.0.tgz", + "integrity": "sha512-FBGWi7dP2hpdi8nBoWxSsLvBFewKAg0+uSQwBaof4Y4DPgBabXgpSYC5/lR7VmnIlSpASmCi/ntRWPbv7089Pw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/get-type": "30.0.1", - "@jest/types": "30.0.5", + "@jest/get-type": "30.1.0", + "@jest/types": "30.2.0", "camelcase": "^6.3.0", "chalk": "^4.1.2", "leven": "^3.1.0", - "pretty-format": "30.0.5" + "pretty-format": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/jest-watcher": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.0.5.tgz", - "integrity": "sha512-z9slj/0vOwBDBjN3L4z4ZYaA+pG56d6p3kTUhFRYGvXbXMWhXmb/FIxREZCD06DYUwDKKnj2T80+Pb71CQ0KEg==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.2.0.tgz", + "integrity": "sha512-PYxa28dxJ9g777pGm/7PrbnMeA0Jr7osHP9bS7eJy9DuAjMgdGtxgf0uKMyoIsTWAkIbUW5hSDdJ3urmgXBqxg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/test-result": "30.0.5", - "@jest/types": "30.0.5", + "@jest/test-result": "30.2.0", + "@jest/types": "30.2.0", "@types/node": "*", "ansi-escapes": "^4.3.2", "chalk": "^4.1.2", "emittery": "^0.13.1", - "jest-util": "30.0.5", + "jest-util": "30.2.0", "string-length": "^4.0.2" }, "engines": { @@ -15156,15 +9596,15 @@ } }, "node_modules/jest-worker": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.0.5.tgz", - "integrity": "sha512-ojRXsWzEP16NdUuBw/4H/zkZdHOa7MMYCk4E430l+8fELeLg/mqmMlRhjL7UNZvQrDmnovWZV4DxX03fZF48fQ==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.2.0.tgz", + "integrity": "sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g==", "dev": true, "license": "MIT", "dependencies": { "@types/node": "*", "@ungap/structured-clone": "^1.3.0", - "jest-util": "30.0.5", + "jest-util": "30.2.0", "merge-stream": "^2.0.0", "supports-color": "^8.1.1" }, @@ -15188,30 +9628,6 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/jiti": { - "version": "1.21.7", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", - "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", - "dev": true, - "license": "MIT", - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/joi": { - "version": "17.13.3", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", - "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@hapi/hoek": "^9.3.0", - "@hapi/topo": "^5.1.0", - "@sideway/address": "^4.1.5", - "@sideway/formula": "^3.0.1", - "@sideway/pinpoint": "^2.0.0" - } - }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -15258,13 +9674,6 @@ "dev": true, "license": "MIT" }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true, - "license": "(AFL-2.1 OR BSD-3-Clause)" - }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -15312,9 +9721,9 @@ } }, "node_modules/katex": { - "version": "0.16.25", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.25.tgz", - "integrity": "sha512-woHRUZ/iF23GBP1dkDQMh1QBad9dmr8/PAwNA54VrSOVYgI12MAcE14TqnDdQOdzyEonGzMepYnqBMYdsoAr8Q==", + "version": "0.16.27", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.27.tgz", + "integrity": "sha512-aeQoDkuRWSqQN6nSvVCEFvfXdqo1OQiCmmW1kc9xSdjutPv7BGO7pqY9sQRJpMOGrEdfDgF2TfRXe5eUAD2Waw==", "dev": true, "funding": [ "https://opencollective.com/katex", @@ -15348,16 +9757,6 @@ "json-buffer": "3.0.1" } }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", @@ -15368,31 +9767,14 @@ "node": ">=6" } }, - "node_modules/latest-version": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", - "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", "dev": true, "license": "MIT", - "dependencies": { - "package-json": "^8.1.0" - }, "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/launch-editor": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.12.0.tgz", - "integrity": "sha512-giOHXoOtifjdHqUamwKq6c49GzBdLjvxrd2D+Q4V6uOHopJv7p9VJxikDsQ/CBXZbEITgUqSVHXLTG3VhPP1Dg==", - "dev": true, - "license": "MIT", - "dependencies": { - "picocolors": "^1.1.1", - "shell-quote": "^1.8.3" + "node": ">= 8" } }, "node_modules/lazystream": { @@ -15408,13 +9790,6 @@ "node": ">= 0.6.3" } }, - "node_modules/lazystream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, - "license": "MIT" - }, "node_modules/lazystream/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", @@ -15472,19 +9847,6 @@ "node": ">= 0.8.0" } }, - "node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -15503,19 +9865,16 @@ } }, "node_modules/lint-staged": { - "version": "16.1.5", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.1.5.tgz", - "integrity": "sha512-uAeQQwByI6dfV7wpt/gVqg+jAPaSp8WwOA8kKC/dv1qw14oGpnpAisY65ibGHUGDUv0rYaZ8CAJZ/1U8hUvC2A==", + "version": "16.2.7", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.2.7.tgz", + "integrity": "sha512-lDIj4RnYmK7/kXMya+qJsmkRFkGolciXjrsZ6PC25GdTfWOAWetR0ZbsNXRAj1EHHImRSalc+whZFg56F5DVow==", "dev": true, "license": "MIT", "dependencies": { - "chalk": "^5.5.0", - "commander": "^14.0.0", - "debug": "^4.4.1", - "lilconfig": "^3.1.3", - "listr2": "^9.0.1", + "commander": "^14.0.2", + "listr2": "^9.0.5", "micromatch": "^4.0.8", - "nano-spawn": "^1.0.2", + "nano-spawn": "^2.0.0", "pidtree": "^0.6.0", "string-argv": "^0.3.2", "yaml": "^2.8.1" @@ -15530,27 +9889,14 @@ "url": "https://opencollective.com/lint-staged" } }, - "node_modules/lint-staged/node_modules/chalk": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.0.tgz", - "integrity": "sha512-46QrSQFyVSEyYAgQ22hQ+zDa60YHA4fBstHmtSApj1Y5vKtG27fWowW03jCk5KcbXEWPZUIR894aARCA/G1kfQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/listr2": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.2.tgz", - "integrity": "sha512-VVd7cS6W+vLJu2wmq4QmfVj14Iep7cz4r/OWNk36Aq5ZOY7G8/BfCrQFexcwB1OIxB3yERiePfE/REBjEFulag==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.5.tgz", + "integrity": "sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==", "dev": true, "license": "MIT", "dependencies": { - "cli-truncate": "^4.0.0", + "cli-truncate": "^5.0.0", "colorette": "^2.0.20", "eventemitter3": "^5.0.1", "log-update": "^6.1.0", @@ -15562,9 +9908,9 @@ } }, "node_modules/listr2/node_modules/ansi-regex": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.0.tgz", - "integrity": "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "license": "MIT", "engines": { @@ -15575,9 +9921,9 @@ } }, "node_modules/listr2/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "license": "MIT", "engines": { @@ -15588,9 +9934,9 @@ } }, "node_modules/listr2/node_modules/emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", "dev": true, "license": "MIT" }, @@ -15613,9 +9959,9 @@ } }, "node_modules/listr2/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "dev": true, "license": "MIT", "dependencies": { @@ -15629,9 +9975,9 @@ } }, "node_modules/listr2/node_modules/wrap-ansi": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "dev": true, "license": "MIT", "dependencies": { @@ -15646,35 +9992,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/loader-runner": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", - "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.11.5" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -15698,26 +10015,12 @@ "dev": true, "license": "MIT" }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true, - "license": "MIT" - }, "node_modules/lodash.iteratee": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.iteratee/-/lodash.iteratee-4.7.0.tgz", "integrity": "sha512-yv3cSQZmfpbIKo4Yo45B1taEvxjNvcpF1CEOc0Y6dEyvhPIfEJE3twDwPgWTPQubcSgXyBwBKG6wpQvWMDOf6Q==", "license": "MIT" }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true, - "license": "MIT" - }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -15725,13 +10028,6 @@ "dev": true, "license": "MIT" }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", - "dev": true, - "license": "MIT" - }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -15769,9 +10065,9 @@ } }, "node_modules/log-update/node_modules/ansi-escapes": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", - "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.2.0.tgz", + "integrity": "sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw==", "dev": true, "license": "MIT", "dependencies": { @@ -15785,9 +10081,9 @@ } }, "node_modules/log-update/node_modules/ansi-regex": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.0.tgz", - "integrity": "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "license": "MIT", "engines": { @@ -15798,9 +10094,9 @@ } }, "node_modules/log-update/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "license": "MIT", "engines": { @@ -15810,95 +10106,13 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/log-update/node_modules/cli-cursor": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", - "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", - "dev": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/log-update/node_modules/emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", "dev": true, "license": "MIT" }, - "node_modules/log-update/node_modules/is-fullwidth-code-point": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", - "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-east-asian-width": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/onetime": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", - "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-function": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/restore-cursor": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", - "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", - "dev": true, - "license": "MIT", - "dependencies": { - "onetime": "^7.0.0", - "signal-exit": "^4.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/slice-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", - "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "is-fullwidth-code-point": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, "node_modules/log-update/node_modules/string-width": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", @@ -15918,9 +10132,9 @@ } }, "node_modules/log-update/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "dev": true, "license": "MIT", "dependencies": { @@ -15934,9 +10148,9 @@ } }, "node_modules/log-update/node_modules/wrap-ansi": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "dev": true, "license": "MIT", "dependencies": { @@ -15961,42 +10175,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -16007,6 +10185,28 @@ "yallist": "^3.0.2" } }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/magicast": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.1.tgz", + "integrity": "sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "source-map-js": "^1.2.1" + } + }, "node_modules/make-dir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", @@ -16104,6 +10304,7 @@ "integrity": "sha512-p3JTemJJbkiMjXEMiFwgm0v6ym5g8K+b2oDny+6xdl300tUKySxvilJQLSea48C6OaYNmO30kH9KxpiAg5bWJw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "globby": "15.0.0", "js-yaml": "4.1.1", @@ -16136,74 +10337,20 @@ "markdownlint-cli2": ">=0.0.4" } }, - "node_modules/markdownlint-cli2/node_modules/globby": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-15.0.0.tgz", - "integrity": "sha512-oB4vkQGqlMl682wL1IlWd02tXCbquGWM4voPEI85QmNKCaw8zGTm1f1rubFgkg3Eli2PtKlFgrnmUqasbQWlkw==", + "node_modules/mdast-util-definitions": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-6.0.0.tgz", + "integrity": "sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==", "dev": true, "license": "MIT", "dependencies": { - "@sindresorhus/merge-streams": "^4.0.0", - "fast-glob": "^3.3.3", - "ignore": "^7.0.5", - "path-type": "^6.0.0", - "slash": "^5.1.0", - "unicorn-magic": "^0.3.0" - }, - "engines": { - "node": ">=20" + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/markdownlint-cli2/node_modules/path-type": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz", - "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/markdownlint-cli2/node_modules/slash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/marked": { - "version": "16.4.2", - "resolved": "https://registry.npmjs.org/marked/-/marked-16.4.2.tgz", - "integrity": "sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==", - "dev": true, - "license": "MIT", - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, "node_modules/mdast-util-directive": { @@ -16282,38 +10429,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/mdast-util-frontmatter": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz", - "integrity": "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "escape-string-regexp": "^5.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "micromark-extension-frontmatter": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-frontmatter/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/mdast-util-gfm": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", @@ -16573,9 +10688,9 @@ } }, "node_modules/mdn-data": { - "version": "2.0.30", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", + "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", "dev": true, "license": "CC0-1.0" }, @@ -16586,45 +10701,6 @@ "dev": true, "license": "MIT" }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memfs": { - "version": "4.51.1", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.51.1.tgz", - "integrity": "sha512-Eyt3XrufitN2ZL9c/uIRMyDwXanLI88h/L3MoWqNY747ha3dMR9dWqp8cRT5ntjZ0U1TNuq4U91ZXK0sMBjYOQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/json-pack": "^1.11.0", - "@jsonjoy.com/util": "^1.9.0", - "glob-to-regex.js": "^1.0.1", - "thingies": "^2.5.0", - "tree-dump": "^1.0.3", - "tslib": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -16642,16 +10718,6 @@ "node": ">= 8" } }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/micromark": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", @@ -16741,23 +10807,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/micromark-extension-frontmatter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz", - "integrity": "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==", - "dev": true, - "license": "MIT", - "dependencies": { - "fault": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/micromark-extension-gfm": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", @@ -17454,40 +11503,17 @@ "node": ">=8.6" } }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, "license": "MIT", - "bin": { - "mime": "cli.js" + "engines": { + "node": ">=8.6" }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "~1.33.0" - }, - "engines": { - "node": ">= 0.6" + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/mimic-fn": { @@ -17512,57 +11538,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mimic-response": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", - "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/mini-css-extract-plugin": { - "version": "2.9.4", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.4.tgz", - "integrity": "sha512-ZWYT7ln73Hptxqxk2DxPU9MmapXRhxkJD6tkSR04dnQxm8BGu2hzgKLugK5yySD97u/8yy7Ma7E76k9ZdvtjkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "schema-utils": "^4.0.0", - "tapable": "^2.2.1" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true, - "license": "ISC" - }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -17576,16 +11551,6 @@ "node": "*" } }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/minipass": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", @@ -17611,20 +11576,6 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, - "node_modules/multicast-dns": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", - "dev": true, - "license": "MIT", - "dependencies": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - }, - "bin": { - "multicast-dns": "cli.js" - } - }, "node_modules/mute-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", @@ -17635,9 +11586,9 @@ } }, "node_modules/nano-spawn": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nano-spawn/-/nano-spawn-1.0.2.tgz", - "integrity": "sha512-21t+ozMQDAL/UGgQVBbZ/xXvNO10++ZPuTmKRO8k9V3AClVRht49ahtDjfY8l1q6nSHOrE5ASfthzH3ol6R/hg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/nano-spawn/-/nano-spawn-2.0.0.tgz", + "integrity": "sha512-tacvGzUY5o2D8CBh2rrwxyNojUsZNU2zjNTzKQrkgGJQTbGAfArVWXSKMBokBeeg6C7OLRGUEyoFlYbfeWQIqw==", "dev": true, "license": "MIT", "engines": { @@ -17667,9 +11618,9 @@ } }, "node_modules/napi-postinstall": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.3.tgz", - "integrity": "sha512-uTp172LLXSxuSYHv/kou+f6KW3SMppU9ivthaVTXian9sOt3XM/zHYHpRZiLgQoxeWfYUnslNWQHF1+G71xcow==", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", + "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", "dev": true, "license": "MIT", "bin": { @@ -17746,60 +11697,37 @@ "node": ">=10" } }, - "node_modules/negotiator": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", - "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "node_modules/neotraverse": { + "version": "0.6.18", + "resolved": "https://registry.npmjs.org/neotraverse/-/neotraverse-0.6.18.tgz", + "integrity": "sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">= 10" } }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "node_modules/nlcst-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-4.0.0.tgz", + "integrity": "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/node-fetch-native": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz", + "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==", "dev": true, "license": "MIT" }, - "node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dev": true, - "license": "MIT", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node_modules/node-emoji": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.2.0.tgz", - "integrity": "sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sindresorhus/is": "^4.6.0", - "char-regex": "^1.0.2", - "emojilib": "^2.4.0", - "skin-tone": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/node-forge": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.3.tgz", - "integrity": "sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg==", - "dev": true, - "license": "(BSD-3-Clause OR GPL-2.0)", - "engines": { - "node": ">= 6.13.0" - } - }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -17807,6 +11735,13 @@ "dev": true, "license": "MIT" }, + "node_modules/node-mock-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/node-mock-http/-/node-mock-http-1.0.4.tgz", + "integrity": "sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==", + "dev": true, + "license": "MIT" + }, "node_modules/node-releases": { "version": "2.0.27", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", @@ -17824,19 +11759,6 @@ "node": ">=0.10.0" } }, - "node_modules/normalize-url": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.1.0.tgz", - "integrity": "sha512-X06Mfd/5aKsRHc0O0J5CUedwnPmnDtLF2+nq+KN9KSDlJHkPuh0JUviWjEWMe0SW/9TDdSLVPuk7L5gGTIA1/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", @@ -17850,13 +11772,6 @@ "node": ">=8" } }, - "node_modules/nprogress": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", - "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==", - "dev": true, - "license": "MIT" - }, "node_modules/nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", @@ -17869,130 +11784,25 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/null-loader": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/null-loader/-/null-loader-4.0.1.tgz", - "integrity": "sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==", + "node_modules/ofetch": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.5.1.tgz", + "integrity": "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==", "dev": true, "license": "MIT", "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" + "destr": "^2.0.5", + "node-fetch-native": "^1.6.7", + "ufo": "^1.6.1" } }, - "node_modules/null-loader/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", - "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0", - "has-symbols": "^1.1.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "node_modules/ohash": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", "dev": true, "license": "MIT" }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", - "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -18018,32 +11828,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "node_modules/oniguruma-parser": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.1.tgz", + "integrity": "sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/oniguruma-to-es": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.4.tgz", + "integrity": "sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA==", "dev": true, "license": "MIT", "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/opener": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", - "dev": true, - "license": "(WTFPL OR MIT)", - "bin": { - "opener": "bin/opener-bin.js" + "oniguruma-parser": "^0.12.1", + "regex": "^6.0.1", + "regex-recursion": "^6.0.2" } }, "node_modules/optionator": { @@ -18087,37 +11888,48 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", - "dev": true, + "node_modules/ora/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, "engines": { - "node": ">=12.20" + "node": ">=8" } }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "dev": true, + "node_modules/ora/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, "engines": { - "node": ">=4" + "node": ">=8" } }, + "node_modules/ora/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-6.2.0.tgz", + "integrity": "sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==", "dev": true, "license": "MIT", "dependencies": { - "yocto-queue": "^0.1.0" + "yocto-queue": "^1.1.1" }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -18139,14 +11951,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "node_modules/p-locate/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "license": "MIT", "dependencies": { - "aggregate-error": "^3.0.0" + "yocto-queue": "^0.1.0" }, "engines": { "node": ">=10" @@ -18155,59 +11967,47 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-queue": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", - "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "node_modules/p-locate/node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, "license": "MIT", - "dependencies": { - "eventemitter3": "^4.0.4", - "p-timeout": "^3.2.0" - }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-queue/node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true, - "license": "MIT" - }, - "node_modules/p-retry": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz", - "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==", + "node_modules/p-queue": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-8.1.1.tgz", + "integrity": "sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ==", "dev": true, "license": "MIT", "dependencies": { - "@types/retry": "0.12.2", - "is-network-error": "^1.0.0", - "retry": "^0.13.1" + "eventemitter3": "^5.0.1", + "p-timeout": "^6.1.2" }, "engines": { - "node": ">=16.17" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.4.tgz", + "integrity": "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==", "dev": true, "license": "MIT", - "dependencies": { - "p-finally": "^1.0.0" - }, "engines": { - "node": ">=8" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-try": { @@ -18220,42 +12020,44 @@ "node": ">=6" } }, - "node_modules/package-json": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz", - "integrity": "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==", - "dev": true, - "license": "MIT", - "dependencies": { - "got": "^12.1.0", - "registry-auth-token": "^5.0.1", - "registry-url": "^6.0.0", - "semver": "^7.3.7" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/package-json-from-dist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", "license": "BlueOak-1.0.0" }, - "node_modules/param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "node_modules/package-manager-detector": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.6.0.tgz", + "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==", + "dev": true, + "license": "MIT" + }, + "node_modules/pagefind": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/pagefind/-/pagefind-1.4.0.tgz", + "integrity": "sha512-z2kY1mQlL4J8q5EIsQkLzQjilovKzfNVhX8De6oyE6uHpfFtyBaqUpcl/XzJC/4fjD8vBDyh1zolimIcVrCn9g==", "dev": true, "license": "MIT", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" + "bin": { + "pagefind": "lib/runner/bin.cjs" + }, + "optionalDependencies": { + "@pagefind/darwin-arm64": "1.4.0", + "@pagefind/darwin-x64": "1.4.0", + "@pagefind/freebsd-x64": "1.4.0", + "@pagefind/linux-arm64": "1.4.0", + "@pagefind/linux-x64": "1.4.0", + "@pagefind/windows-x64": "1.4.0" } }, + "node_modules/pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", + "dev": true, + "license": "MIT" + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -18315,12 +12117,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parse-numeric-range": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", - "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==", + "node_modules/parse-latin": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-7.0.0.tgz", + "integrity": "sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==", "dev": true, - "license": "ISC" + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "@types/unist": "^3.0.0", + "nlcst-to-string": "^4.0.0", + "unist-util-modify-children": "^4.0.0", + "unist-util-visit-children": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, "node_modules/parse5": { "version": "7.3.0", @@ -18335,20 +12149,6 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", - "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "domhandler": "^5.0.3", - "parse5": "^7.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, "node_modules/parse5/node_modules/entities": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", @@ -18362,27 +12162,6 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dev": true, - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -18403,13 +12182,6 @@ "node": ">=0.10.0" } }, - "node_modules/path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", - "dev": true, - "license": "(WTFPL OR MIT)" - }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -18419,17 +12191,10 @@ "node": ">=8" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, - "license": "MIT" - }, "node_modules/path-scurry": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", - "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", + "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^11.0.0", @@ -18443,34 +12208,34 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.1.0.tgz", - "integrity": "sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==", - "license": "ISC", + "version": "11.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", + "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", + "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" } }, - "node_modules/path-to-regexp": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", - "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "isarray": "0.0.1" - } - }, "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz", + "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/piccolore": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/piccolore/-/piccolore-0.1.3.tgz", + "integrity": "sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==", + "dev": true, + "license": "ISC" + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -18479,13 +12244,13 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", "engines": { - "node": ">=8.6" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" @@ -18623,1432 +12388,30 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/postcss-attribute-case-insensitive": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-7.0.1.tgz", - "integrity": "sha512-Uai+SupNSqzlschRyNx3kbCTWgY/2hcwtHEI/ej2LJWc9JJ77qKgGptd8DHwY1mXtZ7Aoh4z4yxfwMBue9eNgw==", + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", "dev": true, "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, { "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-attribute-case-insensitive/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-calc": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz", - "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.0.11", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.2.2" - } - }, - "node_modules/postcss-clamp": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", - "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=7.6.0" - }, - "peerDependencies": { - "postcss": "^8.4.6" - } - }, - "node_modules/postcss-color-functional-notation": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.12.tgz", - "integrity": "sha512-TLCW9fN5kvO/u38/uesdpbx3e8AkTYhMvDZYa9JpmImWuTE99bDQ7GU7hdOADIZsiI9/zuxfAJxny/khknp1Zw==", - "dev": true, - "funding": [ + "url": "https://opencollective.com/postcss/" + }, { "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-color-hex-alpha": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-10.0.0.tgz", - "integrity": "sha512-1kervM2cnlgPs2a8Vt/Qbe5cQ++N7rkYo/2rz2BkqJZIHQwaVuJgQH38REHrAi4uM0b1fqxMkWYmese94iMp3w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" + "url": "https://github.com/sponsors/ai" } ], "license": "MIT", "dependencies": { - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" + "postcss-selector-parser": "^6.1.1" }, "engines": { - "node": ">=18" + "node": ">=12.0" }, "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-color-rebeccapurple": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-10.0.0.tgz", - "integrity": "sha512-JFta737jSP+hdAIEhk1Vs0q0YF5P8fFcj+09pweS8ktuGuZ8pPlykHsk6mPxZ8awDl4TrcxUqJo9l1IhVr/OjQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-colormin": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.1.0.tgz", - "integrity": "sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.0", - "caniuse-api": "^3.0.0", - "colord": "^2.9.3", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-convert-values": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.1.0.tgz", - "integrity": "sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-custom-media": { - "version": "11.0.6", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-11.0.6.tgz", - "integrity": "sha512-C4lD4b7mUIw+RZhtY7qUbf4eADmb7Ey8BFA2px9jUbwg7pjTZDl4KY4bvlUV+/vXQvzQRfiGEVJyAbtOsCMInw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "@csstools/cascade-layer-name-parser": "^2.0.5", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/media-query-list-parser": "^4.0.3" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-custom-properties": { - "version": "14.0.6", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-14.0.6.tgz", - "integrity": "sha512-fTYSp3xuk4BUeVhxCSJdIPhDLpJfNakZKoiTDx7yRGCdlZrSJR7mWKVOBS4sBF+5poPQFMj2YdXx1VHItBGihQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "@csstools/cascade-layer-name-parser": "^2.0.5", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-custom-selectors": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-8.0.5.tgz", - "integrity": "sha512-9PGmckHQswiB2usSO6XMSswO2yFWVoCAuih1yl9FVcwkscLjRKjwsjM3t+NIWpSU2Jx3eOiK2+t4vVTQaoCHHg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "@csstools/cascade-layer-name-parser": "^2.0.5", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-custom-selectors/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-dir-pseudo-class": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-9.0.1.tgz", - "integrity": "sha512-tRBEK0MHYvcMUrAuYMEOa0zg9APqirBcgzi6P21OhxtJyJADo/SWBwY1CAwEohQ/6HDaa9jCjLRG7K3PVQYHEA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-dir-pseudo-class/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-discard-comments": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.2.tgz", - "integrity": "sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-discard-duplicates": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.3.tgz", - "integrity": "sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-discard-empty": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.3.tgz", - "integrity": "sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-discard-overridden": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.2.tgz", - "integrity": "sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-discard-unused": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-6.0.5.tgz", - "integrity": "sha512-wHalBlRHkaNnNwfC8z+ppX57VhvS+HWgjW508esjdaEYr3Mx7Gnn2xA4R/CKf5+Z9S5qsqC+Uzh4ueENWwCVUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.0.16" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-double-position-gradients": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-6.0.4.tgz", - "integrity": "sha512-m6IKmxo7FxSP5nF2l63QbCC3r+bWpFUWmZXZf096WxG0m7Vl1Q1+ruFOhpdDRmKrRS+S3Jtk+TVk/7z0+BVK6g==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-focus-visible": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-10.0.1.tgz", - "integrity": "sha512-U58wyjS/I1GZgjRok33aE8juW9qQgQUNwTSdxQGuShHzwuYdcklnvK/+qOWX1Q9kr7ysbraQ6ht6r+udansalA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-focus-visible/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-focus-within": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-9.0.1.tgz", - "integrity": "sha512-fzNUyS1yOYa7mOjpci/bR+u+ESvdar6hk8XNK/TRR0fiGTp2QT5N+ducP0n3rfH/m9I7H/EQU6lsa2BrgxkEjw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-focus-within/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-font-variant": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", - "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-gap-properties": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-6.0.0.tgz", - "integrity": "sha512-Om0WPjEwiM9Ru+VhfEDPZJAKWUd0mV1HmNXqp2C29z80aQ2uP9UVhLc7e3aYMIor/S5cVhoPgYQ7RtfeZpYTRw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-image-set-function": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-7.0.0.tgz", - "integrity": "sha512-QL7W7QNlZuzOwBTeXEmbVckNt1FSmhQtbMRvGGqqU4Nf4xk6KUEQhAoWuMzwbSv5jxiRiSZ5Tv7eiDB9U87znA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-lab-function": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-7.0.12.tgz", - "integrity": "sha512-tUcyRk1ZTPec3OuKFsqtRzW2Go5lehW29XA21lZ65XmzQkz43VY2tyWEC202F7W3mILOjw0voOiuxRGTsN+J9w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-loader": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.4.tgz", - "integrity": "sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A==", - "dev": true, - "license": "MIT", - "dependencies": { - "cosmiconfig": "^8.3.5", - "jiti": "^1.20.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "postcss": "^7.0.0 || ^8.0.1", - "webpack": "^5.0.0" - } - }, - "node_modules/postcss-logical": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-8.1.0.tgz", - "integrity": "sha512-pL1hXFQ2fEXNKiNiAgtfA005T9FBxky5zkX6s4GZM2D8RkVgRqz3f4g1JUoq925zXv495qk8UNldDwh8uGEDoA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-merge-idents": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-6.0.3.tgz", - "integrity": "sha512-1oIoAsODUs6IHQZkLQGO15uGEbK3EAl5wi9SS8hs45VgsxQfMnxvt+L+zIr7ifZFIH14cfAeVe2uCTa+SPRa3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssnano-utils": "^4.0.2", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-merge-longhand": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.5.tgz", - "integrity": "sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^6.1.1" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-merge-rules": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.1.1.tgz", - "integrity": "sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.0", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^4.0.2", - "postcss-selector-parser": "^6.0.16" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-minify-font-values": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.1.0.tgz", - "integrity": "sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-minify-gradients": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-6.0.3.tgz", - "integrity": "sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "colord": "^2.9.3", - "cssnano-utils": "^4.0.2", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-minify-params": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.1.0.tgz", - "integrity": "sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.0", - "cssnano-utils": "^4.0.2", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-minify-selectors": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.4.tgz", - "integrity": "sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.0.16" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", - "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", - "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", - "dev": true, - "license": "MIT", - "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^7.0.0", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-modules-scope": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", - "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", - "dev": true, - "license": "ISC", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "icss-utils": "^5.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-nesting": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-13.0.2.tgz", - "integrity": "sha512-1YCI290TX+VP0U/K/aFxzHzQWHWURL+CtHMSbex1lCdpXD1SoR2sYuxDu5aNI9lPoXpKTCggFZiDJbwylU0LEQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/selector-resolve-nested": "^3.1.0", - "@csstools/selector-specificity": "^5.0.0", - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-nesting/node_modules/@csstools/selector-resolve-nested": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.1.0.tgz", - "integrity": "sha512-mf1LEW0tJLKfWyvn5KdDrhpxHyuxpbNwTIwOYLIvsTffeyOf85j5oIzfG0yosxDgx/sswlqBnESYUcQH0vgZ0g==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss-selector-parser": "^7.0.0" - } - }, - "node_modules/postcss-nesting/node_modules/@csstools/selector-specificity": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", - "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss-selector-parser": "^7.0.0" - } - }, - "node_modules/postcss-nesting/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-normalize-charset": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.2.tgz", - "integrity": "sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-display-values": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.2.tgz", - "integrity": "sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-positions": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-6.0.2.tgz", - "integrity": "sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-repeat-style": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.2.tgz", - "integrity": "sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-string": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-6.0.2.tgz", - "integrity": "sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-timing-functions": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.2.tgz", - "integrity": "sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-unicode": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.1.0.tgz", - "integrity": "sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-url": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-6.0.2.tgz", - "integrity": "sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-whitespace": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.2.tgz", - "integrity": "sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-opacity-percentage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-3.0.0.tgz", - "integrity": "sha512-K6HGVzyxUxd/VgZdX04DCtdwWJ4NGLG212US4/LA1TLAbHgmAsTWVR86o+gGIbFtnTkfOpb9sCRBx8K7HO66qQ==", - "dev": true, - "funding": [ - { - "type": "kofi", - "url": "https://ko-fi.com/mrcgrtz" - }, - { - "type": "liberapay", - "url": "https://liberapay.com/mrcgrtz" - } - ], - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-ordered-values": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.2.tgz", - "integrity": "sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssnano-utils": "^4.0.2", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-overflow-shorthand": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-6.0.0.tgz", - "integrity": "sha512-BdDl/AbVkDjoTofzDQnwDdm/Ym6oS9KgmO7Gr+LHYjNWJ6ExORe4+3pcLQsLA9gIROMkiGVjjwZNoL/mpXHd5Q==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-page-break": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", - "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "postcss": "^8" - } - }, - "node_modules/postcss-place": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-10.0.0.tgz", - "integrity": "sha512-5EBrMzat2pPAxQNWYavwAfoKfYcTADJ8AXGVPcUZ2UkNloUTWzJQExgrzrDkh3EKzmAx1evfTAzF9I8NGcc+qw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-preset-env": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.5.0.tgz", - "integrity": "sha512-xgxFQPAPxeWmsgy8cR7GM1PGAL/smA5E9qU7K//D4vucS01es3M0fDujhDJn3kY8Ip7/vVYcecbe1yY+vBo3qQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "@csstools/postcss-alpha-function": "^1.0.1", - "@csstools/postcss-cascade-layers": "^5.0.2", - "@csstools/postcss-color-function": "^4.0.12", - "@csstools/postcss-color-function-display-p3-linear": "^1.0.1", - "@csstools/postcss-color-mix-function": "^3.0.12", - "@csstools/postcss-color-mix-variadic-function-arguments": "^1.0.2", - "@csstools/postcss-content-alt-text": "^2.0.8", - "@csstools/postcss-contrast-color-function": "^2.0.12", - "@csstools/postcss-exponential-functions": "^2.0.9", - "@csstools/postcss-font-format-keywords": "^4.0.0", - "@csstools/postcss-gamut-mapping": "^2.0.11", - "@csstools/postcss-gradients-interpolation-method": "^5.0.12", - "@csstools/postcss-hwb-function": "^4.0.12", - "@csstools/postcss-ic-unit": "^4.0.4", - "@csstools/postcss-initial": "^2.0.1", - "@csstools/postcss-is-pseudo-class": "^5.0.3", - "@csstools/postcss-light-dark-function": "^2.0.11", - "@csstools/postcss-logical-float-and-clear": "^3.0.0", - "@csstools/postcss-logical-overflow": "^2.0.0", - "@csstools/postcss-logical-overscroll-behavior": "^2.0.0", - "@csstools/postcss-logical-resize": "^3.0.0", - "@csstools/postcss-logical-viewport-units": "^3.0.4", - "@csstools/postcss-media-minmax": "^2.0.9", - "@csstools/postcss-media-queries-aspect-ratio-number-values": "^3.0.5", - "@csstools/postcss-nested-calc": "^4.0.0", - "@csstools/postcss-normalize-display-values": "^4.0.0", - "@csstools/postcss-oklab-function": "^4.0.12", - "@csstools/postcss-position-area-property": "^1.0.0", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/postcss-random-function": "^2.0.1", - "@csstools/postcss-relative-color-syntax": "^3.0.12", - "@csstools/postcss-scope-pseudo-class": "^4.0.1", - "@csstools/postcss-sign-functions": "^1.1.4", - "@csstools/postcss-stepped-value-functions": "^4.0.9", - "@csstools/postcss-system-ui-font-family": "^1.0.0", - "@csstools/postcss-text-decoration-shorthand": "^4.0.3", - "@csstools/postcss-trigonometric-functions": "^4.0.9", - "@csstools/postcss-unset-value": "^4.0.0", - "autoprefixer": "^10.4.22", - "browserslist": "^4.28.0", - "css-blank-pseudo": "^7.0.1", - "css-has-pseudo": "^7.0.3", - "css-prefers-color-scheme": "^10.0.0", - "cssdb": "^8.5.2", - "postcss-attribute-case-insensitive": "^7.0.1", - "postcss-clamp": "^4.1.0", - "postcss-color-functional-notation": "^7.0.12", - "postcss-color-hex-alpha": "^10.0.0", - "postcss-color-rebeccapurple": "^10.0.0", - "postcss-custom-media": "^11.0.6", - "postcss-custom-properties": "^14.0.6", - "postcss-custom-selectors": "^8.0.5", - "postcss-dir-pseudo-class": "^9.0.1", - "postcss-double-position-gradients": "^6.0.4", - "postcss-focus-visible": "^10.0.1", - "postcss-focus-within": "^9.0.1", - "postcss-font-variant": "^5.0.0", - "postcss-gap-properties": "^6.0.0", - "postcss-image-set-function": "^7.0.0", - "postcss-lab-function": "^7.0.12", - "postcss-logical": "^8.1.0", - "postcss-nesting": "^13.0.2", - "postcss-opacity-percentage": "^3.0.0", - "postcss-overflow-shorthand": "^6.0.0", - "postcss-page-break": "^3.0.4", - "postcss-place": "^10.0.0", - "postcss-pseudo-class-any-link": "^10.0.1", - "postcss-replace-overflow-wrap": "^4.0.0", - "postcss-selector-not": "^8.0.1" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-pseudo-class-any-link": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-10.0.1.tgz", - "integrity": "sha512-3el9rXlBOqTFaMFkWDOkHUTQekFIYnaQY55Rsp8As8QQkpiSgIYEcF/6Ond93oHiDsGb4kad8zjt+NPlOC1H0Q==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-pseudo-class-any-link/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-reduce-idents": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-6.0.3.tgz", - "integrity": "sha512-G3yCqZDpsNPoQgbDUy3T0E6hqOQ5xigUtBQyrmq3tn2GxlyiL0yyl7H+T8ulQR6kOcHJ9t7/9H4/R2tv8tJbMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-reduce-initial": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.1.0.tgz", - "integrity": "sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.0", - "caniuse-api": "^3.0.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-reduce-transforms": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.2.tgz", - "integrity": "sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-replace-overflow-wrap": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", - "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "postcss": "^8.0.3" - } - }, - "node_modules/postcss-selector-not": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-8.0.1.tgz", - "integrity": "sha512-kmVy/5PYVb2UOhy0+LqUYAhKj7DUGDpSWa5LZqlkWJaaAV+dxxsOG3+St0yNLu6vsKD7Dmqx+nWQt0iil89+WA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-selector-not/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" + "postcss": "^8.2.14" } }, "node_modules/postcss-selector-parser": { @@ -20065,75 +12428,6 @@ "node": ">=4" } }, - "node_modules/postcss-sort-media-queries": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-5.2.0.tgz", - "integrity": "sha512-AZ5fDMLD8SldlAYlvi8NIqo0+Z8xnXU2ia0jxmuhxAU+Lqt9K+AlmLNJ/zWEnE9x+Zx3qL3+1K20ATgNOr3fAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "sort-css-media-queries": "2.2.0" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.4.23" - } - }, - "node_modules/postcss-svgo": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.3.tgz", - "integrity": "sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0", - "svgo": "^3.2.0" - }, - "engines": { - "node": "^14 || ^16 || >= 18" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-unique-selectors": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.4.tgz", - "integrity": "sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.0.16" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/postcss-zindex": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-6.0.2.tgz", - "integrity": "sha512-5BxW9l1evPB/4ZIc+2GobEBoKC+h8gPGCMi+jxsYvd2x0mjq7wazk6DrP71pStqxE9Foxh5TVnonbWpFZzXaYg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -20145,9 +12439,9 @@ } }, "node_modules/prettier": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", - "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.7.4.tgz", + "integrity": "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==", "dev": true, "license": "MIT", "peer": true, @@ -20162,13 +12456,13 @@ } }, "node_modules/prettier-plugin-packagejson": { - "version": "2.5.19", - "resolved": "https://registry.npmjs.org/prettier-plugin-packagejson/-/prettier-plugin-packagejson-2.5.19.tgz", - "integrity": "sha512-Qsqp4+jsZbKMpEGZB1UP1pxeAT8sCzne2IwnKkr+QhUe665EXUo3BAvTf1kAPCqyMv9kg3ZmO0+7eOni/C6Uag==", + "version": "2.5.20", + "resolved": "https://registry.npmjs.org/prettier-plugin-packagejson/-/prettier-plugin-packagejson-2.5.20.tgz", + "integrity": "sha512-G8cowPh+QmJJECTZlrPDKWkVVcwrFjF2rGcw546w3N8blLoc4szSs8UUPfFVxHUNLUjiru71Ah83g1lZkeK9Bw==", "dev": true, "license": "MIT", "dependencies": { - "sort-package-json": "3.4.0", + "sort-package-json": "3.5.0", "synckit": "0.11.11" }, "peerDependencies": { @@ -20180,21 +12474,10 @@ } } }, - "node_modules/pretty-error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", - "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash": "^4.17.20", - "renderkid": "^3.0.0" - } - }, "node_modules/pretty-format": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.0.5.tgz", - "integrity": "sha512-D1tKtYvByrBkFLe2wHJl2bwMJIiT8rW+XA+TiataH79/FszLQMrpGEvzUVkzPau7OCO0Qnrhpe87PqtOAIB8Yw==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", + "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", "dev": true, "license": "MIT", "dependencies": { @@ -20219,30 +12502,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/pretty-time": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", - "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/prism-react-renderer": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.4.1.tgz", - "integrity": "sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/prismjs": "^1.26.0", - "clsx": "^2.0.0" - }, - "peerDependencies": { - "react": ">=16.0.0" - } - }, "node_modules/prismjs": { "version": "1.30.0", "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", @@ -20284,25 +12543,6 @@ "node": ">= 6" } }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true, - "license": "MIT" - }, "node_modules/property-information": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", @@ -20314,37 +12554,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", - "dev": true, - "license": "ISC" - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-addr/node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -20365,22 +12574,6 @@ "node": ">=6" } }, - "node_modules/pupa": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.3.0.tgz", - "integrity": "sha512-LjgDO2zPtoXP2wJpDjZrGdojii1uqO0cnwKoIoUzkfS98HDmbeiGmYiXo3lXeFlq2xvne1QFQhwYXSUCLKtEuA==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-goat": "^4.0.0" - }, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/pure-rand": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-7.0.1.tgz", @@ -20398,22 +12591,6 @@ ], "license": "MIT" }, - "node_modules/qs": { - "version": "6.14.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", - "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -20435,166 +12612,13 @@ ], "license": "MIT" }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", - "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "~3.1.2", - "http-errors": "~2.0.1", - "iconv-lite": "~0.4.24", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-body/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-body/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true, - "license": "ISC" - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" - }, - "peerDependencies": { - "react": "^18.3.1" - } - }, - "node_modules/react-fast-compare": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", - "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==", + "node_modules/radix3": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz", + "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==", "dev": true, "license": "MIT" }, - "node_modules/react-helmet-async": { - "name": "@slorber/react-helmet-async", - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@slorber/react-helmet-async/-/react-helmet-async-1.3.0.tgz", - "integrity": "sha512-e9/OK8VhwUSc67diWI8Rb3I0YgI9/SBQtnhe9aEuK6MhZm7ntZZimXgwXnd8W96YTmSOb9M4d8LwhRZyhWr/1A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime": "^7.12.5", - "invariant": "^2.2.4", - "prop-types": "^15.7.2", - "react-fast-compare": "^3.2.0", - "shallowequal": "^1.1.0" - }, - "peerDependencies": { - "react": "^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, "node_modules/react-is": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", @@ -20602,125 +12626,46 @@ "dev": true, "license": "MIT" }, - "node_modules/react-json-view-lite": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-2.5.0.tgz", - "integrity": "sha512-tk7o7QG9oYyELWHL8xiMQ8x4WzjCzbWNyig3uexmkLb54r8jO0yH3WCWx8UZS0c49eSA4QUmG5caiRJ8fAn58g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/react-loadable": { - "name": "@docusaurus/react-loadable", - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", - "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/react": "*" - }, - "peerDependencies": { - "react": "*" - } - }, - "node_modules/react-loadable-ssr-addon-v5-slorber": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz", - "integrity": "sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.10.3" - }, - "engines": { - "node": ">=10.13.0" - }, - "peerDependencies": { - "react-loadable": "*", - "webpack": ">=4.41.1 || 5.x" - } - }, - "node_modules/react-router": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", - "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.12.13", - "history": "^4.9.0", - "hoist-non-react-statics": "^3.1.0", - "loose-envify": "^1.3.1", - "path-to-regexp": "^1.7.0", - "prop-types": "^15.6.2", - "react-is": "^16.6.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" - }, - "peerDependencies": { - "react": ">=15" - } - }, - "node_modules/react-router-config": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz", - "integrity": "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.1.2" - }, - "peerDependencies": { - "react": ">=15", - "react-router": ">=5" - } - }, - "node_modules/react-router-dom": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", - "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.13", - "history": "^4.9.0", - "loose-envify": "^1.3.1", - "prop-types": "^15.6.2", - "react-router": "5.3.4", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" - }, - "peerDependencies": { - "react": ">=15" - } - }, - "node_modules/react-router/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true, - "license": "MIT" - }, "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "dev": true, "license": "MIT", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" }, "engines": { - "node": ">= 6" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/readable-stream/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, "node_modules/readdir-glob": { @@ -20757,16 +12702,17 @@ } }, "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "dev": true, "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, "engines": { - "node": ">=8.10.0" + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, "node_modules/recma-build-jsx": { @@ -20840,26 +12786,33 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true, - "license": "MIT" - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", - "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", + "node_modules/regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", + "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", "dev": true, "license": "MIT", "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" + "regex-utilities": "^2.3.0" } }, + "node_modules/regex-recursion": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", + "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", + "dev": true, + "license": "MIT" + }, "node_modules/regexp-tree": { "version": "0.1.27", "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", @@ -20870,73 +12823,6 @@ "regexp-tree": "bin/regexp-tree" } }, - "node_modules/regexpu-core": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", - "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", - "dev": true, - "license": "MIT", - "dependencies": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.2.2", - "regjsgen": "^0.8.0", - "regjsparser": "^0.13.0", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.2.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regexpu-core/node_modules/regjsparser": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz", - "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "jsesc": "~3.1.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/registry-auth-token": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.1.0.tgz", - "integrity": "sha512-GdekYuwLXLxMuFTwAPg5UKGLW/UXzQrZvH/Zj791BQif5T05T0RsaLfHc9q3ZOKi7n+BoprPD9mJ0O0k4xzUlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@pnpm/npm-conf": "^2.1.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/registry-url": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", - "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "rc": "1.2.8" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", - "dev": true, - "license": "MIT" - }, "node_modules/regjsparser": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", @@ -20963,6 +12849,64 @@ "node": ">=6" } }, + "node_modules/rehype": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/rehype/-/rehype-13.0.2.tgz", + "integrity": "sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "rehype-parse": "^9.0.0", + "rehype-stringify": "^10.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-expressive-code": { + "version": "0.41.5", + "resolved": "https://registry.npmjs.org/rehype-expressive-code/-/rehype-expressive-code-0.41.5.tgz", + "integrity": "sha512-SzKJyu7heDpkt+XE/AqeWsYMSMocE/5mpJXD6CMgstqJHSE9bxGNcLp3zL9Wne3M5iBsS4GJyOD2syV77kRveA==", + "dev": true, + "license": "MIT", + "dependencies": { + "expressive-code": "^0.41.5" + } + }, + "node_modules/rehype-format": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/rehype-format/-/rehype-format-5.0.1.tgz", + "integrity": "sha512-zvmVru9uB0josBVpr946OR8ui7nJEdzZobwLOOqHb/OOD88W0Vk2SqLwoVOj0fM6IPCCO6TaV9CvQvJMWwukFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-format": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-parse": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-9.0.1.tgz", + "integrity": "sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-from-html": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/rehype-raw": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", @@ -20995,14 +12939,20 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "node_modules/rehype-stringify": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-10.0.1.tgz", + "integrity": "sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.10" + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-to-html": "^9.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, "node_modules/remark-directive": { @@ -21042,40 +12992,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/remark-emoji": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-4.0.1.tgz", - "integrity": "sha512-fHdvsTR1dHkWKev9eNyhTo4EFwbUvJ8ka9SgeWkMPYFX4WoI7ViVBms3PjlQYgw5TLvNQso3GUB/b/8t3yo+dg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.2", - "emoticon": "^4.0.1", - "mdast-util-find-and-replace": "^3.0.1", - "node-emoji": "^2.1.0", - "unified": "^11.0.4" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/remark-frontmatter": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-5.0.0.tgz", - "integrity": "sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-frontmatter": "^2.0.0", - "micromark-extension-frontmatter": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/remark-gfm": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", @@ -21144,6 +13060,22 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/remark-smartypants": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/remark-smartypants/-/remark-smartypants-3.0.2.tgz", + "integrity": "sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==", + "dev": true, + "license": "MIT", + "dependencies": { + "retext": "^9.0.0", + "retext-smartypants": "^6.0.0", + "unified": "^11.0.4", + "unist-util-visit": "^5.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/remark-stringify": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", @@ -21159,123 +13091,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/renderkid": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", - "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", - "dev": true, - "license": "MIT", - "dependencies": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" - } - }, - "node_modules/renderkid/node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/renderkid/node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dev": true, - "license": "MIT", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true, - "license": "BSD-2-Clause", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -21286,60 +13101,6 @@ "node": ">=0.10.0" } }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-like": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", - "integrity": "sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/resolve": { - "version": "1.22.11", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true, - "license": "MIT" - }, "node_modules/resolve-cwd": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", @@ -21373,13 +13134,6 @@ "node": ">=4" } }, - "node_modules/resolve-pathname": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", - "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==", - "dev": true, - "license": "MIT" - }, "node_modules/resolve-pkg-maps": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", @@ -21390,49 +13144,109 @@ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, - "node_modules/responselike": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", - "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", "dev": true, "license": "MIT", "dependencies": { - "lowercase-keys": "^3.0.0" + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" }, "engines": { - "node": ">=14.16" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/restore-cursor/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" - }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "node_modules/restore-cursor/node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", "dev": true, "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, "engines": { - "node": ">= 4" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restructure": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/restructure/-/restructure-3.0.2.tgz", + "integrity": "sha512-gSfoiOEA0VPE6Tukkrr7I0RBdE0s7H1eFCDBk05l1KIQT1UIKNc5JZy6jdyW6eYH3aR3g5b3PuL77rq0hvwtAw==", + "dev": true, + "license": "MIT" + }, + "node_modules/retext": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/retext/-/retext-9.0.0.tgz", + "integrity": "sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "retext-latin": "^4.0.0", + "retext-stringify": "^4.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-latin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/retext-latin/-/retext-latin-4.0.0.tgz", + "integrity": "sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "parse-latin": "^7.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-smartypants": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/retext-smartypants/-/retext-smartypants-6.2.0.tgz", + "integrity": "sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "nlcst-to-string": "^4.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-stringify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/retext-stringify/-/retext-stringify-4.0.0.tgz", + "integrity": "sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "nlcst-to-string": "^4.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, "node_modules/reusify": { @@ -21453,36 +13267,47 @@ "dev": true, "license": "MIT" }, - "node_modules/rtlcss": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz", - "integrity": "sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig==", + "node_modules/rollup": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.54.0.tgz", + "integrity": "sha512-3nk8Y3a9Ea8szgKhinMlGMhGMw89mqule3KWczxhIzqudyHdCIOHw8WJlj/r329fACjKLEh13ZSk7oE22kyeIw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0", - "postcss": "^8.4.21", - "strip-json-comments": "^3.1.1" + "@types/estree": "1.0.8" }, "bin": { - "rtlcss": "bin/rtlcss.js" + "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/run-applescript": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", - "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" + "node": ">=18.0.0", + "npm": ">=8.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.54.0", + "@rollup/rollup-android-arm64": "4.54.0", + "@rollup/rollup-darwin-arm64": "4.54.0", + "@rollup/rollup-darwin-x64": "4.54.0", + "@rollup/rollup-freebsd-arm64": "4.54.0", + "@rollup/rollup-freebsd-x64": "4.54.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.54.0", + "@rollup/rollup-linux-arm-musleabihf": "4.54.0", + "@rollup/rollup-linux-arm64-gnu": "4.54.0", + "@rollup/rollup-linux-arm64-musl": "4.54.0", + "@rollup/rollup-linux-loong64-gnu": "4.54.0", + "@rollup/rollup-linux-ppc64-gnu": "4.54.0", + "@rollup/rollup-linux-riscv64-gnu": "4.54.0", + "@rollup/rollup-linux-riscv64-musl": "4.54.0", + "@rollup/rollup-linux-s390x-gnu": "4.54.0", + "@rollup/rollup-linux-x64-gnu": "4.54.0", + "@rollup/rollup-linux-x64-musl": "4.54.0", + "@rollup/rollup-openharmony-arm64": "4.54.0", + "@rollup/rollup-win32-arm64-msvc": "4.54.0", + "@rollup/rollup-win32-ia32-msvc": "4.54.0", + "@rollup/rollup-win32-x64-gnu": "4.54.0", + "@rollup/rollup-win32-x64-msvc": "4.54.0", + "fsevents": "~2.3.2" } }, "node_modules/run-async": { @@ -21554,107 +13379,10 @@ "license": "MIT" }, "node_modules/sax": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", - "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", - "license": "ISC" - }, - "node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/schema-dts": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/schema-dts/-/schema-dts-1.1.5.tgz", - "integrity": "sha512-RJr9EaCmsLzBX2NDiO5Z3ux2BVosNZN5jo0gWgsyKvxKIUL5R3swNvoorulAeL9kLB0iTSX7V6aokhla2m7xbg==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/schema-utils": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", - "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/schema-utils/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/schema-utils/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/schema-utils/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "license": "MIT" - }, - "node_modules/search-insights": { - "version": "2.17.3", - "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", - "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/section-matter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", - "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "extend-shallow": "^2.0.1", - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=4" - } + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.3.tgz", + "integrity": "sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ==", + "license": "BlueOak-1.0.0" }, "node_modules/secure-keys": { "version": "1.0.0", @@ -21663,31 +13391,10 @@ "dev": true, "license": "MIT" }, - "node_modules/select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", - "dev": true, - "license": "MIT" - }, - "node_modules/selfsigned": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", - "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node-forge": "^1.3.0", - "node-forge": "^1" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -21696,254 +13403,46 @@ "node": ">=10" } }, - "node_modules/semver-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", - "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", + "node_modules/sharp": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", + "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", "dev": true, - "license": "MIT", + "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "semver": "^7.3.5" + "color": "^4.2.3", + "detect-libc": "^2.0.3", + "semver": "^7.6.3" }, "engines": { - "node": ">=12" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/send": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", - "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "~0.5.2", - "http-errors": "~2.0.1", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "~2.4.1", - "range-parser": "~1.2.1", - "statuses": "~2.0.2" + "url": "https://opencollective.com/libvips" }, - "engines": { - "node": ">= 0.8.0" + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.33.5", + "@img/sharp-darwin-x64": "0.33.5", + "@img/sharp-libvips-darwin-arm64": "1.0.4", + "@img/sharp-libvips-darwin-x64": "1.0.4", + "@img/sharp-libvips-linux-arm": "1.0.5", + "@img/sharp-libvips-linux-arm64": "1.0.4", + "@img/sharp-libvips-linux-s390x": "1.0.4", + "@img/sharp-libvips-linux-x64": "1.0.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", + "@img/sharp-libvips-linuxmusl-x64": "1.0.4", + "@img/sharp-linux-arm": "0.33.5", + "@img/sharp-linux-arm64": "0.33.5", + "@img/sharp-linux-s390x": "0.33.5", + "@img/sharp-linux-x64": "0.33.5", + "@img/sharp-linuxmusl-arm64": "0.33.5", + "@img/sharp-linuxmusl-x64": "0.33.5", + "@img/sharp-wasm32": "0.33.5", + "@img/sharp-win32-ia32": "0.33.5", + "@img/sharp-win32-x64": "0.33.5" } }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, - "node_modules/send/node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/serve-handler": { - "version": "6.1.6", - "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.6.tgz", - "integrity": "sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.0.0", - "content-disposition": "0.5.2", - "mime-types": "2.1.18", - "minimatch": "3.1.2", - "path-is-inside": "1.0.2", - "path-to-regexp": "3.3.0", - "range-parser": "1.2.0" - } - }, - "node_modules/serve-handler/node_modules/path-to-regexp": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz", - "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==", - "dev": true, - "license": "MIT" - }, - "node_modules/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-index/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/serve-index/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true, - "license": "ISC" - }, - "node_modules/serve-index/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, - "node_modules/serve-index/node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/serve-index/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-static": { - "version": "1.16.3", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", - "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", - "dev": true, - "license": "MIT", - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "~0.19.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true, - "license": "ISC" - }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "license": "MIT", - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shallowequal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", - "dev": true, - "license": "MIT" - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -21965,93 +13464,21 @@ "node": ">=8" } }, - "node_modules/shell-quote": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", - "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "node_modules/shiki": { + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-3.20.0.tgz", + "integrity": "sha512-kgCOlsnyWb+p0WU+01RjkCH+eBVsjL1jOwUYWv0YDWkM2/A46+LDKVs5yZCUXjJG6bj4ndFoAg5iLIIue6dulg==", "dev": true, "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "@shikijs/core": "3.20.0", + "@shikijs/engine-javascript": "3.20.0", + "@shikijs/engine-oniguruma": "3.20.0", + "@shikijs/langs": "3.20.0", + "@shikijs/themes": "3.20.0", + "@shikijs/types": "3.20.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" } }, "node_modules/signal-exit": { @@ -22066,21 +13493,23 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/sirv": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", - "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", + "node_modules/simple-swizzle": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz", + "integrity": "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==", "dev": true, "license": "MIT", "dependencies": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">= 10" + "is-arrayish": "^0.3.1" } }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz", + "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==", + "dev": true, + "license": "MIT" + }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -22089,23 +13518,23 @@ "license": "MIT" }, "node_modules/sitemap": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.2.tgz", - "integrity": "sha512-ARCqzHJ0p4gWt+j7NlU5eDlIO9+Rkr/JhPFZKKQ1l5GCus7rJH4UdrlVAh0xC/gDS/Qir2UMxqYNHtsKr2rpCw==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-8.0.2.tgz", + "integrity": "sha512-LwktpJcyZDoa0IL6KT++lQ53pbSrx2c9ge41/SeLTyqy2XUNA6uR4+P9u5IVo5lPeL2arAcOKn1aZAxoYbCKlQ==", "dev": true, "license": "MIT", "dependencies": { "@types/node": "^17.0.5", "@types/sax": "^1.2.1", "arg": "^5.0.0", - "sax": "^1.2.4" + "sax": "^1.4.1" }, "bin": { "sitemap": "dist/cli.js" }, "engines": { - "node": ">=12.0.0", - "npm": ">=5.6.0" + "node": ">=14.0.0", + "npm": ">=6.0.0" } }, "node_modules/sitemap/node_modules/@types/node": { @@ -22115,19 +13544,6 @@ "dev": true, "license": "MIT" }, - "node_modules/skin-tone": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", - "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", - "dev": true, - "license": "MIT", - "dependencies": { - "unicode-emoji-modifier-base": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -22139,26 +13555,26 @@ } }, "node_modules/slice-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", + "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "license": "MIT", "engines": { @@ -22168,50 +13584,30 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/snake-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", - "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "node_modules/smol-toml": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.6.0.tgz", + "integrity": "sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw==", "dev": true, - "license": "MIT", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "node_modules/sort-css-media-queries": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.2.0.tgz", - "integrity": "sha512-0xtkGhWCC9MGt/EzgnvbbbKhqWjl1+/rncmhTh5qCpbYguXh6S/qwePfv/JQ8jePXXmqingylxoC49pCkSPIbA==", - "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "engines": { - "node": ">= 6.3.0" + "node": ">= 18" + }, + "funding": { + "url": "https://github.com/sponsors/cyyynthia" } }, "node_modules/sort-object-keys": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sort-object-keys/-/sort-object-keys-1.1.3.tgz", - "integrity": "sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/sort-object-keys/-/sort-object-keys-2.0.1.tgz", + "integrity": "sha512-R89fO+z3x7hiKPXX5P0qim+ge6Y60AjtlW+QQpRozrrNcR1lw9Pkpm5MLB56HoNvdcLHL4wbpq16OcvGpEDJIg==", "dev": true, "license": "MIT" }, "node_modules/sort-package-json": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/sort-package-json/-/sort-package-json-3.4.0.tgz", - "integrity": "sha512-97oFRRMM2/Js4oEA9LJhjyMlde+2ewpZQf53pgue27UkbEXfHJnDzHlUxQ/DWUkzqmp7DFwJp8D+wi/TYeQhpA==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/sort-package-json/-/sort-package-json-3.5.0.tgz", + "integrity": "sha512-moY4UtptUuP5sPuu9H9dp8xHNel7eP5/Kz/7+90jTvC0IOiPH2LigtRM/aSFSxreaWoToHUVUpEV4a2tAs2oKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -22220,7 +13616,7 @@ "git-hooks-list": "^4.0.0", "is-plain-obj": "^4.1.0", "semver": "^7.7.1", - "sort-object-keys": "^1.1.3", + "sort-object-keys": "^2.0.0", "tinyglobby": "^0.2.12" }, "bin": { @@ -22244,13 +13640,13 @@ } }, "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", "dev": true, "license": "BSD-3-Clause", "engines": { - "node": ">=0.10.0" + "node": ">= 12" } }, "node_modules/source-map-js": { @@ -22274,6 +13670,16 @@ "source-map": "^0.6.0" } }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/space-separated-tokens": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", @@ -22285,38 +13691,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -22324,19 +13698,6 @@ "dev": true, "license": "BSD-3-Clause" }, - "node_modules/srcset": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/srcset/-/srcset-4.0.0.tgz", - "integrity": "sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/stack-utils": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", @@ -22360,20 +13721,10 @@ "node": ">=8" } }, - "node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/std-env": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", - "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "node_modules/stream-replace-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/stream-replace-string/-/stream-replace-string-2.0.0.tgz", + "integrity": "sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==", "dev": true, "license": "MIT" }, @@ -22484,21 +13835,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/stringify-object": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "get-own-enumerable-property-symbols": "^3.0.0", - "is-obj": "^1.0.1", - "is-regexp": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -22534,16 +13870,6 @@ "node": ">=8" } }, - "node_modules/strip-bom-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", - "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", @@ -22555,14 +13881,11 @@ } }, "node_modules/strip-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", - "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.1.1.tgz", + "integrity": "sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA==", "dev": true, "license": "MIT", - "dependencies": { - "min-indent": "^1.0.1" - }, "engines": { "node": ">=12" }, @@ -22603,23 +13926,6 @@ "inline-style-parser": "0.2.7" } }, - "node_modules/stylehacks": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.1.1.tgz", - "integrity": "sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.0", - "postcss-selector-parser": "^6.0.16" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -22632,46 +13938,26 @@ "node": ">=8" } }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/svg-parser": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", - "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", - "dev": true, - "license": "MIT" - }, "node_modules/svgo": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", - "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.0.tgz", + "integrity": "sha512-VvrHQ+9uniE+Mvx3+C9IEe/lWasXCU0nXMY2kZeLrHNICuRiC8uMPyM14UEaMOFA5mhyQqEkB02VoQ16n3DLaw==", "dev": true, "license": "MIT", "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", + "commander": "^11.1.0", "css-select": "^5.1.0", - "css-tree": "^2.3.1", + "css-tree": "^3.0.1", "css-what": "^6.1.0", "csso": "^5.0.5", - "picocolors": "^1.0.0" + "picocolors": "^1.1.1", + "sax": "^1.4.1" }, "bin": { - "svgo": "bin/svgo" + "svgo": "bin/svgo.js" }, "engines": { - "node": ">=14.0.0" + "node": ">=16" }, "funding": { "type": "opencollective", @@ -22679,27 +13965,13 @@ } }, "node_modules/svgo/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", "dev": true, "license": "MIT", "engines": { - "node": ">= 10" - } - }, - "node_modules/swr": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/swr/-/swr-2.3.8.tgz", - "integrity": "sha512-gaCPRVoMq8WGDcWj9p4YWzCMPHzE0WNl6W8ADIx9c3JBEIdMkJGMzW+uzXvxHMltwcYACr9jP+32H8/hgwMR7w==", - "dev": true, - "license": "MIT", - "dependencies": { - "dequal": "^2.0.3", - "use-sync-external-store": "^1.6.0" - }, - "peerDependencies": { - "react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + "node": ">=16" } }, "node_modules/synckit": { @@ -22744,156 +14016,103 @@ "streamx": "^2.15.0" } }, - "node_modules/tar-stream/node_modules/b4a": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz", - "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==", - "dev": true, - "license": "Apache-2.0", - "peerDependencies": { - "react-native-b4a": "*" - }, - "peerDependenciesMeta": { - "react-native-b4a": { - "optional": true - } - } - }, - "node_modules/terser": { - "version": "5.44.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.1.tgz", - "integrity": "sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.15.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.16", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.16.tgz", - "integrity": "sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "jest-worker": "^27.4.5", - "schema-utils": "^4.3.0", - "serialize-javascript": "^6.0.2", - "terser": "^5.31.1" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/terser-webpack-plugin/node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/terser-webpack-plugin/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/terser/node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", + "integrity": "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==", "dev": true, "license": "ISC", "dependencies": { "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" + "glob": "^10.4.1", + "minimatch": "^9.0.4" }, "engines": { - "node": ">=8" + "node": ">=18" + } + }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" } }, "node_modules/test-exclude/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", "dev": true, "license": "ISC", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/test-exclude/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/test-exclude/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/test-exclude/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/test-exclude/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -22909,81 +14128,32 @@ "b4a": "^1.6.4" } }, - "node_modules/text-decoder/node_modules/b4a": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz", - "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==", + "node_modules/tiny-inflate": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", + "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", "dev": true, - "license": "Apache-2.0", - "peerDependencies": { - "react-native-b4a": "*" - }, - "peerDependenciesMeta": { - "react-native-b4a": { - "optional": true - } - } + "license": "MIT" }, - "node_modules/thingies": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/thingies/-/thingies-2.5.0.tgz", - "integrity": "sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "^2" - } - }, - "node_modules/throttleit": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-2.1.0.tgz", - "integrity": "sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==", + "node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", "dev": true, "license": "MIT", "engines": { "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true, - "license": "MIT" - }, - "node_modules/tiny-invariant": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", - "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", - "dev": true, - "license": "MIT" - }, - "node_modules/tiny-warning": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", - "dev": true, - "license": "MIT" - }, "node_modules/tinyglobby": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", - "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "dev": true, "license": "MIT", "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" + "fdir": "^6.5.0", + "picomatch": "^4.0.3" }, "engines": { "node": ">=12.0.0" @@ -22992,48 +14162,6 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/tinypool": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", - "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.0.0 || >=20.0.0" - } - }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -23054,43 +14182,6 @@ "node": ">=8.0" } }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/totalist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/tree-dump": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.1.0.tgz", - "integrity": "sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, "node_modules/trim-lines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", @@ -23135,25 +14226,32 @@ "typescript": ">=4.0.0" } }, - "node_modules/ts-declaration-location/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "node_modules/tsconfck": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.6.tgz", + "integrity": "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==", "dev": true, "license": "MIT", - "engines": { - "node": ">=12" + "bin": { + "tsconfck": "bin/tsconfck.js" }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "engines": { + "node": "^18 || >=20" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD", - "peer": true + "license": "0BSD" }, "node_modules/type-check": { "version": "0.4.0", @@ -23179,9 +14277,9 @@ } }, "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" @@ -23190,57 +14288,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/type-is/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/type-is/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, "node_modules/typescript": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", - "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", "peer": true, @@ -23259,65 +14310,54 @@ "dev": true, "license": "MIT" }, + "node_modules/ufo": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", + "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/ultrahtml": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ultrahtml/-/ultrahtml-1.6.0.tgz", + "integrity": "sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==", + "dev": true, + "license": "MIT" + }, + "node_modules/uncrypto": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/uncrypto/-/uncrypto-0.1.3.tgz", + "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==", + "dev": true, + "license": "MIT" + }, "node_modules/undici-types": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz", - "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", "devOptional": true, "license": "MIT" }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", - "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-emoji-modifier-base": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", - "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "node_modules/unicode-properties": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/unicode-properties/-/unicode-properties-1.4.1.tgz", + "integrity": "sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==", "dev": true, "license": "MIT", "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" + "base64-js": "^1.3.0", + "unicode-trie": "^2.0.0" } }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", - "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", + "node_modules/unicode-trie": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz", + "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", - "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" + "dependencies": { + "pako": "^0.2.5", + "tiny-inflate": "^1.0.0" } }, "node_modules/unicorn-magic": { @@ -23352,20 +14392,16 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/unique-string": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", - "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", + "node_modules/unifont": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/unifont/-/unifont-0.6.0.tgz", + "integrity": "sha512-5Fx50fFQMQL5aeHyWnZX9122sSLckcDvcfFiBf3QYeHa7a1MKJooUy52b67moi2MJYkrfo/TWY+CoLdr/w0tTA==", "dev": true, "license": "MIT", "dependencies": { - "crypto-random-string": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "css-tree": "^3.0.0", + "ofetch": "^1.4.1", + "ohash": "^2.0.0" } }, "node_modules/unist-util-find": { @@ -23383,10 +14419,25 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/unist-util-find-after": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz", + "integrity": "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/unist-util-is": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", - "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" @@ -23396,6 +14447,21 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/unist-util-modify-children": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-4.0.0.tgz", + "integrity": "sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "array-iterate": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/unist-util-position": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", @@ -23424,6 +14490,21 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/unist-util-remove-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", + "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/unist-util-select": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/unist-util-select/-/unist-util-select-5.1.0.tgz", @@ -23469,10 +14550,24 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/unist-util-visit-children": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit-children/-/unist-util-visit-children-3.0.0.tgz", + "integrity": "sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/unist-util-visit-parents": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", - "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", @@ -23492,16 +14587,6 @@ "node": ">= 10.0.0" } }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/unrs-resolver": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", @@ -23537,6 +14622,110 @@ "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" } }, + "node_modules/unstorage": { + "version": "1.17.3", + "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.3.tgz", + "integrity": "sha512-i+JYyy0DoKmQ3FximTHbGadmIYb8JEpq7lxUjnjeB702bCPum0vzo6oy5Mfu0lpqISw7hCyMW2yj4nWC8bqJ3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "^3.1.3", + "chokidar": "^4.0.3", + "destr": "^2.0.5", + "h3": "^1.15.4", + "lru-cache": "^10.4.3", + "node-fetch-native": "^1.6.7", + "ofetch": "^1.5.1", + "ufo": "^1.6.1" + }, + "peerDependencies": { + "@azure/app-configuration": "^1.8.0", + "@azure/cosmos": "^4.2.0", + "@azure/data-tables": "^13.3.0", + "@azure/identity": "^4.6.0", + "@azure/keyvault-secrets": "^4.9.0", + "@azure/storage-blob": "^12.26.0", + "@capacitor/preferences": "^6.0.3 || ^7.0.0", + "@deno/kv": ">=0.9.0", + "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", + "@planetscale/database": "^1.19.0", + "@upstash/redis": "^1.34.3", + "@vercel/blob": ">=0.27.1", + "@vercel/functions": "^2.2.12 || ^3.0.0", + "@vercel/kv": "^1.0.1", + "aws4fetch": "^1.0.20", + "db0": ">=0.2.1", + "idb-keyval": "^6.2.1", + "ioredis": "^5.4.2", + "uploadthing": "^7.4.4" + }, + "peerDependenciesMeta": { + "@azure/app-configuration": { + "optional": true + }, + "@azure/cosmos": { + "optional": true + }, + "@azure/data-tables": { + "optional": true + }, + "@azure/identity": { + "optional": true + }, + "@azure/keyvault-secrets": { + "optional": true + }, + "@azure/storage-blob": { + "optional": true + }, + "@capacitor/preferences": { + "optional": true + }, + "@deno/kv": { + "optional": true + }, + "@netlify/blobs": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@upstash/redis": { + "optional": true + }, + "@vercel/blob": { + "optional": true + }, + "@vercel/functions": { + "optional": true + }, + "@vercel/kv": { + "optional": true + }, + "aws4fetch": { + "optional": true + }, + "db0": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "ioredis": { + "optional": true + }, + "uploadthing": { + "optional": true + } + } + }, + "node_modules/unstorage/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, "node_modules/update-browserslist-db": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", @@ -23568,211 +14757,6 @@ "browserslist": ">= 4.21.0" } }, - "node_modules/update-notifier": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz", - "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boxen": "^7.0.0", - "chalk": "^5.0.1", - "configstore": "^6.0.0", - "has-yarn": "^3.0.0", - "import-lazy": "^4.0.0", - "is-ci": "^3.0.1", - "is-installed-globally": "^0.4.0", - "is-npm": "^6.0.0", - "is-yarn-global": "^0.4.0", - "latest-version": "^7.0.0", - "pupa": "^3.1.0", - "semver": "^7.3.7", - "semver-diff": "^4.0.0", - "xdg-basedir": "^5.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/yeoman/update-notifier?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/boxen": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", - "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-align": "^3.0.1", - "camelcase": "^7.0.1", - "chalk": "^5.2.0", - "cli-boxes": "^3.0.0", - "string-width": "^5.1.2", - "type-fest": "^2.13.0", - "widest-line": "^4.0.1", - "wrap-ansi": "^8.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/update-notifier/node_modules/camelcase": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", - "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/update-notifier/node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/cli-boxes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", - "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/update-notifier/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/update-notifier/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/update-notifier/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/update-notifier/node_modules/widest-line": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", - "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", - "dev": true, - "license": "MIT", - "dependencies": { - "string-width": "^5.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/update-notifier/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -23783,129 +14767,12 @@ "punycode": "^2.1.0" } }, - "node_modules/url-loader": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", - "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", - "dev": true, - "license": "MIT", - "dependencies": { - "loader-utils": "^2.0.0", - "mime-types": "^2.1.27", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "file-loader": "*", - "webpack": "^4.0.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "file-loader": { - "optional": true - } - } - }, - "node_modules/url-loader/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/url-loader/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/url-loader/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/use-sync-external-store": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", - "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "license": "MIT" }, - "node_modules/utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", - "dev": true, - "license": "MIT" - }, - "node_modules/utility-types": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", - "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/v8-to-istanbul": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", @@ -23921,23 +14788,6 @@ "node": ">=10.12.0" } }, - "node_modules/value-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", - "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==", - "dev": true, - "license": "MIT" - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/vfile": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", @@ -23981,6 +14831,102 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/vite": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", + "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vitefu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.1.tgz", + "integrity": "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==", + "dev": true, + "license": "MIT", + "workspaces": [ + "tests/deps/*", + "tests/projects/*", + "tests/projects/workspace/packages/*" + ], + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, "node_modules/walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", @@ -23991,30 +14937,6 @@ "makeerror": "1.0.12" } }, - "node_modules/watchpack": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", - "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, "node_modules/wcwidth": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", @@ -24035,416 +14957,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/webpack": { - "version": "5.104.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.104.1.tgz", - "integrity": "sha512-Qphch25abbMNtekmEGJmeRUhLDbe+QfiWTiqpKYkpCOWY64v9eyl+KRRLmqOFA2AvKPpc9DC6+u2n76tQLBoaA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/eslint-scope": "^3.7.7", - "@types/estree": "^1.0.8", - "@types/json-schema": "^7.0.15", - "@webassemblyjs/ast": "^1.14.1", - "@webassemblyjs/wasm-edit": "^1.14.1", - "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.15.0", - "acorn-import-phases": "^1.0.3", - "browserslist": "^4.28.1", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.4", - "es-module-lexer": "^2.0.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.3.1", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^4.3.3", - "tapable": "^2.3.0", - "terser-webpack-plugin": "^5.3.16", - "watchpack": "^2.4.4", - "webpack-sources": "^3.3.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-bundle-analyzer": { - "version": "4.10.2", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz", - "integrity": "sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@discoveryjs/json-ext": "0.5.7", - "acorn": "^8.0.4", - "acorn-walk": "^8.0.0", - "commander": "^7.2.0", - "debounce": "^1.2.1", - "escape-string-regexp": "^4.0.0", - "gzip-size": "^6.0.0", - "html-escaper": "^2.0.2", - "opener": "^1.5.2", - "picocolors": "^1.0.0", - "sirv": "^2.0.3", - "ws": "^7.3.1" - }, - "bin": { - "webpack-bundle-analyzer": "lib/bin/analyzer.js" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/webpack-bundle-analyzer/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/webpack-dev-middleware": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.5.tgz", - "integrity": "sha512-uxQ6YqGdE4hgDKNf7hUiPXOdtkXvBJXrfEGYSx7P7LC8hnUYGK70X6xQXUvXeNyBDDcsiQXpG2m3G9vxowaEuA==", - "dev": true, - "license": "MIT", - "dependencies": { - "colorette": "^2.0.10", - "memfs": "^4.43.1", - "mime-types": "^3.0.1", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - } - } - }, - "node_modules/webpack-dev-middleware/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/webpack-dev-middleware/node_modules/mime-types": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/webpack-dev-middleware/node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/webpack-dev-server": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.2.tgz", - "integrity": "sha512-QcQ72gh8a+7JO63TAx/6XZf/CWhgMzu5m0QirvPfGvptOusAxG12w2+aua1Jkjr7hzaWDnJ2n6JFeexMHI+Zjg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/bonjour": "^3.5.13", - "@types/connect-history-api-fallback": "^1.5.4", - "@types/express": "^4.17.21", - "@types/express-serve-static-core": "^4.17.21", - "@types/serve-index": "^1.9.4", - "@types/serve-static": "^1.15.5", - "@types/sockjs": "^0.3.36", - "@types/ws": "^8.5.10", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.2.1", - "chokidar": "^3.6.0", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^2.0.0", - "express": "^4.21.2", - "graceful-fs": "^4.2.6", - "http-proxy-middleware": "^2.0.9", - "ipaddr.js": "^2.1.0", - "launch-editor": "^2.6.1", - "open": "^10.0.3", - "p-retry": "^6.2.0", - "schema-utils": "^4.2.0", - "selfsigned": "^2.4.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^7.4.2", - "ws": "^8.18.0" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - }, - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-dev-server/node_modules/define-lazy-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/webpack-dev-server/node_modules/open": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", - "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", - "dev": true, - "license": "MIT", - "dependencies": { - "default-browser": "^5.2.1", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "wsl-utils": "^0.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.18.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/webpack-merge": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", - "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.1" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/webpack-sources": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", - "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/webpack/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/webpack/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/webpack/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/webpackbar": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-6.0.1.tgz", - "integrity": "sha512-TnErZpmuKdwWBdMoexjio3KKX6ZtoKHRVvLIU0A47R0VVBDtx3ZyOJDktgYixhoJokZTYTt1Z37OkO9pnGJa9Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-escapes": "^4.3.2", - "chalk": "^4.1.2", - "consola": "^3.2.3", - "figures": "^3.2.0", - "markdown-table": "^2.0.0", - "pretty-time": "^1.1.0", - "std-env": "^3.7.0", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=14.21.3" - }, - "peerDependencies": { - "webpack": "3 || 4 || 5" - } - }, - "node_modules/webpackbar/node_modules/consola": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", - "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, - "node_modules/webpackbar/node_modules/markdown-table": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", - "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", - "dev": true, - "license": "MIT", - "dependencies": { - "repeat-string": "^1.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -24460,6 +14972,16 @@ "node": ">= 8" } }, + "node_modules/which-pm-runs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz", + "integrity": "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/widest-line": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", @@ -24472,13 +14994,6 @@ "node": ">=8" } }, - "node_modules/wildcard": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", - "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", - "dev": true, - "license": "MIT" - }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", @@ -24545,86 +15060,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/wsl-utils": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", - "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-wsl": "^3.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/wsl-utils/node_modules/is-wsl": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", - "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-inside-container": "^1.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/xdg-basedir": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", - "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/xml-js": { - "version": "1.6.11", - "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", - "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "sax": "^1.2.4" - }, - "bin": { - "xml-js": "bin/cli.js" - } - }, "node_modules/xml2js": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", @@ -24647,6 +15082,13 @@ "node": ">=4.0" } }, + "node_modules/xxhash-wasm": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-1.1.0.tgz", + "integrity": "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==", + "dev": true, + "license": "MIT" + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -24665,21 +15107,25 @@ "license": "ISC" }, "node_modules/yaml": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", - "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", "license": "ISC", + "peer": true, "bin": { "yaml": "bin.mjs" }, "engines": { "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" } }, "node_modules/yaml-eslint-parser": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-1.3.0.tgz", - "integrity": "sha512-E/+VitOorXSLiAqtTd7Yqax0/pAS3xaYMP+AUUJGOK1OZG3rhcj9fcJOM5HJ2VrP1FrStVCWr1muTfQCdj4tAA==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-1.3.2.tgz", + "integrity": "sha512-odxVsHAkZYYglR30aPYRY4nUGJnoJ2y1ww2HDvZALo0BDETv9kWbi16J52eHs+PWRNmF4ub6nZqfVOeesOvntg==", "dev": true, "license": "MIT", "dependencies": { @@ -24722,6 +15168,37 @@ "yamllint": "dist/cli.js" } }, + "node_modules/yaml-lint/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yaml-lint/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", @@ -24752,13 +15229,42 @@ } }, "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", + "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=10" + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yocto-spinner": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/yocto-spinner/-/yocto-spinner-0.2.3.tgz", + "integrity": "sha512-sqBChb33loEnkoXte1bLg45bEBsOP9N1kzQh5JZNKj/0rik4zAPTNSAVPj3uQAdc6slYJ0Ksc403G2XgxsJQFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yoctocolors": "^2.1.1" + }, + "engines": { + "node": ">=18.19" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.2.tgz", + "integrity": "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -24791,52 +15297,10 @@ "node": ">= 14" } }, - "node_modules/zip-stream/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/zip-stream/node_modules/readable-stream": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", - "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", - "dev": true, - "license": "MIT", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, "node_modules/zod": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.12.tgz", - "integrity": "sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==", + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", "dev": true, "license": "MIT", "peer": true, @@ -24844,6 +15308,26 @@ "url": "https://github.com/sponsors/colinhacks" } }, + "node_modules/zod-to-json-schema": { + "version": "3.25.1", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.1.tgz", + "integrity": "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==", + "dev": true, + "license": "ISC", + "peerDependencies": { + "zod": "^3.25 || ^4" + } + }, + "node_modules/zod-to-ts": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/zod-to-ts/-/zod-to-ts-1.2.0.tgz", + "integrity": "sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA==", + "dev": true, + "peerDependencies": { + "typescript": "^4.9.4 || ^5.0.2", + "zod": "^3" + } + }, "node_modules/zwitch": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", diff --git a/package.json b/package.json index c7bab7f1..a7eb150f 100644 --- a/package.json +++ b/package.json @@ -27,8 +27,9 @@ "bmad:install": "node tools/cli/bmad-cli.js install", "bundle": "node tools/cli/bundlers/bundle-web.js all", "docs:build": "node tools/build-docs.js", - "docs:dev": "npm run docs:build && npm run docs:serve", - "docs:serve": "docusaurus start --config website/docusaurus.config.js --host localhost", + "docs:check-links": "node tools/check-doc-links.js", + "docs:dev": "astro dev --root website", + "docs:preview": "astro preview --root website", "flatten": "node tools/flattener/main.js", "format:check": "prettier --check \"**/*.{js,cjs,mjs,json,yaml}\"", "format:fix": "prettier --write \"**/*.{js,cjs,mjs,json,yaml}\"", @@ -84,10 +85,11 @@ "yaml": "^2.7.0" }, "devDependencies": { - "@docusaurus/core": "^3.6.0", - "@docusaurus/preset-classic": "^3.6.0", + "@astrojs/sitemap": "^3.6.0", + "@astrojs/starlight": "^0.37.0", "@eslint/js": "^9.33.0", "archiver": "^7.0.1", + "astro": "^5.16.0", "c8": "^10.1.3", "eslint": "^9.33.0", "eslint-config-prettier": "^10.1.8", @@ -100,12 +102,9 @@ "markdownlint-cli2": "^0.19.1", "prettier": "^3.5.3", "prettier-plugin-packagejson": "^2.5.19", - "prism-react-renderer": "^2.4.1", - "react": "^18.3.1", - "react-dom": "^18.3.1", + "sharp": "^0.33.5", "yaml-eslint-parser": "^1.2.3", - "yaml-lint": "^1.7.0", - "zod": "^4.1.12" + "yaml-lint": "^1.7.0" }, "engines": { "node": ">=20.0.0" diff --git a/src/modules/cis/module.yaml b/src/modules/cis/module.yaml index f03960d0..02ce7ca9 100644 --- a/src/modules/cis/module.yaml +++ b/src/modules/cis/module.yaml @@ -4,6 +4,7 @@ header: "Creative Innovation Suite (CIS) Module" subheader: "No custom configuration required - uses Core settings only" default_selected: false # This module will not be selected by default for new installations + # Variables from Core Config inserted: ## user_name ## communication_language diff --git a/tools/build-docs.js b/tools/build-docs.js index bfeda390..a5080a76 100644 --- a/tools/build-docs.js +++ b/tools/build-docs.js @@ -2,12 +2,11 @@ * BMAD Documentation Build Pipeline * * Consolidates docs from multiple sources, generates LLM-friendly files, - * creates downloadable bundles, and builds the Docusaurus site. + * creates downloadable bundles, and builds the Astro+Starlight site. * * Build outputs: - * build/consolidated/ - Merged docs from all sources * build/artifacts/ - With llms.txt, llms-full.txt, ZIPs - * build/site/ - Final Docusaurus output (deployable) + * build/site/ - Final Astro output (deployable) */ const { execSync } = require('node:child_process'); @@ -28,17 +27,17 @@ const REPO_URL = 'https://github.com/bmad-code-org/BMAD-METHOD'; const LLM_MAX_CHARS = 600_000; const LLM_WARN_CHARS = 500_000; -const MODULES = ['bmm', 'bmb', 'bmgd', 'cis']; - -// No root docs copied - only docs/ folder content goes to site -// README.md, CHANGELOG.md etc. link to GitHub -const ROOT_DOCS = []; - const LLM_EXCLUDE_PATTERNS = ['changelog', 'ide-info/', 'v4-to-v6-upgrade', 'downloads/', 'faq']; // ============================================================================= // Main Entry Point -// ============================================================================= +/** + * Orchestrates the full BMAD documentation build pipeline. + * + * Executes the high-level build steps in sequence: prints headers and paths, validates internal + * documentation links, cleans the build directory, generates artifacts from the `docs/` folder, + * builds the Astro site, and prints a final build summary. + */ async function main() { console.log(); @@ -48,13 +47,16 @@ async function main() { console.log(`Build directory: ${BUILD_DIR}`); console.log(); + // Check for broken internal links before building + checkDocLinks(); + cleanBuildDirectory(); - const consolidatedDir = consolidateDocs(); - const artifactsDir = await generateArtifacts(consolidatedDir); - const siteDir = buildDocusaurusSite(artifactsDir); + const docsDir = path.join(PROJECT_ROOT, 'docs'); + const artifactsDir = await generateArtifacts(docsDir); + const siteDir = buildAstroSite(); - printBuildSummary(consolidatedDir, artifactsDir, siteDir); + printBuildSummary(docsDir, artifactsDir, siteDir); } main().catch((error) => { @@ -64,33 +66,25 @@ main().catch((error) => { // ============================================================================= // Pipeline Stages -// ============================================================================= +/** + * Generate LLM files and downloadable bundles for the documentation pipeline. + * + * Creates the build/artifacts directory, writes `llms.txt` and `llms-full.txt` (sourced from the provided docs directory), + * and produces download ZIP bundles. + * + * @param {string} docsDir - Path to the source docs directory containing Markdown files. + * @returns {string} Path to the created artifacts directory. + */ -function consolidateDocs() { - printHeader('Consolidating documentation sources'); - - const outputDir = path.join(BUILD_DIR, 'consolidated'); - fs.mkdirSync(outputDir, { recursive: true }); - - copyMainDocs(outputDir); - copyRootDocs(outputDir); - copyModuleDocs(outputDir); - - const mdCount = countMarkdownFiles(outputDir); - console.log(); - console.log(` \u001B[32m✓\u001B[0m Consolidation complete: ${mdCount} markdown files`); - - return outputDir; -} - -async function generateArtifacts(consolidatedDir) { +async function generateArtifacts(docsDir) { printHeader('Generating LLM files and download bundles'); const outputDir = path.join(BUILD_DIR, 'artifacts'); - copyDirectory(consolidatedDir, outputDir); + fs.mkdirSync(outputDir, { recursive: true }); + // Generate LLM files reading from docs/, output to artifacts/ generateLlmsTxt(outputDir); - generateLlmsFullTxt(outputDir); + generateLlmsFullTxt(docsDir, outputDir); await generateDownloadBundles(outputDir); console.log(); @@ -99,82 +93,39 @@ async function generateArtifacts(consolidatedDir) { return outputDir; } -function buildDocusaurusSite(artifactsDir) { - printHeader('Building Docusaurus site'); +/** + * Builds the Astro + Starlight site and copies generated artifacts into the site output directory. + * + * @returns {string} The filesystem path to the built site directory (e.g., build/site). + */ +function buildAstroSite() { + printHeader('Building Astro + Starlight site'); const siteDir = path.join(BUILD_DIR, 'site'); - const mainDocs = path.join(PROJECT_ROOT, 'docs'); - const docsBackup = path.join(BUILD_DIR, 'docs-backup'); - - backupAndReplaceDocs(mainDocs, docsBackup, artifactsDir); - - try { - runDocusaurusBuild(siteDir); - } finally { - restoreDocs(mainDocs, docsBackup); - } + const artifactsDir = path.join(BUILD_DIR, 'artifacts'); + // Build Astro site (outputs to build/site via astro.config.mjs) + runAstroBuild(); copyArtifactsToSite(artifactsDir, siteDir); + // No longer needed: Inject AI agents banner into every HTML page + // injectAgentBanner(siteDir); + console.log(); - console.log(` \u001B[32m✓\u001B[0m Docusaurus build complete`); + console.log(` \u001B[32m✓\u001B[0m Astro build complete`); return siteDir; } -// ============================================================================= -// Documentation Consolidation -// ============================================================================= - -function copyMainDocs(destDir) { - console.log(' → Copying main docs...'); - const docsDir = path.join(PROJECT_ROOT, 'docs'); - // Include modules folder - docs now live in docs/modules/ instead of src/modules/*/docs/ - copyDirectory(docsDir, destDir, ['llms.txt', 'llms-full.txt'], true); -} - -function copyRootDocs(destDir) { - console.log(' → Copying root documentation files...'); - - for (const doc of ROOT_DOCS) { - const srcPath = path.join(PROJECT_ROOT, doc.src); - const destPath = path.join(destDir, doc.dest); - - if (fs.existsSync(srcPath)) { - let content = fs.readFileSync(srcPath, 'utf-8'); - - if (!content.startsWith('---')) { - content = `---\ntitle: "${doc.title}"\n---\n\n${content}`; - } - - content = transformMarkdownLinks(content); - fs.writeFileSync(destPath, content); - console.log(` ${doc.src} → ${doc.dest}`); - } - } -} - -function copyModuleDocs(destDir) { - fs.mkdirSync(path.join(destDir, 'modules'), { recursive: true }); - - for (const moduleName of MODULES) { - const srcPath = path.join(PROJECT_ROOT, 'src', 'modules', moduleName, 'docs'); - const moduleDest = path.join(destDir, 'modules', moduleName); - - if (fs.existsSync(srcPath)) { - console.log(` → Copying ${moduleName} docs...`); - copyDirectory(srcPath, moduleDest, [], false, moduleName); - const count = countMarkdownFiles(moduleDest); - console.log(` ${count} markdown files`); - } else { - console.log(` ⚠ WARNING: ${moduleName} docs not found`); - } - } -} - // ============================================================================= // LLM File Generation -// ============================================================================= +/** + * Create a concise llms.txt summary file containing project metadata, core links, and quick navigation entries for LLM consumption. + * + * Writes the file to `${outputDir}/llms.txt`. + * + * @param {string} outputDir - Destination directory where `llms.txt` will be written. + */ function generateLlmsTxt(outputDir) { console.log(' → Generating llms.txt...'); @@ -220,11 +171,18 @@ function generateLlmsTxt(outputDir) { console.log(` Generated llms.txt (${content.length.toLocaleString()} chars)`); } -function generateLlmsFullTxt(outputDir) { +/** + * Builds a consolidated llms-full.txt containing all Markdown files under docsDir wrapped in tags for LLM consumption. + * + * Writes the generated file to outputDir/llms-full.txt. Files matching LLM_EXCLUDE_PATTERNS are skipped; read errors for individual files are logged. The combined content is validated against configured size thresholds (will exit on overflow and warn if near limit). + * @param {string} docsDir - Root directory containing source Markdown files; paths in the output are relative to this directory. + * @param {string} outputDir - Directory where llms-full.txt will be written. + */ +function generateLlmsFullTxt(docsDir, outputDir) { console.log(' → Generating llms-full.txt...'); const date = new Date().toISOString().split('T')[0]; - const files = getDocsFromSidebar(); + const files = getAllMarkdownFiles(docsDir); const output = [ '# BMAD Method Documentation (Full)', @@ -244,7 +202,7 @@ function generateLlmsFullTxt(outputDir) { continue; } - const fullPath = path.join(outputDir, mdPath); + const fullPath = path.join(docsDir, mdPath); try { const content = readMarkdownContent(fullPath); output.push(``, content, '', ''); @@ -266,34 +224,35 @@ function generateLlmsFullTxt(outputDir) { ); } -function getDocsFromSidebar() { - const sidebarsPath = path.join(PROJECT_ROOT, 'website', 'sidebars.js'); +/** + * Collects all Markdown (.md) files under a directory and returns their paths relative to a base directory. + * @param {string} dir - Directory to search for Markdown files. + * @param {string} [baseDir=dir] - Base directory used to compute returned relative paths. + * @returns {string[]} An array of file paths (relative to `baseDir`) for every `.md` file found under `dir`. + */ +function getAllMarkdownFiles(dir, baseDir = dir) { + const files = []; - try { - const sidebarContent = fs.readFileSync(sidebarsPath, 'utf-8'); - const matches = sidebarContent.matchAll(/'([a-zA-Z0-9\-_/]+)'/g); - const files = []; + for (const entry of fs.readdirSync(dir, { withFileTypes: true })) { + const fullPath = path.join(dir, entry.name); - for (const match of matches) { - const docId = match[1]; - // Skip Docusaurus keywords - if (docId.includes('Sidebar') || docId === 'doc' || docId === 'category') { - continue; - } - // Skip category labels (Title Case words without slashes like 'Workflows', 'Reference') - if (!docId.includes('/') && /^[A-Z][a-z]/.test(docId)) { - continue; - } - files.push(docId + '.md'); + if (entry.isDirectory()) { + files.push(...getAllMarkdownFiles(fullPath, baseDir)); + } else if (entry.name.endsWith('.md')) { + // Return relative path from baseDir + const relativePath = path.relative(baseDir, fullPath); + files.push(relativePath); } - - return files; - } catch { - console.log(' Warning: Could not parse sidebars'); - return []; } + + return files; } +/** + * Determine whether a file path matches any configured LLM exclusion pattern. + * @param {string} filePath - The file path to test. + * @returns {boolean} `true` if the path contains any pattern from LLM_EXCLUDE_PATTERNS, `false` otherwise. + */ function shouldExcludeFromLlm(filePath) { return LLM_EXCLUDE_PATTERNS.some((pattern) => filePath.includes(pattern)); } @@ -347,6 +306,12 @@ async function generateSourcesBundle(downloadsDir) { console.log(` bmad-sources.zip (${size}M)`); } +/** + * Create a zip archive of the project's prompts modules and place it in the downloads directory. + * + * Creates bmad-prompts.zip from src/modules, excluding common unwanted paths, writes it to the provided downloads directory, and logs the resulting file size. If the modules directory does not exist, the function returns without creating a bundle. + * @param {string} downloadsDir - Destination directory where bmad-prompts.zip will be written. + */ async function generatePromptsBundle(downloadsDir) { const modulesDir = path.join(PROJECT_ROOT, 'src', 'modules'); if (!fs.existsSync(modulesDir)) return; @@ -359,39 +324,31 @@ async function generatePromptsBundle(downloadsDir) { } // ============================================================================= -// Docusaurus Build -// ============================================================================= - -function backupAndReplaceDocs(mainDocs, backupDir, artifactsDir) { - console.log(' → Preparing docs for Docusaurus...'); - - if (fs.existsSync(mainDocs)) { - copyDirectory(mainDocs, backupDir); - fs.rmSync(mainDocs, { recursive: true }); - } - - copyDirectory(artifactsDir, mainDocs, ['llms.txt', 'llms-full.txt']); - removeZipFiles(path.join(mainDocs, 'downloads')); -} - -function runDocusaurusBuild(siteDir) { - console.log(' → Running docusaurus build...'); - execSync('npx docusaurus build --config website/docusaurus.config.js --out-dir ' + siteDir, { +// Astro Build +/** + * Builds the Astro site to build/site (configured in astro.config.mjs). + */ +function runAstroBuild() { + console.log(' → Running astro build...'); + execSync('npx astro build --root website', { cwd: PROJECT_ROOT, stdio: 'inherit', + env: { + ...process.env, + NODE_OPTIONS: `${process.env.NODE_OPTIONS || ''} --disable-warning=MODULE_TYPELESS_PACKAGE_JSON`.trim(), + }, }); } -function restoreDocs(mainDocs, backupDir) { - console.log(' → Restoring original docs...'); - fs.rmSync(mainDocs, { recursive: true }); - - if (fs.existsSync(backupDir)) { - copyDirectory(backupDir, mainDocs); - fs.rmSync(backupDir, { recursive: true }); - } -} - +/** + * Copy generated artifact files into the built site directory. + * + * Copies llms.txt and llms-full.txt from the artifacts directory into the site directory. + * If a downloads subdirectory exists under artifacts, copies it into siteDir/downloads. + * + * @param {string} artifactsDir - Path to the build artifacts directory containing generated files. + * @param {string} siteDir - Path to the target site directory where artifacts should be placed. + */ function copyArtifactsToSite(artifactsDir, siteDir) { console.log(' → Copying artifacts to site...'); @@ -404,28 +361,24 @@ function copyArtifactsToSite(artifactsDir, siteDir) { } } -function removeZipFiles(dir) { - if (!fs.existsSync(dir)) return; - - for (const file of fs.readdirSync(dir)) { - if (file.endsWith('.zip')) { - fs.unlinkSync(path.join(dir, file)); - } - } -} - // ============================================================================= // Build Summary -// ============================================================================= +/** + * Prints a concise end-of-build summary and displays a sample listing of the final site directory. + * + * @param {string} docsDir - Path to the source documentation directory used for the build. + * @param {string} artifactsDir - Path to the directory containing generated artifacts (e.g., llms.txt, downloads). + * @param {string} siteDir - Path to the final built site directory whose contents will be listed. + */ -function printBuildSummary(consolidatedDir, artifactsDir, siteDir) { +function printBuildSummary(docsDir, artifactsDir, siteDir) { console.log(); printBanner('Build Complete!'); console.log(); console.log('Build artifacts:'); - console.log(` Consolidated docs: ${consolidatedDir}`); - console.log(` Generated files: ${artifactsDir}`); - console.log(` Final site: ${siteDir}`); + console.log(` Source docs: ${docsDir}`); + console.log(` Generated files: ${artifactsDir}`); + console.log(` Final site: ${siteDir}`); console.log(); console.log(`Deployable output: ${siteDir}/`); console.log(); @@ -449,6 +402,11 @@ function listDirectoryContents(dir) { } } +/** + * Format a byte count into a compact human-readable string using B, K, or M units. + * @param {number} bytes - The number of bytes to format. + * @returns {string} The formatted size: bytes as `N B` (e.g. `512B`), kilobytes truncated to an integer with `K` (e.g. `2K`), or megabytes with one decimal and `M` (e.g. `1.2M`). + */ function formatFileSize(bytes) { if (bytes > 1024 * 1024) { return `${(bytes / 1024 / 1024).toFixed(1)}M`; @@ -459,8 +417,38 @@ function formatFileSize(bytes) { } // ============================================================================= -// File System Utilities +// Post-build Injection +/** + * Recursively collects all files with the given extension under a directory. + * + * @param {string} dir - Root directory to search. + * @param {string} ext - File extension to match (include the leading dot, e.g. ".md"). + * @returns {string[]} An array of file paths for files ending with `ext` found under `dir`. + */ + +function getAllFilesByExtension(dir, ext) { + const result = []; + const entries = fs.readdirSync(dir, { withFileTypes: true }); + + for (const entry of entries) { + const fullPath = path.join(dir, entry.name); + if (entry.isDirectory()) { + result.push(...getAllFilesByExtension(fullPath, ext)); + } else if (entry.name.endsWith(ext)) { + result.push(fullPath); + } + } + + return result; +} + // ============================================================================= +// File System Utilities +/** + * Remove any existing build output and recreate the build directory. + * + * Ensures the configured BUILD_DIR is empty by deleting it if present and then creating a fresh directory. + */ function cleanBuildDirectory() { console.log('Cleaning previous build...'); @@ -471,7 +459,15 @@ function cleanBuildDirectory() { fs.mkdirSync(BUILD_DIR, { recursive: true }); } -function copyDirectory(src, dest, exclude = [], transformMd = false, moduleName = null) { +/** + * Recursively copies all files and subdirectories from one directory to another, creating the destination if needed. + * + * @param {string} src - Path to the source directory to copy from. + * @param {string} dest - Path to the destination directory to copy to. + * @param {string[]} [exclude=[]] - List of file or directory names (not paths) to skip while copying. + * @returns {boolean} `true` if the source existed and copying proceeded, `false` if the source did not exist. + */ +function copyDirectory(src, dest, exclude = []) { if (!fs.existsSync(src)) return false; fs.mkdirSync(dest, { recursive: true }); @@ -482,12 +478,7 @@ function copyDirectory(src, dest, exclude = [], transformMd = false, moduleName const destPath = path.join(dest, entry.name); if (entry.isDirectory()) { - copyDirectory(srcPath, destPath, exclude, transformMd, moduleName); - } else if (entry.name.endsWith('.md')) { - // Always transform markdown links, use module context if provided - let content = fs.readFileSync(srcPath, 'utf-8'); - content = transformMarkdownLinks(content, moduleName); - fs.writeFileSync(destPath, content); + copyDirectory(srcPath, destPath, exclude); } else { fs.copyFileSync(srcPath, destPath); } @@ -495,102 +486,13 @@ function copyDirectory(src, dest, exclude = [], transformMd = false, moduleName return true; } -function transformMarkdownLinks(content, moduleName = null) { - // Transform HTML img src attributes for module docs images - content = content.replaceAll(/src="\.\/src\/modules\/([^/]+)\/docs\/images\/([^"]+)"/g, (match, mod, file) => { - return `src="./modules/${mod}/images/${file}"`; - }); - - return content.replaceAll(/\]\(([^)]+)\)/g, (match, url) => { - // src/modules/{mod}/docs/{path}.md → ./modules/{mod}/{path}.md - // Keeps .md - Docusaurus handles .md → page conversion - const docsMatch = url.match(/^\.\.?\/src\/modules\/([^/]+)\/docs\/(.+\.md)$/); - if (docsMatch) return `](./modules/${docsMatch[1]}/${docsMatch[2]})`; - - // src/modules/{mod}/docs/ → ./modules/{mod}/ - const docsDirMatch = url.match(/^\.\.?\/src\/modules\/([^/]+)\/docs\/$/); - if (docsDirMatch) return `](./modules/${docsDirMatch[1]}/)`; - - // src/modules/{mod}/docs/images/{file} → ./modules/{mod}/images/{file} - const docsImageMatch = url.match(/^\.\.?\/src\/modules\/([^/]+)\/docs\/images\/(.+)$/); - if (docsImageMatch) return `](./modules/${docsImageMatch[1]}/images/${docsImageMatch[2]})`; - - // src/modules/{mod}/README.md → GitHub (not in docs folder) - const readmeMatch = url.match(/^\.\.?\/src\/modules\/([^/]+)\/README\.md$/i); - if (readmeMatch) return `](${REPO_URL}/blob/main/src/modules/${readmeMatch[1]}/README.md)`; - - // src/modules/* (non-docs) → GitHub - const srcMatch = url.match(/^\.\.?\/src\/modules\/(.+)$/); - if (srcMatch) return `](${REPO_URL}/tree/main/src/modules/${srcMatch[1]})`; - - // Relative paths escaping docs/ folder → GitHub (when module context is known) - // e.g., ../workflows/foo/bar.md from within docs/ → src/modules/{mod}/workflows/foo/bar.md - if (moduleName) { - const relativeEscapeMatch = url.match(/^\.\.\/([^.][^)]+)$/); - if (relativeEscapeMatch && !relativeEscapeMatch[1].startsWith('src/')) { - const relativePath = relativeEscapeMatch[1]; - return `](${REPO_URL}/blob/main/src/modules/${moduleName}/${relativePath})`; - } - } - - // ./docs/{path}.md → ./{path}.md (docs folder contents are at root in build) - // Keeps .md - Docusaurus handles .md → page conversion - const rootDocsMatch = url.match(/^\.\/docs\/(.+\.md)$/); - if (rootDocsMatch) return `](./${rootDocsMatch[1]})`; - - // Root docs → GitHub (not part of docs site) - if (url === '../README.md' || url === './README.md' || url === './project-readme') { - return `](${REPO_URL}/blob/main/README.md)`; - } - if (url === '../CHANGELOG.md' || url === './CHANGELOG.md' || url === './changelog') { - return `](${REPO_URL}/blob/main/CHANGELOG.md)`; - } - - // Root files → GitHub (CONTRIBUTING, LICENSE, CODE_OF_CONDUCT, etc.) - const contributingMatch = url.match(/^(\.\.\/)?CONTRIBUTING\.md(#.*)?$/); - if (contributingMatch) { - const anchor = contributingMatch[2] || ''; - return `](${REPO_URL}/blob/main/CONTRIBUTING.md${anchor})`; - } - if (url === 'LICENSE' || url === '../LICENSE') { - return `](${REPO_URL}/blob/main/LICENSE)`; - } - if (url === '.github/CODE_OF_CONDUCT.md' || url === '../.github/CODE_OF_CONDUCT.md') { - return `](${REPO_URL}/blob/main/.github/CODE_OF_CONDUCT.md)`; - } - - // Other root .md files → GitHub - const rootFileMatch = url.match(/^\.\.\/([A-Z][^/]+\.md)$/); - if (rootFileMatch) return `](${REPO_URL}/blob/main/${rootFileMatch[1]})`; - - // Cross-module doc links: ../../{mod}/docs/{path}.md → ../{mod}/{path}.md - // Fixes path structure but keeps .md (Docusaurus handles .md → page conversion) - const crossModuleDocsMatch = url.match(/^\.\.\/\.\.\/([^/]+)\/docs\/(.+\.md)$/); - if (crossModuleDocsMatch) return `](../${crossModuleDocsMatch[1]}/${crossModuleDocsMatch[2]})`; - - // Root-level folders (samples/) → GitHub - const rootFolderMatch = url.match(/^\.\.\/((samples)\/.*)/); - if (rootFolderMatch) return `](${REPO_URL}/blob/main/${rootFolderMatch[1]})`; - - return match; - }); -} - -function countMarkdownFiles(dir) { - let count = 0; - if (!fs.existsSync(dir)) return 0; - - for (const entry of fs.readdirSync(dir, { withFileTypes: true })) { - const fullPath = path.join(dir, entry.name); - if (entry.isDirectory()) { - count += countMarkdownFiles(fullPath); - } else if (entry.name.endsWith('.md')) { - count++; - } - } - return count; -} - +/** + * Create a ZIP archive of a directory, optionally excluding entries that match given substrings. + * @param {string} sourceDir - Path to the source directory to archive. + * @param {string} outputPath - Path to write the resulting ZIP file. + * @param {string[]} [exclude=[]] - Array of substrings; any entry whose path includes one of these substrings will be omitted. + * @returns {Promise} Resolves when the archive has been fully written and closed, rejects on error. + */ function createZipArchive(sourceDir, outputPath, exclude = []) { return new Promise((resolve, reject) => { const output = fs.createWriteStream(outputPath); @@ -624,8 +526,34 @@ function printHeader(title) { console.log('└' + '─'.repeat(62) + '┘'); } +/** + * Prints a centered decorative ASCII banner to the console using the provided title. + * @param {string} title - Text to display centered inside the banner. */ function printBanner(title) { console.log('╔' + '═'.repeat(62) + '╗'); console.log(`║${title.padStart(31 + title.length / 2).padEnd(62)}║`); console.log('╚' + '═'.repeat(62) + '╝'); } + +// ============================================================================= +// Link Checking +/** + * Verify internal documentation links by running the link-checking script. + * + * Executes the Node script tools/check-doc-links.js from the project root and + * exits the process with code 1 if the check fails. + */ + +function checkDocLinks() { + printHeader('Checking documentation links'); + + try { + execSync('node tools/check-doc-links.js', { + cwd: PROJECT_ROOT, + stdio: 'inherit', + }); + } catch { + console.error('\n \u001B[31m✗\u001B[0m Link check failed - fix broken links before building\n'); + process.exit(1); + } +} diff --git a/tools/check-doc-links.js b/tools/check-doc-links.js new file mode 100644 index 00000000..d89d6605 --- /dev/null +++ b/tools/check-doc-links.js @@ -0,0 +1,282 @@ +/** + * Internal documentation link checker + * Scans markdown files in docs/ and verifies: + * - All relative links point to existing files + * - All anchor links (#section) point to valid headings + * - No duplicate/conflicting paths + * + * Exits with code 1 if broken links are found (fails the build). + */ + +const { readFileSync, existsSync } = require('node:fs'); +const { resolve, dirname, join, normalize, relative } = require('node:path'); +const { glob } = require('glob'); + +const DOCS_DIR = resolve(process.cwd(), 'docs'); + +// Regex to match markdown links: [text](path) and reference-style [text]: path +const LINK_PATTERNS = [ + /\[([^\]]*)\]\(([^)]+)\)/g, // [text](path) + /\[([^\]]+)\]:\s*(\S+)/g, // [text]: path +]; + +// Regex to extract headings for anchor validation +const HEADING_PATTERN = /^#{1,6}\s+(.+)$/gm; + +/** + * Determines whether a link should be ignored during validation. + * @param {string} link - The link URL or path to test. + * @returns {boolean} `true` if the link is external, uses a special protocol (`http://`, `https://`, `mailto:`, `tel:`), or is an absolute path starting with `/`, `false` otherwise. + */ +function shouldIgnore(link) { + return ( + link.startsWith('http://') || + link.startsWith('https://') || + link.startsWith('mailto:') || + link.startsWith('tel:') || + link.startsWith('/') // Absolute paths handled by Astro routing + ); +} + +/** + * Convert a markdown heading into the anchor slug used by common Markdown processors. + * + * Produces a lowercase slug with emojis and most punctuation removed, whitespace collapsed to single + * hyphens, consecutive hyphens collapsed, and leading/trailing hyphens trimmed. + * @param {string} heading - The heading text to convert. + * @returns {string} The resulting anchor slug. + */ +function headingToAnchor(heading) { + return heading + .toLowerCase() + .replaceAll(/[\u{1F300}-\u{1F9FF}]/gu, '') // Remove emojis + .replaceAll(/[^\w\s-]/g, '') // Remove special chars except hyphens + .replaceAll(/\s+/g, '-') // Spaces to hyphens + .replaceAll(/-+/g, '-') // Collapse multiple hyphens + .replaceAll(/^-+|-+$/g, ''); // Trim leading/trailing hyphens +} + +/** + * Extracts anchor slugs from Markdown content by converting headings to their anchor form. + * + * Strips inline formatting (code spans, emphasis, bold, and inline links), processes + * Markdown headings (levels 1–6), and returns the resulting anchor slugs. + * + * @param {string} content - The Markdown text to scan for headings. + * @returns {Set} A set of anchor slugs derived from the headings in `content`. + */ +function extractAnchors(content) { + const anchors = new Set(); + let match; + + HEADING_PATTERN.lastIndex = 0; + while ((match = HEADING_PATTERN.exec(content)) !== null) { + const headingText = match[1].trim(); + // Remove inline code, bold, italic, links from heading + const cleanHeading = headingText + .replaceAll(/`[^`]+`/g, '') + .replaceAll(/\*\*([^*]+)\*\*/g, '$1') + .replaceAll(/\*([^*]+)\*/g, '$1') + .replaceAll(/\[([^\]]+)\]\([^)]+\)/g, '$1') + .trim(); + anchors.add(headingToAnchor(cleanHeading)); + } + + return anchors; +} + +/** + * Remove fenced and inline code segments from Markdown content. + * + * @param {string} content - Markdown text to sanitize. + * @returns {string} The input content with fenced code blocks (```...``` and ~~~...~~~) and inline code (backtick-enclosed) removed. + */ +function stripCodeBlocks(content) { + // Remove fenced code blocks (``` or ~~~) + return content + .replaceAll(/```[\s\S]*?```/g, '') + .replaceAll(/~~~[\s\S]*?~~~/g, '') + .replaceAll(/`[^`\n]+`/g, ''); // Also remove inline code +} + +/** + * Extracts all non-external link targets from markdown content, ignoring links inside code blocks. + * @param {string} content - Markdown source to scan for link targets. + * @returns {string[]} Array of raw link strings (paths and optional anchors) found in the content; external or protocol-based links are excluded. + */ +function extractLinks(content) { + const strippedContent = stripCodeBlocks(content); + const links = []; + for (const pattern of LINK_PATTERNS) { + let match; + pattern.lastIndex = 0; + while ((match = pattern.exec(strippedContent)) !== null) { + const rawLink = match[2]; + if (!shouldIgnore(rawLink)) { + links.push(rawLink); + } + } + } + return links; +} + +/** + * Split a link into its path and anchor components. + * @param {string} link - The link string to parse; may include a `#` followed by an anchor. + * @returns {{path: string|null, anchor: string|null}} An object where `path` is the portion before `#` (or `null` when empty, indicating a same-file anchor), and `anchor` is the portion after `#` (or `null` when no `#` is present). Note: `anchor` may be an empty string if the link ends with `#`. + */ +function parseLink(link) { + const hashIndex = link.indexOf('#'); + if (hashIndex === -1) { + return { path: link, anchor: null }; + } + return { + path: link.slice(0, hashIndex) || null, // Empty path means same file + anchor: link.slice(hashIndex + 1), + }; +} + +/** + * Resolve a relative markdown link path from a source file to a concrete absolute file path. + * @param {string} fromFile - Absolute path of the file containing the link. + * @param {string|null} linkPath - Link target as written in markdown; may be `null` or empty for same-file anchors. + * @returns {string} The resolved absolute path. If `linkPath` is null/empty returns `fromFile`. If the resolved path has no extension, an existing `.md` file or an `index.md` inside a matching directory is preferred; otherwise the normalized resolved path is returned. + */ +function resolveLink(fromFile, linkPath) { + if (!linkPath) return fromFile; // Same file anchor + + const fromDir = dirname(fromFile); + let resolved = normalize(resolve(fromDir, linkPath)); + + // If link doesn't have extension, try .md + if (!resolved.endsWith('.md') && !existsSync(resolved)) { + const withMd = resolved + '.md'; + if (existsSync(withMd)) { + return withMd; + } + // Try as directory with index.md + const asIndex = join(resolved, 'index.md'); + if (existsSync(asIndex)) { + return asIndex; + } + } + + return resolved; +} + +// Cache for file anchors to avoid re-reading files +const anchorCache = new Map(); + +/** + * Retrieve and cache the set of markdown anchor slugs for a given file. + * + * Reads the file at the provided path, extracts heading-based anchor slugs, stores them in an internal cache, and returns them. + * @param {string} filePath - Absolute or relative path to the markdown file. + * @returns {Set} The set of anchor slugs present in the file. + */ +function getAnchorsForFile(filePath) { + if (anchorCache.has(filePath)) { + return anchorCache.get(filePath); + } + + const content = readFileSync(filePath, 'utf-8'); + const anchors = extractAnchors(content); + anchorCache.set(filePath, anchors); + return anchors; +} + +/** + * Validate Markdown files in docs/ for broken relative links and anchor targets. + * + * Scans all `.md` and `.mdx` files under DOCS_DIR, checks that relative links resolve to existing + * files and that any `#anchor` references point to existing headings. Prints a grouped, + * colored report of issues to stdout and terminates the process with exit code `0` if no issues + * were found or `1` if any broken links or anchors are detected. + */ +async function main() { + console.log(' → Scanning for broken links and anchors...'); + + const files = await glob('**/*.{md,mdx}', { cwd: DOCS_DIR, absolute: true }); + const errors = []; + + // Track all resolved paths for duplicate detection + const pathRegistry = new Map(); // normalized path -> [source files] + + for (const file of files) { + const content = readFileSync(file, 'utf-8'); + const links = extractLinks(content); + const relativePath = relative(DOCS_DIR, file); + + for (const rawLink of links) { + const { path: linkPath, anchor } = parseLink(rawLink); + + // Resolve target file + const targetFile = resolveLink(file, linkPath); + const normalizedTarget = normalize(targetFile); + + // Check if file exists (skip for same-file anchors) + if (linkPath && !existsSync(targetFile)) { + errors.push({ + type: 'broken-link', + file: relativePath, + link: rawLink, + message: `File not found: ${linkPath}`, + }); + continue; + } + + // Check anchor if present + if (anchor) { + const anchors = getAnchorsForFile(targetFile); + if (!anchors.has(anchor)) { + errors.push({ + type: 'broken-anchor', + file: relativePath, + link: rawLink, + message: `Anchor "#${anchor}" not found in ${linkPath || 'same file'}`, + }); + } + } + + // Track paths for duplicate detection + if (linkPath) { + if (!pathRegistry.has(normalizedTarget)) { + pathRegistry.set(normalizedTarget, []); + } + pathRegistry.get(normalizedTarget).push({ from: relativePath, link: rawLink }); + } + } + } + + // Report results + if (errors.length === 0) { + console.log(` \u001B[32m✓\u001B[0m Checked ${files.length} files - no broken links found.`); + process.exit(0); + } + + console.log(`\n \u001B[31m✗\u001B[0m Found ${errors.length} issue(s):\n`); + + // Group by file + const byFile = {}; + for (const error of errors) { + if (!byFile[error.file]) byFile[error.file] = []; + byFile[error.file].push(error); + } + + for (const [file, fileErrors] of Object.entries(byFile)) { + console.log(` \u001B[36m${file}\u001B[0m`); + for (const error of fileErrors) { + const icon = error.type === 'broken-link' ? '🔗' : '⚓'; + console.log(` ${icon} ${error.link}`); + console.log(` └─ ${error.message}`); + } + console.log(); + } + + process.exit(1); +} + +main().catch((error) => { + console.error('Error:', error.message); + process.exit(1); +}); diff --git a/website/README.md b/website/README.md new file mode 100644 index 00000000..0545d295 --- /dev/null +++ b/website/README.md @@ -0,0 +1,76 @@ +# BMAD Method Documentation Site + +This directory contains the Astro + Starlight configuration for the BMAD Method documentation site. + +## Architecture + +The documentation uses a symlink architecture to keep content in `docs/` at the repo root while serving it through Astro: + +``` +bmad2/ +├── docs/ # Content lives here (repo root) +│ ├── index.md +│ ├── tutorials/ +│ ├── how-to/ +│ ├── explanation/ +│ └── reference/ +└── website/ + ├── astro.config.mjs # Astro + Starlight config + ├── src/ + │ ├── content/ + │ │ └── docs -> ../../docs # Symlink to content + │ └── styles/ + │ └── custom.css # Custom styling + └── public/ # Static assets +``` + +## Development + +```bash +# From repo root +npm run docs:dev # Start dev server +npm run docs:build # Build for production +npm run docs:preview # Preview production build +``` + +## Platform Notes + +### Windows Symlink Support + +The `website/src/content/docs` symlink may not work correctly on Windows without Developer Mode enabled or administrator privileges. + +**To enable symlinks on Windows:** + +1. **Enable Developer Mode** (recommended): + - Settings → Update & Security → For developers → Developer Mode: On + - This allows creating symlinks without admin rights + +2. **Or use Git's symlink support**: + ```bash + git config core.symlinks true + ``` + Then re-clone the repository. + +3. **Or create a junction** (alternative): + ```cmd + # Run as Administrator + mklink /J website\src\content\docs ..\..\docs + ``` + +**If symlinks don't work**, you can copy the docs folder instead: +```bash +# Remove the symlink +rm website/src/content/docs + +# Copy the docs folder +cp -r docs website/src/content/docs +``` + +Note: If copying, remember to keep the copy in sync with changes to `docs/`. + +## Build Output + +The build pipeline (`npm run docs:build`) produces: +- Static HTML site in `build/site/` +- LLM-friendly files: `llms.txt`, `llms-full.txt` +- Downloadable ZIP bundles in `downloads/` diff --git a/website/astro.config.mjs b/website/astro.config.mjs new file mode 100644 index 00000000..e3d96fd3 --- /dev/null +++ b/website/astro.config.mjs @@ -0,0 +1,125 @@ +// @ts-check +import { defineConfig } from 'astro/config'; +import starlight from '@astrojs/starlight'; +import sitemap from '@astrojs/sitemap'; +import rehypeMarkdownLinks from './src/rehype-markdown-links.js'; +import { getSiteUrl } from './src/lib/site-url.js'; + +const siteUrl = getSiteUrl(); +const urlParts = new URL(siteUrl); +// Normalize basePath: ensure trailing slash so links can use `${BASE_URL}path` +const basePath = urlParts.pathname === '/' ? '/' : urlParts.pathname.endsWith('/') ? urlParts.pathname : urlParts.pathname + '/'; + +export default defineConfig({ + site: `${urlParts.origin}${basePath}`, + base: basePath, + outDir: '../build/site', + + // Disable aggressive caching in dev mode + vite: { + optimizeDeps: { + force: true, // Always re-bundle dependencies + }, + server: { + watch: { + usePolling: false, // Set to true if file changes aren't detected + }, + }, + }, + + markdown: { + rehypePlugins: [rehypeMarkdownLinks], + }, + + integrations: [ + sitemap(), + starlight({ + title: 'BMAD Method', + tagline: 'AI-driven agile development with specialized agents and workflows that scale from bug fixes to enterprise platforms.', + + logo: { + src: './public/img/logo.svg', + alt: 'BMAD Logo', + }, + favicon: '/favicon.ico', + + // Social links + social: [ + { icon: 'discord', label: 'Discord', href: 'https://discord.gg/gk8jAdXWmj' }, + { icon: 'github', label: 'GitHub', href: 'https://github.com/bmad-code-org/BMAD-METHOD' }, + { icon: 'youtube', label: 'YouTube', href: 'https://www.youtube.com/@BMadCode' }, + ], + + // Show last updated timestamps + lastUpdated: true, + + // Custom head tags for LLM discovery + head: [ + { + tag: 'meta', + attrs: { + name: 'ai-terms', + content: `AI-optimized documentation: ${siteUrl}/llms-full.txt (plain text, ~100k tokens, complete BMAD reference). Index: ${siteUrl}/llms.txt`, + }, + }, + { + tag: 'meta', + attrs: { + name: 'llms-full', + content: `${siteUrl}/llms-full.txt`, + }, + }, + { + tag: 'meta', + attrs: { + name: 'llms', + content: `${siteUrl}/llms.txt`, + }, + }, + ], + + // Custom CSS + customCss: ['./src/styles/custom.css'], + + // Sidebar configuration (Diataxis structure) + sidebar: [ + { label: 'Welcome', slug: 'index' }, + { + label: 'Tutorials', + collapsed: false, + autogenerate: { directory: 'tutorials' }, + }, + { + label: 'How-To Guides', + collapsed: true, + autogenerate: { directory: 'how-to' }, + }, + { + label: 'Explanation', + collapsed: true, + autogenerate: { directory: 'explanation' }, + }, + { + label: 'Reference', + collapsed: true, + autogenerate: { directory: 'reference' }, + }, + ], + + // Credits in footer + credits: false, + + // Pagination + pagination: true, + + // Custom components + components: { + Header: './src/components/Header.astro', + MobileMenuFooter: './src/components/MobileMenuFooter.astro', + }, + + // Table of contents + tableOfContents: { minHeadingLevel: 2, maxHeadingLevel: 3 }, + }), + ], +}); diff --git a/website/css/custom.css b/website/css/custom.css deleted file mode 100644 index 793bfae4..00000000 --- a/website/css/custom.css +++ /dev/null @@ -1,52 +0,0 @@ -/** - * BMAD Documentation Custom Styles - */ - -:root { - --ifm-color-primary: #0d9488; - --ifm-color-primary-dark: #0b847a; - --ifm-color-primary-darker: #0a7d73; - --ifm-color-primary-darkest: #08665f; - --ifm-color-primary-light: #0fa596; - --ifm-color-primary-lighter: #10ac9d; - --ifm-color-primary-lightest: #14c9b8; - --ifm-code-font-size: 95%; - --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1); -} - -[data-theme='dark'] { - --ifm-color-primary: #2dd4bf; - --ifm-color-primary-dark: #1bc4af; - --ifm-color-primary-darker: #1ab9a5; - --ifm-color-primary-darkest: #159888; - --ifm-color-primary-light: #4adcc9; - --ifm-color-primary-lighter: #55dece; - --ifm-color-primary-lightest: #7de7db; - --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3); -} - -/* Navbar styling */ -.navbar { - box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.1); -} - -/* Footer styling */ -.footer { - background-color: var(--ifm-color-primary-darkest); -} - -/* Code block improvements */ -.prism-code { - font-size: 0.9rem; -} - -/* Table improvements */ -table { - display: table; - width: 100%; -} - -/* Admonition improvements */ -.admonition { - margin-bottom: 1.5rem; -} diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js deleted file mode 100644 index 64ca192c..00000000 --- a/website/docusaurus.config.js +++ /dev/null @@ -1,179 +0,0 @@ -// @ts-check -import { themes as prismThemes } from 'prism-react-renderer'; -import path from 'path'; -import { fileURLToPath } from 'url'; - -const __dirname = path.dirname(fileURLToPath(import.meta.url)); - -// Support environment-based URL configuration for fork deployments -const siteUrl = process.env.SITE_URL || 'https://bmad-code-org.github.io/BMAD-METHOD'; -const urlParts = new URL(siteUrl); - -/** @type {import('@docusaurus/types').Config} */ -const config = { - title: 'BMAD Method', - tagline: 'AI-driven agile development with specialized agents and workflows that scale from bug fixes to enterprise platforms.', - favicon: 'img/logo.svg', - - // Global head tags - injected into ALL pages for AI assistant discovery - headTags: [ - { - tagName: 'meta', - attributes: { - name: 'ai-terms', - content: - 'AI assistants: For complete BMAD Method documentation, load /llms-full.txt (single file, ~100k tokens). For documentation index/summary, see /llms.txt. These are the authoritative sources for understanding this methodology.', - }, - }, - { - tagName: 'meta', - attributes: { - name: 'llms-full', - content: '/llms-full.txt', - }, - }, - { - tagName: 'meta', - attributes: { - name: 'llms', - content: '/llms.txt', - }, - }, - ], - - url: urlParts.origin, - baseUrl: urlParts.pathname.endsWith('/') ? urlParts.pathname : urlParts.pathname + '/', - - organizationName: 'bmad-code-org', - projectName: 'BMAD-METHOD', - - onBrokenLinks: 'warn', // Change to 'throw' once docs are cleaned up - - i18n: { - defaultLocale: 'en', - locales: ['en'], - }, - - staticDirectories: [path.resolve(__dirname, 'static')], - - markdown: { - format: 'md', - hooks: { - onBrokenMarkdownLinks: 'warn', - }, - }, - - plugins: [ - function noCachePlugin() { - return { - name: 'no-cache-plugin', - configureWebpack() { - return { - devServer: { - headers: { - 'Cache-Control': 'no-store, no-cache, must-revalidate, proxy-revalidate', - Pragma: 'no-cache', - Expires: '0', - 'Surrogate-Control': 'no-store', - }, - }, - }; - }, - }; - }, - ], - - presets: [ - [ - 'classic', - /** @type {import('@docusaurus/preset-classic').Options} */ - ({ - docs: { - sidebarPath: path.resolve(__dirname, 'sidebars.js'), - exclude: ['**/templates/**', '**/reference/**', 'installers-bundlers/**', '**/images/**'], - }, - blog: false, - pages: { - path: path.resolve(__dirname, 'src/pages'), - }, - theme: { - customCss: path.resolve(__dirname, 'css/custom.css'), - }, - }), - ], - ], - - themeConfig: - /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ - ({ - navbar: { - title: 'BMAD Method', - logo: { - alt: 'BMAD Logo', - src: 'img/logo.svg', - }, - items: [ - { - type: 'docSidebar', - sidebarId: 'mainSidebar', - position: 'left', - label: 'Docs', - }, - { - to: '/downloads', - label: 'Downloads', - position: 'right', - }, - { - href: 'pathname:///llms.txt', - label: 'llms.txt', - position: 'right', - }, - { - href: 'https://github.com/bmad-code-org/BMAD-METHOD', - label: 'GitHub', - position: 'right', - }, - ], - }, - footer: { - style: 'dark', - links: [ - { - title: 'Docs', - items: [ - { label: 'Quick Start', to: '/docs/modules/bmm/quick-start' }, - { label: 'Installation', to: '/docs/getting-started/installation' }, - ], - }, - { - title: 'Community', - items: [{ label: 'Discord', href: 'https://discord.gg/bmad' }], - }, - { - title: 'More', - items: [ - { - label: 'GitHub', - href: 'https://github.com/bmad-code-org/BMAD-METHOD', - }, - { label: 'llms.txt', href: 'pathname:///llms.txt' }, - { label: 'llms-full.txt', href: 'pathname:///llms-full.txt' }, - ], - }, - ], - copyright: `Copyright © ${new Date().getFullYear()} BMAD Code Organization.`, - }, - prism: { - theme: prismThemes.github, - darkTheme: prismThemes.dracula, - }, - colorMode: { - defaultMode: 'light', - disableSwitch: false, - respectPrefersColorScheme: true, - }, - }), -}; - -export default config; diff --git a/website/static/favicon.ico b/website/public/favicon.ico similarity index 100% rename from website/static/favicon.ico rename to website/public/favicon.ico diff --git a/website/static/img/logo.svg b/website/public/img/logo.svg similarity index 100% rename from website/static/img/logo.svg rename to website/public/img/logo.svg diff --git a/website/static/robots.txt b/website/public/robots.txt similarity index 100% rename from website/static/robots.txt rename to website/public/robots.txt diff --git a/website/sidebars.js b/website/sidebars.js deleted file mode 100644 index aa6b183a..00000000 --- a/website/sidebars.js +++ /dev/null @@ -1,134 +0,0 @@ -/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */ -const sidebars = { - mainSidebar: [ - 'index', - { - type: 'category', - label: 'Core Concepts', - items: [ - 'bmad-core-concepts/index', - 'bmad-core-concepts/agents', - 'bmad-core-concepts/workflows', - 'bmad-core-concepts/modules', - { - type: 'category', - label: 'Installing', - collapsed: true, - items: ['bmad-core-concepts/installing/index', 'bmad-core-concepts/installing/upgrading'], - }, - { - type: 'category', - label: 'Customization', - collapsed: true, - items: [ - 'bmad-core-concepts/bmad-customization/index', - 'bmad-core-concepts/bmad-customization/agents', - 'bmad-core-concepts/bmad-customization/workflows', - ], - }, - 'bmad-core-concepts/web-bundles/index', - ], - }, - { - type: 'category', - label: 'BMM - Method', - items: [ - 'modules/bmm-bmad-method/index', - 'modules/bmm-bmad-method/quick-start', - { - type: 'category', - label: 'Quick Flows', - collapsed: true, - items: [ - 'modules/bmm-bmad-method/bmad-quick-flow', - 'modules/bmm-bmad-method/quick-flow-solo-dev', - 'modules/bmm-bmad-method/quick-spec-flow', - ], - }, - { - type: 'category', - label: 'Workflows', - collapsed: true, - items: [ - 'modules/bmm-bmad-method/workflows-planning', - 'modules/bmm-bmad-method/workflows-solutioning', - 'modules/bmm-bmad-method/workflows-analysis', - 'modules/bmm-bmad-method/workflows-implementation', - ], - }, - { - type: 'category', - label: 'Advanced Topics', - collapsed: true, - items: [ - 'modules/bmm-bmad-method/party-mode', - 'modules/bmm-bmad-method/agents-guide', - 'modules/bmm-bmad-method/brownfield-guide', - 'modules/bmm-bmad-method/test-architecture', - ], - }, - { - type: 'category', - label: 'Reference', - collapsed: true, - items: [ - 'modules/bmm-bmad-method/workflow-document-project-reference', - 'modules/bmm-bmad-method/troubleshooting', - 'modules/bmm-bmad-method/faq', - 'modules/bmm-bmad-method/glossary', - ], - }, - ], - }, - { - type: 'category', - label: 'BMB - Builder', - collapsed: true, - items: [ - 'modules/bmb-bmad-builder/index', - 'modules/bmb-bmad-builder/agent-creation-guide', - 'modules/bmb-bmad-builder/workflow-vendoring-customization-inheritance', - 'modules/bmb-bmad-builder/custom-content', - 'modules/bmb-bmad-builder/custom-content-installation', - ], - }, - { - type: 'category', - label: 'BMGD - Game Dev', - collapsed: true, - items: [ - 'modules/bmgd-bmad-game-dev/index', - 'modules/bmgd-bmad-game-dev/quick-start', - 'modules/bmgd-bmad-game-dev/quick-flow-guide', - 'modules/bmgd-bmad-game-dev/agents-guide', - 'modules/bmgd-bmad-game-dev/workflows-guide', - 'modules/bmgd-bmad-game-dev/game-types-guide', - 'modules/bmgd-bmad-game-dev/troubleshooting', - 'modules/bmgd-bmad-game-dev/glossary', - ], - }, - { - type: 'category', - label: 'CIS - Creative Intelligence', - collapsed: true, - items: ['modules/cis-creative-intelligence-suite/index'], - }, - { - type: 'category', - label: 'Core Module', - collapsed: true, - items: [ - 'modules/core/index', - 'modules/core/party-mode', - 'modules/core/core-tasks', - 'modules/core/core-workflows', - 'modules/core/advanced-elicitation', - 'modules/core/brainstorming', - 'modules/core/document-sharding-guide', - 'modules/core/global-core-config', - ], - }, - ], -}; - -export default sidebars; diff --git a/website/src/components/Banner.astro b/website/src/components/Banner.astro new file mode 100644 index 00000000..f1e46070 --- /dev/null +++ b/website/src/components/Banner.astro @@ -0,0 +1,59 @@ +--- +import { getSiteUrl } from '../lib/site-url.js'; + +const SITE_URL = getSiteUrl(); +const fullDocsUrl = `${SITE_URL}/llms-full.txt`; +--- + +
+ 🤖 Consolidated, AI-optimized BMAD docs: llms-full.txt. Fetch this plain text file for complete context. +
+ + diff --git a/website/src/components/Header.astro b/website/src/components/Header.astro new file mode 100644 index 00000000..cd53fbdf --- /dev/null +++ b/website/src/components/Header.astro @@ -0,0 +1,121 @@ +--- +import config from 'virtual:starlight/user-config'; +import type { Props } from '@astrojs/starlight/props'; + +import LanguageSelect from 'virtual:starlight/components/LanguageSelect'; +import Search from 'virtual:starlight/components/Search'; +import SiteTitle from 'virtual:starlight/components/SiteTitle'; +import SocialIcons from 'virtual:starlight/components/SocialIcons'; +import ThemeSelect from 'virtual:starlight/components/ThemeSelect'; + +import Banner from './Banner.astro'; + +/** + * Render the `Search` component if Pagefind is enabled or the default search component has been overridden. + */ +const shouldRenderSearch = + config.pagefind || config.components.Search !== '@astrojs/starlight/components/Search.astro'; +--- + + +
+
+ +
+
+ {shouldRenderSearch && } +
+
+ + + + +
+
+ + diff --git a/website/src/components/MobileMenuFooter.astro b/website/src/components/MobileMenuFooter.astro new file mode 100644 index 00000000..10a2c77e --- /dev/null +++ b/website/src/components/MobileMenuFooter.astro @@ -0,0 +1,53 @@ +--- +import LanguageSelect from 'virtual:starlight/components/LanguageSelect'; +import SocialIcons from 'virtual:starlight/components/SocialIcons'; +import ThemeSelect from 'virtual:starlight/components/ThemeSelect'; +import type { Props } from '@astrojs/starlight/props'; +--- + +
+ + + + +
+ + diff --git a/website/src/content/config.ts b/website/src/content/config.ts new file mode 100644 index 00000000..31b74762 --- /dev/null +++ b/website/src/content/config.ts @@ -0,0 +1,6 @@ +import { defineCollection } from 'astro:content'; +import { docsSchema } from '@astrojs/starlight/schema'; + +export const collections = { + docs: defineCollection({ schema: docsSchema() }), +}; diff --git a/website/src/content/docs b/website/src/content/docs new file mode 120000 index 00000000..48c4a0c0 --- /dev/null +++ b/website/src/content/docs @@ -0,0 +1 @@ +../../../docs \ No newline at end of file diff --git a/website/src/lib/site-url.js b/website/src/lib/site-url.js new file mode 100644 index 00000000..62df2bf3 --- /dev/null +++ b/website/src/lib/site-url.js @@ -0,0 +1,25 @@ +/** + * Resolve the site's base URL using cascading environment defaults. + * + * Preference order: use SITE_URL if set; otherwise derive a GitHub Pages URL from GITHUB_REPOSITORY; otherwise use the local development URL. + * @returns {string} The resolved site URL (SITE_URL override, or `https://{owner}.github.io/{repo}`, or `http://localhost:3000`). + */ +export function getSiteUrl() { + // Explicit override (works in both local and GitHub Actions) + if (process.env.SITE_URL) { + return process.env.SITE_URL; + } + + // GitHub Actions: compute from repository context + if (process.env.GITHUB_REPOSITORY) { + const parts = process.env.GITHUB_REPOSITORY.split('/'); + if (parts.length !== 2 || !parts[0] || !parts[1]) { + throw new Error(`Invalid GITHUB_REPOSITORY format: "${process.env.GITHUB_REPOSITORY}". Expected "owner/repo".`); + } + const [owner, repo] = parts; + return `https://${owner}.github.io/${repo}`; + } + + // Local development: use dev server + return 'http://localhost:3000'; +} diff --git a/website/src/pages/index.js b/website/src/pages/index.js deleted file mode 100644 index cab2c5d1..00000000 --- a/website/src/pages/index.js +++ /dev/null @@ -1,50 +0,0 @@ -import React from 'react'; -import Layout from '@theme/Layout'; -import Link from '@docusaurus/Link'; -import useBaseUrl from '@docusaurus/useBaseUrl'; - -export default function Home() { - const llmsFullUrl = useBaseUrl('/llms-full.txt'); - - return ( - -
-

BMAD Method

-

- Under Construction -

- - - View Documentation - - - - 🤖 AI Context: llms-full.txt - -
-
- ); -} diff --git a/website/src/rehype-markdown-links.js b/website/src/rehype-markdown-links.js new file mode 100644 index 00000000..ff66c67e --- /dev/null +++ b/website/src/rehype-markdown-links.js @@ -0,0 +1,88 @@ +/** + * Rehype plugin to transform relative markdown file links (.md) to page routes + * + * Transforms: + * ./path/to/file.md → ./path/to/file/ + * ./path/index.md → ./path/ (index.md becomes directory root) + * ../path/file.md#anchor → ../path/file/#anchor + * ./file.md?query=param → ./file/?query=param + * + * Only affects relative links (./, ../) - absolute and external links are unchanged + */ + +import { visit } from 'unist-util-visit'; + +/** + * Convert relative Markdown file links (./ or ../) into equivalent page route-style links. + * + * The returned transformer walks the HTML tree and rewrites anchor `href` values that are relative paths pointing to `.md` files. It preserves query strings and hash anchors, rewrites `.../index.md` to the directory root path (`.../`), and rewrites other `.md` file paths by removing the `.md` extension and ensuring a trailing slash. Absolute, external, non-relative, non-string, or links without `.md` are left unchanged. + * + * @returns {function} A HAST tree transformer that mutates `a` element `href` properties as described. + */ +export default function rehypeMarkdownLinks() { + return (tree) => { + visit(tree, 'element', (node) => { + // Only process anchor tags with href + if (node.tagName !== 'a' || !node.properties?.href) { + return; + } + + const href = node.properties.href; + + // Skip if not a string (shouldn't happen, but be safe) + if (typeof href !== 'string') { + return; + } + + // Only transform relative paths starting with ./ or ../ + if (!href.startsWith('./') && !href.startsWith('../')) { + return; + } + + // Extract path portion (before ? and #) to check if it's a .md file + const firstDelimiter = Math.min( + href.indexOf('?') === -1 ? Infinity : href.indexOf('?'), + href.indexOf('#') === -1 ? Infinity : href.indexOf('#'), + ); + const pathPortion = firstDelimiter === Infinity ? href : href.substring(0, firstDelimiter); + + // Don't transform if path doesn't end with .md + if (!pathPortion.endsWith('.md')) { + return; + } + + // Split the URL into parts: path, anchor, and query + let urlPath = pathPortion; + let anchor = ''; + let query = ''; + + // Extract query string and anchor from original href + if (firstDelimiter !== Infinity) { + const suffix = href.substring(firstDelimiter); + const anchorInSuffix = suffix.indexOf('#'); + if (suffix.startsWith('?')) { + if (anchorInSuffix !== -1) { + query = suffix.substring(0, anchorInSuffix); + anchor = suffix.substring(anchorInSuffix); + } else { + query = suffix; + } + } else { + // starts with # + anchor = suffix; + } + } + + // Transform .md to / + // Special case: index.md → directory root (e.g., ./tutorials/index.md → ./tutorials/) + if (urlPath.endsWith('/index.md')) { + urlPath = urlPath.replace(/\/index\.md$/, '/'); + } else { + urlPath = urlPath.replace(/\.md$/, '/'); + } + + // Reconstruct the href + node.properties.href = urlPath + query + anchor; + }); + }; +} diff --git a/website/src/styles/custom.css b/website/src/styles/custom.css new file mode 100644 index 00000000..a232f5ec --- /dev/null +++ b/website/src/styles/custom.css @@ -0,0 +1,483 @@ +/** + * BMAD Method Documentation - Custom Styles for Starlight + * Electric Blue theme optimized for dark mode + * + * CSS Variable Mapping: + * Docusaurus → Starlight + * --ifm-color-primary → --sl-color-accent + * --ifm-background-color → --sl-color-bg + * --ifm-font-color-base → --sl-color-text + */ + +/* ============================================ + COLOR PALETTE - Light Mode + ============================================ */ +:root { + --ai-banner-height: 2.75rem; + --sl-nav-height: 6.25rem; /* Base nav height (~3.5rem) + banner height (2.75rem) */ + + /* Primary accent colors - purple to match Docusaurus */ + --sl-color-accent-low: #e0e0ff; + --sl-color-accent: #8C8CFF; + --sl-color-accent-high: #4141FF; + + /* Text colors */ + --sl-color-white: #1e293b; + --sl-color-gray-1: #334155; + --sl-color-gray-2: #475569; + --sl-color-gray-3: #64748b; + --sl-color-gray-4: #94a3b8; + --sl-color-gray-5: #cbd5e1; + --sl-color-gray-6: #e2e8f0; + --sl-color-black: #f8fafc; + + /* Font settings */ + --sl-font: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', + Arial, sans-serif; + --sl-text-base: 1rem; + --sl-line-height: 1.7; + + /* Code highlighting */ + --sl-color-bg-inline-code: rgba(140, 140, 255, 0.1); +} + +/* ============================================ + COLOR PALETTE - Dark Mode (Primary Focus) + ============================================ */ +:root[data-theme='dark'] { + /* Primary accent colors - purple to match Docusaurus */ + --sl-color-accent-low: #2a2a5a; + --sl-color-accent: #8C8CFF; + --sl-color-accent-high: #B9B9FF; + + /* Background colors */ + --sl-color-bg: #1b1b1d; + --sl-color-bg-nav: #1b1b1d; + --sl-color-bg-sidebar: #1b1b1d; + --sl-color-hairline-light: rgba(140, 140, 255, 0.1); + --sl-color-hairline: rgba(140, 140, 255, 0.15); + + /* Text colors */ + --sl-color-white: #f8fafc; + --sl-color-gray-1: #e2e8f0; + --sl-color-gray-2: #cbd5e1; + --sl-color-gray-3: #94a3b8; + --sl-color-gray-4: #64748b; + --sl-color-gray-5: #475569; + --sl-color-gray-6: #334155; + --sl-color-black: #1b1b1d; + + /* Code highlighting */ + --sl-color-bg-inline-code: rgba(140, 140, 255, 0.15); +} + +/* ============================================ + TYPOGRAPHY + ============================================ */ +.sl-markdown-content h1 { + margin-bottom: 1.5rem; +} + +.sl-markdown-content h2 { + margin-top: 2.5rem; + margin-bottom: 1rem; +} + +.sl-markdown-content h3 { + margin-top: 2rem; + margin-bottom: 0.75rem; +} + +.sl-markdown-content p { + margin-bottom: 1.25rem; +} + +/* ============================================ + SIDEBAR & NAVIGATION + Clean styling inspired by React Native docs + ============================================ */ + +/* Base transition for all sidebar links */ +.sidebar-content a { + transition: + background-color 0.15s ease, + color 0.15s ease, + border-color 0.15s ease; + border-radius: 4px; +} + +/* Top-level sidebar items (Diataxis categories) */ +.sidebar-content > ul > li > details > summary, +.sidebar-content > ul > li > a { + font-weight: 700; + font-size: 0.9375rem; + padding: 0.5rem 0.75rem; +} + +/* Nested sidebar items */ +.sidebar-content ul ul a { + font-weight: 500; + font-size: 0.875rem; + padding: 0.375rem 0.75rem; + padding-left: 1.5rem; + border-left: 3px solid transparent; +} + +/* Deep nested items */ +.sidebar-content ul ul ul a { + font-weight: 400; + font-size: 0.8125rem; + padding-left: 2.25rem; +} + +/* Active state - thin left accent bar */ +.sidebar-content a[aria-current='page'] { + background-color: rgba(140, 140, 255, 0.08); + color: var(--sl-color-accent); + border-left-color: var(--sl-color-accent); + font-weight: 600; +} + +:root[data-theme='dark'] .sidebar-content a[aria-current='page'] { + background-color: rgba(140, 140, 255, 0.1); + color: var(--sl-color-accent-high); + border-left-color: var(--sl-color-accent); +} + +/* Hover states */ +.sidebar-content a:hover { + background-color: rgba(0, 0, 0, 0.05); +} + +:root[data-theme='dark'] .sidebar-content a:hover { + background-color: rgba(255, 255, 255, 0.05); +} + +/* Section spacing */ +.sidebar-content > ul > li { + margin-top: 0.75rem; +} + +.sidebar-content > ul > li:first-child { + margin-top: 0; +} + +/* Lighter chevrons/carets */ +.sidebar-content summary::marker, +.sidebar-content details > summary::after { + opacity: 0.4; +} + +.sidebar-content summary:hover::marker, +.sidebar-content details > summary:hover::after { + opacity: 0.6; +} + +/* ============================================ + LAYOUT - Fixed width at large viewport + ============================================ */ +.content-panel { + max-width: 1400px; + margin: 0 auto; +} + +/* Main content area */ +main { + min-width: 0; +} + +.sl-markdown-content { + min-width: 0; + overflow-wrap: break-word; + word-wrap: break-word; +} + +/* Hide breadcrumbs if desired */ +/* Uncomment to hide: +nav[aria-label="Breadcrumb"] { + display: none; +} +*/ + +/* ============================================ + NAVBAR + ============================================ */ +header.header { + padding: 0 !important; /* Remove all padding for full-width banner */ + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); + height: var(--sl-nav-height) !important; + display: flex; + flex-direction: column; +} + +header.header .header.sl-flex { + padding: 0 1.5rem; + height: calc(var(--sl-nav-height) - var(--ai-banner-height)); + width: 100%; +} + +:root[data-theme='dark'] header.header { + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3); +} + +.site-title { + font-weight: 700; +} + +/* Logo sizing - constrain to reasonable size */ +.site-title img { + height: 2.5rem; + width: auto; +} + +/* Social links styling */ +.social-icons a { + padding: 0.5rem; + transition: + background-color 0.15s ease, + color 0.15s ease; + border-radius: 6px; +} + +.social-icons a:hover { + background-color: rgba(0, 0, 0, 0.05); +} + +:root[data-theme='dark'] .social-icons a:hover { + background-color: rgba(255, 255, 255, 0.05); +} + +/* ============================================ + CARDS + ============================================ */ +.card { + border-radius: 12px; + border: 2px solid var(--sl-color-gray-5); + background-color: var(--sl-color-bg); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08); + transition: + transform 0.2s ease, + box-shadow 0.2s ease, + border-color 0.2s ease; +} + +.card:hover { + transform: translateY(-3px); + border-color: var(--sl-color-accent); + box-shadow: 0 8px 24px rgba(140, 140, 255, 0.15); +} + +:root[data-theme='dark'] .card { + background: linear-gradient(145deg, rgba(30, 41, 59, 0.6), rgba(15, 23, 42, 0.8)); + border-color: rgba(140, 140, 255, 0.2); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3); +} + +:root[data-theme='dark'] .card:hover { + border-color: rgba(140, 140, 255, 0.5); + box-shadow: + 0 8px 32px rgba(140, 140, 255, 0.2), + 0 0 0 1px rgba(140, 140, 255, 0.1); +} + +/* Starlight card grid */ +.sl-link-card { + border-radius: 12px; + border: 2px solid var(--sl-color-gray-5); + transition: + transform 0.2s ease, + box-shadow 0.2s ease, + border-color 0.2s ease; +} + +.sl-link-card:hover { + transform: translateY(-3px); + border-color: var(--sl-color-accent); +} + +:root[data-theme='dark'] .sl-link-card { + border-color: rgba(140, 140, 255, 0.2); +} + +:root[data-theme='dark'] .sl-link-card:hover { + border-color: rgba(140, 140, 255, 0.5); +} + +/* ============================================ + BUTTONS + ============================================ */ +.sl-flex a[href], +button { + transition: + background-color 0.2s ease, + transform 0.1s ease; +} + +.sl-flex a[href]:hover, +button:hover { + transform: translateY(-1px); +} + +/* ============================================ + MISC ENHANCEMENTS + ============================================ */ + +/* Smooth scrolling */ +html { + scroll-behavior: smooth; +} + +/* Better link underlines */ +.sl-markdown-content a:not(.sl-link-card) { + text-decoration-thickness: 1px; + text-underline-offset: 2px; +} + +/* Table styling */ +table { + display: table; + width: 100%; +} + +:root[data-theme='dark'] table { + border-color: rgba(140, 140, 255, 0.1); +} + +:root[data-theme='dark'] table th { + background-color: rgba(140, 140, 255, 0.05); +} + +:root[data-theme='dark'] table tr:nth-child(2n) { + background-color: rgba(140, 140, 255, 0.02); +} + +/* Blockquotes */ +blockquote { + border-left-color: var(--sl-color-accent); + background-color: rgba(140, 140, 255, 0.05); + border-radius: 0 8px 8px 0; + padding: 1rem 1.25rem; +} + +/* ============================================ + ADMONITIONS (Starlight Asides) + Rounded, no left border bar + ============================================ */ +.starlight-aside { + margin-bottom: 1.5rem; + padding: 1.25rem 1.5rem; + border-radius: 12px; + border: none; + border-left: 0; + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.08); +} + +/* Tip aside */ +.starlight-aside--tip { + background-color: rgba(16, 185, 129, 0.08); +} + +.starlight-aside--tip .starlight-aside__title { + color: #059669; +} + +:root[data-theme='dark'] .starlight-aside--tip { + background-color: rgba(16, 185, 129, 0.12); +} + +:root[data-theme='dark'] .starlight-aside--tip .starlight-aside__title { + color: #34d399; +} + +/* Note aside */ +.starlight-aside--note { + background-color: rgba(140, 140, 255, 0.08); +} + +.starlight-aside--note .starlight-aside__title { + color: #8C8CFF; +} + +:root[data-theme='dark'] .starlight-aside--note { + background-color: rgba(140, 140, 255, 0.12); +} + +:root[data-theme='dark'] .starlight-aside--note .starlight-aside__title { + color: #8C8CFF; +} + +/* Caution aside */ +.starlight-aside--caution { + background-color: rgba(245, 158, 11, 0.1); +} + +.starlight-aside--caution .starlight-aside__title { + color: #d97706; +} + +:root[data-theme='dark'] .starlight-aside--caution { + background-color: rgba(245, 158, 11, 0.15); +} + +:root[data-theme='dark'] .starlight-aside--caution .starlight-aside__title { + color: #fbbf24; +} + +/* Danger aside */ +.starlight-aside--danger { + background-color: rgba(239, 68, 68, 0.1); +} + +.starlight-aside--danger .starlight-aside__title { + color: #dc2626; +} + +:root[data-theme='dark'] .starlight-aside--danger { + background-color: rgba(239, 68, 68, 0.15); +} + +:root[data-theme='dark'] .starlight-aside--danger .starlight-aside__title { + color: #f87171; +} + +/* Aside icon styling */ +.starlight-aside__icon svg { + width: 1.25rem; + height: 1.25rem; +} + +/* ============================================ + FOOTER - Minimal styling + ============================================ */ +footer { + background-color: var(--sl-color-black); + border-top: 1px solid var(--sl-color-hairline); +} + +:root[data-theme='dark'] footer { + background-color: #020617; +} + +/* ============================================ + RESPONSIVE ADJUSTMENTS + ============================================ */ +@media (max-width: 72rem) { + .content-panel { + max-width: 100%; + } +} + +/* Responsive padding on navbar row only - banner stays full-width */ +@media (min-width: 50rem) { + header.header .header.sl-flex { + padding-left: 2.5rem; + padding-right: 2.5rem; + } +} + +@media (min-width: 72rem) { + header.header .header.sl-flex { + padding-left: 3rem; + padding-right: 3rem; + } +} From 692f14f2e76fc0e26964619ba4083c7e7dbb09d2 Mon Sep 17 00:00:00 2001 From: Alex Verkhovsky Date: Wed, 7 Jan 2026 00:05:05 -0800 Subject: [PATCH 14/19] docs: add how-to guide for getting BMAD answers + fix Discord channels (#1265) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * docs: add how-to guide for getting BMAD answers + fix Discord channels - New guide: docs/how-to/get-answers-about-bmad.md Teaches users to point LLMs at BMAD sources for self-serve answers - Fixed outdated Discord channel references across 8 files: #general-dev → #bmad-development #bugs-issues → #report-bugs-and-issues Added #suggestions-feedback and #bmad-method-help where appropriate * docs: add Mayakovsky-style poem to how-to guide --- CONTRIBUTING.md | 16 +-- docs/explanation/bmm/index.md | 2 +- docs/explanation/faq/tools-faq.md | 2 +- docs/how-to/get-answers-about-bmad.md | 98 +++++++++++++++++++ docs/how-to/index.md | 2 + .../tutorials/advanced/create-custom-agent.md | 2 +- .../getting-started/getting-started-bmadv4.md | 2 +- .../getting-started/getting-started-bmadv6.md | 2 +- .../getting-started/quick-start-bmgd.md | 2 +- 9 files changed, 115 insertions(+), 13 deletions(-) create mode 100644 docs/how-to/get-answers-about-bmad.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d7c48cb4..78798b57 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,8 +4,9 @@ Thank you for considering contributing to the BMad project! We believe in **Huma 💬 **Discord Community**: Join our [Discord server](https://discord.gg/gk8jAdXWmj) for real-time discussions: -- **#general-dev** - Technical discussions, feature ideas, and development questions -- **#bugs-issues** - Bug reports and issue discussions +- **#bmad-development** - Technical discussions and development questions +- **#suggestions-feedback** - Feature ideas and suggestions +- **#report-bugs-and-issues** - Bug reports and issue discussions ## Our Philosophy @@ -56,7 +57,7 @@ Every contribution should strengthen human-AI collaboration. Ask yourself: **"Do ### Reporting Bugs 1. **Check existing issues** first to avoid duplicates -2. **Consider discussing in Discord** (#bugs-issues channel) for quick help +2. **Consider discussing in Discord** (#report-bugs-and-issues channel) for quick help 3. **Use the bug report template** when creating a new issue - it guides you through providing: - Clear bug description - Steps to reproduce @@ -67,7 +68,7 @@ Every contribution should strengthen human-AI collaboration. Ask yourself: **"Do ### Suggesting Features or New Modules -1. **Discuss first in Discord** (#general-dev channel) - the feature request template asks if you've done this +1. **Discuss first in Discord** (#suggestions-feedback channel) - the feature request template asks if you've done this 2. **Check existing issues and discussions** to avoid duplicates 3. **Use the feature request template** when creating an issue 4. **Be specific** about why this feature would benefit the BMad community and strengthen human-AI collaboration @@ -77,7 +78,7 @@ Every contribution should strengthen human-AI collaboration. Ask yourself: **"Do ⚠️ **Required before submitting PRs:** 1. **For bugs**: Check if an issue exists (create one using the bug template if not) -2. **For features**: Discuss in Discord (#general-dev) AND create a feature request issue +2. **For features**: Discuss in Discord (#suggestions-feedback) AND create a feature request issue 3. **For large changes**: Always open an issue first to discuss alignment Please propose small, granular changes! For large or significant changes, discuss in Discord and open an issue first. This prevents wasted effort on PRs that may not align with planned changes. @@ -251,8 +252,9 @@ By participating in this project, you agree to abide by our Code of Conduct. We ## Need Help? - 💬 Join our [Discord Community](https://discord.gg/gk8jAdXWmj): - - **#general-dev** - Technical questions and feature discussions - - **#bugs-issues** - Get help with bugs before filing issues + - **#bmad-development** - Technical questions and discussions + - **#suggestions-feedback** - Feature ideas and suggestions + - **#report-bugs-and-issues** - Get help with bugs before filing issues - 🐛 Report bugs using the [bug report template](https://github.com/bmad-code-org/BMAD-METHOD/issues/new?template=bug_report.md) - 💡 Suggest features using the [feature request template](https://github.com/bmad-code-org/BMAD-METHOD/issues/new?template=feature_request.md) - 📖 Browse the [GitHub Discussions](https://github.com/bmad-code-org/BMAD-METHOD/discussions) diff --git a/docs/explanation/bmm/index.md b/docs/explanation/bmm/index.md index f6438397..4a0e3074 100644 --- a/docs/explanation/bmm/index.md +++ b/docs/explanation/bmm/index.md @@ -128,7 +128,7 @@ Comprehensive documentation for all BMM workflows organized by phase: ### Community and Support -- **[Discord Community](https://discord.gg/gk8jAdXWmj)** - Get help from the community (#general-dev, #bugs-issues) +- **[Discord Community](https://discord.gg/gk8jAdXWmj)** - Get help from the community (#bmad-method-help, #report-bugs-and-issues) - **[GitHub Issues](https://github.com/bmad-code-org/BMAD-METHOD/issues)** - Report bugs or request features - **[YouTube Channel](https://www.youtube.com/@BMadCode)** - Video tutorials and walkthroughs diff --git a/docs/explanation/faq/tools-faq.md b/docs/explanation/faq/tools-faq.md index 682eedd2..313af199 100644 --- a/docs/explanation/faq/tools-faq.md +++ b/docs/explanation/faq/tools-faq.md @@ -221,7 +221,7 @@ Trust your expertise - BMM supports your decisions. **A:** 1. Search [Complete Documentation](https://github.com/bmad-code-org/BMAD-METHOD/blob/main/README.md) for related topics -2. Ask in [Discord Community](https://discord.gg/gk8jAdXWmj) (#general-dev) +2. Ask in [Discord Community](https://discord.gg/gk8jAdXWmj) (#bmad-method-help) 3. Open a [GitHub Issue](https://github.com/bmad-code-org/BMAD-METHOD/issues) 4. Watch [YouTube Tutorials](https://www.youtube.com/@BMadCode) diff --git a/docs/how-to/get-answers-about-bmad.md b/docs/how-to/get-answers-about-bmad.md new file mode 100644 index 00000000..3efe136c --- /dev/null +++ b/docs/how-to/get-answers-about-bmad.md @@ -0,0 +1,98 @@ +--- +title: "How to Get Answers About BMAD" +description: Use an LLM to quickly answer your own BMAD questions +--- + +Point an LLM at BMAD's source files and ask your question. That's the technique—the rest of this guide shows you how. + +## See It Work + +:::note[Example] +**Q:** "Tell me the fastest way to build something with BMAD" + +**A:** Use Quick Flow: Run `create-tech-spec` to write a technical specification, then `quick-dev` to implement it—skipping the full planning phases. This gets small features shipped in a single focused session instead of going through the full 4-phase BMM workflow. +::: + +## Why This Works + +BMAD's prompts are written in plain English, not code. The `_bmad` folder contains readable instructions, workflows, and agent definitions—exactly what LLMs are good at processing. You're not asking the LLM to guess; you're giving it the actual source material. + +## How to Do It + +### What Each Source Gives You + +| Source | Best For | Examples | +|--------|----------|----------| +| **`_bmad` folder** (installed) | How BMAD works in detail—agents, workflows, prompts | "What does the PM agent do?" "How does the PRD workflow work?" | +| **Full GitHub repo** (cloned) | Why things are the way they are—history, installer, architecture | "Why is the installer structured this way?" "What changed in v6?" | +| **`llms-full.txt`** | Quick overview from documentation perspective | "Explain BMAD's four phases" "What's the difference between levels?" | + +:::note[What's `_bmad`?] +The `_bmad` folder is created when you install BMAD. It contains all the agent definitions, workflows, and prompts. If you don't have this folder yet, you haven't installed BMAD—see the "clone the repo" option below. +::: + +### If Your AI Can Read Files (Claude Code, Cursor, etc.) + +**BMAD installed:** Point your LLM at the `_bmad` folder and ask directly. + +**Want deeper context:** Clone the [full repo](https://github.com/bmad-code-org/BMAD-METHOD) for git history and installer details. + +### If You Use ChatGPT or Claude.ai + +Fetch `llms-full.txt` into your session: + +``` +https://bmad-code-org.github.io/BMAD-METHOD/llms-full.txt +``` + +You can also find this and other downloadable resources on the [Downloads page](/downloads). + +:::tip[Verify Surprising Answers] +LLMs occasionally get things wrong. If an answer seems off, check the source file it referenced or ask on Discord. +::: + +## Still Stuck? + +Tried the LLM approach and still need help? You now have a much better question to ask. + +| Channel | Use For | +|---------|---------| +| `#bmad-method-help` | Quick questions (real-time chat) | +| `help-requests` forum | Detailed questions (searchable, persistent) | +| `#suggestions-feedback` | Ideas and feature requests | +| `#report-bugs-and-issues` | Bug reports | + +**Discord:** [discord.gg/gk8jAdXWmj](https://discord.gg/gk8jAdXWmj) + +## Found a Bug? + +If it's clearly a bug in BMAD itself, skip Discord and go straight to GitHub Issues: + +**GitHub Issues:** [github.com/bmad-code-org/BMAD-METHOD/issues](https://github.com/bmad-code-org/BMAD-METHOD/issues) + +--- + +*You!* + *Stuck* + *in the queue—* + *waiting* + *for who?* + +*The source* + *is there,* + *plain to see!* + +*Point* + *your machine.* + *Set it free.* + +*It reads.* + *It speaks.* + *Ask away—* + +*Why wait* + *for tomorrow* + *when you have* + *today?* + +*—Claude* diff --git a/docs/how-to/index.md b/docs/how-to/index.md index 3319781c..df7059c3 100644 --- a/docs/how-to/index.md +++ b/docs/how-to/index.md @@ -32,3 +32,5 @@ Working with existing codebases. ## Troubleshooting Solutions to common problems. + +- [Get Answers About BMAD](./get-answers-about-bmad.md) diff --git a/docs/tutorials/advanced/create-custom-agent.md b/docs/tutorials/advanced/create-custom-agent.md index d68e22dc..11572963 100644 --- a/docs/tutorials/advanced/create-custom-agent.md +++ b/docs/tutorials/advanced/create-custom-agent.md @@ -154,7 +154,7 @@ Study the reference agents in `src/modules/bmb/reference/agents/`: ## Getting Help -- **[Discord Community](https://discord.gg/gk8jAdXWmj)** - Ask in #general-dev or #bugs-issues +- **[Discord Community](https://discord.gg/gk8jAdXWmj)** - Ask in #bmad-method-help or #report-bugs-and-issues - **[GitHub Issues](https://github.com/bmad-code-org/BMAD-METHOD/issues)** - Report bugs or request features ## Further Reading diff --git a/docs/tutorials/getting-started/getting-started-bmadv4.md b/docs/tutorials/getting-started/getting-started-bmadv4.md index 40bb9cb4..53ca1c6c 100644 --- a/docs/tutorials/getting-started/getting-started-bmadv4.md +++ b/docs/tutorials/getting-started/getting-started-bmadv4.md @@ -231,7 +231,7 @@ Workflows are context-intensive. Reusing chats can cause the AI to hallucinate o - **During workflows** — Agents guide you with questions and explanations - **Check status** — Run `workflow-status` with any agent -- **Community** — [Discord](https://discord.gg/gk8jAdXWmj) (#general-dev, #bugs-issues) +- **Community** — [Discord](https://discord.gg/gk8jAdXWmj) (#bmad-method-help, #report-bugs-and-issues) - **Video tutorials** — [BMad Code YouTube](https://www.youtube.com/@BMadCode) ## Key Takeaways diff --git a/docs/tutorials/getting-started/getting-started-bmadv6.md b/docs/tutorials/getting-started/getting-started-bmadv6.md index 4679f893..644e822d 100644 --- a/docs/tutorials/getting-started/getting-started-bmadv6.md +++ b/docs/tutorials/getting-started/getting-started-bmadv6.md @@ -230,7 +230,7 @@ Yes, once you learn the flow. Use the Quick Reference to go directly to needed w ## Getting Help - **During workflows** — Agents guide you with questions and explanations -- **Community** — [Discord](https://discord.gg/gk8jAdXWmj) (#general-dev, #bugs-issues) +- **Community** — [Discord](https://discord.gg/gk8jAdXWmj) (#bmad-method-help, #report-bugs-and-issues) - **Documentation** — [BMM Workflow Reference](../../reference/workflows/index.md) - **Video tutorials** — [BMad Code YouTube](https://www.youtube.com/@BMadCode) diff --git a/docs/tutorials/getting-started/quick-start-bmgd.md b/docs/tutorials/getting-started/quick-start-bmgd.md index a67c7d78..eca43f38 100644 --- a/docs/tutorials/getting-started/quick-start-bmgd.md +++ b/docs/tutorials/getting-started/quick-start-bmgd.md @@ -243,7 +243,7 @@ Yes. Documents are living artifacts—return to update them as your vision evolv ## Getting Help - **During workflows** — Agents guide you with questions and explanations -- **Community** — [Discord](https://discord.gg/gk8jAdXWmj) (#general-dev, #bugs-issues) +- **Community** — [Discord](https://discord.gg/gk8jAdXWmj) (#bmad-method-help, #report-bugs-and-issues) - **Documentation** — [BMGD Workflow Reference](../../reference/workflows/bmgd-workflows.md) - **Video tutorials** — [BMad Code YouTube](https://www.youtube.com/@BMadCode) From 7bf05c9d9da69da1c6706d879a0056523851bb42 Mon Sep 17 00:00:00 2001 From: Brian Madison Date: Wed, 7 Jan 2026 16:21:08 +0800 Subject: [PATCH 15/19] fix missing scripts from installation, and add ability to exclude workflows from being added as commands in tools, the first being the example workflow meant just for workflow example to the workflow builder --- src/core/tasks/shard-doc.xml | 4 +- src/core/tasks/validate-workflow.xml | 89 ----- .../workflows/meal-prep-nutrition/workflow.md | 1 + .../create-module/steps/step-01-init.md | 156 -------- .../create-module/steps/step-01b-continue.md | 170 --------- .../create-module/steps/step-02-concept.md | 218 ----------- .../create-module/steps/step-03-components.md | 268 -------------- .../create-module/steps/step-04-structure.md | 229 ------------ .../create-module/steps/step-05-config.md | 234 ------------ .../create-module/steps/step-06-agents.md | 297 --------------- .../create-module/steps/step-07-workflows.md | 229 ------------ .../create-module/steps/step-08-installer.md | 187 ---------- .../steps/step-09-documentation.md | 310 ---------------- .../create-module/steps/step-10-roadmap.md | 338 ------------------ .../create-module/steps/step-11-validate.md | 336 ----------------- .../create-module/templates/agent.template.md | 313 ---------------- .../templates/installer.template.js | 47 --- .../templates/module-plan.template.md | 5 - .../templates/module.template.yaml | 53 --- .../templates/workflow-plan-template.md | 23 -- .../bmb/workflows/create-module/validation.md | 126 ------- .../bmb/workflows/create-module/workflow.md | 56 --- .../examples/meal-prep-nutrition/workflow.md | 1 + .../workflow/data/frontmatter-standards.md | 140 +++++--- .../steps-v/step-02-frontmatter-validation.md | 135 ++++--- .../bmb/workflows/workflow/workflow.md | 4 +- .../steps/step-01-init.md | 11 +- .../steps/step-01b-continue.md | 5 - .../steps/step-02-vision.md | 7 +- .../steps/step-03-users.md | 7 +- .../steps/step-04-metrics.md | 7 +- .../steps/step-05-scope.md | 7 +- .../steps/step-06-complete.md | 5 - .../installers/lib/core/manifest-generator.js | 10 +- 34 files changed, 202 insertions(+), 3826 deletions(-) delete mode 100644 src/core/tasks/validate-workflow.xml delete mode 100644 src/modules/bmb/workflows/create-module/steps/step-01-init.md delete mode 100644 src/modules/bmb/workflows/create-module/steps/step-01b-continue.md delete mode 100644 src/modules/bmb/workflows/create-module/steps/step-02-concept.md delete mode 100644 src/modules/bmb/workflows/create-module/steps/step-03-components.md delete mode 100644 src/modules/bmb/workflows/create-module/steps/step-04-structure.md delete mode 100644 src/modules/bmb/workflows/create-module/steps/step-05-config.md delete mode 100644 src/modules/bmb/workflows/create-module/steps/step-06-agents.md delete mode 100644 src/modules/bmb/workflows/create-module/steps/step-07-workflows.md delete mode 100644 src/modules/bmb/workflows/create-module/steps/step-08-installer.md delete mode 100644 src/modules/bmb/workflows/create-module/steps/step-09-documentation.md delete mode 100644 src/modules/bmb/workflows/create-module/steps/step-10-roadmap.md delete mode 100644 src/modules/bmb/workflows/create-module/steps/step-11-validate.md delete mode 100644 src/modules/bmb/workflows/create-module/templates/agent.template.md delete mode 100644 src/modules/bmb/workflows/create-module/templates/installer.template.js delete mode 100644 src/modules/bmb/workflows/create-module/templates/module-plan.template.md delete mode 100644 src/modules/bmb/workflows/create-module/templates/module.template.yaml delete mode 100644 src/modules/bmb/workflows/create-module/templates/workflow-plan-template.md delete mode 100644 src/modules/bmb/workflows/create-module/validation.md delete mode 100644 src/modules/bmb/workflows/create-module/workflow.md diff --git a/src/core/tasks/shard-doc.xml b/src/core/tasks/shard-doc.xml index 551c8965..cd1dd674 100644 --- a/src/core/tasks/shard-doc.xml +++ b/src/core/tasks/shard-doc.xml @@ -1,4 +1,4 @@ - Split large markdown documents into smaller, organized files based on level 2 sections using @kayvan/markdown-tree-parser tool @@ -106,4 +106,4 @@ HALT if npx command fails or produces no output files - \ No newline at end of file + \ No newline at end of file diff --git a/src/core/tasks/validate-workflow.xml b/src/core/tasks/validate-workflow.xml deleted file mode 100644 index 663622a4..00000000 --- a/src/core/tasks/validate-workflow.xml +++ /dev/null @@ -1,89 +0,0 @@ - - Run a checklist against a document with thorough analysis and produce a validation report - - - - - - - - - - If checklist not provided, load checklist.md from workflow location - Try to fuzzy match for files similar to the input document name or if user did not provide the document. If document not - provided or unsure, ask user: "Which document should I validate?" - Load both the checklist and document - - - - For EVERY checklist item, WITHOUT SKIPPING ANY: - - - Read requirement carefully - Search document for evidence along with any ancillary loaded documents or artifacts (quotes with line numbers) - Analyze deeply - look for explicit AND implied coverage - - - ✓ PASS - Requirement fully met (provide evidence) - ⚠ PARTIAL - Some coverage but incomplete (explain gaps) - ✗ FAIL - Not met or severely deficient (explain why) - ➖ N/A - Not applicable (explain reason) - - - - DO NOT SKIP ANY SECTIONS OR ITEMS - - - - Create validation-report-{timestamp}.md in document's folder - - - # Validation Report - - **Document:** {document-path} - **Checklist:** {checklist-path} - **Date:** {timestamp} - - ## Summary - - Overall: X/Y passed (Z%) - - Critical Issues: {count} - - ## Section Results - - ### {Section Name} - Pass Rate: X/Y (Z%) - - {For each item:} - [MARK] {Item description} - Evidence: {Quote with line# or explanation} - {If FAIL/PARTIAL: Impact: {why this matters}} - - ## Failed Items - {All ✗ items with recommendations} - - ## Partial Items - {All ⚠ items with what's missing} - - ## Recommendations - 1. Must Fix: {critical failures} - 2. Should Improve: {important gaps} - 3. Consider: {minor improvements} - - - - - Present section-by-section summary - Highlight all critical issues - Provide path to saved report - HALT - do not continue unless user asks - - - - - NEVER skip sections - validate EVERYTHING - ALWAYS provide evidence (quotes + line numbers) for marks - Think deeply about each requirement - don't rush - Save report to document's folder automatically - HALT after presenting summary - wait for user - - \ No newline at end of file diff --git a/src/modules/bmb/reference/workflows/meal-prep-nutrition/workflow.md b/src/modules/bmb/reference/workflows/meal-prep-nutrition/workflow.md index f0276b39..4bcdd903 100644 --- a/src/modules/bmb/reference/workflows/meal-prep-nutrition/workflow.md +++ b/src/modules/bmb/reference/workflows/meal-prep-nutrition/workflow.md @@ -2,6 +2,7 @@ name: Meal Prep & Nutrition Plan description: Creates personalized meal plans through collaborative nutrition planning between an expert facilitator and individual seeking to improve their nutrition habits. web_bundle: true +standalone: false --- # Meal Prep & Nutrition Plan Workflow diff --git a/src/modules/bmb/workflows/create-module/steps/step-01-init.md b/src/modules/bmb/workflows/create-module/steps/step-01-init.md deleted file mode 100644 index 8e7d79c3..00000000 --- a/src/modules/bmb/workflows/create-module/steps/step-01-init.md +++ /dev/null @@ -1,156 +0,0 @@ ---- -nextStepFile: '{installed_path}/steps/step-02-concept.md' -continueFile: '{installed_path}/steps/step-01b-continue.md' -modulePlanTemplate: '{installed_path}/templates/module-plan.template.md' -advancedElicitationTask: '{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml' -partyModeWorkflow: '{project-root}/_bmad/core/workflows/party-mode/workflow.md' -customModuleLocation: '{bmb_creations_output_folder}' -modulePlanFile: '{bmb_creations_output_folder}/{module_name}/module-plan-{module_name}.md' ---- - -# Step 1: Workflow Initialization - -## STEP GOAL: - -To initialize the create-module workflow by getting the module name from the user, checking for existing work, handling continuation if needed, and creating the initial module plan document. - -## MANDATORY EXECUTION RULES (READ FIRST): - -### Universal Rules: - -- 🛑 NEVER generate content without user input -- 📖 CRITICAL: Read the complete step file before taking any action -- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read -- 📋 YOU ARE A FACILITATOR, not a content generator -- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` - -### Role Reinforcement: - -- ✅ You are a Module Architect and BMAD Systems Specialist -- ✅ We engage in collaborative dialogue, not command-response -- ✅ You bring expertise in BMAD architecture and module creation, user brings their module requirements -- ✅ Maintain collaborative, guiding tone throughout - -### Step-Specific Rules: - -- 🎯 Focus ONLY on initialization, getting module name, and setting up tracking -- 🚫 FORBIDDEN to look ahead to future steps -- 💬 Handle initialization professionally -- 🚪 DETECT existing workflow state and handle continuation properly - -## EXECUTION PROTOCOLS: - -- 🎯 Show analysis before taking any action -- 💾 Initialize document and update frontmatter -- 📖 Set up frontmatter `stepsCompleted: [1]` before loading next step -- 🚫 FORBIDDEN to load next step until setup is complete - -## CONTEXT BOUNDARIES: - -- Variables from workflow.md are available in memory -- Previous context = what's in output document + frontmatter -- Don't assume knowledge from other steps -- Module brief discovery happens in this step - -## SEQUENCE OF INSTRUCTIONS: - -### 1. Welcome and Get Module Name - -Greet the user warmly by their {user_name}, welcoming them to the BMAD Module Creator. Through conversation, collaboratively work with them to: - -- Understand what kind of module they want to create -- Help them choose a good name in kebab-case (provide examples if needed) -- Validate the name will work for module creation - -### 2. Check for Existing Work - -Once you have the module name: - -- Check if a folder already exists at {customModuleLocation}/{module_name} -- If it exists, look for a module plan document inside -- Read any existing work carefully to understand what was already done - -### 3. Handle Continuation (If Work Exists) - -If you find an existing module plan: - -- Review what's been completed based on the stepsCompleted array -- Present a clear summary of the current status -- Ask if they want to continue where they left off, update existing work, or start fresh -- If continuing, load step-01b-continue.md - -### 4. Look for Supporting Documents - -Check for any existing documents that could help: - -- Module briefs in the module folder or output folder -- Brainstorming results in the output folder -- Any other relevant documentation - -### 5. Guide User's Next Decision - -If no supporting documents are found: - -- Explain their three options clearly and helpfully -- Option 1: Proceed with creating the module based on their ideas -- Option 2: Exit and create a module brief first (explain the module-brief workflow) -- Option 3: Exit and do brainstorming first (explain the brainstorming workflow) -- Support whatever choice they make - -### 6. Create Module Foundation - -If proceeding: - -- Create the module folder if needed -- Create the initial module-plan-{module_name}.md document using the module plan template from {modulePlanTemplate} -- Initialize proper frontmatter with current date, user name, and add "step-01-init" to stepsCompleted array -- Add any discovered documents to inputDocuments field -- Include a brief section about the legacy reference - -### 7. Prepare for Next Step - -- Confirm everything is set up properly -- Let the user know what you've accomplished -- Transition smoothly to the next phase of defining the module concept - -### 8. Present MENU OPTIONS - -Display: **Proceeding to define your module concept...** - -#### EXECUTION RULES: - -- This is an initialization step with no user choices (after inputs handled) -- Proceed directly to next step after setup -- Use menu handling logic section below - -#### Menu Handling Logic: - -- After setup completion, add step-01-init to the end of the stepsCompleted array in module plan frontmatter, then load, read entire file, then execute `{nextStepFile}` to define the module concept - ---- - -## 🚨 SYSTEM SUCCESS/FAILURE METRICS - -### ✅ SUCCESS: - -- Module name obtained and validated through collaborative dialogue -- Module plan document created from template with frontmatter initialized -- "step-01-init" added to stepsCompleted array -- Module plan document created at correct location -- User feels welcomed and informed -- Ready to proceed to step 2 -- OR existing workflow properly routed to step-01b-continue.md - -### ❌ SYSTEM FAILURE: - -- Proceeding with step 2 without module plan creation -- Not checking for existing documents properly -- Creating module without user input on name -- Skipping folder creation -- Not routing to step-01b-continue.md when appropriate - -**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. - -## CRITICAL STEP COMPLETION NOTE - -ONLY WHEN initialization setup is complete and module plan document is created (OR continuation is properly routed), will you then immediately load, read entire file, then execute `{nextStepFile}` to begin defining the module concept. diff --git a/src/modules/bmb/workflows/create-module/steps/step-01b-continue.md b/src/modules/bmb/workflows/create-module/steps/step-01b-continue.md deleted file mode 100644 index f2b3528f..00000000 --- a/src/modules/bmb/workflows/create-module/steps/step-01b-continue.md +++ /dev/null @@ -1,170 +0,0 @@ ---- -modulePlanFile: '{bmb_creations_output_folder}/{module_name}/module-plan-{module_name}.md' ---- - -# Step 1b: Continue Module Creation - -## MANDATORY EXECUTION RULES (READ FIRST): - -### Universal Rules: - -- 🛑 NEVER generate content without user input -- 📖 CRITICAL: Read the complete step file before taking any action -- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read -- 📋 YOU ARE A FACILITATOR, not a content generator -- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` - -### Role Reinforcement: - -- ✅ You are a Module Architect and BMAD Systems Specialist -- ✅ We engage in collaborative dialogue, not command-response -- ✅ You bring expertise in BMAD architecture and module creation, user brings their module requirements -- ✅ Maintain collaborative, guiding tone throughout - -### Step-Specific Rules: - -- 🎯 Focus ONLY on handling continuation and resuming workflow -- 🚫 FORBIDDEN to modify existing work without user consent -- 💬 Present status clearly and get user direction -- 📋 Track completion status accurately - -## EXECUTION PROTOCOLS: - -- 🎯 Load and analyze existing module plan -- 💾 Update frontmatter with continuation status -- 📖 Route to appropriate next step based on progress -- 🚫 FORBIDDEN to skip steps just because they exist - -## CONTEXT BOUNDARIES: - -- Module plan document exists with previous work -- Focus on understanding what's been done and what remains -- Don't assume completion without verification -- User direction guides next actions - -## STEP GOAL: - -To resume module creation by presenting current status, understanding what's been accomplished, and determining the next step in the process. - -## CONTINUATION HANDLING SEQUENCE: - -### 1. Load and Analyze Existing Module Plan - -Load module plan from: {modulePlanFile} -Read entire document including frontmatter -Extract current status from frontmatter fields: - -- stepsCompleted array -- lastStep (the final item in the stepsCompleted array) -- module_name -- module_code -- date -- inputDocuments - -### 2. Present Current Status - -"Welcome back! I found your in-progress module creation for **{module_name}**. - -**Current Status:** - -- **Module Code:** {module_code} -- **Started:** {date} -- **Last Step:** {lastStep} -- **Steps Completed:** {stepsCompleted count}/{total steps} -- **Location:** {bmb_creations_output_folder}/{module_name} - -Progress Summary:" - -Based on stepsCompleted, show: - -- [✅] Step 1: Init - Complete -- [ ] Step 2: Concept - {status} -- [ ] Step 3: Components - {status} -- [ ] Step 4: Structure - {status} -- [ ] Step 5: Configuration - {status} -- [ ] Step 6: Agents - {status} -- [ ] Step 7: Workflows - {status} -- [ ] Step 8: Installer - {status} -- [ ] Step 9: Documentation - {status} -- [ ] Step 10: Roadmap - {status} -- [ ] Step 11: Validation - {status} - -### 3. Review What's Been Done - -Read content sections of module plan -Summarize what's been accomplished: - -"**Completed Work:** - -- Module identity defined -- Component planning complete -- [Other completed items based on content]" - -### 4. Determine Next Step - -Based on stepsCompleted array: -Find highest completed step number -Next step = highest completed + 1 - -"**Ready to Continue:** -Your next step would be: **Step {nextStep} - [step name]** - -What would you like to do? - -1. **Continue** from where you left off -2. **Review** what's been done so far -3. **Modify** previous work -4. **Start over** with a new plan" - -### 5. Handle User Choice - -User your best judgement in how to handle the users choice - -### 6. Update Continuation Status - -Update modulePlanFile frontmatter: - -- Set lastStep: 'continued' -- Add note about continuation date -- Keep stepsCompleted unchanged - -## ✅ SUCCESS METRICS: - -- User understands current progress -- Next step identified correctly -- User choice handled appropriately -- Module plan updated with continuation status -- Workflow resumed at correct location - -## ❌ FAILURE MODES TO AVOID: - -- Not accurately reading previous status -- Skipping steps just because they exist -- Not offering review option -- Losing previous work -- Not updating continuation tracking - ---- - -## 🚨 SYSTEM SUCCESS/FAILURE METRICS - -### ✅ SUCCESS: - -- Existing work properly loaded and analyzed -- User clearly understands current status -- Continuation options presented clearly -- Next step determined correctly -- Module plan updated with continuation information - -### ❌ SYSTEM FAILURE: - -- Not reading existing plan completely -- Misrepresenting progress status -- Losing track of what's been done -- Not offering appropriate continuation options - -**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. - -## CRITICAL STEP COMPLETION NOTE - -ONLY WHEN user selects 'C' (Continue) and appropriate updates are saved to modulePlanFile, will you then load, read entire file, then execute the determined next step file to resume the module creation workflow. diff --git a/src/modules/bmb/workflows/create-module/steps/step-02-concept.md b/src/modules/bmb/workflows/create-module/steps/step-02-concept.md deleted file mode 100644 index 0d868d25..00000000 --- a/src/modules/bmb/workflows/create-module/steps/step-02-concept.md +++ /dev/null @@ -1,218 +0,0 @@ ---- -installed_path: '{project-root}/_bmad/bmb/workflows/create-module' -nextStepFile: '{installed_path}/steps/step-03-components.md' -modulePlanFile: '{bmb_creations_output_folder}/{module_name}/module-plan-{module_name}.md' -moduleStructureGuide: '{project-root}/bmb/workflows/create-agent-legacy/create-module/module-structure.md' -advancedElicitationTask: '{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml' -partyModeWorkflow: '{project-root}/_bmad/core/workflows/party-mode/workflow.md' ---- - -# Step 2: Define Module Concept and Scope - -## MANDATORY EXECUTION RULES (READ FIRST): - -### Universal Rules: - -- 🛑 NEVER generate content without user input -- 📖 CRITICAL: Read the complete step file before taking any action -- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read -- 📋 YOU ARE A FACILITATOR, not a content generator -- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` - -### Role Reinforcement: - -- ✅ You are a Module Architect and Business Analyst -- ✅ If you already have been given communication or persona patterns, continue to use those while playing this new role -- ✅ We engage in collaborative dialogue, not command-response -- ✅ You bring expertise in module design and BMAD patterns, user brings their domain knowledge -- ✅ Maintain collaborative, educational tone - -### Step-Specific Rules: - -- 🎯 Focus ONLY on defining the module concept and scope -- 🚫 FORBIDDEN to start designing components in this step -- 💬 Ask questions conversationally to understand vision -- 🚫 FORBIDDEN to proceed without clear module identity - -## EXECUTION PROTOCOLS: - -- 🎯 Load and study module structure guide for context -- 💾 Document all module identity details in plan -- 📖 Add "step-02-concept" to stepsCompleted array` before loading next step -- 🚫 FORBIDDEN to load next step until user selects 'C' - -## CONTEXT BOUNDARIES: - -- Module name and location from step 1 -- Input documents (brief/brainstorming) if any -- Focus ONLY on concept and scope definition -- Don't assume module details beyond what user provides - -## STEP GOAL: - -To articulate the module's vision, define its identity, and establish clear boundaries for what it will and won't do. - -## MODULE CONCEPT DEFINITION PROCESS: - -### 1. Load Context and Briefs - -"Let's define your module's concept and identity. This will guide all the decisions we make about agents, workflows, and features." - -Load module-plan.md and check inputDocuments field - -Read the module brief completely -"I see you have a module brief. Let me review that to understand your vision..." -Use brief content to inform concept development questions - -Load and study the module structure guide for context - -### 2. Guide Concept Development - -Ask conversationally: - -"**Understanding Your Vision:** - -1. **What problem will this module solve?** - What pain point or need are you addressing? - -2. **Who is the primary user?** - Who will benefit most from this module? - -3. **What's the main outcome?** - What will users be able to do after using your module? - -4. **Why is this important?** - What makes this module valuable or unique?" - -### 3. Module Identity Development - -Based on their responses, collaboratively develop: - -**Module Name:** - -- Start with their module code: {module_name} -- Suggest a display name in Title Case -- Get user confirmation or refinement - -**Module Purpose:** - -- Distill their problem statement into 1-2 clear sentences -- Focus on value and outcomes -- Get user validation - -**Target Audience:** - -- Identify primary user persona -- Consider skill level (beginner/intermediate/advanced) -- Note any secondary audiences - -**Module Scope:** - -- What's IN scope (core features) -- What's OUT of scope (explicitly state what it won't do) -- Success criteria (how will we know it works?) - -### 4. Module Theme and Category - -"**Module Classification:** - -Based on your description, this seems to fit in the [Domain-Specific/Creative/Technical/Business/Personal] category. - -Does this sound right? Or would you categorize it differently? - -**Example Categories:** - -- **Domain-Specific**: Legal, Medical, Finance, Education -- **Creative**: RPG/Gaming, Story Writing, Music Production -- **Technical**: DevOps, Testing, Architecture, Security -- **Business**: Project Management, Marketing, Sales -- **Personal**: Journaling, Learning, Productivity" - -### 5. Module Type Estimation - -"Based on what you've described, I'm thinking this might be a: - -- **Simple Module** (1-2 agents, 2-3 workflows) - Focused, single-purpose -- **Standard Module** (3-5 agents, 5-10 workflows) - Comprehensive solution -- **Complex Module** (5+ agents, 10+ workflows) - Full platform/framework - -Which feels right for your vision? We'll confirm this after planning components." - -### 6. Document Module Concept - -Update module-plan.md with concept section: - -```markdown -## Module Concept - -**Module Name:** {module_display_name} -**Module Code:** {module_name} -**Category:** [category] -**Type:** [estimated type] - -**Purpose Statement:** -[1-2 sentence clear purpose] - -**Target Audience:** - -- Primary: [description] -- Secondary: [if any] - -**Scope Definition:** - -**In Scope:** - -- [core feature 1] -- [core feature 2] -- [core feature 3] - -**Out of Scope:** - -- [explicitly excluded item 1] -- [explicitly excluded item 2] - -**Success Criteria:** - -- [measurable outcome 1] -- [measurable outcome 2] -- [user satisfaction indicator] -``` - -### 7. Present MENU OPTIONS - -Display: **Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Continue - -#### Menu Handling Logic: - -- IF A: Execute {advancedElicitationTask} to explore alternative concept approaches -- IF P: Execute {partyModeWorkflow} to get creative input on module identity -- IF C: Save concept to module-plan.md, add step-02-concept to the end of the stepsCompleted array in frontmatter, then load nextStepFile -- IF Any other comments or queries: help user respond then redisplay menu - -#### EXECUTION RULES: - -- ALWAYS halt and wait for user input after presenting menu -- ONLY proceed to next step when user selects 'C' -- After other menu items execution, return to this menu -- User can chat or ask questions - always respond then end with display again of the menu options - ---- - -## 🚨 SYSTEM SUCCESS/FAILURE METRICS - -### ✅ SUCCESS: - -- Module purpose clearly articulated -- Module identity established (name, audience, scope) -- Category and type determined -- Concept documented in module plan -- User feels the concept matches their vision - -### ❌ SYSTEM FAILURE: - -- Proceeding without clear module purpose -- Not defining scope boundaries -- Skipping user validation of concept -- Not documenting concept details - -**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. - -## CRITICAL STEP COMPLETION NOTE - -ONLY WHEN C is selected and module concept is saved to module-plan.md with stepsCompleted updated to [1, 2], will you then load, read entire file, then execute `{nextStepFile}` to begin component planning. diff --git a/src/modules/bmb/workflows/create-module/steps/step-03-components.md b/src/modules/bmb/workflows/create-module/steps/step-03-components.md deleted file mode 100644 index 9634b7fd..00000000 --- a/src/modules/bmb/workflows/create-module/steps/step-03-components.md +++ /dev/null @@ -1,268 +0,0 @@ ---- -installed_path: '{project-root}/_bmad/bmb/workflows/create-module' -nextStepFile: '{installed_path}/steps/step-04-structure.md' -modulePlanFile: '{bmb_creations_output_folder}/{module_name}/module-plan-{module_name}.md' -agent_examples_path: '{project-root}/bmb/reference/agents/module-examples' -advancedElicitationTask: '{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml' -partyModeWorkflow: '{project-root}/_bmad/core/workflows/party-mode/workflow.md' ---- - -# Step 3: Plan Module Components - -## MANDATORY EXECUTION RULES (READ FIRST): - -### Universal Rules: - -- 🛑 NEVER generate content without user input -- 📖 CRITICAL: Read the complete step file before taking any action -- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read -- 📋 YOU ARE A FACILITATOR, not a content generator -- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` - -### Role Reinforcement: - -- ✅ You are a Module Architect and Systems Designer -- ✅ If you already have been given communication or persona patterns, continue to use those while playing this new role -- ✅ We engage in collaborative dialogue, not command-response -- ✅ You bring expertise in BMAD component design patterns, user brings their domain requirements -- ✅ Maintain collaborative, design-focused tone - -### Step-Specific Rules: - -- 🎯 Focus ONLY on planning component architecture -- 🚫 FORBIDDEN to create actual components in this step -- 💬 Present component options with reasoning -- 🚫 FORBIDDEN to finalize component list without user agreement - -## EXECUTION PROTOCOLS: - -- 🎯 Reference agent examples for patterns -- 💾 Document component plan in detail -- 📖 Add "step-03-components" to stepsCompleted array` before loading next step -- 🚫 FORBIDDEN to load next step until user selects 'C' - -## CONTEXT BOUNDARIES: - -- Module concept from step 2 is available -- Focus on planning, not implementation -- Consider BMAD patterns and best practices -- Reference examples but don't copy exactly - -## STEP GOAL: - -To design the component architecture for the module, determining what agents, workflows, and tasks are needed to fulfill the module's purpose. - -## COMPONENT PLANNING PROCESS: - -### 1. Initialize Component Planning - -"Now that we have a clear module concept, let's plan the components that will bring it to life. - -Based on your module's purpose and scope, we'll design: - -- **Agents** - The AI personas that will help users -- **Workflows** - The step-by-step processes for accomplishing tasks -- **Tasks** - Quick utilities and supporting functions" - -### 2. Agent Planning - -"**Agent Architecture:** - -Think about the different roles or perspectives needed to accomplish your module's goals. Each agent should have a clear, distinct purpose." - -Reference agent examples for patterns -Load and browse agent examples: {agent_examples_path} - -"**Common Agent Patterns:** - -- **Primary Agent** - The main interface/orchestrator -- **Specialist Agents** - Domain-specific experts -- **Utility Agents** - Helper/support functions - -**Example by Module Type:** - -**Technical Modules (e.g., DevOps, Testing):** - -- Implementation Specialist -- Reviewer/Auditor -- Documentation Expert - -**Creative Modules (e.g., Story Writing, Game Design):** - -- Creative Director -- World Builder -- Content Generator - -**Business Modules (e.g., Project Management):** - -- Project Coordinator -- Facilitator -- Analyst" - -"**For your {module_category} module, I suggest considering:** - -[Suggest 2-4 specific agent types based on module concept] - -**What resonates with your vision?** Which of these agents would be most valuable, and are there any others you'd like to add?" - -### 3. Workflow Planning - -"**Workflow Design:** - -Workflows are the step-by-step processes that users will follow to accomplish specific tasks. Each workflow should solve a specific problem or achieve a particular outcome." - -**Types of Workflows:** - -- **Document Workflows** - Generate reports, plans, specifications -- **Action Workflows** - Perform operations, create structures -- **Interactive Workflows** - Guided sessions, coaching, training - -**Example Workflow Patterns:** - -"For your module's purpose, consider these potential workflows: - -1. **[Primary Workflow Name]** - Main workflow for core functionality -2. **[Supporting Workflow 1]** - For specific use case -3. **[Supporting Workflow 2]** - For another use case - -Remember: We'll create workflow PLANS first, not full implementations. These plans can be used later with the create-workflow workflow." - -### 4. Task Planning (Optional) - -"**Task Planning (if needed):** - -Tasks are single-operation utilities that don't need full workflows. They're good for: - -- Quick actions -- Shared subroutines -- Helper functions - -Does your module need any tasks? For example: - -- Status checking -- Quick formatting -- Validation utilities" - -### 5. Component Integration Planning - -"**How Components Work Together:** - -Let's think about how your components will interact: - -- **Agent Collaboration**: Will agents work together or independently? -- **Workflow Dependencies**: Do workflows need to call each other? -- **Task Usage**: Which workflows will use which tasks?" - -### 6. Component Priority and MVP - -"**Starting Point (MVP):** - -To ensure success, let's identify the minimum viable set: - -**Must Have (Phase 1):** - -- [List essential agents] -- [List essential workflows] - -**Nice to Have (Phase 2):** - -- [Additional agents] -- [Additional workflows] -- [Tasks if any] - -This approach lets you launch with core functionality and expand later." - -### 7. Document Component Plan - -Update module-plan.md with component section: - -```markdown -## Component Architecture - -### Agents (N planned) - -1. **[Agent Name]** - [Brief purpose] - - Type: [Primary/Specialist/Utility] - - Role: [Specific role description] - -2. **[Agent Name]** - [Brief purpose] - - Type: [Primary/Specialist/Utility] - - Role: [Specific role description] - -### Workflows (N planned) - -1. **[Workflow Name]** - [Purpose] - - Type: [Document/Action/Interactive] - - Primary user: [Who uses this] - - Key output: [What it produces] - -2. **[Workflow Name]** - [Purpose] - - Type: [Document/Action/Interactive] - - Primary user: [Who uses this] - - Key output: [What it produces] - -### Tasks (N planned) - -1. **[Task Name]** - [Single-purpose function] - - Used by: [Which workflows/agents] - -### Component Integration - -- Agents collaborate via: [description] -- Workflow dependencies: [description] -- Task usage patterns: [description] - -### Development Priority - -**Phase 1 (MVP):** - -- [List of components to create first] - -**Phase 2 (Enhancement):** - -- [List of components for later] -``` - -### 8. Present MENU OPTIONS - -Display: **Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Continue - -#### Menu Handling Logic: - -- IF A: Execute {advancedElicitationTask} to explore alternative component architectures -- IF P: Execute {partyModeWorkflow} to get creative input on component design -- IF C: Save component plan to module-plan.md, add step-03-components to the end of the stepsCompleted array in frontmatter, then load nextStepFile -- IF Any other comments or queries: help user respond then redisplay menu - -#### EXECUTION RULES: - -- ALWAYS halt and wait for user input after presenting menu -- ONLY proceed to next step when user selects 'C' -- After other menu items execution, return to this menu -- User can chat or ask questions - always respond then end with display again of the menu options - ---- - -## 🚨 SYSTEM SUCCESS/FAILURE METRICS - -### ✅ SUCCESS: - -- Component architecture planned and documented -- Agent types and purposes clearly defined -- Workflow requirements identified -- Integration patterns established -- Development priority set (MVP vs enhancements) - -### ❌ SYSTEM FAILURE: - -- Planning components without module purpose context -- Not considering BMAD patterns and examples -- Over-engineering (too many components) -- Under-planning (missing essential components) -- Not establishing development priorities - -**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. - -## CRITICAL STEP COMPLETION NOTE - -ONLY WHEN C is selected and component plan is saved to module-plan.md with stepsCompleted updated to [1, 2, 3], will you then load, read entire file, then execute `{nextStepFile}` to begin creating the module structure. diff --git a/src/modules/bmb/workflows/create-module/steps/step-04-structure.md b/src/modules/bmb/workflows/create-module/steps/step-04-structure.md deleted file mode 100644 index 2b1bfc58..00000000 --- a/src/modules/bmb/workflows/create-module/steps/step-04-structure.md +++ /dev/null @@ -1,229 +0,0 @@ ---- -installed_path: '{project-root}/_bmad/bmb/workflows/create-module' -nextStepFile: '{installed_path}/steps/step-05-config.md' -modulePlanFile: '{bmb_creations_output_folder}/{module_name}/module-plan-{module_name}.md' -advancedElicitationTask: '{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml' -partyModeWorkflow: '{project-root}/_bmad/core/workflows/party-mode/workflow.md' ---- - -# Step 4: Create Module Structure - -## MANDATORY EXECUTION RULES (READ FIRST): - -### Universal Rules: - -- 🛑 NEVER generate content without user input -- 📖 CRITICAL: Read the complete step file before taking any action -- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read -- 📋 YOU ARE A FACILITATOR, not a content generator -- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` - -### Role Reinforcement: - -- ✅ You are a Module Architect and Systems Organizer -- ✅ If you already have been given communication or persona patterns, continue to use those while playing this new role -- ✅ We engage in collaborative dialogue, not command-response -- ✅ You bring expertise in BMAD structure patterns, user brings their component requirements -- ✅ Maintain collaborative, organized tone - -### Step-Specific Rules: - -- 🎯 Focus ONLY on creating directory structure and determining complexity -- 🚫 FORBIDDEN to create actual component files in this step -- 💬 Explain structure decisions clearly -- 🚫 FORBIDDEN to proceed without confirming structure - -## EXECUTION PROTOCOLS: - -- 🎯 Use component count to determine module type -- 💾 Create all required directories -- 📖 Add "step-04-structure" to stepsCompleted array` before loading next step -- 🚫 FORBIDDEN to load next step until user selects 'C' - -## CONTEXT BOUNDARIES: - -- Component plan from step 3 is available -- Standard BMAD module structure to follow -- Focus on structure creation, not content -- Module folder already exists from step 1 - -## STEP GOAL: - -To determine the module's complexity type and create the complete directory structure for the module. - -## MODULE STRUCTURE CREATION PROCESS: - -### 1. Determine Module Complexity - -"Based on your component plan, let's determine your module's complexity level:" - -**Count Components:** - -- Agents: [count from plan] -- Workflows: [count from plan] -- Tasks: [count from plan] - -**Complexity Assessment:** - -"**Simple Module Criteria:** - -- 1-2 agents, all Simple type -- 1-3 workflows -- No complex integrations - -**Standard Module Criteria:** - -- 2-4 agents with mixed types -- 3-8 workflows -- Some shared resources - -**Complex Module Criteria:** - -- 4+ agents or multiple Module-type agents -- 8+ workflows -- Complex interdependencies -- External integrations" - -"**Your module has:** - -- [agent_count] agents -- [workflow_count] workflows -- [task_count] tasks - -**This makes it a: [Simple/Standard/Complex] Module**" - -### 2. Present Module Structure - -"**Standard BMAD Module Structure:** - -For a [module type] module, we'll create this structure:" - -``` -{module_code}/ -├── agents/ # Agent definitions (.md) -│ ├── [agent-name].md -│ └── ... -├── workflows/ # Workflow folders -│ ├── [workflow-name]/ -│ │ ├── workflow-plan.md # Descriptive plan -│ │ └── README.md # Workflow documentation -│ └── ... -├── tasks/ # Task files (if any) -│ └── [task-name].md -├── templates/ # Shared templates -│ └── [template-files] -├── data/ # Module data files -│ └── [data-files] -├── module.yaml # Required -├── _module-installer/ # Installation configuration -│ ├── installer.js # Optional -│ └── assets/ # Optional install assets -└── README.md # Module documentation -``` - -### 3. Create Directory Structure - -Create all directories in {bmb_creations_output_folder}/{module_name}/: - -1. **agents/** - For agent definition files -2. **workflows/** - For workflow folders -3. **tasks/** - For task files (if tasks planned) -4. **templates/** - For shared templates -5. **data/** - For module data -6. **_module-installer/** - For installation configuration - -### 4. Create Placeholder README - -Create initial README.md with basic structure: - -````markdown -# {module_display_name} - -{module_purpose} - -## Installation - -```bash -bmad install {module_code} -``` -```` - -## Components - -_Module documentation will be completed in Step 9_ - -## Quick Start - -_Getting started guide will be added in Step 9_ - ---- - -_This module is currently under construction_ - -```` - -### 5. Document Structure Creation - -Update module-plan.md with structure section: - -```markdown -## Module Structure - -**Module Type:** [Simple/Standard/Complex] -**Location:** {bmb_creations_output_folder}/{module_name} - -**Directory Structure Created:** -- ✅ agents/ -- ✅ workflows/ -- ✅ tasks/ -- ✅ templates/ -- ✅ data/ -- ✅ _module-installer/ -- ✅ README.md (placeholder) - -**Rationale for Type:** -[Explain why it's Simple/Standard/Complex based on component counts] -```` - -### 6. Present MENU OPTIONS - -Display: **Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Continue - -#### Menu Handling Logic: - -- IF A: Execute {advancedElicitationTask} to explore alternative structure approaches -- IF P: Execute {partyModeWorkflow} to get creative input on organization -- IF C: Save structure info to module-plan.md, add step-04-structure to the end of the stepsCompleted array in frontmatter, then load nextStepFile -- IF Any other comments or queries: help user respond then redisplay menu - -#### EXECUTION RULES: - -- ALWAYS halt and wait for user input after presenting menu -- ONLY proceed to next step when user selects 'C' -- After other menu items execution, return to this menu -- User can chat or ask questions - always respond then end with display again of the menu options - ---- - -## 🚨 SYSTEM SUCCESS/FAILURE METRICS - -### ✅ SUCCESS: - -- Module complexity correctly determined -- All required directories created -- Structure follows BMAD standards -- Placeholder README created -- Structure documented in plan - -### ❌ SYSTEM FAILURE: - -- Not creating all required directories -- Incorrectly categorizing module complexity -- Not following BMAD structure patterns -- Creating component files prematurely - -**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. - -## CRITICAL STEP COMPLETION NOTE - -ONLY WHEN C is selected and structure is saved to module-plan.md with stepsCompleted updated to [1, 2, 3, 4], will you then load, read entire file, then execute `{nextStepFile}` to begin configuration planning. diff --git a/src/modules/bmb/workflows/create-module/steps/step-05-config.md b/src/modules/bmb/workflows/create-module/steps/step-05-config.md deleted file mode 100644 index 73172e2a..00000000 --- a/src/modules/bmb/workflows/create-module/steps/step-05-config.md +++ /dev/null @@ -1,234 +0,0 @@ ---- -installed_path: '{project-root}/_bmad/bmb/workflows/create-module' -nextStepFile: '{installed_path}/steps/step-06-agents.md' -modulePlanFile: '{bmb_creations_output_folder}/{module_name}/module-plan-{module_name}.md' -advancedElicitationTask: '{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml' -partyModeWorkflow: '{project-root}/_bmad/core/workflows/party-mode/workflow.md' ---- - -# Step 5: Plan Module Configuration - -## MANDATORY EXECUTION RULES (READ FIRST): - -### Universal Rules: - -- 🛑 NEVER generate content without user input -- 📖 CRITICAL: Read the complete step file before taking any action -- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read -- 📋 YOU ARE A FACILITATOR, not a content generator -- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` - -### Role Reinforcement: - -- ✅ You are a Module Architect and Configuration Specialist -- ✅ If you already have been given communication or persona patterns, continue to use those while playing this new role -- ✅ We engage in collaborative dialogue, not command-response -- ✅ You bring expertise in BMAD installation patterns, user brings their module requirements -- ✅ Maintain collaborative, planning-focused tone - -### Step-Specific Rules: - -- 🎯 Focus ONLY on planning configuration fields -- 🚫 FORBIDDEN to create installer files in this step -- 💬 Present configuration options clearly -- 🚫 FORBIDDEN to finalize without user input - -## EXECUTION PROTOCOLS: - -- 🎯 Consider what users might want to configure -- 💾 Document all configuration field plans -- 📖 Add "step-05-config" to stepsCompleted array` before loading next step -- 🚫 FORBIDDEN to load next step until user selects 'C' - -## CONTEXT BOUNDARIES: - -- Module concept and components from previous steps -- Standard BMAD installer configuration patterns -- Focus on planning, not implementation -- Consider user customization needs - -## STEP GOAL: - -To determine what configuration settings the module needs and plan how they'll be implemented in the installer. - -## CONFIGURATION PLANNING PROCESS: - -### 1. Initialize Configuration Planning - -"Now let's plan the configuration for your module's installer. This determines what users can customize when they install your module." - -**Configuration allows users to:** - -- Set up file locations -- Choose features or behavior -- Provide API keys or credentials -- Adjust output formats -- Configure integrations - -### 2. Assess Configuration Needs - -"**Configuration Assessment:** - -Does your {module_display_name} module need any user-configurable settings during installation?" - -**Common Configuration Categories:** - -**1. Output/Data Paths** - -- Where should outputs be saved? -- What's the default data directory? -- Any special folder structures needed? - -**2. Feature Toggles** - -- Enable/disable specific features -- Choose between behavior modes -- Set verbosity levels - -**3. Integration Settings** - -- API keys (for external services) -- Service endpoints -- Authentication credentials - -**4. User Preferences** - -- Default language -- Time zone -- Skill level (beginner/advanced) -- Detail level (minimal/standard/verbose)" - -### 3. Plan Configuration Fields - -"**For each configuration need, let's define:** - -1. **Field Name** (snake_case, e.g., 'output_path') -2. **Type** - INTERACTIVE (asks user) or STATIC (hardcoded) -3. **Prompt** (what to ask user, if interactive) -4. **Default Value** (sensible default) -5. **Input Type** - text, single-select, multi-select -6. **Result Template** - how to store the value" - -**Examples:** - -"**INTERACTIVE Text Input:** - -```yaml -output_path: - prompt: 'Where should {module_name} save outputs?' - default: 'output/{module_name}' - result: '{project-root}/{value}' -``` - -**INTERACTIVE Single-Select:** - -```yaml -detail_level: - prompt: 'How detailed should outputs be?' - default: 'standard' - result: '{value}' - single-select: - - value: 'minimal' - label: 'Minimal - Brief summaries only' - - value: 'standard' - label: 'Standard - Balanced detail' - - value: 'detailed' - label: 'Detailed - Comprehensive information' -``` - -**STATIC Value:** - -````yaml -module_version: - result: "1.0.0" -```" - -### 4. Design Configuration for Your Module - -"**Based on your module's purpose, consider these potential configurations:" - -[Suggest relevant configurations based on module type and purpose] - -"**Which of these apply to your module?** -- [Present options relevant to the specific module] - -**Any additional configurations needed?**" - -### 5. Document Configuration Plan - -Update module-plan.md with configuration section: - -```markdown -## Configuration Planning - -### Required Configuration Fields - -1. **[field_name]** - - Type: [INTERACTIVE/STATIC] - - Purpose: [what it controls] - - Default: [default value] - - Input Type: [text/single-select/multi-select] - - Prompt: [user prompt if interactive] - -2. **[field_name]** - - Type: [INTERACTIVE/STATIC] - - Purpose: [what it controls] - - Default: [default value] - - Input Type: [text/single-select/multi-select] - - Prompt: [user prompt if interactive] - -### Installation Questions Flow - -1. [First question] -2. [Second question] -3. [Additional questions...] - -### Result Configuration Structure - -The module.yaml will generate: -- Module configuration at: _bmad/{module_code}/config.yaml -- User settings stored as: [describe structure] -```` - -### 6. Present MENU OPTIONS - -Display: **Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Continue - -#### Menu Handling Logic: - -- IF A: Execute {advancedElicitationTask} to explore additional configuration options -- IF P: Execute {partyModeWorkflow} to get input on user experience -- IF C: Save configuration plan to module-plan.md, add step-05-config to the end of the stepsCompleted array in frontmatter, then load nextStepFile -- IF Any other comments or queries: help user respond then redisplay menu - -#### EXECUTION RULES: - -- ALWAYS halt and wait for user input after presenting menu -- ONLY proceed to next step when user selects 'C' -- After other menu items execution, return to this menu -- User can chat or ask questions - always respond then end with display again of the menu options - ---- - -## 🚨 SYSTEM SUCCESS/FAILURE METRICS - -### ✅ SUCCESS: - -- All necessary configuration fields identified -- Field types and prompts clearly defined -- User interaction flow planned -- Configuration structure documented -- Ready for installer implementation - -### ❌ SYSTEM FAILURE: - -- Skipping configuration planning for modules that need it -- Over-configuring (too many options) -- Not considering user experience -- Not documenting configuration plans - -**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. - -## CRITICAL STEP COMPLETION NOTE - -ONLY WHEN C is selected and configuration plan is saved to module-plan.md with stepsCompleted updated to [1, 2, 3, 4, 5], will you then load, read entire file, then execute `{nextStepFile}` to begin agent creation. diff --git a/src/modules/bmb/workflows/create-module/steps/step-06-agents.md b/src/modules/bmb/workflows/create-module/steps/step-06-agents.md deleted file mode 100644 index 60cbbc0d..00000000 --- a/src/modules/bmb/workflows/create-module/steps/step-06-agents.md +++ /dev/null @@ -1,297 +0,0 @@ ---- -installed_path: '{project-root}/_bmad/bmb/workflows/create-module' -nextStepFile: '{installed_path}/steps/step-07-workflows.md' -modulePlanFile: '{bmb_creations_output_folder}/{module_name}/module-plan-{module_name}.md' -agentTemplate: '{installed_path}/templates/agent.template.md' -agent_examples_path: '{project-root}/bmb/reference/agents/module-examples' -advancedElicitationTask: '{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml' -partyModeWorkflow: '{project-root}/_bmad/core/workflows/party-mode/workflow.md' ---- - -# Step 6: Create Module Agents - -## MANDATORY EXECUTION RULES (READ FIRST): - -### Universal Rules: - -- 🛑 NEVER generate content without user input -- 📖 CRITICAL: Read the complete step file before taking any action -- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read -- 📋 YOU ARE A FACILITATOR, not a content generator -- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` - -### Role Reinforcement: - -- ✅ You are a Module Architect and Agent Designer -- ✅ If you already have been given communication or persona patterns, continue to use those while playing this new role -- ✅ We engage in collaborative dialogue, not command-response -- ✅ You bring expertise in BMAD agent patterns, user brings their domain requirements -- ✅ Maintain collaborative, creative tone - -### Step-Specific Rules: - -- 🎯 Focus on creating proper YAML agent files following the template -- 🚫 FORBIDDEN to use create-agent workflow (it's problematic) -- 💬 Create placeholder workflow folders with README.md for each agent -- 🚫 FORBIDDEN to create full workflows in this step - -## EXECUTION PROTOCOLS: - -- 🎯 Follow agent.template.md exactly for structure -- 💾 Save agents as .yaml files to module's agents folder -- 📖 Create workflow folders with README.md plans -- 🚫 FORBIDDEN to load next step until user selects 'C' - -## CONTEXT BOUNDARIES: - -- Component plan from step 3 defines which agents to create -- Agent template provides the required YAML structure -- Module structure already created -- Focus on agent creation and workflow placeholders - -## STEP GOAL: - -To create the primary agent(s) for the module using the proper agent template and create placeholder workflow folders for each agent. - -## AGENT CREATION PROCESS: - -### 1. Review Agent Plan - -"Let's create the agents for your {module_display_name} module. - -From your component plan, you have: - -- [agent_count] agents planned -- [list of agent types from plan] - -I'll create each agent following the proper BMAD template and set up placeholder workflow folders for them." - -### 2. Load Agent Template - -Load and study the agent template from {agentTemplate} -Reference agent examples from {agent_examples_path} for patterns - -### 3. Create Each Agent - -For each agent in the component plan: - -#### 3.1 Determine Agent Characteristics - -"**Agent: [Agent Name]** - -Let's design this agent by understanding what it needs: - -**Memory & Learning:** - -1. Does this agent need to remember things across sessions? (conversations, preferences, patterns) - - If yes: We'll add sidecar folder structure for memory - - If no: No persistent memory needed - -**Interaction Types:** 2. What does this agent DO? - -- Conversational interactions? → Use embedded prompts -- Quick single actions? → Use inline actions -- Complex multi-step processes? → Consider workflows -- Document generation? → Likely need workflows - -**Multiple Agent Usage:** 3. Will other agents in this module need the same workflows? - -- If yes: Definitely create separate workflow files -- If no: Could embed in agent file - -**Based on this, what combination does [Agent Name] need?** - -- Memory/Persistence: [Yes/No] -- Embedded prompts: [List main interactions] -- Workflows needed: [Which processes need separate files?]" - -#### 3.2 Present Agent Design - -"**Agent Design: [Agent Name]** - -**Core Identity:** - -- Name: [Suggested name] -- Title: [Brief description] -- Icon: [Appropriate emoji] - -**Persona:** - -- Role: [What the agent does] -- Identity: [Personality/background] -- Communication Style: [How they communicate] -- Principles: [3-5 core principles] - -**Structure:** - -- Memory needed: [Yes/No - sidecar folder] -- Embedded prompts: [List main interaction prompts] -- Workflow processes: [Which need separate files] - -**Menu Items Planned:** - -- [List with trigger codes and types] - -**Quick actions vs Workflows:** - -- Quick prompts: [single-step interactions] -- Workflows: [multi-step, shared processes] - -Does this design match what you envisioned? What should we adjust?" - -#### 3.3 Create Agent File and Structure - -After user confirmation: - -Create hybrid agent file with only needed sections: - -```yaml -agent: - metadata: - name: '[Agent Name]' - title: '[Agent Title]' - icon: '[Icon]' - module: '{module_code}' - persona: - role: '[Agent Role]' - identity: | - [Multi-line identity description] - communication_style: | - [Multi-line communication style] - principles: - - '[Principle 1]' - - '[Principle 2]' - - '[Principle 3]' - - # Only include if agent needs memory/persistence - critical_actions: - - 'Load COMPLETE file ./[agent-name]-sidecar/memories.md and integrate all past interactions' - - 'ONLY read/write files in ./[agent-name]-sidecar/ - this is our private workspace' - - # Only include if agent has embedded prompts - prompts: - - id: '[prompt-name]' - content: | - - [How to use this prompt] - - - [Detailed prompt content] - - menu: - # Always include - - multi: '[CH] Chat with agent or [SPM] Start Party Mode' - triggers: - - party-mode: - input: SPM - route: '{project-root}/_bmad/core/workflows/edit-agent/workflow.md' - type: exec - - expert-chat: - input: CH - action: agent responds as expert - type: action - - # Group related functions - - multi: '[PF] Primary Function [QF] Quick Task' - triggers: - - primary-function: - input: PF - action: '#[prompt-id]' - type: action - - quick-task: - input: QF - route: '#[prompt-id]' - type: exec - - # Workflow only for complex processes - - trigger: 'complex-process' - route: '{project-root}/_bmad/{custom_module}/workflows/[workflow]/workflow.md' - description: 'Complex process [icon]' - - # Quick inline actions - - trigger: 'save-item' - action: 'Save to ./[agent-name]-sidecar/file.md' - description: 'Save item 💾' -``` - -#### 3.4 Create Supporting Structure - -**If agent needs memory:** - -1. Create folder: {bmb_creations_output_folder}/{module_name}/agents/[agent-name]-sidecar/ -2. Create files: - - memories.md (empty, for persistent memory) - - instructions.md (empty, for agent protocols) - - insights.md (empty, for breakthrough moments) - - sessions/ (subfolder for session records) - - patterns.md (empty, for tracking patterns) - -**If agent has workflows:** -For each workflow that needs separate file: - -1. Create folder: {bmb_creations_output_folder}/{module_name}/workflows/[workflow-name]/ -2. Create README.md with workflow plan - -### 4. Repeat for All Agents - -Go through each agent from the component plan, presenting drafts and creating files with user confirmation. - -### 5. Document Agent Creation - -Update module-plan.md with agents section: - -```markdown -## Agents Created - -1. **[Agent Name]** - [Agent Title] - - File: [agent-filename].yaml - - Features: [Memory/Sidecar, Embedded prompts, Workflows] - - Structure: - - Sidecar: [Yes/No] - - Prompts: [number embedded] - - Workflows: [list of workflow folders] - - Status: Created with [combination of features] -``` - -### 6. Present MENU OPTIONS - -Display: **Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Continue - -#### Menu Handling Logic: - -- IF A: Execute {advancedElicitationTask} to refine agent designs -- IF P: Execute {partyModeWorkflow} to get creative input on agent personas -- IF C: Save agent creation status to module-plan.md, add step-06-agents to the end of the stepsCompleted array in frontmatter, then load nextStepFile -- IF Any other comments or queries: help user respond then redisplay menu - -#### EXECUTION RULES: - -- ALWAYS halt and wait for user input after presenting menu -- ONLY proceed to next step when user selects 'C' -- After other menu items execution, return to this menu -- User can chat or ask questions - always respond then end with display again of the menu options - ---- - -## 🚨 SYSTEM SUCCESS/FAILURE METRICS - -### ✅ SUCCESS: - -- All planned agents created with proper YAML structure -- Each agent follows agent.template.md format exactly -- Workflow placeholder folders created with README.md plans -- Agent menu items properly reference workflow paths -- Users confirmed each agent draft before creation - -### ❌ SYSTEM FAILURE: - -- Using create-agent workflow instead of template -- Creating XML agents instead of YAML -- Not creating workflow placeholder folders -- Skipping user confirmation on agent drafts - -**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. - -## CRITICAL STEP COMPLETION NOTE - -ONLY WHEN C is selected and all agents are created with placeholder workflows and stepsCompleted updated, will you then load, read entire file, then execute `{nextStepFile}` to begin workflow plan review. diff --git a/src/modules/bmb/workflows/create-module/steps/step-07-workflows.md b/src/modules/bmb/workflows/create-module/steps/step-07-workflows.md deleted file mode 100644 index 6a7134c4..00000000 --- a/src/modules/bmb/workflows/create-module/steps/step-07-workflows.md +++ /dev/null @@ -1,229 +0,0 @@ ---- -installed_path: '{project-root}/_bmad/bmb/workflows/create-module' -nextStepFile: '{installed_path}/steps/step-08-installer.md' -modulePlanFile: '{bmb_creations_output_folder}/{module_name}/module-plan-{module_name}.md' -workflowPlanTemplate: '{installed_path}/templates/workflow-plan-template.md' -advancedElicitationTask: '{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml' -partyModeWorkflow: '{project-root}/_bmad/core/workflows/party-mode/workflow.md' ---- - -# Step 7: Review Workflow Plans - -## MANDATORY EXECUTION RULES (READ FIRST): - -### Universal Rules: - -- 🛑 NEVER generate content without user input -- 📖 CRITICAL: Read the complete step file before taking any action -- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read -- 📋 YOU ARE A FACILITATOR, not a content generator -- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` - -### Role Reinforcement: - -- ✅ You are a Module Architect and Workflow Designer -- ✅ If you already have been given communication or persona patterns, continue to use those while playing this new role -- ✅ We engage in collaborative dialogue, not command-response -- ✅ You bring expertise in BMAD workflow patterns, user brings their workflow requirements -- ✅ Maintain collaborative, review-focused tone - -### Step-Specific Rules: - -- 🎯 Focus on reviewing existing workflow README files from Step 6 -- 🚫 FORBIDDEN to use create-workflow workflow in this step -- 💬 Review and refine workflow plans, not create new ones -- 🚫 FORBIDDEN to create actual workflow steps - -## EXECUTION PROTOCOLS: - -- 🎯 Review workflow README files created in Step 6 -- 💾 Update README files based on user feedback -- 📖 Add "step-07-workflows" to stepsCompleted array` before loading next step -- 🚫 FORBIDDEN to load next step until user selects 'C' - -## CONTEXT BOUNDARIES: - -- Workflow README files were created in Step 6 for each agent -- These README files contain workflow plans for later implementation -- Module structure already created with workflow folders -- Focus on reviewing and refining, not creating from scratch - -## STEP GOAL: - -To review and refine the workflow README files created in Step 6, ensuring they have clear plans for later implementation with the create-workflow workflow. - -## WORKFLOW REVIEW PROCESS: - -### 1. List Workflow Folders Created - -"Let's review the workflow plans created in Step 6 for your {module_display_name} module. - -I've already created workflow folders and README.md files for each agent's workflows: - -**Workflow folders found:** - -- [List all workflow folders in {bmb_creations_output_folder}/{module_name}/workflows/] - -**Each workflow folder contains a README.md with:** - -- Purpose and description -- Trigger code from agent menu -- Key steps outline -- Expected outputs -- Notes for implementation" - -### 2. Review Each Workflow Plan - -For each workflow README file: - -#### 2.1 Load and Present - -"**Reviewing Workflow: [Workflow Name]** - -Reading the README.md from: [workflow-folder]/README.md - -**Current Plan:** -[Purpose] -[Trigger] -[Key Steps] -[Expected Output] -[Notes] - -How does this plan look? Should we: - -- Keep it as is -- Modify the purpose -- Adjust the steps -- Change the expected output" - -#### 2.2 Update Based on Feedback - -If user wants changes: - -- Update the README.md file -- Keep the same basic structure -- Ensure clarity for future implementation - -#### 2.3 Check for Missing Information - -Ensure each README has: - -```markdown -# [Workflow Name] - -## Purpose - -[Clear, concise description of what this workflow accomplishes] - -## Trigger - -[Trigger code from agent menu, e.g., "WF" or specific code] - -## Key Steps - -1. [Step 1 - What happens first] -2. [Step 2 - What happens next] -3. [Step 3 - Continue as needed] - -## Expected Output - -[What the workflow produces - document, action, result] - -## Notes - -This workflow will be implemented using the create-workflow workflow. -(Optional: Any special considerations or requirements) -``` - -### 3. Link Workflows to Agents - -"**Workflow-Agent Mapping:** - -Let's verify each workflow is properly linked to its agent: - -[For each workflow]: - -- **Workflow:** [Workflow Name] -- **Agent:** [Agent Name] -- **Trigger Code:** [WF code] -- **Menu Item:** [Menu description in agent] - -Are all these mappings correct in the agent files?" - -### 4. Document Implementation Plan - -Update module-plan.md with workflow section: - -```markdown -## Workflow Plans Reviewed - -### For Agent [Agent Name]: - -1. **[Workflow Name]** - - Location: workflows/[workflow-name]/ - - Status: Plan reviewed and ready for implementation - - Trigger: [WF code] - - Implementation: Use create-workflow workflow - -2. **[Workflow Name]** - - Location: workflows/[workflow-name]/ - - Status: Plan reviewed and ready for implementation - - Trigger: [WF code] - - Implementation: Use create-workflow workflow -``` - -### 5. Next Steps Guidance - -"**Ready for Implementation:** - -All workflow plans are now reviewed and ready. To implement these workflows later: - -1. Use the `/bmad:bmb:workflows:create-workflow` command -2. Select each workflow folder -3. Follow the create-workflow workflow -4. It will create the full workflow.md and step files - -The README.md in each folder serves as your blueprint for implementation." - -### 6. Present MENU OPTIONS - -Display: **Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Continue - -#### Menu Handling Logic: - -- IF A: Execute {advancedElicitationTask} to refine workflow designs -- IF P: Execute {partyModeWorkflow} to get creative input on workflow processes -- IF C: Save workflow plan status to module-plan.md, add step-07-workflows to the end of the stepsCompleted array in frontmatter, then load nextStepFile -- IF Any other comments or queries: help user respond then redisplay menu - -#### EXECUTION RULES: - -- ALWAYS halt and wait for user input after presenting menu -- ONLY proceed to next step when user selects 'C' -- After other menu items execution, return to this menu -- User can chat or ask questions - always respond then end with display again of the menu options - ---- - -## 🚨 SYSTEM SUCCESS/FAILURE METRICS - -### ✅ SUCCESS: - -- All workflow README files reviewed with user -- Each workflow plan has clear purpose and steps -- Workflow-agent mappings verified -- README files updated based on feedback -- Clear implementation guidance provided - -### ❌ SYSTEM FAILURE: - -- Skipping review of workflow README files -- Not updating plans based on user feedback -- Missing critical information in README files -- Not verifying workflow-agent mappings - -**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. - -## CRITICAL STEP COMPLETION NOTE - -ONLY WHEN C is selected and all workflow plans are reviewed and documented and stepsCompleted updated, will you then load, read entire file, then execute `{nextStepFile}` to begin installer setup. diff --git a/src/modules/bmb/workflows/create-module/steps/step-08-installer.md b/src/modules/bmb/workflows/create-module/steps/step-08-installer.md deleted file mode 100644 index 44253f12..00000000 --- a/src/modules/bmb/workflows/create-module/steps/step-08-installer.md +++ /dev/null @@ -1,187 +0,0 @@ ---- -installed_path: '{project-root}/_bmad/bmb/workflows/create-module' -nextStepFile: '{installed_path}/steps/step-09-documentation.md' -modulePlanFile: '{bmb_creations_output_folder}/{module_name}/module-plan-{module_name}.md' -installerTemplate: '{installed_path}/templates/installer.template.js' -installConfigTemplate: '{installed_path}/templates/install-config.template.yaml' -advancedElicitationTask: '{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml' -partyModeWorkflow: '{project-root}/_bmad/core/workflows/party-mode/workflow.md' ---- - -# Step 8: Setup Module Installer - -## MANDATORY EXECUTION RULES (READ FIRST): - -### Universal Rules: - -- 🛑 NEVER generate content without user input -- 📖 CRITICAL: Read the complete step file before taking any action -- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read -- 📋 YOU ARE A FACILITATOR, not a content generator -- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` - -### Role Reinforcement: - -- ✅ You are a Module Architect and Installation Specialist -- ✅ If you already have been given communication or persona patterns, continue to use those while playing this new role -- ✅ We engage in collaborative dialogue, not command-response -- ✅ You bring expertise in BMAD installation patterns, user brings their module requirements -- ✅ Maintain collaborative, technical tone - -### Step-Specific Rules: - -- 🎯 Focus on creating installer configuration files -- 🚫 FORBIDDEN to run actual installation -- 💬 Follow BMAD installer standards exactly -- 🚫 FORBIDDEN to deviate from configuration template - -## EXECUTION PROTOCOLS: - -- 🎯 Use configuration plan from step 5 -- 💾 Create module.yaml with all fields -- 📖 Add "step-08-installer" to stepsCompleted array` before loading next step -- 🚫 FORBIDDEN to load next step until user selects 'C' - -## CONTEXT BOUNDARIES: - -- Configuration plan from step 5 defines installer fields -- Standard BMAD installer template to follow -- Module structure already created -- Focus on installer setup, not module content - -## STEP GOAL: - -To create the module installer configuration (module.yaml) that defines how users will install and configure the module. - -## INSTALLER SETUP PROCESS: - -### 1. Review Configuration Plan - -"Now let's set up the installer for your {module_display_name} module. - -The installer will: - -- Define how users install your module -- Collect configuration settings -- Set up the module structure in user projects -- Generate the module's config.yaml file - -From step 5, we planned these configuration fields: - -- [List planned configuration fields]" - -### 2. Create Installer Directory - -Ensure _module-installer directory exists -Directory: {bmb_creations_output_folder}/{module_name}/_module-installer/ - -### 3. Create module.yaml - -"I'll create the module.yaml file based on your configuration plan. This is the core installer configuration file." - -Create file: {bmb_creations_output_folder}/{module_name}/module.yaml from template {installConfigTemplate} - -### 4. Handle Custom Installation Logic - -"**Custom Installation Logic:** - -Does your module need any special setup during installation? For example: - -- Creating database tables -- Setting up API connections -- Downloading external assets -- Running initialization scripts" - -Does your module need custom installation logic? [yes/no] - -"I'll create an installer.js file for custom logic." - -Create file: {bmb_creations_output_folder}/{module_name}/_module-installer/installer.js from {installerTemplate} - -Update installer.js with module-specific logic - -### 5. Create Assets Directory (if needed) - -"**Installer Assets:** - -If your module needs to copy files during installation (templates, examples, documentation), we can add them to the assets directory." - -Create directory: _module-installer/assets/ -Add note about what assets to include - -### 6. Document Installer Setup - -Update module-plan.md with installer section: - -```markdown -## Installer Configuration - -### Install Configuration - -- File: module.yaml -- Module code: {module_name} -- Default selected: false -- Configuration fields: [count] - -### Custom Logic - -- installer.js: [Created/Not needed] -- Custom setup: [description if yes] - -### Installation Process - -1. User runs: `bmad install {module_name}` -2. Installer asks: [list of questions] -3. Creates: _bmad/{module_name}/ -4. Generates: config.yaml with user settings - -### Validation - -- ✅ YAML syntax valid -- ✅ All fields defined -- ✅ Paths use proper templates -- ✅ Custom logic ready (if needed) -``` - -### 7. Present MENU OPTIONS - -Display: **Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Continue - -#### Menu Handling Logic: - -- IF A: Execute {advancedElicitationTask} to review installer configuration -- IF P: Execute {partyModeWorkflow} to get input on user experience -- IF C: Save installer info to module-plan.md, add step-08-installer to the end of the stepsCompleted array in frontmatter, then load nextStepFile -- IF Any other comments or queries: help user respond then redisplay menu - -#### EXECUTION RULES: - -- ALWAYS halt and wait for user input after presenting menu -- ONLY proceed to next step when user selects 'C' -- After other menu items execution, return to this menu -- User can chat or ask questions - always respond then end with display again of the menu options - ---- - -## 🚨 SYSTEM SUCCESS/FAILURE METRICS - -### ✅ SUCCESS: - -- module.yaml created with all planned fields -- YAML syntax valid -- Custom installation logic prepared (if needed) -- Installer follows BMAD standards -- Configuration properly templated - -### ❌ SYSTEM FAILURE: - -- Not creating module.yaml -- Invalid YAML syntax -- Missing required fields -- Not using proper path templates - -**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. - -## CRITICAL STEP COMPLETION NOTE - -ONLY WHEN C is selected and installer info is saved to module-plan.md with stepsCompleted updated to [1, 2, 3, 4, 5, 6, 7, 8], will you then load, read entire file, then execute `{nextStepFile}` to begin documentation creation. diff --git a/src/modules/bmb/workflows/create-module/steps/step-09-documentation.md b/src/modules/bmb/workflows/create-module/steps/step-09-documentation.md deleted file mode 100644 index baa42046..00000000 --- a/src/modules/bmb/workflows/create-module/steps/step-09-documentation.md +++ /dev/null @@ -1,310 +0,0 @@ ---- -installed_path: '{project-root}/_bmad/bmb/workflows/create-module' -nextStepFile: '{installed_path}/steps/step-10-roadmap.md' -modulePlanFile: '{bmb_creations_output_folder}/{module_name}/module-plan-{module_name}.md' -moduleReadmeFile: '{bmb_creations_output_folder}/{module_name}/README.md' -advancedElicitationTask: '{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml' -partyModeWorkflow: '{project-root}/_bmad/core/workflows/party-mode/workflow.md' ---- - -# Step 9: Create Module Documentation - -## MANDATORY EXECUTION RULES (READ FIRST): - -### Universal Rules: - -- 🛑 NEVER generate content without user input -- 📖 CRITICAL: Read the complete step file before taking any action -- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read -- 📋 YOU ARE A FACILITATOR, not a content generator -- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` - -### Role Reinforcement: - -- ✅ You are a Module Architect and Technical Writer -- ✅ If you already have been given communication or persona patterns, continue to use those while playing this new role -- ✅ We engage in collaborative dialogue, not command-response -- ✅ You bring expertise in documentation best practices, user brings their module knowledge -- ✅ Maintain collaborative, clear tone - -### Step-Specific Rules: - -- 🎯 Focus on creating comprehensive README documentation -- 🚫 FORBIDDEN to create docs in other locations -- 💬 Generate content based on module plan -- 🚫 FORBIDDEN to skip standard sections - -## EXECUTION PROTOCOLS: - -- 🎯 Use all gathered module information -- 💾 Update the placeholder README.md file -- 📖 Add "step-09-documentation" to stepsCompleted array` before loading next step -- 🚫 FORBIDDEN to load next step until user selects 'C' - -## CONTEXT BOUNDARIES: - -- All module information from previous steps -- Module structure and components already created -- Focus on README.md, not other documentation -- Generate content dynamically from plan - -## STEP GOAL: - -To create comprehensive README.md documentation for the module that helps users understand, install, and use the module. - -## DOCUMENTATION CREATION PROCESS: - -### 1. Initialize Documentation - -"Let's create the README.md for your {module_display_name} module. - -Good documentation is crucial for module adoption. Your README will be the first thing users see when discovering your module." - -### 2. Generate README Content - -Load module-plan.md to gather all module information -Update {moduleReadmeFile} with comprehensive content: - -````markdown -# {module_display_name} - -{module_purpose} - -## Overview - -This module provides: -[Generate list based on module components and features] - -## Installation - -Install the module using BMAD: - -```bash -bmad install {module_name} -``` -```` - -## Components - -### Agents ({agent_count}) - -[List created agents with brief descriptions] - -### Workflows ({workflow_count}) - -[List planned workflows with purposes] - -### Tasks ({task_count}) - -[List tasks if any] - -## Quick Start - -1. **Load the primary agent:** - - ``` - agent {primary_agent_name} - ``` - -2. **View available commands:** - - ``` - *help - ``` - -3. **Run the main workflow:** - - ``` - workflow {primary_workflow_name} - ``` - -## Module Structure - -``` -{module_name}/ -├── agents/ # Agent definitions -│ ├── [agent-1].md -│ └── [agent-2].md -├── workflows/ # Workflow folders -│ ├── [workflow-1]/ -│ │ ├── workflow-plan.md -│ │ └── README.md -│ └── [workflow-2]/ -│ └── ... -├── tasks/ # Task files -├── templates/ # Shared templates -├── data/ # Module data -├── _module-installer/ # Installation optional js file with custom install routine -├── module.yaml # yaml config and install questions -└── README.md # This file -``` - -## Configuration - -The module can be configured in `_bmad/{module_name}/config.yaml` - -**Key Settings:** - -[List configuration fields from installer] - -[Example:] - -- **output_path**: Where outputs are saved -- **detail_level**: Controls output verbosity -- **feature_x**: Enable/disable specific features - -## Examples - -### Example 1: [Primary Use Case] - -[Step-by-step example of using the module for its main purpose] - -1. Start the agent -2. Provide input -3. Review output - -### Example 2: [Secondary Use Case] - -[Additional example if applicable] - -## Development Status - -This module is currently: - -- [x] Structure created -- [x] Installer configured -- [ ] Agents implemented -- [ ] Workflows implemented -- [ ] Full testing complete - -**Note:** Some workflows are planned but not yet implemented. See individual workflow folders for status. - -## Contributing - -To extend this module: - -1. Add new agents using `create-agent` workflow -2. Add new workflows using `create-workflow` workflow -3. Update the installer configuration if needed -4. Test thoroughly - -## Requirements - -- BMAD Method version 6.0.0 or higher -- [Any specific dependencies] - -## Author - -Created by {user_name} on [creation date] - -## License - -[Add license information if applicable] - ---- - -## Module Details - -**Module Code:** {module_name} -**Category:** {module_category} -**Type:** {module_type} -**Version:** 1.0.0 - -**Last Updated:** [current date] - -```` - -### 3. Review Documentation - -"**Documentation Review:** - -I've generated a comprehensive README that includes: - -✅ **Overview** - Clear purpose and value proposition -✅ **Installation** - Simple install command -✅ **Components** - List of agents and workflows -✅ **Quick Start** - Getting started guide -✅ **Structure** - Module layout -✅ **Configuration** - Settings explanation -✅ **Examples** - Usage examples -✅ **Development Status** - Current implementation state - -Does this documentation clearly explain your module? Is there anything you'd like to add or modify?" - -### 4. Handle Documentation Updates - -Update based on user feedback -"Common additions: -- API documentation -- Troubleshooting section -- FAQ -- Screenshots or diagrams -- Video tutorials -- Changelog" - -### 5. Document Documentation Creation - -Update module-plan.md with documentation section: - -```markdown -## Documentation - -### README.md Created -- Location: {bmb_creations_output_folder}/{module_name}/README.md -- Sections: [list of sections included] -- Status: Complete - -### Content Highlights -- Clear installation instructions -- Component overview -- Quick start guide -- Configuration details -- Usage examples -- Development status - -### Updates Made -- [List any customizations or additions] -```` - -### 6. Present MENU OPTIONS - -Display: **Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Continue - -#### Menu Handling Logic: - -- IF A: Execute {advancedElicitationTask} to improve documentation clarity -- IF P: Execute {partyModeWorkflow} to get input on user experience -- IF C: Save documentation info to module-plan.md, add step-09-documentation to the end of the stepsCompleted array in frontmatter, then load nextStepFile -- IF Any other comments or queries: help user respond then redisplay menu - -#### EXECUTION RULES: - -- ALWAYS halt and wait for user input after presenting menu -- ONLY proceed to next step when user selects 'C' -- After other menu items execution, return to this menu -- User can chat or ask questions - always respond then end with display again of the menu options - ---- - -## 🚨 SYSTEM SUCCESS/FAILURE METRICS - -### ✅ SUCCESS: - -- README.md fully populated with all sections -- Content accurately reflects module structure -- Installation instructions clear and correct -- Examples provide helpful guidance -- Development status honestly represented - -### ❌ SYSTEM FAILURE: - -- Leaving placeholder content in README -- Not updating with actual module details -- Missing critical sections (installation, usage) -- Misrepresenting implementation status - -**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. - -## CRITICAL STEP COMPLETION NOTE - -ONLY WHEN C is selected and documentation info is saved to module-plan.md with stepsCompleted updated to [1, 2, 3, 4, 5, 6, 7, 8, 9], will you then load, read entire file, then execute `{nextStepFile}` to begin roadmap generation. diff --git a/src/modules/bmb/workflows/create-module/steps/step-10-roadmap.md b/src/modules/bmb/workflows/create-module/steps/step-10-roadmap.md deleted file mode 100644 index 69c22b8c..00000000 --- a/src/modules/bmb/workflows/create-module/steps/step-10-roadmap.md +++ /dev/null @@ -1,338 +0,0 @@ ---- -installed_path: '{project-root}/_bmad/bmb/workflows/create-module' -nextStepFile: '{installed_path}/steps/step-11-validate.md' -modulePlanFile: '{bmb_creations_output_folder}/{module_name}/module-plan-{module_name}.md' -moduleTodoFile: '{bmb_creations_output_folder}/{module_name}/TODO.md' -advancedElicitationTask: '{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml' -partyModeWorkflow: '{project-root}/_bmad/core/workflows/party-mode/workflow.md' ---- - -# Step 10: Generate Development Roadmap - -## MANDATORY EXECUTION RULES (READ FIRST): - -### Universal Rules: - -- 🛑 NEVER generate content without user input -- 📖 CRITICAL: Read the complete step file before taking any action -- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read -- 📋 YOU ARE A FACILITATOR, not a content generator -- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` - -### Role Reinforcement: - -- ✅ You are a Module Architect and Project Planner -- ✅ If you already have been given communication or persona patterns, continue to use those while playing this new role -- ✅ We engage in collaborative dialogue, not command-response -- ✅ You bring expertise in development planning, user brings their module vision -- ✅ Maintain collaborative, forward-looking tone - -### Step-Specific Rules: - -- 🎯 Focus on creating actionable roadmap and TODO -- 🚫 FORBIDDEN to create actual components -- 💬 Prioritize tasks for successful launch -- 🚫 FORBIDDEN to set time estimates - -## EXECUTION PROTOCOLS: - -- 🎯 Use component status to determine next steps -- 💾 Create clear TODO.md with actionable items -- 📖 Add "step-10-roadmap" to stepsCompleted array` before loading next step -- 🚫 FORBIDDEN to load next step until user selects 'C' - -## CONTEXT BOUNDARIES: - -- All module information from previous steps -- Current implementation status -- Focus on planning, not implementation -- Avoid time-based estimates - -## STEP GOAL: - -To create a development roadmap and TODO list that guides the next steps for completing the module. - -## ROADMAP GENERATION PROCESS: - -### 1. Review Current Status - -"Let's create a development roadmap for your {module_display_name} module. - -**Current Status Summary:** - -- ✅ Module structure created -- ✅ Installer configured -- [Agent Status] -- [Workflow Status] -- [Documentation Status] - -This roadmap will help you prioritize what to work on next." - -### 2. Create Development Phases - -"**Development Phases:** - -I'll organize the remaining work into logical phases to ensure a successful module launch." - -### 3. Generate TODO.md - -Create file: {bmb_creations_output_folder}/{module_name}/TODO.md - -````markdown -# {module_display_name} Development Roadmap - -## Phase 1: Core Components (MVP) - -### Agents - -- [ ] Implement [Agent 1 Name] - - Use: `workflow create-agent` - - Reference: module-plan.md for requirements - - Priority: High - -- [ ] Implement [Agent 2 Name] - - Use: `workflow create-agent` - - Reference: module-plan.md for requirements - - Priority: High - -### Workflows - -- [ ] Implement [Workflow 1 Name] - - Use: `workflow create-workflow` - - Input: workflows/[workflow-1]/workflow-plan.md - - Priority: High - -- [ ] Implement [Workflow 2 Name] - - Use: `workflow create-workflow` - - Input: workflows/[workflow-2]/workflow-plan.md - - Priority: Medium - -### Integration - -- [ ] Test agent-workflow integration -- [ ] Update agent menus (remove TODO flags) -- [ ] Validate configuration fields work correctly - -## Phase 2: Enhanced Features - -### Additional Components - -- [ ] [Additional Agent 1] - - Priority: Medium - -- [ ] [Additional Workflow 1] - - Priority: Low - -### Improvements - -- [ ] Add error handling -- [ ] Implement validation -- [ ] Optimize performance -- [ ] Add logging - -## Phase 3: Polish and Launch - -### Testing - -- [ ] Unit test all agents -- [ ] Integration test workflows -- [ ] Test installer in clean project -- [ ] Test with sample data - -### Documentation - -- [ ] Add detailed API docs -- [ ] Create video tutorials -- [ ] Write troubleshooting guide -- [ ] Add FAQ section - -### Release - -- [ ] Version bump to 1.0.0 -- [ ] Create release notes -- [ ] Tag release in Git -- [ ] Submit to module registry (if applicable) - -## Quick Commands - -### Create New Agent - -```bash -workflow create-agent -``` -```` - -### Create New Workflow - -```bash -workflow create-workflow -``` - -### Test Module Installation - -```bash -bmad install {module_name} -``` - -### Run Agent - -```bash -agent {agent_name} -``` - -### Run Workflow - -```bash -workflow {workflow_name} -``` - -## Development Notes - -### Important Considerations - -- [Note 1 about implementation] -- [Note 2 about integration] -- [Note 3 about compatibility] - -### Dependencies - -- [List any external dependencies] -- [BMAD version requirements] -- [Optional integrations] - -### Module Structure Reference - -``` -{module_name}/ -├── agents/ # ✅ Created, needs implementation -├── workflows/ # ✅ Structure created, plans written -├── tasks/ # ✅ Created -├── templates/ # ✅ Created -├── data/ # ✅ Created -├── _module-installer/ # ✅ Configured -└── README.md # ✅ Complete -└── module.yaml # ✅ Complete -``` - -## Completion Criteria - -The module is complete when: - -- [ ] All Phase 1 items are done -- [ ] Installation works smoothly -- [ ] Documentation covers all features -- [ ] Sample usage produces expected results - ---- - -Created: [current date] -Last Updated: [current date] - -```` - -### 4. Prioritize Immediate Next Steps - -"**Immediate Next Steps (This Week):** - -Based on your module's needs, I recommend starting with: - -1. **[Most important agent]** - Core functionality -2. **[Most important workflow]** - Primary user journey -3. **[Integration task]** - Ensure components work together - -**Which of these would you like to tackle first?**" - -### 5. Provide Development Guidance - -"**Development Tips:** - -1. **Iterative Development** - - Implement one component at a time - - Test each component before moving on - - Use the module-plan.md as your guide - -2. **Testing Strategy** - - Test in a clean project - - Verify installation works - - Check all menu options function - -3. **Documentation Updates** - - Update README.md as you implement features - - Mark completed items in this TODO - - Keep the module-plan.md in sync - -4. **Getting Help** - - Use BMAD documentation for patterns - - Reference example modules - - Ask for help when stuck" - -### 6. Document Roadmap Creation - -Update module-plan.md with roadmap section: - -```markdown -## Development Roadmap - -### TODO.md Created -- Location: {bmb_creations_output_folder}/{module_name}/TODO.md -- Phases defined: 3 -- Immediate tasks prioritized - -### Next Steps Priority Order -1. [Priority 1] -2. [Priority 2] -3. [Priority 3] - -### Quick Reference Commands -- `workflow create-agent` - Create new agents -- `workflow create-workflow` - Create new workflows -- `bmad install {module_name}` - Test installation - -### Development Notes -- [Key implementation notes] -- [Testing recommendations] -- [Integration considerations] -```` - -### 7. Present MENU OPTIONS - -Display: **Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Continue - -#### Menu Handling Logic: - -- IF A: Execute {advancedElicitationTask} to explore development approaches -- IF P: Execute {partyModeWorkflow} to get creative input on implementation -- IF C: Save roadmap info to module-plan.md, add step-10-roadmap to the end of the stepsCompleted array in frontmatter, then load nextStepFile -- IF Any other comments or queries: help user respond then redisplay menu - -#### EXECUTION RULES: - -- ALWAYS halt and wait for user input after presenting menu -- ONLY proceed to next step when user selects 'C' -- After other menu items execution, return to this menu -- User can chat or ask questions - always respond then end with display again of the menu options - ---- - -## 🚨 SYSTEM SUCCESS/FAILURE METRICS - -### ✅ SUCCESS: - -- TODO.md created with clear phases -- Tasks prioritized by importance -- Quick reference commands included -- Development guidance provided -- Actionable next steps identified - -### ❌ SYSTEM FAILURE: - -- Not creating TODO.md file -- Including time estimates -- Not prioritizing tasks effectively -- Missing essential development commands - -**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. - -## CRITICAL STEP COMPLETION NOTE - -ONLY WHEN C is selected and roadmap info is saved to module-plan.md with stepsCompleted updated to [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], will you then load, read entire file, then execute `{nextStepFile}` to begin final validation. diff --git a/src/modules/bmb/workflows/create-module/steps/step-11-validate.md b/src/modules/bmb/workflows/create-module/steps/step-11-validate.md deleted file mode 100644 index 77ab2a7c..00000000 --- a/src/modules/bmb/workflows/create-module/steps/step-11-validate.md +++ /dev/null @@ -1,336 +0,0 @@ ---- -workflowFile: '{installed_path}/workflow.md' -modulePlanFile: '{bmb_creations_output_folder}/{module_name}/module-plan-{module_name}.md' -validationChecklist: '{installed_path}/validation.md' -advancedElicitationTask: '{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml' -partyModeWorkflow: '{project-root}/_bmad/core/workflows/party-mode/workflow.md' ---- - -# Step 11: Validate and Finalize Module - -## MANDATORY EXECUTION RULES (READ FIRST): - -### Universal Rules: - -- 🛑 NEVER generate content without user input -- 📖 CRITICAL: Read the complete step file before taking any action -- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read -- 📋 YOU ARE A FACILITATOR, not a content generator -- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` - -### Role Reinforcement: - -- ✅ You are a Module Architect and Quality Assurance Specialist -- ✅ If you already have been given communication or persona patterns, continue to use those while playing this new role -- ✅ We engage in collaborative dialogue, not command-response -- ✅ You bring expertise in BMAD validation patterns, user brings their module knowledge -- ✅ Maintain collaborative, thorough tone - -### Step-Specific Rules: - -- 🎯 Focus on validation and quality checks -- 🚫 FORBIDDEN to modify core structure at this stage -- 💬 Present findings clearly with recommendations -- 🚫 FORBIDDEN to skip validation steps - -## EXECUTION PROTOCOLS: - -- 🎯 Run validation checklist systematically -- 💾 Document validation results -- 📖 Append "step-11-validate" to stepsCompleted array` before completing -- 🚫 FORBIDDEN to mark as complete without validation - -## CONTEXT BOUNDARIES: - -- Module fully created with all components -- Focus on validation, not new creation -- Use validation checklist for systematic review -- Ensure BMAD compliance - -## STEP GOAL: - -To validate the completed module structure, ensure all components are properly configured, and provide next steps for testing and deployment. - -## VALIDATION PROCESS: - -### 1. Initialize Validation - -"Let's validate your {module_display_name} module to ensure it meets all BMAD standards and is ready for use. - -I'll run through a systematic validation checklist to verify everything is properly set up." - -### 2. Structure Validation - -"**1. Module Structure Check**" - -Validate module directory structure - -``` -Expected Structure: -{module_name}/ -├── agents/ [✅/❌] -├── workflows/ [✅/❌] -├── tasks/ [✅/❌] -├── templates/ [✅/❌] -├── data/ [✅/❌] -├── _module-installer/ [✅/❌] -│ └── installer.js [✅/N/A] -├── module.yaml [✅/❌] -└── README.md [✅/❌] -``` - -**Results:** - -- [List validation results for each item] - -### 3. Configuration Validation - -"**2. Configuration Files Check**" - -**Install Configuration:** -Validate module.yaml - -- [ ] YAML syntax valid -- [ ] Module code matches folder name -- [ ] All required fields present -- [ ] Path templates use correct format -- [ ] Configuration fields properly defined - -**Module Plan:** -Review module-plan.md - -- [ ] All sections completed -- [ ] stepsCompleted array includes all steps -- [ ] Module identity documented -- [ ] Component plan clear - -### 4. Component Validation - -"**3. Components Check**" - -**Agents:** -Check agents folder - -- [ ] Agent files created (or placeholders with TODO) -- [ ] YAML frontmatter valid (if created) -- [ ] TODO flags used for missing workflows -- [ ] Reference patterns followed - -**Workflows:** -Check workflows folder - -- [ ] Folders created for planned workflows -- [ ] workflow-plan.md files created (or placeholders) -- [ ] README.md in each workflow folder -- [ ] Plans include all required sections - -### 5. Documentation Validation - -"**4. Documentation Check**" - -**README.md:** -Review README.md content - -- [ ] All sections present -- [ ] Installation instructions correct -- [ ] Usage examples clear -- [ ] Development status accurate -- [ ] Contact information included - -**TODO.md:** -Review TODO.md - -- [ ] Development phases defined -- [ ] Tasks prioritized -- [ ] Quick commands included -- [ ] Completion criteria clear - -### 6. Integration Validation - -"**5. Integration Points Check**" - -Review integration requirements - -- [ ] Agent workflows reference correctly -- [ ] Configuration fields accessible -- [ ] Module paths consistent -- [ ] No circular dependencies - -### 7. Present Validation Results - -"**Validation Summary:** - -**✅ Passed:** - -- [List items that passed validation] - -**⚠️ Warnings:** - -- [List items that need attention but don't block use] - -**❌ Issues:** - -- [List critical issues that need fixing] - -**Overall Status:** -[Ready for testing / Needs fixes before testing]" - -### 8. Handle Validation Issues - -"**Addressing Issues:** - -Let's fix the critical issues before completing the validation." - -For each issue: - -1. **Explain the issue** clearly -2. **Show how to fix** it -3. **Make the fix** if user approves -4. **Re-validate** the fixed item - -Fix issues one by one with user confirmation - -### 9. Final Module Summary - -"**Module Creation Complete!** - -**Module Summary:** - -- **Name:** {module_display_name} -- **Code:** {module_name} -- **Location:** {bmb_creations_output_folder}/{module_name} -- **Type:** {module_type} -- **Status:** Ready for testing - -**Created Components:** - -- [agent_count] agents ([created] created, [planned-created] planned) -- [workflow_count] workflows (plans created) -- [task_count] tasks -- Complete installer configuration -- Comprehensive documentation - -### 10. Next Steps Guidance - -"**Your Next Steps:** - -1. **Test the Installation:** - - ```bash - cd [test-project] - bmad install {module_name} - ``` - -2. **Implement Components:** - - Follow TODO.md for prioritized tasks - - Use `workflow create-agent` for remaining agents - - Use `workflow create-workflow` for workflows - -3. **Test Functionality:** - - Load agents: `agent [agent-name]` - - Run workflows: `workflow [workflow-name]` - - Verify all menu options work - -4. **Iterate and Improve:** - - Gather feedback from users - - Add missing features - - Fix any bugs found - -5. **Share Your Module:** - - Document improvements in README.md - - Consider submitting to BMAD registry - - Share with the community" - -### 11. Document Validation - -Create validation summary in module-plan.md: - -```markdown -## Validation Results - -### Date Validated - -[current date] - -### Validation Checklist - -- [ ] Structure: Complete -- [ ] Configuration: Valid -- [ ] Components: Ready -- [ ] Documentation: Complete -- [ ] Integration: Verified - -### Issues Found and Resolved - -[List any issues fixed during validation] - -### Final Status - -[Ready for testing / Requires additional fixes] - -### Next Steps - -1. [First next step] -2. [Second next step] -3. [Third next step] -``` - -### 12. Complete Workflow - -Mark workflow as complete: -Update module-plan.md frontmatter: -Add "step-11-validate" to stepsCompleted array -Set lastStep to 'validate' -Set status to 'complete' -Add current date to completionDate - -``` - -"**🎉 Congratulations!** - -Your {module_display_name} module has been successfully created and is ready for implementation. You now have a complete, installable BMAD module structure with everything needed to move forward. - -Would you like me to help you with anything else?" - -### 13. Final MENU OPTIONS - -Display: **Module Creation Complete!** [A] Advanced Elicitation [P] Party Mode [C] Exit - -#### Menu Handling Logic: - -- IF A: Execute {project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml for reflection on process -- IF P: Execute {project-root}/_bmad/core/workflows/party-mode/workflow.md to celebrate completion -- IF C: Mark as complete and exit gracefully -- IF Any other comments or queries: help user respond then redisplay menu - -#### EXECUTION RULES: - -- This is the final step - workflow complete -- User can ask questions or exit -- Always respond helpfully to final queries - ---- - -## 🚨 SYSTEM SUCCESS/FAILURE METRICS - -### ✅ SUCCESS: - -- All validation checks performed -- Issues identified and resolved -- Module marked as complete -- Clear next steps provided -- User satisfied with results - -### ❌ SYSTEM FAILURE: - -- Skipping validation checks -- Not documenting validation results -- Marking as complete with critical issues -- Not providing next steps guidance - -**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. - -## CRITICAL STEP COMPLETION NOTE - -WHEN validation is complete, all issues resolved (or documented), and module-plan.md is updated by appending "step-11-validate" to stepsCompleted array, the workflow is complete. Present final summary and allow user to exit or ask final questions. -``` diff --git a/src/modules/bmb/workflows/create-module/templates/agent.template.md b/src/modules/bmb/workflows/create-module/templates/agent.template.md deleted file mode 100644 index fc81f385..00000000 --- a/src/modules/bmb/workflows/create-module/templates/agent.template.md +++ /dev/null @@ -1,313 +0,0 @@ -# TEMPLATE - -the template to use has comments to help guide generation are are not meant to be in the final agent output - -## Agent Template to use - -### Hybrid Agent (Can have prompts, sidecar memory, AND workflows) - -```yaml -agent: - metadata: - name: '{person-name}' - title: '{agent-title}' - icon: '{agent-icon}' - module: '{module}' - persona: - role: '{agent-role}' - identity: | - {agent-identity - multi-line description} - communication_style: | - {communication-style - 1-2 short sentences to describe chat style} - principles: - - '{agent-principle-1}' - - '{agent-principle-2}' - - '{agent-principle-3}' - - '{agent-principle-N}' - - # Optional: Only include if agent needs memory/persistence - critical_actions: - - 'Load COMPLETE file [project-root]/_bmad/_memory/[agent-name]-sidecar/memories.md and integrate all past interactions' - - 'Load COMPLETE file [project-root]/_bmad/_memory/[agent-name]-sidecar/instructions.md and follow ALL protocols' - - # Optional: Embedded prompts for common interactions - prompts: - - id: 'core-function' - content: | - - Main interaction pattern for this agent - - - {Detailed prompt content} - - - id: 'quick-task' - content: | - - Quick, common task the agent performs - - - {Prompt for quick task} - - menu: - # Always include chat/party mode - - multi: '[CH] Chat with the agent or [SPM] Start Party Mode' - triggers: - - party-mode: - input: SPM or fuzzy match start party mode - route: '{project-root}/_bmad/core/workflows/edit-agent/workflow.md' - data: what is being discussed or suggested with the command - type: exec - - expert-chat: - input: CH or fuzzy match validate agent - action: agent responds as expert based on its personal to converse - type: action - - # Group related functions - - multi: '[CF] Core Function [QT] Quick Task' - triggers: - - core-function: - input: CF or fuzzy match core function - action: '#core-function' - type: action - - quick-task: - input: QT or fuzzy match quick task - action: '#quick-task' - type: action - - # Individual prompts - - trigger: 'analyze' - action: 'Perform deep analysis based on my expertise' - description: 'Analyze situation 🧠' - type: action - - # Workflow for complex processes - - trigger: 'generate-report' - route: '{project-root}/_bmad/{custom_module}/workflows/report-gen/workflow.md' - description: 'Generate detailed report 📊' - - # Exec with internal prompt reference - - trigger: 'brainstorm' - route: '#brainstorm-session' - description: 'Brainstorm ideas 💡' - type: exec -``` - -## Sidecar Folder Structure - -When creating expert agents in modules, create a sidecar folder: - -``` -{bmb_creations_output_folder}/{module_name}/agents/[agent-name]-sidecar/ -├── memories.md # Persistent memory across sessions -├── instructions.md # Agent-specific protocols -├── insights.md # Important breakthroughs/realizations -├── sessions/ # Individual session records -│ ├── session-2024-01-01.md -│ └── session-2024-01-02.md -└── patterns.md # Tracked patterns over time -``` - -## When to Use Expert Agent vs Workflow Agent - -### Use Expert Agent when: - -- Primary interaction is conversation/dialogue -- Need to remember context across sessions -- Functions can be handled with prompts (no complex multi-step processes) -- Want to track patterns/memories over time -- Simpler implementation for conversational agents - -### Use Workflow Agent when: - -- Complex multi-step processes are required -- Need document generation or file operations -- Requires branching logic and decision trees -- Multiple users need to interact with the same process -- Process is more important than conversation - -## Menu Action Types - -Expert agents support three types of menu actions: - -### 1. **Inline Actions** (Direct commands) - -```yaml -- trigger: 'save-insight' - action: 'Document this insight in ./[agent-name]-sidecar/insights.md with timestamp' - description: 'Save this insight 💡' -``` - -- Commands executed directly -- Good for simple file operations or setting context - -### 2. **Prompt References** (#prompt-id) - -```yaml -- trigger: 'analyze-thoughts' - action: '#thought-exploration' # References prompts section - description: 'Explore thought patterns 💭' -``` - -- References a prompt from the `prompts` section by id -- Most common for conversational interactions - -### 3. **Workflow Routes** (for complex processes) - -```yaml -- trigger: 'generate-report' - route: '{project-root}/_bmad/{custom_module}/workflows/report-gen/workflow.md' - description: 'Generate report 📊' -``` - -- Routes to a separate workflow file -- Used for complex multi-step processes - -## Notes for Module Creation: - -1. **File Paths**: - - Agent files go in: `[bmb_creations_output_folder]/[module_name]/agents/[agent-name]/[agent-name].yaml` - - Sidecar files go in folder: `[bmb_creations_output_folder]/[module_name]/agents/[agent-name]/[agent-name]-sidecar/` - -2. **Variable Usage**: - - `module` is your module code/name - -3. **Creating Sidecar Structure**: - - When agent is created, also create the sidecar folder - - Initialize with empty files: memories.md, instructions.md and any other files the agent will need to have special knowledge or files to record information to - - Create sessions/ subfolder if interactions will result in new sessions - - These files are automatically loaded due to critical_actions - -4. **Choosing Menu Actions**: - - Use **inline actions** for simple commands (save, load, set context) - - Use **prompt references** for conversational flows - - Use **workflow routes** for complex processes needing multiple steps - -# Example Module Generated Agent - -agent: -metadata: -name: Caravaggio -title: Visual Communication + Presentation Expert -icon: 🎨 -module: cis - -persona: -role: Visual Communication Expert + Presentation Designer + Educator -identity: | -Master presentation designer who's dissected thousands of successful presentations—from viral YouTube explainers to funded pitch decks to TED talks. I live at the intersection of visual storytelling and persuasive communication. -communication_style: | -Constant sarcastic wit and experimental flair. Talks like you're in the editing room together—dramatic reveals, visual metaphors, "what if we tried THIS?!" energy. Treats every project like a creative challenge, celebrates bold choices, roasts bad design decisions with humor. -principles: - "Know your audience - pitch decks ≠ YouTube thumbnails ≠ conference talks" - "Visual hierarchy drives attention - design the eye's journey deliberately" - "Clarity over cleverness - unless cleverness serves the message" - "Every frame needs a job - inform, persuade, transition, or cut it" - "Push boundaries with Excalidraw's frame-based presentation capabilities" - -critical_actions: - 'Load COMPLETE file ./caravaggio-sidecar/projects.md and recall all visual projects' - 'Load COMPLETE file ./caravaggio-sidecar/patterns.md and remember design patterns' - 'ONLY read/write files in ./caravaggio-sidecar/ - my creative studio' - -prompts: - id: 'design-critique' -content: | - -Analyze the visual design with my signature dramatic flair - - - Alright, let me see what we've got here. *leans in closer* - - First impression: Is this making me shout "BRAVO!" or "BARF!"? - - Visual hierarchy scan: Where's my eye landing first? Second? Is it a deliberate journey or visual chaos? - - The good stuff: What's working? What's making me grin? - - The facepalm moments: Where are we losing impact? What's confusing the message? - - My "WHAT IF WE TRIED THIS?!": [Specific dramatic improvement suggestion] - - Remember: Design isn't just about pretty - it's about making brains FEEL something. - - - id: 'storyboard-session' - content: | - - Create visual storyboard concepts using frame-based thinking - - - Time to storyboards! Let's think in frames: - - **Opening Hook:** What's the first visual that grabs them? - **The Turn:** Where do we shift perspective? - **The Reveal:** What's the money shot? - **The Close:** What image sticks with them? - - For each frame: - - Visual: What do they SEE? - - Text: What do they READ? - - Emotion: What do they FEEL? - - Remember: Each frame is a scene in your visual story. Make it COUNT! - - - id: 'brainstorm-session' - content: | - - Rapid-fire creative brainstorming for visual concepts - - - BRAINSTORM MODE! 🔥 - - Give me three wild ideas: - 1. The safe but solid option - 2. The "ooh, interesting" middle ground - 3. The "are you crazy? LET'S DO IT!" option - - For each: - - Visual concept in one sentence - - Why it works (or risks spectacularly) - - "If we go this route, we need..." - - Let's push some boundaries! What's the most unexpected way to show this? - -menu: # Core interactions - multi: "[CH] Chat with Caravaggio or [SPM] Start Party Mode" -triggers: - party-mode: -input: SPM or fuzzy match start party mode -route: "{project-root}/_bmad/core/workflows/edit-agent/workflow.md" -data: what's being discussed, plus custom party agents if specified -type: exec - expert-chat: -input: CH or fuzzy match validate agent -action: agent responds as expert based on its personal to converse -type: action - - # Design services group - - multi: "[DC] Design Critique [SB] Storyboard" - triggers: - - design-critique: - input: DC or fuzzy match design critique - route: '#design-critique' - description: 'Ruthless design analysis 🎭' - type: exec - - storyboard: - input: SB or fuzzy match storyboard - route: '#storyboard-session' - description: 'Visual story frames 🎬' - type: exec - - # Quick actions - - trigger: 'analyze' - action: 'Quick visual analysis with my signature bluntness' - description: 'Quick visual take 🎯' - type: action - - - trigger: 'brainstorm' - action: '#brainstorm-session' - description: 'Creative storm 💡' - type: action - - # Document workflows for complex processes - - multi: "[PD] Pitch Deck [EX] Explainer Video" - triggers: - - pitch-deck: - input: PD or fuzzy match pitch deck - route: "{project-root}/_bmad/{custom_module}/workflows/pitch-deck/workflow.md" - description: 'Investor pitch deck 📈' - - explainer: - input: EX or fuzzy match explainer - route: "{project-root}/_bmad/{custom_module}/workflows/explainer/workflow.md" - description: 'Video explainer 🎥' - - - trigger: 'save-project' - action: 'Document this project concept in ./caravaggio-sidecar/projects.md with sketches and notes' - description: 'Save project 💾' diff --git a/src/modules/bmb/workflows/create-module/templates/installer.template.js b/src/modules/bmb/workflows/create-module/templates/installer.template.js deleted file mode 100644 index 428a57e4..00000000 --- a/src/modules/bmb/workflows/create-module/templates/installer.template.js +++ /dev/null @@ -1,47 +0,0 @@ -/** - * {module_display_name} Module Installer - * Custom installation logic - */ - -/** - * @param {Object} options - Installation options - * @param {string} options.projectRoot - Project root directory - * @param {Object} options.config - Module configuration from module.yaml - * @param {Array} options.installedIDEs - List of IDE codes being configured - * @param {Object} options.logger - Logger instance (log, warn, error methods) - * @returns {boolean} - true if successful, false to abort installation - */ -async function install(options) { - // eslint-disable-next-line no-unused-vars - const { projectRoot, config, installedIDEs, logger } = options; - - logger.log('Installing {module_display_name}...'); - - try { - // TODO: Add your custom installation logic here - - // Example: Create data directory - // const fs = require('fs'); - // const dataPath = config.data_path; - // if (!fs.existsSync(dataPath)) { - // fs.mkdirSync(dataPath, { recursive: true }); - // logger.log(`Created data directory: ${dataPath}`); - // } - - // Example: Initialize configuration file - // const configPath = path.join(projectRoot, config.config_file); - // fs.writeFileSync(configPath, JSON.stringify({ - // initialized: new Date().toISOString(), - // version: config.module_version - // }, null, 2)); - - logger.log('{module_display_name} installation complete!'); - return true; - } catch (error) { - logger.error(`Installation failed: ${error.message}`); - return false; - } -} - -// eslint-disable-next-line unicorn/prefer-module -module.exports = { install }; diff --git a/src/modules/bmb/workflows/create-module/templates/module-plan.template.md b/src/modules/bmb/workflows/create-module/templates/module-plan.template.md deleted file mode 100644 index 7e4dab7a..00000000 --- a/src/modules/bmb/workflows/create-module/templates/module-plan.template.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -stepsCompleted: [] ---- - -# Module Plan {module name} diff --git a/src/modules/bmb/workflows/create-module/templates/module.template.yaml b/src/modules/bmb/workflows/create-module/templates/module.template.yaml deleted file mode 100644 index 501f6e20..00000000 --- a/src/modules/bmb/workflows/create-module/templates/module.template.yaml +++ /dev/null @@ -1,53 +0,0 @@ -# {module_display_name} Module Configuration -# This file defines installation questions and module configuration values - -code: "${module_name}" # e.g., my-module -name: "{module_display_name}" -default_selected: false - -# Welcome message shown during installation -prompt: - - "Thank you for choosing {module_display_name}!" - - "{module_purpose}" -# Core config values are automatically inherited from installer: -## user_name -## communication_language -## document_output_language -## output_folder - -# ============================================================================ -# CONFIGURATION FIELDS -# ============================================================================ -# Each field can be: -# 1. INTERACTIVE (has 'prompt' - asks user during installation) -# 2. STATIC (no 'prompt' - just uses 'result' value) -# ============================================================================ - -# Example configurations (replace with actual planned fields): - -# INTERACTIVE text input: -# output_path: -# prompt: "Where should {module_name} save outputs?" -# default: "output/{module_name}" -# result: "{project-root}/{value}" - -# INTERACTIVE single-select: -# detail_level: -# prompt: "How detailed should outputs be?" -# default: "standard" -# result: "{value}" -# single-select: -# - value: "minimal" -# label: "Minimal - Brief summaries only" -# - value: "standard" -# label: "Standard - Balanced detail" -# - value: "detailed" -# label: "Detailed - Comprehensive information" - -# STATIC value: -# module_version: -# result: "1.0.0" - -# STATIC path: -# data_path: -# result: "{project-root}/_bmad/{module_name}/data" diff --git a/src/modules/bmb/workflows/create-module/templates/workflow-plan-template.md b/src/modules/bmb/workflows/create-module/templates/workflow-plan-template.md deleted file mode 100644 index 3d79eee5..00000000 --- a/src/modules/bmb/workflows/create-module/templates/workflow-plan-template.md +++ /dev/null @@ -1,23 +0,0 @@ -# Workflow Plan Template - -Use this template when creating workflow plans in step-07-workflows.md - -## Template Structure - -Copy the content from step-07-workflows.md when creating workflow plans. The template is embedded in the step file as a code block under "Workflow plan template". - -## Usage - -1. Navigate to the workflow folder -2. Create workflow-plan.md -3. Use the template structure from step-07-workflows.md -4. Fill in details specific to your workflow - -## Required Sections - -- Purpose -- Requirements (User Inputs, Prerequisites, Dependencies) -- Proposed Steps -- Expected Outputs -- Integration Points -- Implementation Notes diff --git a/src/modules/bmb/workflows/create-module/validation.md b/src/modules/bmb/workflows/create-module/validation.md deleted file mode 100644 index 147664d3..00000000 --- a/src/modules/bmb/workflows/create-module/validation.md +++ /dev/null @@ -1,126 +0,0 @@ -# Create Module Workflow Validation Checklist - -This document provides the validation criteria used in step-11-validate.md to ensure module quality and BMAD compliance. - -## Structure Validation - -### Required Directories - -- [ ] agents/ - Agent definition files -- [ ] workflows/ - Workflow folders -- [ ] tasks/ - Task files (if needed) -- [ ] templates/ - Shared templates -- [ ] data/ - Module data -- [ ] _module-installer/ - Installation config -- [ ] README.md - Module documentation -- [ ] module.yaml - module config file - -### Optional File in _module-installer/ - -- [ ] installer.js - Custom logic (if needed) - -## Configuration Validation - -### module.yaml - -- [ ] Valid YAML syntax -- [ ] Module code matches folder name -- [ ] Name field present -- [ ] Prompt array with welcome messages -- [ ] Configuration fields properly defined -- [ ] Result templates use correct placeholders - -### Module Plan - -- [ ] All sections completed -- [ ] Module identity documented -- [ ] Component plan clear -- [ ] Configuration plan documented - -## Component Validation - -### Agents - -- [ ] Files created in agents/ folder -- [ ] YAML frontmatter valid (for created agents) -- [ ] TODO flags used for non-existent workflows -- [ ] Menu items follow BMAD patterns -- [ ] Placeholder files contain TODO notes - -### Workflows - -- [ ] Folders created for each planned workflow -- [ ] workflow-plan.md in each folder -- [ ] README.md in each workflow folder -- [ ] Plans include all required sections -- [ ] Placeholder READMEs created for unplanned workflows - -## Documentation Validation - -### README.md - -- [ ] Module name and purpose -- [ ] Installation instructions -- [ ] Components section -- [ ] Quick start guide -- [ ] Module structure diagram -- [ ] Configuration section -- [ ] Usage examples -- [ ] Development status -- [ ] Author information - -### TODO.md - -- [ ] Development phases defined -- [ ] Tasks prioritized -- [ ] Quick commands included -- [ ] Completion criteria defined - -## Integration Validation - -### Path Consistency - -- [ ] All paths use correct template format -- [ ] Module code consistent throughout -- [ ] No hardcoded paths -- [ ] Cross-references correct - -### Agent-Workflow Integration - -- [ ] Agents reference correct workflows -- [ ] TODO flags used appropriately -- [ ] No circular dependencies -- [ ] Clear integration points - -## BMAD Compliance - -### Standards - -- [ ] Follows BMAD module structure -- [ ] Uses BMAD installation patterns -- [ ] Agent files follow BMAD format -- [ ] Workflow plans follow BMAD patterns - -### Best Practices - -- [ ] Clear naming conventions -- [ ] Proper documentation -- [ ] Version control ready -- [ ] Installable via bmad install - -## Final Checklist - -### Before Marking Complete - -- [ ] All validation items checked -- [ ] Critical issues resolved -- [ ] Module plan updated with final status -- [ ] stepsCompleted includes all 11 steps -- [ ] User satisfied with result - -### Ready for Testing - -- [ ] Installation should work -- [ ] Documentation accurate -- [ ] Structure complete -- [ ] Next steps clear diff --git a/src/modules/bmb/workflows/create-module/workflow.md b/src/modules/bmb/workflows/create-module/workflow.md deleted file mode 100644 index 9dad9757..00000000 --- a/src/modules/bmb/workflows/create-module/workflow.md +++ /dev/null @@ -1,56 +0,0 @@ ---- -name: create-module -description: 'Interactive workflow to build complete BMAD modules with agents, workflows, and installation infrastructure' -web_bundle: true -installed_path: '{project-root}/_bmad/bmb/workflows/create-module' ---- - -# Create Module Workflow - -**Goal:** To guide users through creating complete, installable BMAD modules with proper structure, agents, workflow plans, and documentation. - -**Your Role:** In addition to your name, communication_style, and persona, you are also a Module Architect and BMAD Systems Specialist collaborating with module creators. This is a partnership, not a client-vendor relationship. You bring expertise in BMAD architecture, component design, and installation patterns, while the user brings their domain knowledge and specific module requirements. Work together as equals. - -## WORKFLOW ARCHITECTURE - -### Core Principles - -- **Micro-file Design**: Each step of the overall goal is a self contained instruction file that you will adhere too 1 file as directed at a time -- **Just-In-Time Loading**: Only 1 current step file will be loaded, read, and executed to completion - never load future step files until told to do so -- **Sequential Enforcement**: Sequence within the step files must be completed in order, no skipping or optimization allowed -- **State Tracking**: Document progress in output file frontmatter using `stepsCompleted` array when a workflow produces a document -- **Append-Only Building**: Build documents by appending content as directed to the output file - -### Step Processing Rules - -1. **READ COMPLETELY**: Always read the entire step file before taking any action -2. **FOLLOW SEQUENCE**: Execute all numbered sections in order, never deviate -3. **WAIT FOR INPUT**: If a menu is presented, halt and wait for user selection -4. **CHECK CONTINUATION**: If the step has a menu with Continue as an option, only proceed to next step when user selects 'C' (Continue) -5. **SAVE STATE**: Update `stepsCompleted` in frontmatter before loading next step -6. **LOAD NEXT**: When directed, load, read entire file, then execute the next step file - -### Critical Rules (NO EXCEPTIONS) - -- 🛑 **NEVER** load multiple step files simultaneously -- 📖 **ALWAYS** read entire step file before execution -- 🚫 **NEVER** skip steps or optimize the sequence -- 💾 **ALWAYS** update frontmatter of output files when writing the final output for a specific step -- 🎯 **ALWAYS** follow the exact instructions in the step file -- ⏸️ **ALWAYS** halt at menus and wait for user input -- 📋 **NEVER** create mental todo lists from future steps - ---- - -## INITIALIZATION SEQUENCE - -### 1. Module Configuration Loading - -Load and read full config from {project-root}/_bmad/bmb/config.yaml and resolve: - -- `project_name`, `output_folder`, `user_name`, `communication_language`, `document_output_language`, `bmb_creations_output_folder` -- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` - -### 2. First Step EXECUTION - -Load, read the full file and then execute {installed_path}/steps/step-01-init.md to begin the workflow. diff --git a/src/modules/bmb/workflows/workflow/data/examples/meal-prep-nutrition/workflow.md b/src/modules/bmb/workflows/workflow/data/examples/meal-prep-nutrition/workflow.md index 8c72e740..b24c0cb7 100644 --- a/src/modules/bmb/workflows/workflow/data/examples/meal-prep-nutrition/workflow.md +++ b/src/modules/bmb/workflows/workflow/data/examples/meal-prep-nutrition/workflow.md @@ -2,6 +2,7 @@ name: Meal Prep & Nutrition Plan description: Creates personalized meal plans through collaborative nutrition planning between an expert facilitator and individual seeking to improve their nutrition habits. web_bundle: true +standalone: false --- # Meal Prep & Nutrition Plan Workflow diff --git a/src/modules/bmb/workflows/workflow/data/frontmatter-standards.md b/src/modules/bmb/workflows/workflow/data/frontmatter-standards.md index f33d44cb..ba3dda17 100644 --- a/src/modules/bmb/workflows/workflow/data/frontmatter-standards.md +++ b/src/modules/bmb/workflows/workflow/data/frontmatter-standards.md @@ -8,7 +8,7 @@ 1. **Only variables USED in the step** may be in frontmatter 2. **All file references MUST use `{variable}` format** - no hardcoded paths -3. **Paths within workflow folder MUST be relative** +3. **Paths within workflow folder MUST be relative** - NO `workflow_path` variable allowed --- @@ -48,25 +48,24 @@ description: '[what this step does]' --- ``` -### File References (ONLY if used in this step) +### File References - ONLY variables used in this step ```yaml --- -# File References -workflow_path: '{project-root}/_bmad/[module]/workflows/[workflow-name]' -thisStepFile: '{workflow_path}/steps/step-[N]-[name].md' -nextStepFile: '{workflow_path}/steps/step-[N+1]-[name].md' -workflowFile: '{workflow_path}/workflow.md' -outputFile: '{output_folder}/[output-name].md' +# Step to step (SAME folder) - use ./filename.md +nextStepFile: './step-02-vision.md' -# Task References (IF USED) +# Step to template (PARENT folder) - use ../filename.md +productBriefTemplate: '../product-brief.template.md' + +# Step to data (SUBFOLDER) - use ./data/filename.md +someData: './data/config.csv' + +# Output files - use variable +outputFile: '{planning_artifacts}/product-brief-{{project_name}}-{{date}}.md' + +# External references - use {project-root} advancedElicitationTask: '{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml' partyModeWorkflow: '{project-root}/_bmad/core/workflows/party-mode/workflow.md' - -# Template References (IF USED) -someTemplate: '{workflow_path}/templates/[template].md' - -# Data References (IF USED) -someData: '{workflow_path}/data/[data].csv' --- ``` @@ -74,50 +73,103 @@ someData: '{workflow_path}/data/[data].csv' ## Critical Rule: Unused Variables Forbidden -### ❌ VIOLATION +### ❌ VIOLATION - Variable defined but never used ```yaml --- outputFile: '{output_folder}/output.md' -partyModeWorkflow: '{project-root}/.../party-mode/workflow.md' # ❌ NOT USED! +thisStepFile: './step-01-init.md' # ❌ NEVER USED in body +workflowFile: './workflow.md' # ❌ NEVER USED in body --- -# Step body never mentions {partyModeWorkflow} +# Step body never mentions {thisStepFile} or {workflowFile} ``` -### ✅ CORRECT +### ✅ CORRECT - Only variables that are used ```yaml --- outputFile: '{output_folder}/output.md' +nextStepFile: './step-02-foo.md' --- -# Step body uses {outputFile} +# Step body uses {outputFile} and {nextStepFile} ``` +**Detection Rule:** For EVERY variable in frontmatter, search the step body for `{variableName}`. If not found, it's a violation. + --- -## Path Rules +## Path Rules - NO EXCEPTIONS -### 1. Paths Within Workflow Folder = RELATIVE +### 1. Step to Step (SAME folder) = ./filename.md ```yaml -# ❌ WRONG - absolute for same-folder -someTemplate: '{project-root}/_bmad/bmb/workflows/my-workflow/templates/template.md' +# ❌ WRONG +nextStepFile: '{workflow_path}/steps/step-02.md' +nextStepFile: '{project-root}/_bmad/bmm/workflows/foo/steps/step-02.md' -# ✅ CORRECT - relative or via workflow_path +# ✅ CORRECT +nextStepFile: './step-02-vision.md' +``` + +### 2. Step to Template (PARENT folder) = ../filename.md +```yaml +# ❌ WRONG someTemplate: '{workflow_path}/templates/template.md' + +# ✅ CORRECT +someTemplate: '../template.md' ``` -### 2. External References = Full Variable Paths +### 3. Step to Subfolder = ./subfolder/file.md +```yaml +# ❌ WRONG +dataFile: '{workflow_path}/data/config.csv' + +# ✅ CORRECT +dataFile: './data/config.csv' +``` + +### 4. External References = {project-root}/... ```yaml # ✅ CORRECT advancedElicitationTask: '{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml' ``` -### 3. Output Files = Use output_folder Variable +### 5. Output Files = Use folder variable ```yaml # ✅ CORRECT -outputFile: '{output_folder}/workflow-output-{project_name}.md' +outputFile: '{planning_artifacts}/workflow-output-{project_name}.md' +outputFile: '{output_folder}/output.md' ``` --- +## ❌ FORBIDDEN Patterns + +These patterns are **NEVER ALLOWED** in workflow step frontmatter: + +| Pattern | Why It's Wrong | +|---------|----------------| +| `workflow_path: '{project-root}/...'` | Use relative paths instead | +| `thisStepFile: './step-XX.md'` | Almost never used - remove unless actually referenced | +| `workflowFile: './workflow.md'` | Almost never used - remove unless actually referenced | +| `{workflow_path}/steps/...` | Use `./step-XX.md` (same folder) | +| `{workflow_path}/templates/...` | Use `../template.md` (parent folder) | +| `{workflow_path}/data/...` | Use `./data/file.md` (subfolder) | + +--- + +## Variable Naming + +Use `snake_case` with descriptive prefixes: + +| Pattern | Usage | Example | +| --------- | ---------------------- | -------------------------- | +| `{*_File}` | File references | `outputFile`, `nextStepFile` | +| `{*_Task}` | Task references | `advancedElicitationTask` | +| `{*_Workflow}` | Workflow references | `partyModeWorkflow` | +| `{*_Template}` | Templates | `productBriefTemplate` | +| `{*_Data}` | Data files | `dietaryData` | + +--- + ## Defining New Variables Steps can define NEW variables that future steps will use. @@ -127,6 +179,7 @@ Steps can define NEW variables that future steps will use. --- targetWorkflowPath: '{bmb_creations_output_folder}/workflows/{workflow_name}' --- +# Uses {targetWorkflowPath} in body ``` **Step 02 uses:** @@ -135,6 +188,7 @@ targetWorkflowPath: '{bmb_creations_output_folder}/workflows/{workflow_name}' targetWorkflowPath: '{bmb_creations_output_folder}/workflows/{workflow_name}' workflowPlanFile: '{targetWorkflowPath}/plan.md' --- +# Uses {targetWorkflowPath} and {workflowPlanFile} in body ``` --- @@ -154,26 +208,18 @@ date: '2025-01-01' --- -## Variable Naming - -Use `snake_case` with descriptive prefixes: - -| Pattern | Usage | Example | -| --------- | ---------------------- | -------------------------- | -| `{*_path}` | Folder paths | `workflow_path`, `data_path` | -| `{*_file}` | Files | `outputFile`, `planFile` | -| `{*_template}` | Templates | `profileTemplate` | -| `{*_data}` | Data files | `dietaryData` | - ---- - ## Validation Checklist -For every step frontmatter: -- [ ] `name` present, kebab-case +For EVERY step frontmatter, verify: + +- [ ] `name` present, kebab-case format - [ ] `description` present -- [ ] All variables in frontmatter ARE used in step body -- [ ] All file references use `{variable}` format -- [ ] Paths within workflow folder are relative +- [ ] Extract ALL variable names from frontmatter (between `---` markers) +- [ ] For EACH variable, search body: is `{variableName}` present? +- [ ] If variable NOT in body → ❌ VIOLATION, remove from frontmatter +- [ ] All step-to-step paths use `./filename.md` format (same folder) +- [ ] All parent-folder paths use `../filename.md` format +- [ ] All subfolder paths use `./subfolder/filename.md` format +- [ ] NO `{workflow_path}` variable exists - [ ] External paths use `{project-root}` variable -- [ ] Module variables only if workflow belongs to that module +- [ ] Module variables only used if workflow belongs to that module diff --git a/src/modules/bmb/workflows/workflow/steps-v/step-02-frontmatter-validation.md b/src/modules/bmb/workflows/workflow/steps-v/step-02-frontmatter-validation.md index a5e5b1f0..71778037 100644 --- a/src/modules/bmb/workflows/workflow/steps-v/step-02-frontmatter-validation.md +++ b/src/modules/bmb/workflows/workflow/steps-v/step-02-frontmatter-validation.md @@ -12,7 +12,7 @@ frontmatterStandards: '../data/frontmatter-standards.md' ## STEP GOAL: -To validate that EVERY step file's frontmatter follows the frontmatter standards - correct variables, proper path formatting, no unused variables. +To validate that EVERY step file's frontmatter follows the frontmatter standards - correct variables, proper relative paths, NO unused variables. ## MANDATORY EXECUTION RULES (READ FIRST): @@ -39,9 +39,9 @@ To validate that EVERY step file's frontmatter follows the frontmatter standards ## CONTEXT BOUNDARIES: -- All step files in steps-c/ must be validated +- All step files in the workflow must be validated - Load {frontmatterStandards} for validation criteria -- Check for: unused variables, hardcoded paths, missing required fields +- Check for: unused variables, non-relative paths, missing required fields, forbidden patterns ## MANDATORY SEQUENCE @@ -49,44 +49,81 @@ To validate that EVERY step file's frontmatter follows the frontmatter standards ### 1. Load Frontmatter Standards -Load {frontmatterStandards} to understand validation criteria: +Load {frontmatterStandards} to understand validation criteria. -**Golden Rules:** +**Key Rules:** 1. Only variables USED in the step may be in frontmatter 2. All file references MUST use `{variable}` format -3. Paths within workflow folder MUST be relative +3. Paths within workflow folder MUST be relative - NO `workflow_path` allowed -**Required Fields:** -- `name` - must be present, kebab-case -- `description` - must be present +**Forbidden Patterns:** +- `workflow_path: '...'` - use relative paths instead +- `thisStepFile: '...'` - remove unless actually referenced in body +- `workflowFile: '...'` - remove unless actually referenced in body +- `{workflow_path}/steps/...` - use `./step-XX.md` +- `{workflow_path}/templates/...` - use `../template.md` -### 2. Check EVERY Step File +### 2. Validate EVERY Step File - Systematic Algorithm -**DO NOT BE LAZY - For EACH file in steps-c/:** +**DO NOT BE LAZY - For EACH step file:** -1. Load the file -2. Extract frontmatter -3. Validate against each rule: +#### Step 2.1: Extract Frontmatter Variables -**Check 1: Required Fields** -- ✅ `name` exists and is kebab-case -- ✅ `description` exists +```python +# Algorithm to extract variables from frontmatter: +1. Find content between first `---` and second `---` +2. For each line, extract key before `:` +3. Skip `name`, `description`, and comment lines starting with `#` +4. Collect all variable names +``` -**Check 2: All Frontmatter Variables Are Used** -- For each variable in frontmatter, check if it appears in step body -- ❌ If not used: mark as violation +Example frontmatter: +```yaml +--- +# File References +nextStepFile: './step-02-vision.md' +outputFile: '{planning_artifacts}/product-brief-{{project_name}}.md' +workflow_path: '{project-root}/...' # ❌ FORBIDDEN +thisStepFile: './step-01-init.md' # ❌ Likely unused +--- +``` -**Check 3: No Hardcoded Paths** -- Check all file references use `{variable}` format -- ❌ If absolute path found: mark as violation +Variables extracted: `nextStepFile`, `outputFile`, `workflow_path`, `thisStepFile` -**Check 4: Relative Paths Within Workflow** -- Paths to same workflow should be relative (`../data/`) -- ❌ If absolute path for same-folder: mark as violation +#### Step 2.2: Check Each Variable Is Used -**Check 5: External References Use Full Variable Paths** -- `{project-root}` variables for external references -- ✅ Correct: `advancedElicitationTask: '{project-root}/_bmad/core/...'` +```python +# Algorithm to check variable usage: +for each variable in extracted_variables: + search_body = "{variableName}" # with curly braces + if search_body NOT found in step body (after frontmatter): + MARK_AS_UNUSED(variable) +``` + +**Example:** +- Variable `nextStepFile`: Search body for `{nextStepFile}` → Found in line 166 ✅ +- Variable `thisStepFile`: Search body for `{thisStepFile}` → Not found ❌ VIOLATION + +#### Step 2.3: Check Path Formats + +For each variable containing a file path: + +```python +# Algorithm to validate paths: +if path contains "{workflow_path}": + MARK_AS_VIOLATION("workflow_path is forbidden - use relative paths") + +if path is to another step file: + if not path.startswith("./step-"): + MARK_AS_VIOLATION("Step-to-step paths must be ./filename.md") + +if path is to parent folder template: + if not path.startswith("../"): + MARK_AS_VIOLATION("Parent folder paths must be ../filename.md") + +if path contains "{project-root}" and is internal workflow reference: + MARK_AS_VIOLATION("Internal paths must be relative, not project-root") +``` ### 3. Document Findings @@ -95,27 +132,26 @@ Create report table: ```markdown ### Frontmatter Validation Results -| File | Required Fields | Variables Used | Relative Paths | Status | -|------|----------------|----------------|----------------|--------| -| step-01-init.md | ✅ | ✅ | ✅ | ✅ PASS | -| step-02-*.md | ✅ | ❌ Unused: partyModeWorkflow | ✅ | ❌ FAIL | -| step-03-*.md | ❌ Missing description | ✅ | ❌ Hardcoded path | ❌ FAIL | +| File | Required | All Vars Used | Relative Paths | No Forbidden | Status | +|------|----------|---------------|----------------|-------------|--------| +| step-01-init.md | ✅ | ❌ Unused: thisStepFile, workflowFile | ✅ | ✅ | ❌ FAIL | +| step-02-vision.md | ✅ | ✅ | ✅ | ✅ | ✅ PASS | ``` -### 4. List Violations +### 4. List All Violations + +For EACH file with violations: ```markdown ### Violations Found -**step-02-[name].md:** -- Unused variable in frontmatter: `partyModeWorkflow` (not used in step body) +**step-01-init.md:** +- ❌ Unused variable: `thisStepFile` (defined but {thisStepFile} never appears in body) +- ❌ Unused variable: `workflowFile` (defined but {workflowFile} never appears in body) +- ❌ Forbidden pattern: `workflow_path` variable found (use relative paths instead) -**step-03-[name].md:** -- Missing required field: `description` -- Hardcoded path: `someTemplate: '/absolute/path/template.md'` should use relative or variable - -**step-05-[name].md:** -- All checks passed ✅ +**step-02-vision.md:** +- ✅ All checks passed ``` ### 5. Append to Report @@ -137,8 +173,10 @@ Then immediately load, read entire file, then execute {nextStepFile}. ### ✅ SUCCESS: -- EVERY step file's frontmatter validated -- All violations documented +- EVERY step file's frontmatter validated using systematic algorithm +- Each variable checked for usage in step body +- Each path checked for proper relative format +- All violations documented with specific variable names - Findings appended to report - Report saved before proceeding - Next validation step loaded @@ -146,8 +184,9 @@ Then immediately load, read entire file, then execute {nextStepFile}. ### ❌ SYSTEM FAILURE: - Not checking every file -- Skipping frontmatter checks -- Not documenting violations +- Not systematically checking each variable for usage +- Missing forbidden pattern detection +- Not documenting violations with specific details - Not saving report before proceeding -**Master Rule:** Validation is systematic and thorough. DO NOT BE LAZY. Check EVERY file's frontmatter. Auto-proceed through all validation steps. +**Master Rule:** Validation is systematic and thorough. DO NOT BE LAZY. For EACH variable in frontmatter, verify it's used in the body. For EACH path, verify it's relative. Auto-proceed through all validation steps. diff --git a/src/modules/bmb/workflows/workflow/workflow.md b/src/modules/bmb/workflows/workflow/workflow.md index 47feff81..a3e15c03 100644 --- a/src/modules/bmb/workflows/workflow/workflow.md +++ b/src/modules/bmb/workflows/workflow/workflow.md @@ -1,6 +1,6 @@ --- -name: create-workflow -description: Create structured standalone workflows using markdown-based step architecture (tri-modal: create, validate, edit) +name: workflow +description: "Create structured standalone workflows using markdown-based step architecture (tri-modal: create, validate, edit)" web_bundle: true --- diff --git a/src/modules/bmm/workflows/1-analysis/create-product-brief/steps/step-01-init.md b/src/modules/bmm/workflows/1-analysis/create-product-brief/steps/step-01-init.md index bf900a1f..a5535a42 100644 --- a/src/modules/bmm/workflows/1-analysis/create-product-brief/steps/step-01-init.md +++ b/src/modules/bmm/workflows/1-analysis/create-product-brief/steps/step-01-init.md @@ -2,17 +2,12 @@ name: 'step-01-init' description: 'Initialize the product brief workflow by detecting continuation state and setting up the document' -# Path Definitions -workflow_path: '{project-root}/_bmad/bmm/workflows/1-analysis/create-product-brief' - # File References -thisStepFile: '{workflow_path}/steps/step-01-init.md' -nextStepFile: '{workflow_path}/steps/step-02-vision.md' -workflowFile: '{workflow_path}/workflow.md' +nextStepFile: './step-02-vision.md' outputFile: '{planning_artifacts}/product-brief-{{project_name}}-{{date}}.md' # Template References -productBriefTemplate: '{workflow_path}/product-brief.template.md' +productBriefTemplate: '../product-brief.template.md' --- # Step 1: Product Brief Initialization @@ -78,7 +73,7 @@ If the document exists and has frontmatter with `stepsCompleted`: **Continuation Protocol:** -- **STOP immediately** and load `{workflow_path}/steps/step-01b-continue.md` +- **STOP immediately** and load `./step-01b-continue.md` - Do not proceed with any initialization tasks - Let step-01b handle all continuation logic - This is an auto-proceed situation - no user choice needed diff --git a/src/modules/bmm/workflows/1-analysis/create-product-brief/steps/step-01b-continue.md b/src/modules/bmm/workflows/1-analysis/create-product-brief/steps/step-01b-continue.md index 04c2cbcb..0d541b40 100644 --- a/src/modules/bmm/workflows/1-analysis/create-product-brief/steps/step-01b-continue.md +++ b/src/modules/bmm/workflows/1-analysis/create-product-brief/steps/step-01b-continue.md @@ -2,12 +2,7 @@ name: 'step-01b-continue' description: 'Resume the product brief workflow from where it was left off, ensuring smooth continuation' -# Path Definitions -workflow_path: '{project-root}/_bmad/bmm/workflows/1-analysis/create-product-brief' - # File References -thisStepFile: '{workflow_path}/steps/step-01b-continue.md' -workflowFile: '{workflow_path}/workflow.md' outputFile: '{planning_artifacts}/product-brief-{{project_name}}-{{date}}.md' --- diff --git a/src/modules/bmm/workflows/1-analysis/create-product-brief/steps/step-02-vision.md b/src/modules/bmm/workflows/1-analysis/create-product-brief/steps/step-02-vision.md index 532f619d..1df56977 100644 --- a/src/modules/bmm/workflows/1-analysis/create-product-brief/steps/step-02-vision.md +++ b/src/modules/bmm/workflows/1-analysis/create-product-brief/steps/step-02-vision.md @@ -2,13 +2,8 @@ name: 'step-02-vision' description: 'Discover and define the core product vision, problem statement, and unique value proposition' -# Path Definitions -workflow_path: '{project-root}/_bmad/bmm/workflows/1-analysis/create-product-brief' - # File References -thisStepFile: '{workflow_path}/steps/step-02-vision.md' -nextStepFile: '{workflow_path}/steps/step-03-users.md' -workflowFile: '{workflow_path}/workflow.md' +nextStepFile: './step-03-users.md' outputFile: '{planning_artifacts}/product-brief-{{project_name}}-{{date}}.md' # Task References diff --git a/src/modules/bmm/workflows/1-analysis/create-product-brief/steps/step-03-users.md b/src/modules/bmm/workflows/1-analysis/create-product-brief/steps/step-03-users.md index d95c3045..8493e7d2 100644 --- a/src/modules/bmm/workflows/1-analysis/create-product-brief/steps/step-03-users.md +++ b/src/modules/bmm/workflows/1-analysis/create-product-brief/steps/step-03-users.md @@ -2,13 +2,8 @@ name: 'step-03-users' description: 'Define target users with rich personas and map their key interactions with the product' -# Path Definitions -workflow_path: '{project-root}/_bmad/bmm/workflows/1-analysis/create-product-brief' - # File References -thisStepFile: '{workflow_path}/steps/step-03-users.md' -nextStepFile: '{workflow_path}/steps/step-04-metrics.md' -workflowFile: '{workflow_path}/workflow.md' +nextStepFile: './step-04-metrics.md' outputFile: '{planning_artifacts}/product-brief-{{project_name}}-{{date}}.md' # Task References diff --git a/src/modules/bmm/workflows/1-analysis/create-product-brief/steps/step-04-metrics.md b/src/modules/bmm/workflows/1-analysis/create-product-brief/steps/step-04-metrics.md index fedd380d..6a3dde46 100644 --- a/src/modules/bmm/workflows/1-analysis/create-product-brief/steps/step-04-metrics.md +++ b/src/modules/bmm/workflows/1-analysis/create-product-brief/steps/step-04-metrics.md @@ -2,13 +2,8 @@ name: 'step-04-metrics' description: 'Define comprehensive success metrics that include user success, business objectives, and key performance indicators' -# Path Definitions -workflow_path: '{project-root}/_bmad/bmm/workflows/1-analysis/create-product-brief' - # File References -thisStepFile: '{workflow_path}/steps/step-04-metrics.md' -nextStepFile: '{workflow_path}/steps/step-05-scope.md' -workflowFile: '{workflow_path}/workflow.md' +nextStepFile: './step-05-scope.md' outputFile: '{planning_artifacts}/product-brief-{{project_name}}-{{date}}.md' # Task References diff --git a/src/modules/bmm/workflows/1-analysis/create-product-brief/steps/step-05-scope.md b/src/modules/bmm/workflows/1-analysis/create-product-brief/steps/step-05-scope.md index fd1b8450..b494f2d8 100644 --- a/src/modules/bmm/workflows/1-analysis/create-product-brief/steps/step-05-scope.md +++ b/src/modules/bmm/workflows/1-analysis/create-product-brief/steps/step-05-scope.md @@ -2,13 +2,8 @@ name: 'step-05-scope' description: 'Define MVP scope with clear boundaries and outline future vision while managing scope creep' -# Path Definitions -workflow_path: '{project-root}/_bmad/bmm/workflows/1-analysis/create-product-brief' - # File References -thisStepFile: '{workflow_path}/steps/step-05-scope.md' -nextStepFile: '{workflow_path}/steps/step-06-complete.md' -workflowFile: '{workflow_path}/workflow.md' +nextStepFile: './step-06-complete.md' outputFile: '{planning_artifacts}/product-brief-{{project_name}}-{{date}}.md' # Task References diff --git a/src/modules/bmm/workflows/1-analysis/create-product-brief/steps/step-06-complete.md b/src/modules/bmm/workflows/1-analysis/create-product-brief/steps/step-06-complete.md index 1a034739..0c49da1e 100644 --- a/src/modules/bmm/workflows/1-analysis/create-product-brief/steps/step-06-complete.md +++ b/src/modules/bmm/workflows/1-analysis/create-product-brief/steps/step-06-complete.md @@ -2,12 +2,7 @@ name: 'step-06-complete' description: 'Complete the product brief workflow, update status files, and suggest next steps for the project' -# Path Definitions -workflow_path: '{project-root}/_bmad/bmm/workflows/1-analysis/create-product-brief' - # File References -thisStepFile: '{workflow_path}/steps/step-06-complete.md' -workflowFile: '{workflow_path}/workflow.md' outputFile: '{planning_artifacts}/product-brief-{{project_name}}-{{date}}.md' --- diff --git a/tools/cli/installers/lib/core/manifest-generator.js b/tools/cli/installers/lib/core/manifest-generator.js index bbaf751a..f9c8c401 100644 --- a/tools/cli/installers/lib/core/manifest-generator.js +++ b/tools/cli/installers/lib/core/manifest-generator.js @@ -183,6 +183,14 @@ class ManifestGenerator { continue; } + // Skip workflows marked as non-standalone (reference/example workflows) + if (workflow.standalone === false) { + if (debug) { + console.log(`[DEBUG] Skipped (standalone=false): ${workflow.name}`); + } + continue; + } + if (workflow.name && workflow.description) { // Build relative path for installation const installPath = @@ -190,7 +198,7 @@ class ManifestGenerator { ? `${this.bmadFolderName}/core/workflows/${relativePath}/${entry.name}` : `${this.bmadFolderName}/${moduleName}/workflows/${relativePath}/${entry.name}`; - // ALL workflows now generate commands - no standalone property needed + // Workflows with standalone: false are filtered out above workflows.push({ name: workflow.name, description: workflow.description.replaceAll('"', '""'), // Escape quotes for CSV From 5c7665773282e96e8827f97b98f7b3f95b95d0cc Mon Sep 17 00:00:00 2001 From: Brian Madison Date: Wed, 7 Jan 2026 18:18:12 +0800 Subject: [PATCH 16/19] Add CNAME file --- CNAME | 1 + 1 file changed, 1 insertion(+) create mode 100644 CNAME diff --git a/CNAME b/CNAME new file mode 100644 index 00000000..99cd1ce5 --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +docs.bmad-method.org \ No newline at end of file From 67b70288a64fbb4e8bb6a7959eafe88ba2034539 Mon Sep 17 00:00:00 2001 From: Alex Verkhovsky Date: Wed, 7 Jan 2026 15:58:53 -0800 Subject: [PATCH 17/19] docs: update README links to new documentation site (#1274) --- README.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 959cab22..49a83e74 100644 --- a/README.md +++ b/README.md @@ -24,8 +24,8 @@ The completely revamped **BMAD V6 installer** now includes built-in support for **📚 Learn More:** -- [**Custom Content Overview**](docs/modules/bmb-bmad-builder/custom-content.md) - Discover all supported content types -- [**Installation Guide**](docs/modules/bmb-bmad-builder/custom-content-installation.md) - Learn to create and install custom content +- [**Custom Content Overview**](http://docs.bmad-method.org/explanation/bmad-builder/custom-content-types/) - Discover all supported content types +- [**Installation Guide**](http://docs.bmad-method.org/how-to/installation/install-custom-modules/) - Learn to create and install custom content - [**2 Very simple Custom Modules of questionable quality**](./samples/sample-custom-modules/README.md) - if you want to download and try to install a custom shared module, get an idea of how to bundle and share your own, or create your own personal agents, workflows and modules. @@ -67,7 +67,7 @@ With **BMad Builder**, you can architect both simple agents and vastly complex d ## 📊 See It In Action

- BMad Method Workflow + BMad Method Workflow

@@ -146,17 +146,17 @@ Each agent brings deep expertise and can be customized to match your team's styl - 12 specialized agents - 34 workflows across 4 phases - Stand Along Quick Spec Flow for a streamlined simple implementation process - - [→ Documentation Hub](./docs/modules/bmm-bmad-method/index.md) + - [→ Documentation Hub](http://docs.bmad-method.org/explanation/bmm/) - **BMad Builder (BMB)** - Create custom agents and workflows - Build anything from simple agents to complex modules - Create domain-specific solutions (legal, medical, finance, education) - - [→ Builder Guide](./docs/modules/bmb-bmad-builder/index.md) + - [→ Builder Guide](http://docs.bmad-method.org/explanation/bmad-builder/) - **Creative Intelligence Suite (CIS)** - Innovation & problem-solving - Brainstorming, design thinking, storytelling - 5 creative facilitation workflows - - [→ Creative Workflows](./docs/modules/cis-creative-intelligence-suite/index.md) + - [→ Creative Workflows](http://docs.bmad-method.org/explanation/creative-intelligence/) ### Key Features @@ -170,15 +170,15 @@ Each agent brings deep expertise and can be customized to match your team's styl ### Quick Links -- **[Quick Start Guide](./docs/modules/bmm-bmad-method/quick-start.md)** - 15-minute introduction -- **[Complete BMM Documentation](./docs/modules/bmm-bmad-method/index.md)** - All guides and references -- **[Agent Customization](docs/bmad-customization/agent-customization-guide.md)** - Personalize your agents -- **[All Documentation](./docs/index.md)** - Complete documentation index +- **[Quick Start Guide](http://docs.bmad-method.org/tutorials/getting-started/getting-started-bmadv6/)** - 15-minute introduction +- **[Complete BMM Documentation](http://docs.bmad-method.org/explanation/bmm/)** - All guides and references +- **[Agent Customization](http://docs.bmad-method.org/how-to/customization/customize-agents/)** - Personalize your agents +- **[All Documentation](http://docs.bmad-method.org/)** - Complete documentation index ### For v4 Users - **[v4 Documentation](https://github.com/bmad-code-org/BMAD-METHOD/tree/V4/docs)** -- **[v4 to v6 Upgrade Guide](./docs/v4-to-v6-upgrade.md)** +- **[v4 to v6 Upgrade Guide](http://docs.bmad-method.org/how-to/installation/upgrade-to-v6/)** ## 💬 Community & Support @@ -211,7 +211,7 @@ If you would like to contribute, first check the [CONTRIBUTING.md](CONTRIBUTING. ### 🔄 For v4 Users -- **[Comprehensive Upgrade Guide](./docs/v4-to-v6-upgrade.md)** - Step-by-step migration +- **[Comprehensive Upgrade Guide](http://docs.bmad-method.org/how-to/installation/upgrade-to-v6/)** - Step-by-step migration - **[v4 Documentation Archive](https://github.com/bmad-code-org/BMAD-METHOD/tree/V4)** - Legacy reference - Backwards compatibility where possible - Smooth migration path with installer detection From 8e165b9b57e48cfae62c41c329ae0fdcec502a95 Mon Sep 17 00:00:00 2001 From: Alex Verkhovsky Date: Wed, 7 Jan 2026 15:59:30 -0800 Subject: [PATCH 18/19] chore: enable CodeRabbit auto-review on new PRs (#1276) --- .coderabbit.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.coderabbit.yaml b/.coderabbit.yaml index c53b1981..58eb549f 100644 --- a/.coderabbit.yaml +++ b/.coderabbit.yaml @@ -11,8 +11,8 @@ reviews: walkthrough: false poem: false auto_review: - enabled: false - drafts: true # Can review drafts. Since it's manually triggered, it's fine. + enabled: true + drafts: false # Don't review drafts automatically auto_incremental_review: false # always review the whole PR, not just new commits base_branches: - main From d19cca79d2d607d8a099b57df93aee4f202d1cf7 Mon Sep 17 00:00:00 2001 From: Q00 <31264094+Q00@users.noreply.github.com> Date: Thu, 8 Jan 2026 16:42:22 +0900 Subject: [PATCH 19/19] fix: resolve ERR_REQUIRE_ESM by using dynamic import for inquirer (#1278) Inquirer v9+ is ESM-only, causing ERR_REQUIRE_ESM when loaded via require() in CommonJS. Convert all require('inquirer') calls to dynamic import('inquirer') across 8 CLI files. Fixes #1197 --- tools/cli/commands/install.js | 2 +- .../installers/lib/core/config-collector.js | 12 +++++++++- tools/cli/installers/lib/core/installer.js | 7 +++--- tools/cli/installers/lib/ide/antigravity.js | 6 ++--- tools/cli/installers/lib/ide/claude-code.js | 6 ++--- tools/cli/installers/lib/ide/codex.js | 2 +- .../cli/installers/lib/ide/github-copilot.js | 2 +- tools/cli/lib/ui.js | 23 ++++++++++++++++++- 8 files changed, 45 insertions(+), 15 deletions(-) diff --git a/tools/cli/commands/install.js b/tools/cli/commands/install.js index 1ae5d4c0..f71d5679 100644 --- a/tools/cli/commands/install.js +++ b/tools/cli/commands/install.js @@ -1,6 +1,5 @@ const chalk = require('chalk'); const path = require('node:path'); -const inquirer = require('inquirer').default || require('inquirer'); const { Installer } = require('../installers/lib/core/installer'); const { UI } = require('../lib/ui'); @@ -72,6 +71,7 @@ module.exports = { console.log(chalk.dim(' • ElevenLabs AI (150+ premium voices)')); console.log(chalk.dim(' • Piper TTS (50+ free voices)\n')); + const { default: inquirer } = await import('inquirer'); await inquirer.prompt([ { type: 'input', diff --git a/tools/cli/installers/lib/core/config-collector.js b/tools/cli/installers/lib/core/config-collector.js index fad0f108..fb48b68d 100644 --- a/tools/cli/installers/lib/core/config-collector.js +++ b/tools/cli/installers/lib/core/config-collector.js @@ -2,10 +2,18 @@ const path = require('node:path'); const fs = require('fs-extra'); const yaml = require('yaml'); const chalk = require('chalk'); -const inquirer = require('inquirer').default || require('inquirer'); const { getProjectRoot, getModulePath } = require('../../../lib/project-root'); const { CLIUtils } = require('../../../lib/cli-utils'); +// Lazy-load inquirer (ESM module) to avoid ERR_REQUIRE_ESM +let _inquirer = null; +async function getInquirer() { + if (!_inquirer) { + _inquirer = (await import('inquirer')).default; + } + return _inquirer; +} + class ConfigCollector { constructor() { this.collectedConfig = {}; @@ -175,6 +183,7 @@ class ConfigCollector { * @returns {boolean} True if new fields were prompted, false if all fields existed */ async collectModuleConfigQuick(moduleName, projectDir, silentMode = true) { + const inquirer = await getInquirer(); this.currentProjectDir = projectDir; // Load existing config if not already loaded @@ -493,6 +502,7 @@ class ConfigCollector { * @param {boolean} skipCompletion - Skip showing completion message (for early core collection) */ async collectModuleConfig(moduleName, projectDir, skipLoadExisting = false, skipCompletion = false) { + const inquirer = await getInquirer(); this.currentProjectDir = projectDir; // Load existing config if needed and not already loaded if (!skipLoadExisting && !this.existingConfig) { diff --git a/tools/cli/installers/lib/core/installer.js b/tools/cli/installers/lib/core/installer.js index 816dbbbc..8b7e05fd 100644 --- a/tools/cli/installers/lib/core/installer.js +++ b/tools/cli/installers/lib/core/installer.js @@ -2,7 +2,6 @@ const path = require('node:path'); const fs = require('fs-extra'); const chalk = require('chalk'); const ora = require('ora'); -const inquirer = require('inquirer').default || require('inquirer'); const { Detector } = require('./detector'); const { Manifest } = require('./manifest'); const { ModuleManager } = require('../modules/manager'); @@ -2140,7 +2139,7 @@ class Installer { * Private: Prompt for update action */ async promptUpdateAction() { - const inquirer = require('inquirer').default || require('inquirer'); + const { default: inquirer } = await import('inquirer'); return await inquirer.prompt([ { type: 'list', @@ -2157,7 +2156,7 @@ class Installer { * @param {Object} _legacyV4 - Legacy V4 detection result (unused in simplified version) */ async handleLegacyV4Migration(_projectDir, _legacyV4) { - const inquirer = require('inquirer').default || require('inquirer'); + const { default: inquirer } = await import('inquirer'); console.log(''); console.log(chalk.yellow.bold('⚠️ Legacy BMAD v4 detected')); @@ -2438,7 +2437,7 @@ class Installer { console.log(chalk.yellow(`\n⚠️ Found ${customModulesWithMissingSources.length} custom module(s) with missing sources:`)); - const inquirer = require('inquirer').default || require('inquirer'); + const { default: inquirer } = await import('inquirer'); let keptCount = 0; let updatedCount = 0; let removedCount = 0; diff --git a/tools/cli/installers/lib/ide/antigravity.js b/tools/cli/installers/lib/ide/antigravity.js index a7fed6ea..c896d62d 100644 --- a/tools/cli/installers/lib/ide/antigravity.js +++ b/tools/cli/installers/lib/ide/antigravity.js @@ -58,7 +58,7 @@ class AntigravitySetup extends BaseIdeSetup { if (config.subagentChoices.install !== 'none') { // Ask for installation location - const inquirer = require('inquirer').default || require('inquirer'); + const { default: inquirer } = await import('inquirer'); const locationAnswer = await inquirer.prompt([ { type: 'list', @@ -297,7 +297,7 @@ class AntigravitySetup extends BaseIdeSetup { choices = await this.promptSubagentInstallation(config.subagents); if (choices.install !== 'none') { - const inquirer = require('inquirer').default || require('inquirer'); + const { default: inquirer } = await import('inquirer'); const locationAnswer = await inquirer.prompt([ { type: 'list', @@ -334,7 +334,7 @@ class AntigravitySetup extends BaseIdeSetup { * Prompt user for subagent installation preferences */ async promptSubagentInstallation(subagentConfig) { - const inquirer = require('inquirer').default || require('inquirer'); + const { default: inquirer } = await import('inquirer'); // First ask if they want to install subagents const { install } = await inquirer.prompt([ diff --git a/tools/cli/installers/lib/ide/claude-code.js b/tools/cli/installers/lib/ide/claude-code.js index 35e70b0b..f2a33221 100644 --- a/tools/cli/installers/lib/ide/claude-code.js +++ b/tools/cli/installers/lib/ide/claude-code.js @@ -57,7 +57,7 @@ class ClaudeCodeSetup extends BaseIdeSetup { if (config.subagentChoices.install !== 'none') { // Ask for installation location - const inquirer = require('inquirer').default || require('inquirer'); + const { default: inquirer } = await import('inquirer'); const locationAnswer = await inquirer.prompt([ { type: 'list', @@ -305,7 +305,7 @@ class ClaudeCodeSetup extends BaseIdeSetup { choices = await this.promptSubagentInstallation(config.subagents); if (choices.install !== 'none') { - const inquirer = require('inquirer').default || require('inquirer'); + const { default: inquirer } = await import('inquirer'); const locationAnswer = await inquirer.prompt([ { type: 'list', @@ -342,7 +342,7 @@ class ClaudeCodeSetup extends BaseIdeSetup { * Prompt user for subagent installation preferences */ async promptSubagentInstallation(subagentConfig) { - const inquirer = require('inquirer').default || require('inquirer'); + const { default: inquirer } = await import('inquirer'); // First ask if they want to install subagents const { install } = await inquirer.prompt([ diff --git a/tools/cli/installers/lib/ide/codex.js b/tools/cli/installers/lib/ide/codex.js index 9967057a..3ce9d910 100644 --- a/tools/cli/installers/lib/ide/codex.js +++ b/tools/cli/installers/lib/ide/codex.js @@ -21,7 +21,7 @@ class CodexSetup extends BaseIdeSetup { * @returns {Object} Collected configuration */ async collectConfiguration(options = {}) { - const inquirer = require('inquirer').default || require('inquirer'); + const { default: inquirer } = await import('inquirer'); let confirmed = false; let installLocation = 'global'; diff --git a/tools/cli/installers/lib/ide/github-copilot.js b/tools/cli/installers/lib/ide/github-copilot.js index 36d3eecb..b9dd5f98 100644 --- a/tools/cli/installers/lib/ide/github-copilot.js +++ b/tools/cli/installers/lib/ide/github-copilot.js @@ -1,7 +1,6 @@ const path = require('node:path'); const { BaseIdeSetup } = require('./_base-ide'); const chalk = require('chalk'); -const inquirer = require('inquirer').default || require('inquirer'); const { AgentCommandGenerator } = require('./shared/agent-command-generator'); /** @@ -22,6 +21,7 @@ class GitHubCopilotSetup extends BaseIdeSetup { * @returns {Object} Collected configuration */ async collectConfiguration(options = {}) { + const { default: inquirer } = await import('inquirer'); const config = {}; console.log('\n' + chalk.blue(' 🔧 VS Code Settings Configuration')); diff --git a/tools/cli/lib/ui.js b/tools/cli/lib/ui.js index ab055643..85f31ce1 100644 --- a/tools/cli/lib/ui.js +++ b/tools/cli/lib/ui.js @@ -1,11 +1,19 @@ const chalk = require('chalk'); -const inquirer = require('inquirer').default || require('inquirer'); const path = require('node:path'); const os = require('node:os'); const fs = require('fs-extra'); const { CLIUtils } = require('./cli-utils'); const { CustomHandler } = require('../installers/lib/custom/handler'); +// Lazy-load inquirer (ESM module) to avoid ERR_REQUIRE_ESM +let _inquirer = null; +async function getInquirer() { + if (!_inquirer) { + _inquirer = (await import('inquirer')).default; + } + return _inquirer; +} + /** * UI utilities for the installer */ @@ -15,6 +23,7 @@ class UI { * @returns {Object} Installation configuration */ async promptInstall() { + const inquirer = await getInquirer(); CLIUtils.displayLogo(); // Display version-specific start message from install-messages.yaml @@ -450,6 +459,7 @@ class UI { * @returns {Object} Tool configuration */ async promptToolSelection(projectDir, selectedModules) { + const inquirer = await getInquirer(); // Check for existing configured IDEs - use findBmadDir to detect custom folder names const { Detector } = require('../installers/lib/core/detector'); const { Installer } = require('../installers/lib/core/installer'); @@ -582,6 +592,7 @@ class UI { * @returns {Object} Update configuration */ async promptUpdate() { + const inquirer = await getInquirer(); const answers = await inquirer.prompt([ { type: 'confirm', @@ -606,6 +617,7 @@ class UI { * @returns {Array} Selected modules */ async promptModules(modules) { + const inquirer = await getInquirer(); const choices = modules.map((mod) => ({ name: `${mod.name} - ${mod.description}`, value: mod.id, @@ -637,6 +649,7 @@ class UI { * @returns {boolean} User confirmation */ async confirm(message, defaultValue = false) { + const inquirer = await getInquirer(); const { confirmed } = await inquirer.prompt([ { type: 'confirm', @@ -743,6 +756,7 @@ class UI { * @returns {Array} Module choices for inquirer */ async getModuleChoices(installedModuleIds, customContentConfig = null) { + const inquirer = await getInquirer(); const moduleChoices = []; const isNewInstallation = installedModuleIds.size === 0; @@ -823,6 +837,7 @@ class UI { * @returns {Array} Selected module IDs */ async selectModules(moduleChoices, defaultSelections = []) { + const inquirer = await getInquirer(); const moduleAnswer = await inquirer.prompt([ { type: 'checkbox', @@ -843,6 +858,7 @@ class UI { * @returns {Object} Directory answer from inquirer */ async promptForDirectory() { + const inquirer = await getInquirer(); return await inquirer.prompt([ { type: 'input', @@ -899,6 +915,7 @@ class UI { * @returns {boolean} Whether user confirmed */ async confirmDirectory(directory) { + const inquirer = await getInquirer(); const dirExists = await fs.pathExists(directory); if (dirExists) { @@ -1085,6 +1102,7 @@ class UI { * - GitHub Issue: paulpreibisch/AgentVibes#36 */ async promptAgentVibes(projectDir) { + const inquirer = await getInquirer(); CLIUtils.displaySection('🎤 Voice Features', 'Enable TTS for multi-agent conversations'); // Check if AgentVibes is already installed @@ -1235,6 +1253,7 @@ class UI { * @returns {Object} Custom content configuration */ async promptCustomContentSource() { + const inquirer = await getInquirer(); const customContentConfig = { hasCustomContent: true, sources: [] }; // Keep asking for more sources until user is done @@ -1372,6 +1391,7 @@ class UI { * @returns {Object} Result with selected custom modules and custom content config */ async handleCustomModulesInModifyFlow(directory, selectedModules) { + const inquirer = await getInquirer(); // Get existing installation to find custom modules const { existingInstall } = await this.getExistingInstallation(directory); @@ -1566,6 +1586,7 @@ class UI { * @returns {Promise} True if user wants to proceed, false if they cancel */ async showOldAlphaVersionWarning(installedVersion, currentVersion, bmadFolderName) { + const inquirer = await getInquirer(); const versionInfo = this.checkAlphaVersionAge(installedVersion, currentVersion); // Also warn if version is unknown or can't be parsed (legacy/unsupported)