bmad-method 5.1.2 → 6.0.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/FUNDING.yaml +2 -2
- package/.github/ISSUE_TEMPLATE/config.yaml +1 -0
- package/.github/ISSUE_TEMPLATE/idea_submission.md +109 -0
- package/.github/workflows/discord.yaml +1 -10
- package/.github/workflows/format-check.yaml +3 -2
- package/.github/workflows/manual-release.yaml +2 -2
- package/.nvmrc +1 -0
- package/.vscode/settings.json +34 -9
- package/CHANGELOG.md +211 -577
- package/CONTRIBUTING.md +130 -60
- package/LICENSE +6 -1
- package/docs/codebase-flattener.md +19 -0
- package/docs/ide-info/auggie.md +31 -0
- package/docs/ide-info/claude-code.md +25 -0
- package/docs/ide-info/cline.md +31 -0
- package/docs/ide-info/codex.md +32 -0
- package/docs/ide-info/crush.md +30 -0
- package/docs/ide-info/cursor.md +25 -0
- package/docs/ide-info/gemini.md +25 -0
- package/docs/ide-info/github-copilot.md +26 -0
- package/docs/ide-info/iflow.md +33 -0
- package/docs/ide-info/kilo.md +24 -0
- package/docs/ide-info/qwen.md +25 -0
- package/docs/ide-info/roo.md +27 -0
- package/docs/ide-info/trae.md +25 -0
- package/docs/ide-info/windsurf.md +22 -0
- package/docs/installers-bundlers/ide-injections.md +196 -0
- package/docs/installers-bundlers/installers-modules-platforms-reference.md +355 -0
- package/docs/installers-bundlers/web-bundler-usage.md +54 -0
- package/eslint.config.mjs +17 -7
- package/package.json +26 -35
- package/prettier.config.mjs +1 -1
- package/readme.md +216 -0
- package/src/core/_module-installer/install-menu-config.yaml +24 -0
- package/src/core/_module-installer/installer.js +68 -0
- package/src/core/agents/bmad-master.md +27 -0
- package/src/core/agents/bmad-web-orchestrator.md +71 -0
- package/src/core/tasks/adv-elicit-methods.csv +39 -0
- package/src/core/tasks/adv-elicit.md +109 -0
- package/src/core/tasks/index-docs.md +69 -0
- package/src/core/tasks/shard-doc.md +57 -0
- package/src/core/tasks/validate-workflow.md +92 -0
- package/src/core/tasks/workflow.md +141 -0
- package/src/core/workflows/bmad-init/instructions.md +79 -0
- package/src/core/workflows/bmad-init/workflow.yaml +24 -0
- package/src/core/workflows/party-mode/instructions.md +181 -0
- package/src/core/workflows/party-mode/workflow.yaml +24 -0
- package/src/modules/bmb/_module-installer/install-menu-config.yaml +16 -0
- package/src/modules/bmb/agents/bmad-builder.md +30 -0
- package/src/modules/bmb/workflows/convert-legacy/README.md +262 -0
- package/src/modules/bmb/workflows/convert-legacy/checklist.md +204 -0
- package/src/modules/bmb/workflows/convert-legacy/instructions.md +328 -0
- package/src/modules/bmb/workflows/convert-legacy/workflow.yaml +35 -0
- package/src/modules/bmb/workflows/create-agent/README.md +268 -0
- package/src/modules/bmb/workflows/create-agent/agent-architecture.md +412 -0
- package/src/modules/bmb/workflows/create-agent/agent-command-patterns.md +757 -0
- package/src/modules/bmb/workflows/create-agent/agent-types.md +177 -0
- package/src/modules/bmb/workflows/create-agent/brainstorm-context.md +174 -0
- package/src/modules/bmb/workflows/create-agent/checklist.md +134 -0
- package/src/modules/bmb/workflows/create-agent/communication-styles.md +240 -0
- package/src/modules/bmb/workflows/create-agent/instructions.md +340 -0
- package/src/modules/bmb/workflows/create-agent/workflow.yaml +39 -0
- package/src/modules/bmb/workflows/create-module/README.md +218 -0
- package/src/modules/bmb/workflows/create-module/brainstorm-context.md +137 -0
- package/src/modules/bmb/workflows/create-module/checklist.md +245 -0
- package/src/modules/bmb/workflows/create-module/installer-templates/install-module-config.yaml +132 -0
- package/src/modules/bmb/workflows/create-module/installer-templates/installer.js +231 -0
- package/src/modules/bmb/workflows/create-module/instructions.md +509 -0
- package/src/modules/bmb/workflows/create-module/module-structure.md +310 -0
- package/src/modules/bmb/workflows/create-module/workflow.yaml +47 -0
- package/src/modules/bmb/workflows/create-workflow/README.md +216 -0
- package/src/modules/bmb/workflows/create-workflow/brainstorm-context.md +197 -0
- package/src/modules/bmb/workflows/create-workflow/checklist.md +72 -0
- package/src/modules/bmb/workflows/create-workflow/instructions.md +267 -0
- package/src/modules/bmb/workflows/create-workflow/workflow-creation-guide.md +456 -0
- package/src/modules/bmb/workflows/create-workflow/workflow-template/checklist.md +24 -0
- package/src/modules/bmb/workflows/create-workflow/workflow-template/instructions.md +12 -0
- package/src/modules/bmb/workflows/create-workflow/workflow-template/template.md +9 -0
- package/src/modules/bmb/workflows/create-workflow/workflow-template/workflow.yaml +35 -0
- package/src/modules/bmb/workflows/create-workflow/workflow.yaml +42 -0
- package/src/modules/bmb/workflows/edit-workflow/README.md +63 -0
- package/src/modules/bmb/workflows/edit-workflow/checklist.md +70 -0
- package/src/modules/bmb/workflows/edit-workflow/instructions.md +170 -0
- package/src/modules/bmb/workflows/edit-workflow/workflow.yaml +34 -0
- package/src/modules/bmb/workflows/module-brief/README.md +264 -0
- package/src/modules/bmb/workflows/module-brief/checklist.md +116 -0
- package/src/modules/bmb/workflows/module-brief/instructions.md +265 -0
- package/src/modules/bmb/workflows/module-brief/template.md +275 -0
- package/src/modules/bmb/workflows/module-brief/workflow.yaml +30 -0
- package/src/modules/bmb/workflows/redoc/README.md +87 -0
- package/src/modules/bmb/workflows/redoc/checklist.md +99 -0
- package/src/modules/bmb/workflows/redoc/instructions.md +255 -0
- package/src/modules/bmb/workflows/redoc/workflow.yaml +33 -0
- package/src/modules/bmm/_module-installer/assets/bmm-kb.md +1 -0
- package/src/modules/bmm/_module-installer/assets/technical-decisions-template.md +30 -0
- package/src/modules/bmm/_module-installer/install-menu-config.yaml +49 -0
- package/src/modules/bmm/_module-installer/installer.js +131 -0
- package/src/modules/bmm/_module-installer/platform-specifics/claude-code.js +35 -0
- package/src/modules/bmm/_module-installer/platform-specifics/windsurf.js +32 -0
- package/src/modules/bmm/agents/analyst.md +26 -0
- package/src/modules/bmm/agents/architect.md +29 -0
- package/src/modules/bmm/agents/dev.md +61 -0
- package/src/modules/bmm/agents/game-architect.md +26 -0
- package/src/modules/bmm/agents/game-designer.md +27 -0
- package/src/modules/bmm/agents/game-dev.md +28 -0
- package/src/modules/bmm/agents/pm.md +26 -0
- package/src/modules/bmm/agents/po.md +25 -0
- package/src/modules/bmm/agents/sm.md +29 -0
- package/src/modules/bmm/agents/tea.md +32 -0
- package/src/modules/bmm/agents/ux-expert.md +24 -0
- package/src/modules/bmm/sub-modules/claude-code/config.yaml +5 -0
- package/src/modules/bmm/sub-modules/claude-code/injections.yaml +242 -0
- package/src/modules/bmm/sub-modules/claude-code/readme.md +87 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/api-documenter.md +85 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/codebase-analyzer.md +64 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/data-analyst.md +84 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/dependency-mapper.md +67 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/document-reviewer.md +85 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/epic-optimizer.md +66 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/market-researcher.md +34 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/pattern-detector.md +67 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/requirements-analyst.md +61 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/tech-debt-auditor.md +89 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/technical-decisions-curator.md +146 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/technical-evaluator.md +51 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/test-coverage-analyzer.md +91 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/trend-spotter.md +99 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/user-journey-mapper.md +101 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/user-researcher.md +56 -0
- package/src/modules/bmm/tasks/daily-standup.md +91 -0
- package/src/modules/bmm/tasks/retrospective.md +110 -0
- package/src/modules/bmm/teams/team-all.yaml +7 -0
- package/src/modules/bmm/teams/team-dev.yaml +14 -0
- package/src/modules/bmm/teams/team-gamedev.yaml +9 -0
- package/src/modules/bmm/testarch/atdd.md +40 -0
- package/src/modules/bmm/testarch/automate.md +38 -0
- package/src/modules/bmm/testarch/ci.md +39 -0
- package/src/modules/bmm/testarch/framework.md +41 -0
- package/src/modules/bmm/testarch/nfr-assess.md +38 -0
- package/src/modules/bmm/testarch/risk-profile.md +38 -0
- package/src/modules/bmm/testarch/tea-commands.csv +11 -0
- package/src/modules/bmm/testarch/tea-gate.md +38 -0
- package/src/modules/bmm/testarch/tea-knowledge.md +275 -0
- package/src/modules/bmm/testarch/test-design.md +39 -0
- package/{bmad-core/data → src/modules/bmm/testarch}/test-levels-framework.md +2 -0
- package/{bmad-core/data → src/modules/bmm/testarch}/test-priorities-matrix.md +2 -0
- package/src/modules/bmm/testarch/trace-requirements.md +38 -0
- package/src/modules/bmm/workflows/1-analysis/brainstorm-game/game-brain-methods.csv +26 -0
- package/src/modules/bmm/workflows/1-analysis/brainstorm-game/game-context.md +115 -0
- package/src/modules/bmm/workflows/1-analysis/brainstorm-game/instructions.md +47 -0
- package/src/modules/bmm/workflows/1-analysis/brainstorm-game/workflow.yaml +22 -0
- package/src/modules/bmm/workflows/1-analysis/brainstorm-project/instructions.md +38 -0
- package/src/modules/bmm/workflows/1-analysis/brainstorm-project/project-context.md +25 -0
- package/src/modules/bmm/workflows/1-analysis/brainstorm-project/workflow.yaml +21 -0
- package/src/modules/bmm/workflows/1-analysis/game-brief/README.md +221 -0
- package/src/modules/bmm/workflows/1-analysis/game-brief/checklist.md +128 -0
- package/src/modules/bmm/workflows/1-analysis/game-brief/instructions.md +517 -0
- package/src/modules/bmm/workflows/1-analysis/game-brief/template.md +205 -0
- package/src/modules/bmm/workflows/1-analysis/game-brief/workflow.yaml +34 -0
- package/src/modules/bmm/workflows/1-analysis/product-brief/README.md +180 -0
- package/src/modules/bmm/workflows/1-analysis/product-brief/checklist.md +115 -0
- package/src/modules/bmm/workflows/1-analysis/product-brief/instructions.md +353 -0
- package/src/modules/bmm/workflows/1-analysis/product-brief/template.md +165 -0
- package/src/modules/bmm/workflows/1-analysis/product-brief/workflow.yaml +33 -0
- package/src/modules/bmm/workflows/1-analysis/research/README.md +454 -0
- package/src/modules/bmm/workflows/1-analysis/research/checklist.md +202 -0
- package/src/modules/bmm/workflows/1-analysis/research/claude-code/injections.yaml +114 -0
- package/src/modules/bmm/workflows/1-analysis/research/claude-code/sub-agents/bmm-competitor-analyzer.md +259 -0
- package/src/modules/bmm/workflows/1-analysis/research/claude-code/sub-agents/bmm-data-analyst.md +190 -0
- package/src/modules/bmm/workflows/1-analysis/research/claude-code/sub-agents/bmm-market-researcher.md +337 -0
- package/src/modules/bmm/workflows/1-analysis/research/claude-code/sub-agents/bmm-trend-spotter.md +107 -0
- package/src/modules/bmm/workflows/1-analysis/research/claude-code/sub-agents/bmm-user-researcher.md +329 -0
- package/src/modules/bmm/workflows/1-analysis/research/instructions-deep-prompt.md +370 -0
- package/src/modules/bmm/workflows/1-analysis/research/instructions-market.md +553 -0
- package/src/modules/bmm/workflows/1-analysis/research/instructions-router.md +91 -0
- package/src/modules/bmm/workflows/1-analysis/research/instructions-technical.md +442 -0
- package/src/modules/bmm/workflows/1-analysis/research/template-deep-prompt.md +94 -0
- package/src/modules/bmm/workflows/1-analysis/research/template-market.md +311 -0
- package/src/modules/bmm/workflows/1-analysis/research/template-technical.md +210 -0
- package/src/modules/bmm/workflows/1-analysis/research/workflow.yaml +149 -0
- package/src/modules/bmm/workflows/2-plan/README.md +203 -0
- package/src/modules/bmm/workflows/2-plan/checklist.md +369 -0
- package/src/modules/bmm/workflows/2-plan/gdd/README.md +222 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/action-platformer.md +45 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/adventure.md +84 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/card-game.md +76 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/fighting.md +89 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/horror.md +86 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/idle-incremental.md +78 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/metroidvania.md +87 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/moba.md +74 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/party-game.md +79 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/puzzle.md +58 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/racing.md +88 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/rhythm.md +79 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/roguelike.md +69 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/rpg.md +70 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/sandbox.md +79 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/shooter.md +62 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/simulation.md +73 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/sports.md +75 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/strategy.md +71 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/survival.md +79 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/text-based.md +91 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/tower-defense.md +79 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/turn-based-tactics.md +88 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/visual-novel.md +89 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types.csv +25 -0
- package/src/modules/bmm/workflows/2-plan/gdd/gdd-template.md +159 -0
- package/src/modules/bmm/workflows/2-plan/gdd/instructions-gdd.md +480 -0
- package/src/modules/bmm/workflows/2-plan/instructions-router.md +222 -0
- package/src/modules/bmm/workflows/2-plan/narrative/instructions-narrative.md +517 -0
- package/src/modules/bmm/workflows/2-plan/narrative/narrative-template.md +195 -0
- package/src/modules/bmm/workflows/2-plan/prd/analysis-template.md +53 -0
- package/src/modules/bmm/workflows/2-plan/prd/epics-template.md +18 -0
- package/src/modules/bmm/workflows/2-plan/prd/instructions-lg.md +267 -0
- package/src/modules/bmm/workflows/2-plan/prd/instructions-med.md +251 -0
- package/src/modules/bmm/workflows/2-plan/prd/prd-template.md +73 -0
- package/src/modules/bmm/workflows/2-plan/tech-spec/instructions-sm.md +137 -0
- package/src/modules/bmm/workflows/2-plan/tech-spec/tech-spec-template.md +59 -0
- package/src/modules/bmm/workflows/2-plan/ux/instructions-ux.md +360 -0
- package/src/modules/bmm/workflows/2-plan/ux/ux-spec-template.md +162 -0
- package/src/modules/bmm/workflows/2-plan/workflow.yaml +60 -0
- package/src/modules/bmm/workflows/3-solutioning/ADR-template.md +74 -0
- package/src/modules/bmm/workflows/3-solutioning/README.md +565 -0
- package/src/modules/bmm/workflows/3-solutioning/checklist.md +170 -0
- package/src/modules/bmm/workflows/3-solutioning/instructions.md +661 -0
- package/src/modules/bmm/workflows/3-solutioning/project-types/backend-questions.md +490 -0
- package/src/modules/bmm/workflows/3-solutioning/project-types/cli-questions.md +337 -0
- package/src/modules/bmm/workflows/3-solutioning/project-types/data-questions.md +472 -0
- package/src/modules/bmm/workflows/3-solutioning/project-types/desktop-questions.md +299 -0
- package/src/modules/bmm/workflows/3-solutioning/project-types/embedded-questions.md +118 -0
- package/src/modules/bmm/workflows/3-solutioning/project-types/extension-questions.md +374 -0
- package/src/modules/bmm/workflows/3-solutioning/project-types/game-questions.md +133 -0
- package/src/modules/bmm/workflows/3-solutioning/project-types/infra-questions.md +484 -0
- package/src/modules/bmm/workflows/3-solutioning/project-types/library-questions.md +146 -0
- package/src/modules/bmm/workflows/3-solutioning/project-types/mobile-questions.md +110 -0
- package/src/modules/bmm/workflows/3-solutioning/project-types/project-types.csv +12 -0
- package/src/modules/bmm/workflows/3-solutioning/project-types/web-questions.md +136 -0
- package/src/modules/bmm/workflows/3-solutioning/tech-spec/README.md +195 -0
- package/src/modules/bmm/workflows/3-solutioning/tech-spec/checklist.md +17 -0
- package/src/modules/bmm/workflows/3-solutioning/tech-spec/instructions.md +73 -0
- package/src/modules/bmm/workflows/3-solutioning/tech-spec/template.md +76 -0
- package/src/modules/bmm/workflows/3-solutioning/tech-spec/workflow.yaml +51 -0
- package/src/modules/bmm/workflows/3-solutioning/templates/backend-service-architecture.md +66 -0
- package/src/modules/bmm/workflows/3-solutioning/templates/cli-tool-architecture.md +66 -0
- package/src/modules/bmm/workflows/3-solutioning/templates/data-pipeline-architecture.md +66 -0
- package/src/modules/bmm/workflows/3-solutioning/templates/desktop-app-architecture.md +66 -0
- package/src/modules/bmm/workflows/3-solutioning/templates/embedded-firmware-architecture.md +66 -0
- package/src/modules/bmm/workflows/3-solutioning/templates/game-engine-architecture.md +244 -0
- package/src/modules/bmm/workflows/3-solutioning/templates/game-engine-godot-guide.md +428 -0
- package/src/modules/bmm/workflows/3-solutioning/templates/game-engine-unity-guide.md +333 -0
- package/src/modules/bmm/workflows/3-solutioning/templates/game-engine-web-guide.md +528 -0
- package/src/modules/bmm/workflows/3-solutioning/templates/infrastructure-architecture.md +66 -0
- package/src/modules/bmm/workflows/3-solutioning/templates/library-package-architecture.md +66 -0
- package/src/modules/bmm/workflows/3-solutioning/templates/mobile-app-architecture.md +66 -0
- package/src/modules/bmm/workflows/3-solutioning/templates/registry.csv +172 -0
- package/src/modules/bmm/workflows/3-solutioning/templates/web-api-architecture.md +66 -0
- package/src/modules/bmm/workflows/3-solutioning/templates/web-fullstack-architecture.md +277 -0
- package/src/modules/bmm/workflows/3-solutioning/workflow.yaml +65 -0
- package/src/modules/bmm/workflows/4-implementation/correct-course/checklist.md +279 -0
- package/src/modules/bmm/workflows/4-implementation/correct-course/instructions.md +190 -0
- package/src/modules/bmm/workflows/4-implementation/correct-course/workflow.yaml +35 -0
- package/src/modules/bmm/workflows/4-implementation/create-story/README.md +42 -0
- package/src/modules/bmm/workflows/4-implementation/create-story/checklist.md +39 -0
- package/src/modules/bmm/workflows/4-implementation/create-story/instructions.md +81 -0
- package/src/modules/bmm/workflows/4-implementation/create-story/template.md +57 -0
- package/src/modules/bmm/workflows/4-implementation/create-story/workflow.yaml +72 -0
- package/src/modules/bmm/workflows/4-implementation/dev-story/README.md +84 -0
- package/src/modules/bmm/workflows/4-implementation/dev-story/checklist.md +38 -0
- package/src/modules/bmm/workflows/4-implementation/dev-story/instructions.md +87 -0
- package/src/modules/bmm/workflows/4-implementation/dev-story/workflow.yaml +53 -0
- package/src/modules/bmm/workflows/4-implementation/retrospective/instructions.md +391 -0
- package/src/modules/bmm/workflows/4-implementation/retrospective/workflow.yaml +41 -0
- package/src/modules/bmm/workflows/4-implementation/review-story/README.md +72 -0
- package/src/modules/bmm/workflows/4-implementation/review-story/backlog_template.md +12 -0
- package/src/modules/bmm/workflows/4-implementation/review-story/checklist.md +22 -0
- package/src/modules/bmm/workflows/4-implementation/review-story/instructions.md +176 -0
- package/src/modules/bmm/workflows/4-implementation/review-story/workflow.yaml +99 -0
- package/src/modules/bmm/workflows/4-implementation/story-context/README.md +234 -0
- package/src/modules/bmm/workflows/4-implementation/story-context/checklist.md +16 -0
- package/src/modules/bmm/workflows/4-implementation/story-context/context-template.xml +34 -0
- package/src/modules/bmm/workflows/4-implementation/story-context/instructions.md +76 -0
- package/src/modules/bmm/workflows/4-implementation/story-context/workflow.yaml +56 -0
- package/src/modules/cis/_module-installer/install-menu-config.yaml +14 -0
- package/src/modules/cis/_module-installer/installer.js +92 -0
- package/src/modules/cis/agents/README.md +104 -0
- package/src/modules/cis/agents/brainstorming-coach.md +24 -0
- package/src/modules/cis/agents/creative-problem-solver.md +24 -0
- package/src/modules/cis/agents/design-thinking-coach.md +24 -0
- package/src/modules/cis/agents/innovation-strategist.md +24 -0
- package/src/modules/cis/agents/storyteller.md +24 -0
- package/src/modules/cis/readme.md +86 -0
- package/src/modules/cis/teams/creative-squad.yaml +6 -0
- package/src/modules/cis/workflows/README.md +67 -0
- package/src/modules/cis/workflows/brainstorming/README.md +271 -0
- package/src/modules/cis/workflows/brainstorming/brain-methods.csv +36 -0
- package/src/modules/cis/workflows/brainstorming/instructions.md +310 -0
- package/src/modules/cis/workflows/brainstorming/template.md +102 -0
- package/src/modules/cis/workflows/brainstorming/workflow.yaml +30 -0
- package/src/modules/cis/workflows/design-thinking/README.md +56 -0
- package/src/modules/cis/workflows/design-thinking/design-methods.csv +31 -0
- package/src/modules/cis/workflows/design-thinking/instructions.md +200 -0
- package/src/modules/cis/workflows/design-thinking/template.md +111 -0
- package/src/modules/cis/workflows/design-thinking/workflow.yaml +29 -0
- package/src/modules/cis/workflows/innovation-strategy/README.md +56 -0
- package/src/modules/cis/workflows/innovation-strategy/innovation-frameworks.csv +31 -0
- package/src/modules/cis/workflows/innovation-strategy/instructions.md +274 -0
- package/src/modules/cis/workflows/innovation-strategy/template.md +189 -0
- package/src/modules/cis/workflows/innovation-strategy/workflow.yaml +29 -0
- package/src/modules/cis/workflows/problem-solving/README.md +56 -0
- package/src/modules/cis/workflows/problem-solving/instructions.md +250 -0
- package/src/modules/cis/workflows/problem-solving/solving-methods.csv +31 -0
- package/src/modules/cis/workflows/problem-solving/template.md +165 -0
- package/src/modules/cis/workflows/problem-solving/workflow.yaml +29 -0
- package/src/modules/cis/workflows/storytelling/README.md +58 -0
- package/src/modules/cis/workflows/storytelling/instructions.md +275 -0
- package/src/modules/cis/workflows/storytelling/story-types.csv +26 -0
- package/src/modules/cis/workflows/storytelling/template.md +113 -0
- package/src/modules/cis/workflows/storytelling/workflow.yaml +29 -0
- package/src/utility/models/agent-activation-ide.xml +51 -0
- package/src/utility/models/agent-config-template.md +23 -0
- package/tools/cli/bmad-cli.js +42 -0
- package/tools/cli/bundlers/bundle-web.js +157 -0
- package/tools/cli/bundlers/test-analyst.js +28 -0
- package/tools/cli/bundlers/test-bundler.js +118 -0
- package/tools/cli/bundlers/web-bundler.js +880 -0
- package/tools/cli/commands/install.js +41 -0
- package/tools/cli/commands/list.js +28 -0
- package/tools/cli/commands/status.js +47 -0
- package/tools/cli/commands/uninstall.js +44 -0
- package/tools/cli/commands/update.js +28 -0
- package/tools/cli/installers/lib/core/config-collector.js +383 -0
- package/tools/cli/installers/lib/core/dependency-resolver.js +721 -0
- package/tools/cli/installers/lib/core/detector.js +208 -0
- package/tools/cli/installers/lib/core/installer.js +1070 -0
- package/tools/cli/installers/lib/core/manifest-generator.js +385 -0
- package/tools/cli/installers/lib/core/manifest.js +484 -0
- package/tools/cli/installers/lib/ide/_base-ide.js +281 -0
- package/tools/cli/installers/lib/ide/auggie.js +271 -0
- package/tools/cli/installers/lib/ide/claude-code.js +625 -0
- package/tools/cli/installers/lib/ide/cline.js +301 -0
- package/tools/cli/installers/lib/ide/codex.js +267 -0
- package/tools/cli/installers/lib/ide/crush.js +204 -0
- package/tools/cli/installers/lib/ide/cursor.js +224 -0
- package/tools/cli/installers/lib/ide/gemini.js +160 -0
- package/tools/cli/installers/lib/ide/github-copilot.js +289 -0
- package/tools/cli/installers/lib/ide/iflow.js +142 -0
- package/tools/cli/installers/lib/ide/kilo.js +171 -0
- package/tools/cli/installers/lib/ide/manager.js +203 -0
- package/tools/cli/installers/lib/ide/qwen.js +188 -0
- package/tools/cli/installers/lib/ide/roo.js +288 -0
- package/tools/cli/installers/lib/ide/trae.js +182 -0
- package/tools/cli/installers/lib/ide/windsurf.js +149 -0
- package/tools/cli/installers/lib/ide/workflow-command-generator.js +162 -0
- package/tools/cli/installers/lib/ide/workflow-command-template.md +11 -0
- package/tools/cli/installers/lib/modules/manager.js +452 -0
- package/tools/cli/lib/agent-party-generator.js +206 -0
- package/tools/cli/lib/cli-utils.js +208 -0
- package/tools/cli/lib/config.js +210 -0
- package/tools/cli/lib/file-ops.js +204 -0
- package/tools/cli/lib/platform-codes.js +116 -0
- package/tools/cli/lib/project-root.js +71 -0
- package/tools/cli/lib/replace-project-root.js +239 -0
- package/tools/cli/lib/ui.js +516 -0
- package/tools/cli/lib/xml-handler.js +183 -0
- package/tools/cli/lib/xml-to-markdown.js +82 -0
- package/tools/{yaml-format.js → cli/lib/yaml-format.js} +3 -10
- package/tools/cli/regenerate-manifests.js +28 -0
- package/tools/flattener/ignoreRules.js +2 -6
- package/tools/flattener/main.js +31 -121
- package/tools/flattener/projectRoot.js +3 -8
- package/tools/flattener/stats.helpers.js +8 -35
- package/tools/flattener/stats.js +1 -6
- package/tools/flattener/test-matrix.js +1 -5
- package/tools/platform-codes.yaml +127 -0
- package/tools/test-agents/captain-kirk-commander.md +110 -0
- package/tools/test-agents/data-operations-android.md +123 -0
- package/tools/test-agents/geordi-chief-engineer.md +135 -0
- package/tools/test-agents/isabella-martinez-ethicist.md +109 -0
- package/tools/test-agents/marcus-thompson-security.md +109 -0
- package/tools/test-agents/maya-patel-pragmatist.md +82 -0
- package/tools/test-agents/picard-diplomat-captain.md +134 -0
- package/tools/test-agents/spock-science-officer.md +124 -0
- package/tools/test-agents/william-smithers-technocrat.md +71 -0
- package/tools/test-agents/zara-chen-designer.md +94 -0
- package/tools/validate-bundles.js +87 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +0 -22
- package/README.md +0 -221
- package/bmad-core/agent-teams/team-all.yaml +0 -14
- package/bmad-core/agent-teams/team-fullstack.yaml +0 -18
- package/bmad-core/agent-teams/team-ide-minimal.yaml +0 -10
- package/bmad-core/agent-teams/team-no-ui.yaml +0 -13
- package/bmad-core/agents/analyst.md +0 -81
- package/bmad-core/agents/architect.md +0 -83
- package/bmad-core/agents/bmad-master.md +0 -107
- package/bmad-core/agents/bmad-orchestrator.md +0 -149
- package/bmad-core/agents/dev.md +0 -75
- package/bmad-core/agents/pm.md +0 -81
- package/bmad-core/agents/po.md +0 -76
- package/bmad-core/agents/qa.md +0 -88
- package/bmad-core/agents/sm.md +0 -62
- package/bmad-core/agents/ux-expert.md +0 -66
- package/bmad-core/checklists/architect-checklist.md +0 -438
- package/bmad-core/checklists/change-checklist.md +0 -182
- package/bmad-core/checklists/pm-checklist.md +0 -370
- package/bmad-core/checklists/po-master-checklist.md +0 -432
- package/bmad-core/checklists/story-dod-checklist.md +0 -94
- package/bmad-core/checklists/story-draft-checklist.md +0 -153
- package/bmad-core/core-config.yaml +0 -20
- package/bmad-core/data/bmad-kb.md +0 -806
- package/bmad-core/data/brainstorming-techniques.md +0 -36
- package/bmad-core/data/elicitation-methods.md +0 -154
- package/bmad-core/data/technical-preferences.md +0 -3
- package/bmad-core/tasks/advanced-elicitation.md +0 -117
- package/bmad-core/tasks/brownfield-create-epic.md +0 -160
- package/bmad-core/tasks/brownfield-create-story.md +0 -147
- package/bmad-core/tasks/correct-course.md +0 -70
- package/bmad-core/tasks/create-brownfield-story.md +0 -312
- package/bmad-core/tasks/create-deep-research-prompt.md +0 -278
- package/bmad-core/tasks/create-next-story.md +0 -112
- package/bmad-core/tasks/document-project.md +0 -343
- package/bmad-core/tasks/facilitate-brainstorming-session.md +0 -136
- package/bmad-core/tasks/generate-ai-frontend-prompt.md +0 -51
- package/bmad-core/tasks/index-docs.md +0 -173
- package/bmad-core/tasks/kb-mode-interaction.md +0 -75
- package/bmad-core/tasks/nfr-assess.md +0 -343
- package/bmad-core/tasks/qa-gate.md +0 -159
- package/bmad-core/tasks/review-story.md +0 -314
- package/bmad-core/tasks/risk-profile.md +0 -353
- package/bmad-core/tasks/shard-doc.md +0 -185
- package/bmad-core/tasks/test-design.md +0 -174
- package/bmad-core/tasks/trace-requirements.md +0 -264
- package/bmad-core/tasks/validate-next-story.md +0 -134
- package/bmad-core/templates/architecture-tmpl.yaml +0 -650
- package/bmad-core/templates/brainstorming-output-tmpl.yaml +0 -156
- package/bmad-core/templates/brownfield-architecture-tmpl.yaml +0 -476
- package/bmad-core/templates/brownfield-prd-tmpl.yaml +0 -280
- package/bmad-core/templates/competitor-analysis-tmpl.yaml +0 -306
- package/bmad-core/templates/front-end-architecture-tmpl.yaml +0 -218
- package/bmad-core/templates/front-end-spec-tmpl.yaml +0 -349
- package/bmad-core/templates/fullstack-architecture-tmpl.yaml +0 -823
- package/bmad-core/templates/market-research-tmpl.yaml +0 -252
- package/bmad-core/templates/prd-tmpl.yaml +0 -202
- package/bmad-core/templates/project-brief-tmpl.yaml +0 -221
- package/bmad-core/templates/qa-gate-tmpl.yaml +0 -102
- package/bmad-core/templates/story-tmpl.yaml +0 -137
- package/bmad-core/workflows/brownfield-fullstack.yaml +0 -297
- package/bmad-core/workflows/brownfield-service.yaml +0 -187
- package/bmad-core/workflows/brownfield-ui.yaml +0 -197
- package/bmad-core/workflows/greenfield-fullstack.yaml +0 -240
- package/bmad-core/workflows/greenfield-service.yaml +0 -206
- package/bmad-core/workflows/greenfield-ui.yaml +0 -235
- package/common/tasks/create-doc.md +0 -101
- package/common/tasks/execute-checklist.md +0 -86
- package/common/utils/bmad-doc-template.md +0 -325
- package/common/utils/workflow-management.md +0 -69
- package/dist/agents/analyst.txt +0 -2889
- package/dist/agents/architect.txt +0 -3552
- package/dist/agents/bmad-master.txt +0 -8769
- package/dist/agents/bmad-orchestrator.txt +0 -1513
- package/dist/agents/dev.txt +0 -414
- package/dist/agents/pm.txt +0 -2204
- package/dist/agents/po.txt +0 -1346
- package/dist/agents/qa.txt +0 -1987
- package/dist/agents/sm.txt +0 -658
- package/dist/agents/ux-expert.txt +0 -694
- package/dist/expansion-packs/bmad-2d-phaser-game-dev/agents/game-designer.txt +0 -2371
- package/dist/expansion-packs/bmad-2d-phaser-game-dev/agents/game-developer.txt +0 -1620
- package/dist/expansion-packs/bmad-2d-phaser-game-dev/agents/game-sm.txt +0 -815
- package/dist/expansion-packs/bmad-2d-phaser-game-dev/teams/phaser-2d-nodejs-game-team.txt +0 -10952
- package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-architect.txt +0 -4012
- package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-designer.txt +0 -3698
- package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-developer.txt +0 -450
- package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-sm.txt +0 -973
- package/dist/expansion-packs/bmad-2d-unity-game-dev/teams/unity-2d-game-team.txt +0 -15376
- package/dist/expansion-packs/bmad-infrastructure-devops/agents/infra-devops-platform.txt +0 -2075
- package/dist/teams/team-all.txt +0 -12682
- package/dist/teams/team-fullstack.txt +0 -10421
- package/dist/teams/team-ide-minimal.txt +0 -5103
- package/dist/teams/team-no-ui.txt +0 -8980
- package/docs/GUIDING-PRINCIPLES.md +0 -91
- package/docs/core-architecture.md +0 -219
- package/docs/enhanced-ide-development-workflow.md +0 -248
- package/docs/expansion-packs.md +0 -280
- package/docs/how-to-contribute-with-pull-requests.md +0 -158
- package/docs/user-guide.md +0 -504
- package/docs/versioning-and-releases.md +0 -147
- package/docs/versions.md +0 -48
- package/docs/working-in-the-brownfield.md +0 -597
- package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/Complete AI Agent System - Flowchart.svg +0 -102
- package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/PART 1 - Google Cloud Vertex AI Setup Documentation/1.1 Google Cloud Project Setup/1.1.1 - Initial Project Configuration - bash copy.txt +0 -13
- package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/PART 1 - Google Cloud Vertex AI Setup Documentation/1.1 Google Cloud Project Setup/1.1.1 - Initial Project Configuration - bash.txt +0 -13
- package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/PART 1 - Google Cloud Vertex AI Setup Documentation/1.2 Agent Development Kit Installation/1.2.2 - Basic Project Structure - txt.txt +0 -25
- package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/PART 1 - Google Cloud Vertex AI Setup Documentation/1.3 Core Configuration Files/1.3.1 - settings.py +0 -34
- package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/PART 1 - Google Cloud Vertex AI Setup Documentation/1.3 Core Configuration Files/1.3.2 - main.py - Base Application.py +0 -70
- package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/PART 1 - Google Cloud Vertex AI Setup Documentation/1.4 Deployment Configuration/1.4.2 - cloudbuild.yaml +0 -26
- package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/README.md +0 -109
- package/expansion-packs/README.md +0 -3
- package/expansion-packs/bmad-2d-phaser-game-dev/agent-teams/phaser-2d-nodejs-game-team.yaml +0 -13
- package/expansion-packs/bmad-2d-phaser-game-dev/agents/game-designer.md +0 -71
- package/expansion-packs/bmad-2d-phaser-game-dev/agents/game-developer.md +0 -78
- package/expansion-packs/bmad-2d-phaser-game-dev/agents/game-sm.md +0 -64
- package/expansion-packs/bmad-2d-phaser-game-dev/checklists/game-design-checklist.md +0 -201
- package/expansion-packs/bmad-2d-phaser-game-dev/checklists/game-story-dod-checklist.md +0 -160
- package/expansion-packs/bmad-2d-phaser-game-dev/config.yaml +0 -8
- package/expansion-packs/bmad-2d-phaser-game-dev/data/bmad-kb.md +0 -250
- package/expansion-packs/bmad-2d-phaser-game-dev/data/development-guidelines.md +0 -647
- package/expansion-packs/bmad-2d-phaser-game-dev/tasks/advanced-elicitation.md +0 -110
- package/expansion-packs/bmad-2d-phaser-game-dev/tasks/create-game-story.md +0 -216
- package/expansion-packs/bmad-2d-phaser-game-dev/tasks/game-design-brainstorming.md +0 -290
- package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-architecture-tmpl.yaml +0 -613
- package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-brief-tmpl.yaml +0 -356
- package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-design-doc-tmpl.yaml +0 -343
- package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-story-tmpl.yaml +0 -253
- package/expansion-packs/bmad-2d-phaser-game-dev/templates/level-design-doc-tmpl.yaml +0 -484
- package/expansion-packs/bmad-2d-phaser-game-dev/workflows/game-dev-greenfield.yaml +0 -183
- package/expansion-packs/bmad-2d-phaser-game-dev/workflows/game-prototype.yaml +0 -175
- package/expansion-packs/bmad-2d-unity-game-dev/agent-teams/unity-2d-game-team.yaml +0 -14
- package/expansion-packs/bmad-2d-unity-game-dev/agents/game-architect.md +0 -80
- package/expansion-packs/bmad-2d-unity-game-dev/agents/game-designer.md +0 -77
- package/expansion-packs/bmad-2d-unity-game-dev/agents/game-developer.md +0 -78
- package/expansion-packs/bmad-2d-unity-game-dev/agents/game-sm.md +0 -65
- package/expansion-packs/bmad-2d-unity-game-dev/checklists/game-architect-checklist.md +0 -391
- package/expansion-packs/bmad-2d-unity-game-dev/checklists/game-change-checklist.md +0 -203
- package/expansion-packs/bmad-2d-unity-game-dev/checklists/game-design-checklist.md +0 -201
- package/expansion-packs/bmad-2d-unity-game-dev/checklists/game-story-dod-checklist.md +0 -124
- package/expansion-packs/bmad-2d-unity-game-dev/config.yaml +0 -6
- package/expansion-packs/bmad-2d-unity-game-dev/data/bmad-kb.md +0 -769
- package/expansion-packs/bmad-2d-unity-game-dev/data/development-guidelines.md +0 -586
- package/expansion-packs/bmad-2d-unity-game-dev/tasks/advanced-elicitation.md +0 -110
- package/expansion-packs/bmad-2d-unity-game-dev/tasks/correct-course-game.md +0 -141
- package/expansion-packs/bmad-2d-unity-game-dev/tasks/create-game-story.md +0 -184
- package/expansion-packs/bmad-2d-unity-game-dev/tasks/game-design-brainstorming.md +0 -290
- package/expansion-packs/bmad-2d-unity-game-dev/tasks/validate-game-story.md +0 -200
- package/expansion-packs/bmad-2d-unity-game-dev/templates/game-architecture-tmpl.yaml +0 -1030
- package/expansion-packs/bmad-2d-unity-game-dev/templates/game-brief-tmpl.yaml +0 -356
- package/expansion-packs/bmad-2d-unity-game-dev/templates/game-design-doc-tmpl.yaml +0 -705
- package/expansion-packs/bmad-2d-unity-game-dev/templates/game-story-tmpl.yaml +0 -256
- package/expansion-packs/bmad-2d-unity-game-dev/templates/level-design-doc-tmpl.yaml +0 -484
- package/expansion-packs/bmad-2d-unity-game-dev/workflows/game-dev-greenfield.yaml +0 -183
- package/expansion-packs/bmad-2d-unity-game-dev/workflows/game-prototype.yaml +0 -175
- package/expansion-packs/bmad-infrastructure-devops/README.md +0 -147
- package/expansion-packs/bmad-infrastructure-devops/agents/infra-devops-platform.md +0 -71
- package/expansion-packs/bmad-infrastructure-devops/checklists/infrastructure-checklist.md +0 -484
- package/expansion-packs/bmad-infrastructure-devops/config.yaml +0 -9
- package/expansion-packs/bmad-infrastructure-devops/data/bmad-kb.md +0 -305
- package/expansion-packs/bmad-infrastructure-devops/tasks/review-infrastructure.md +0 -159
- package/expansion-packs/bmad-infrastructure-devops/tasks/validate-infrastructure.md +0 -153
- package/expansion-packs/bmad-infrastructure-devops/templates/infrastructure-architecture-tmpl.yaml +0 -424
- package/expansion-packs/bmad-infrastructure-devops/templates/infrastructure-platform-from-arch-tmpl.yaml +0 -629
- package/release_notes.md +0 -32
- package/tools/bmad-npx-wrapper.js +0 -39
- package/tools/builders/web-builder.js +0 -675
- package/tools/bump-all-versions.js +0 -115
- package/tools/bump-expansion-version.js +0 -90
- package/tools/cli.js +0 -152
- package/tools/installer/README.md +0 -8
- package/tools/installer/bin/bmad.js +0 -585
- package/tools/installer/config/ide-agent-config.yaml +0 -58
- package/tools/installer/config/install.config.yaml +0 -123
- package/tools/installer/lib/config-loader.js +0 -257
- package/tools/installer/lib/file-manager.js +0 -389
- package/tools/installer/lib/ide-base-setup.js +0 -228
- package/tools/installer/lib/ide-setup.js +0 -1441
- package/tools/installer/lib/installer.js +0 -1995
- package/tools/installer/lib/memory-profiler.js +0 -225
- package/tools/installer/lib/module-manager.js +0 -114
- package/tools/installer/lib/resource-locator.js +0 -308
- package/tools/installer/package.json +0 -44
- package/tools/lib/dependency-resolver.js +0 -175
- package/tools/lib/yaml-utils.js +0 -29
- package/tools/md-assets/web-agent-startup-instructions.md +0 -39
- package/tools/preview-release-notes.js +0 -66
- package/tools/shared/bannerArt.js +0 -105
- package/tools/sync-installer-version.js +0 -32
- package/tools/update-expansion-version.js +0 -53
- package/tools/upgraders/v3-to-v4-upgrader.js +0 -672
- package/tools/version-bump.js +0 -94
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
const fs = require('node:fs');
|
|
2
|
+
const path = require('node:path');
|
|
3
|
+
|
|
4
|
+
function convertXmlToMarkdown(xmlFilePath) {
|
|
5
|
+
if (!xmlFilePath.endsWith('.xml')) {
|
|
6
|
+
throw new Error('Input file must be an XML file');
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
const xmlContent = fs.readFileSync(xmlFilePath, 'utf8');
|
|
10
|
+
|
|
11
|
+
const basename = path.basename(xmlFilePath, '.xml');
|
|
12
|
+
const dirname = path.dirname(xmlFilePath);
|
|
13
|
+
const mdFilePath = path.join(dirname, `${basename}.md`);
|
|
14
|
+
|
|
15
|
+
// Extract version and name/title from root element attributes
|
|
16
|
+
let title = basename;
|
|
17
|
+
let version = '';
|
|
18
|
+
|
|
19
|
+
// Match the root element and its attributes
|
|
20
|
+
const rootMatch = xmlContent.match(
|
|
21
|
+
/<[^>\s]+[^>]*?\sv="([^"]+)"[^>]*?(?:\sname="([^"]+)")?|<[^>\s]+[^>]*?(?:\sname="([^"]+)")?[^>]*?\sv="([^"]+)"/,
|
|
22
|
+
);
|
|
23
|
+
|
|
24
|
+
if (rootMatch) {
|
|
25
|
+
// Handle both v="x" name="y" and name="y" v="x" orders
|
|
26
|
+
version = rootMatch[1] || rootMatch[4] || '';
|
|
27
|
+
const nameAttr = rootMatch[2] || rootMatch[3] || '';
|
|
28
|
+
|
|
29
|
+
if (nameAttr) {
|
|
30
|
+
title = nameAttr;
|
|
31
|
+
} else {
|
|
32
|
+
// Try to find name in a <name> element if not in attributes
|
|
33
|
+
const nameElementMatch = xmlContent.match(/<name>([^<]+)<\/name>/);
|
|
34
|
+
if (nameElementMatch) {
|
|
35
|
+
title = nameElementMatch[1];
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const heading = version ? `# ${title} v${version}` : `# ${title}`;
|
|
41
|
+
|
|
42
|
+
const markdownContent = `${heading}
|
|
43
|
+
|
|
44
|
+
\`\`\`xml
|
|
45
|
+
${xmlContent}
|
|
46
|
+
\`\`\`
|
|
47
|
+
`;
|
|
48
|
+
|
|
49
|
+
fs.writeFileSync(mdFilePath, markdownContent, 'utf8');
|
|
50
|
+
|
|
51
|
+
return mdFilePath;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function main() {
|
|
55
|
+
const args = process.argv.slice(2);
|
|
56
|
+
|
|
57
|
+
if (args.length === 0) {
|
|
58
|
+
console.error('Usage: node xml-to-markdown.js <xml-file-path>');
|
|
59
|
+
process.exit(1);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const xmlFilePath = path.resolve(args[0]);
|
|
63
|
+
|
|
64
|
+
if (!fs.existsSync(xmlFilePath)) {
|
|
65
|
+
console.error(`Error: File not found: ${xmlFilePath}`);
|
|
66
|
+
process.exit(1);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
try {
|
|
70
|
+
const mdFilePath = convertXmlToMarkdown(xmlFilePath);
|
|
71
|
+
console.log(`Successfully converted: ${xmlFilePath} -> ${mdFilePath}`);
|
|
72
|
+
} catch (error) {
|
|
73
|
+
console.error(`Error converting file: ${error.message}`);
|
|
74
|
+
process.exit(1);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
if (require.main === module) {
|
|
79
|
+
main();
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
module.exports = { convertXmlToMarkdown };
|
|
@@ -40,16 +40,11 @@ async function formatYamlContent(content, filename) {
|
|
|
40
40
|
// If the content contains special YAML characters or looks complex, quote it
|
|
41
41
|
// BUT skip if it looks like a proper YAML key-value pair (like "key: value")
|
|
42
42
|
if (
|
|
43
|
-
(content.includes(':') ||
|
|
44
|
-
content.includes('-') ||
|
|
45
|
-
content.includes('{') ||
|
|
46
|
-
content.includes('}')) &&
|
|
43
|
+
(content.includes(':') || content.includes('-') || content.includes('{') || content.includes('}')) &&
|
|
47
44
|
!/^\w+:\s/.test(content)
|
|
48
45
|
) {
|
|
49
46
|
// Remove any existing quotes first, escape internal quotes, then add proper quotes
|
|
50
|
-
const cleanContent = content
|
|
51
|
-
.replaceAll(/^["']|["']$/g, '')
|
|
52
|
-
.replaceAll('"', String.raw`\"`);
|
|
47
|
+
const cleanContent = content.replaceAll(/^["']|["']$/g, '').replaceAll('"', String.raw`\"`);
|
|
53
48
|
return `${indent}- "${cleanContent}"`;
|
|
54
49
|
}
|
|
55
50
|
return match;
|
|
@@ -231,9 +226,7 @@ async function main() {
|
|
|
231
226
|
}
|
|
232
227
|
|
|
233
228
|
if (hasChanges) {
|
|
234
|
-
console.log(
|
|
235
|
-
chalk.green(`\n✨ YAML formatting completed! Modified ${filesProcessed.length} files:`),
|
|
236
|
-
);
|
|
229
|
+
console.log(chalk.green(`\n✨ YAML formatting completed! Modified ${filesProcessed.length} files:`));
|
|
237
230
|
for (const file of filesProcessed) console.log(chalk.blue(` 📝 ${file}`));
|
|
238
231
|
}
|
|
239
232
|
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
const path = require('node:path');
|
|
2
|
+
const { ManifestGenerator } = require('./installers/lib/core/manifest-generator');
|
|
3
|
+
|
|
4
|
+
async function regenerateManifests() {
|
|
5
|
+
const generator = new ManifestGenerator();
|
|
6
|
+
const targetDir = process.argv[2] || 'z1';
|
|
7
|
+
const bmadDir = path.join(process.cwd(), targetDir, 'bmad');
|
|
8
|
+
|
|
9
|
+
// List of modules to include in manifests
|
|
10
|
+
const selectedModules = ['bmb', 'bmm', 'cis'];
|
|
11
|
+
|
|
12
|
+
console.log('Regenerating manifests with relative paths...');
|
|
13
|
+
console.log('Target directory:', bmadDir);
|
|
14
|
+
|
|
15
|
+
try {
|
|
16
|
+
const result = await generator.generateManifests(bmadDir, selectedModules);
|
|
17
|
+
console.log('✓ Manifests generated successfully:');
|
|
18
|
+
console.log(` - ${result.workflows} workflows`);
|
|
19
|
+
console.log(` - ${result.agents} agents`);
|
|
20
|
+
console.log(` - ${result.tasks} tasks`);
|
|
21
|
+
console.log(` - ${result.files} files in files-manifest.csv`);
|
|
22
|
+
} catch (error) {
|
|
23
|
+
console.error('Error generating manifests:', error);
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
regenerateManifests();
|
|
@@ -6,7 +6,7 @@ const ignore = require('ignore');
|
|
|
6
6
|
// These complement .gitignore and are applied regardless of VCS presence.
|
|
7
7
|
const DEFAULT_PATTERNS = [
|
|
8
8
|
// Project/VCS
|
|
9
|
-
'**/.bmad-
|
|
9
|
+
'**/.bmad-method/**',
|
|
10
10
|
'**/.git/**',
|
|
11
11
|
'**/.svn/**',
|
|
12
12
|
'**/.hg/**',
|
|
@@ -154,11 +154,7 @@ async function parseGitignore(gitignorePath) {
|
|
|
154
154
|
async function loadIgnore(rootDir, extraPatterns = []) {
|
|
155
155
|
const ig = ignore();
|
|
156
156
|
const gitignorePath = path.join(rootDir, '.gitignore');
|
|
157
|
-
const patterns = [
|
|
158
|
-
...(await readIgnoreFile(gitignorePath)),
|
|
159
|
-
...DEFAULT_PATTERNS,
|
|
160
|
-
...extraPatterns,
|
|
161
|
-
];
|
|
157
|
+
const patterns = [...(await readIgnoreFile(gitignorePath)), ...DEFAULT_PATTERNS, ...extraPatterns];
|
|
162
158
|
// De-duplicate
|
|
163
159
|
const unique = [...new Set(patterns.map(String))];
|
|
164
160
|
ig.add(unique);
|
package/tools/flattener/main.js
CHANGED
|
@@ -78,19 +78,13 @@ program
|
|
|
78
78
|
|
|
79
79
|
// Detect if user explicitly provided -i/--input or -o/--output
|
|
80
80
|
const argv = process.argv.slice(2);
|
|
81
|
-
const userSpecifiedInput = argv.some(
|
|
82
|
-
|
|
83
|
-
);
|
|
84
|
-
const userSpecifiedOutput = argv.some(
|
|
85
|
-
(a) => a === '-o' || a === '--output' || a.startsWith('--output='),
|
|
86
|
-
);
|
|
81
|
+
const userSpecifiedInput = argv.some((a) => a === '-i' || a === '--input' || a.startsWith('--input='));
|
|
82
|
+
const userSpecifiedOutput = argv.some((a) => a === '-o' || a === '--output' || a.startsWith('--output='));
|
|
87
83
|
const noPathArguments = !userSpecifiedInput && !userSpecifiedOutput;
|
|
88
84
|
|
|
89
85
|
if (noPathArguments) {
|
|
90
86
|
const detectedRoot = await findProjectRoot(process.cwd());
|
|
91
|
-
const suggestedOutput = detectedRoot
|
|
92
|
-
? path.join(detectedRoot, 'flattened-codebase.xml')
|
|
93
|
-
: path.resolve('flattened-codebase.xml');
|
|
87
|
+
const suggestedOutput = detectedRoot ? path.join(detectedRoot, 'flattened-codebase.xml') : path.resolve('flattened-codebase.xml');
|
|
94
88
|
|
|
95
89
|
if (detectedRoot) {
|
|
96
90
|
const useDefaults = await promptYesNo(
|
|
@@ -102,24 +96,13 @@ program
|
|
|
102
96
|
outputPath = suggestedOutput;
|
|
103
97
|
} else {
|
|
104
98
|
inputDir = await promptPath('Enter input directory path', process.cwd());
|
|
105
|
-
outputPath = await promptPath(
|
|
106
|
-
'Enter output file path',
|
|
107
|
-
path.join(inputDir, 'flattened-codebase.xml'),
|
|
108
|
-
);
|
|
99
|
+
outputPath = await promptPath('Enter output file path', path.join(inputDir, 'flattened-codebase.xml'));
|
|
109
100
|
}
|
|
110
101
|
} else {
|
|
111
102
|
console.log('Could not auto-detect a project root.');
|
|
112
103
|
inputDir = await promptPath('Enter input directory path', process.cwd());
|
|
113
|
-
outputPath = await promptPath(
|
|
114
|
-
'Enter output file path',
|
|
115
|
-
path.join(inputDir, 'flattened-codebase.xml'),
|
|
116
|
-
);
|
|
104
|
+
outputPath = await promptPath('Enter output file path', path.join(inputDir, 'flattened-codebase.xml'));
|
|
117
105
|
}
|
|
118
|
-
} else {
|
|
119
|
-
console.error(
|
|
120
|
-
'Could not auto-detect a project root and no arguments were provided. Please specify -i/--input and -o/--output.',
|
|
121
|
-
);
|
|
122
|
-
process.exit(1);
|
|
123
106
|
}
|
|
124
107
|
|
|
125
108
|
// Ensure output directory exists
|
|
@@ -144,14 +127,8 @@ program
|
|
|
144
127
|
// Process files with progress tracking
|
|
145
128
|
console.log('Reading file contents');
|
|
146
129
|
const processingSpinner = ora('📄 Processing files...').start();
|
|
147
|
-
const aggregatedContent = await aggregateFileContents(
|
|
148
|
-
|
|
149
|
-
inputDir,
|
|
150
|
-
processingSpinner,
|
|
151
|
-
);
|
|
152
|
-
processingSpinner.succeed(
|
|
153
|
-
`✅ Processed ${aggregatedContent.processedFiles}/${filteredFiles.length} files`,
|
|
154
|
-
);
|
|
130
|
+
const aggregatedContent = await aggregateFileContents(filteredFiles, inputDir, processingSpinner);
|
|
131
|
+
processingSpinner.succeed(`✅ Processed ${aggregatedContent.processedFiles}/${filteredFiles.length} files`);
|
|
155
132
|
if (aggregatedContent.errors.length > 0) {
|
|
156
133
|
console.log(`Errors: ${aggregatedContent.errors.length}`);
|
|
157
134
|
}
|
|
@@ -167,23 +144,16 @@ program
|
|
|
167
144
|
|
|
168
145
|
// Display completion summary
|
|
169
146
|
console.log('\n📊 Completion Summary:');
|
|
170
|
-
console.log(
|
|
171
|
-
`✅ Successfully processed ${filteredFiles.length} files into ${path.basename(outputPath)}`,
|
|
172
|
-
);
|
|
147
|
+
console.log(`✅ Successfully processed ${filteredFiles.length} files into ${path.basename(outputPath)}`);
|
|
173
148
|
console.log(`📁 Output file: ${outputPath}`);
|
|
174
149
|
console.log(`📏 Total source size: ${stats.totalSize}`);
|
|
175
150
|
console.log(`📄 Generated XML size: ${stats.xmlSize}`);
|
|
176
151
|
console.log(`📝 Total lines of code: ${stats.totalLines.toLocaleString()}`);
|
|
177
152
|
console.log(`🔢 Estimated tokens: ${stats.estimatedTokens}`);
|
|
178
|
-
console.log(
|
|
179
|
-
`📊 File breakdown: ${stats.textFiles} text, ${stats.binaryFiles} binary, ${stats.errorFiles} errors\n`,
|
|
180
|
-
);
|
|
153
|
+
console.log(`📊 File breakdown: ${stats.textFiles} text, ${stats.binaryFiles} binary, ${stats.errorFiles} errors\n`);
|
|
181
154
|
|
|
182
155
|
// Ask user if they want detailed stats + markdown report
|
|
183
|
-
const generateDetailed = await promptYesNo(
|
|
184
|
-
'Generate detailed stats (console + markdown) now?',
|
|
185
|
-
true,
|
|
186
|
-
);
|
|
156
|
+
const generateDetailed = await promptYesNo('Generate detailed stats (console + markdown) now?', true);
|
|
187
157
|
|
|
188
158
|
if (generateDetailed) {
|
|
189
159
|
// Additional detailed stats
|
|
@@ -209,11 +179,7 @@ program
|
|
|
209
179
|
console.log('\n📦 Top Extensions:');
|
|
210
180
|
for (const e of topExt) {
|
|
211
181
|
const pct = stats.totalBytes ? (e.bytes / stats.totalBytes) * 100 : 0;
|
|
212
|
-
console.log(
|
|
213
|
-
` ${e.ext}: ${e.count} files, ${e.bytes.toLocaleString()} bytes (${pct.toFixed(
|
|
214
|
-
2,
|
|
215
|
-
)}%)`,
|
|
216
|
-
);
|
|
182
|
+
console.log(` ${e.ext}: ${e.count} files, ${e.bytes.toLocaleString()} bytes (${pct.toFixed(2)}%)`);
|
|
217
183
|
}
|
|
218
184
|
if (stats.byExtension.length > 2) {
|
|
219
185
|
console.log(` … and ${stats.byExtension.length - 2} more extensions`);
|
|
@@ -225,11 +191,7 @@ program
|
|
|
225
191
|
console.log('\n📂 Top Directories:');
|
|
226
192
|
for (const d of topDir) {
|
|
227
193
|
const pct = stats.totalBytes ? (d.bytes / stats.totalBytes) * 100 : 0;
|
|
228
|
-
console.log(
|
|
229
|
-
` ${d.dir}: ${d.count} files, ${d.bytes.toLocaleString()} bytes (${pct.toFixed(
|
|
230
|
-
2,
|
|
231
|
-
)}%)`,
|
|
232
|
-
);
|
|
194
|
+
console.log(` ${d.dir}: ${d.count} files, ${d.bytes.toLocaleString()} bytes (${pct.toFixed(2)}%)`);
|
|
233
195
|
}
|
|
234
196
|
if (stats.byDirectory.length > 2) {
|
|
235
197
|
console.log(` … and ${stats.byDirectory.length - 2} more directories`);
|
|
@@ -259,14 +221,10 @@ program
|
|
|
259
221
|
if (stats.temporal) {
|
|
260
222
|
console.log('\n⏱️ Temporal:');
|
|
261
223
|
if (stats.temporal.oldest) {
|
|
262
|
-
console.log(
|
|
263
|
-
` Oldest: ${stats.temporal.oldest.path} (${stats.temporal.oldest.mtime})`,
|
|
264
|
-
);
|
|
224
|
+
console.log(` Oldest: ${stats.temporal.oldest.path} (${stats.temporal.oldest.mtime})`);
|
|
265
225
|
}
|
|
266
226
|
if (stats.temporal.newest) {
|
|
267
|
-
console.log(
|
|
268
|
-
` Newest: ${stats.temporal.newest.path} (${stats.temporal.newest.mtime})`,
|
|
269
|
-
);
|
|
227
|
+
console.log(` Newest: ${stats.temporal.newest.path} (${stats.temporal.newest.mtime})`);
|
|
270
228
|
}
|
|
271
229
|
if (Array.isArray(stats.temporal.ageBuckets)) {
|
|
272
230
|
console.log(' Age buckets:');
|
|
@@ -286,13 +244,9 @@ program
|
|
|
286
244
|
console.log(` Hidden files: ${stats.quality.hiddenFiles}`);
|
|
287
245
|
console.log(` Symlinks: ${stats.quality.symlinks}`);
|
|
288
246
|
console.log(
|
|
289
|
-
` Large files (>= ${(stats.quality.largeThreshold / (1024 * 1024)).toFixed(
|
|
290
|
-
0,
|
|
291
|
-
)} MB): ${stats.quality.largeFilesCount}`,
|
|
292
|
-
);
|
|
293
|
-
console.log(
|
|
294
|
-
` Suspiciously large files (>= 100 MB): ${stats.quality.suspiciousLargeFilesCount}`,
|
|
247
|
+
` Large files (>= ${(stats.quality.largeThreshold / (1024 * 1024)).toFixed(0)} MB): ${stats.quality.largeFilesCount}`,
|
|
295
248
|
);
|
|
249
|
+
console.log(` Suspiciously large files (>= 100 MB): ${stats.quality.suspiciousLargeFilesCount}`);
|
|
296
250
|
}
|
|
297
251
|
|
|
298
252
|
if (Array.isArray(stats.duplicateCandidates) && stats.duplicateCandidates.length > 0) {
|
|
@@ -306,21 +260,13 @@ program
|
|
|
306
260
|
}
|
|
307
261
|
|
|
308
262
|
if (typeof stats.compressibilityRatio === 'number') {
|
|
309
|
-
console.log(
|
|
310
|
-
`\n🗜️ Compressibility ratio (sampled): ${(stats.compressibilityRatio * 100).toFixed(
|
|
311
|
-
2,
|
|
312
|
-
)}%`,
|
|
313
|
-
);
|
|
263
|
+
console.log(`\n🗜️ Compressibility ratio (sampled): ${(stats.compressibilityRatio * 100).toFixed(2)}%`);
|
|
314
264
|
}
|
|
315
265
|
|
|
316
266
|
if (stats.git && stats.git.isRepo) {
|
|
317
267
|
console.log('\n🔧 Git:');
|
|
318
|
-
console.log(
|
|
319
|
-
|
|
320
|
-
);
|
|
321
|
-
console.log(
|
|
322
|
-
` Untracked: ${stats.git.untrackedCount} files, ${stats.git.untrackedBytes.toLocaleString()} bytes`,
|
|
323
|
-
);
|
|
268
|
+
console.log(` Tracked: ${stats.git.trackedCount} files, ${stats.git.trackedBytes.toLocaleString()} bytes`);
|
|
269
|
+
console.log(` Untracked: ${stats.git.untrackedCount} files, ${stats.git.untrackedBytes.toLocaleString()} bytes`);
|
|
324
270
|
if (Array.isArray(stats.git.lfsCandidates) && stats.git.lfsCandidates.length > 0) {
|
|
325
271
|
console.log(' LFS candidates (top 2):');
|
|
326
272
|
for (const f of stats.git.lfsCandidates.slice(0, 2)) {
|
|
@@ -343,9 +289,7 @@ program
|
|
|
343
289
|
locStr = `, LOC: ${tf.lines.toLocaleString()}`;
|
|
344
290
|
}
|
|
345
291
|
}
|
|
346
|
-
console.log(
|
|
347
|
-
` ${f.path} – ${f.sizeFormatted} (${f.percentOfTotal.toFixed(2)}%)${locStr}`,
|
|
348
|
-
);
|
|
292
|
+
console.log(` ${f.path} – ${f.sizeFormatted} (${f.percentOfTotal.toFixed(2)}%)${locStr}`);
|
|
349
293
|
}
|
|
350
294
|
if (stats.largestFiles.length > 2) {
|
|
351
295
|
console.log(` … and ${stats.largestFiles.length - 2} more files`);
|
|
@@ -354,9 +298,7 @@ program
|
|
|
354
298
|
|
|
355
299
|
// Write a comprehensive markdown report next to the XML
|
|
356
300
|
{
|
|
357
|
-
const mdPath = outputPath.endsWith('.xml')
|
|
358
|
-
? outputPath.replace(/\.xml$/i, '.stats.md')
|
|
359
|
-
: outputPath + '.stats.md';
|
|
301
|
+
const mdPath = outputPath.endsWith('.xml') ? outputPath.replace(/\.xml$/i, '.stats.md') : outputPath + '.stats.md';
|
|
360
302
|
try {
|
|
361
303
|
const pct = (num, den) => (den ? (num / den) * 100 : 0);
|
|
362
304
|
const md = [];
|
|
@@ -379,11 +321,7 @@ program
|
|
|
379
321
|
|
|
380
322
|
// Histogram
|
|
381
323
|
if (Array.isArray(stats.histogram) && stats.histogram.length > 0) {
|
|
382
|
-
md.push(
|
|
383
|
-
'## 🧮 Size Histogram',
|
|
384
|
-
'| Bucket | Files | Bytes |',
|
|
385
|
-
'| --- | ---: | ---: |',
|
|
386
|
-
);
|
|
324
|
+
md.push('## 🧮 Size Histogram', '| Bucket | Files | Bytes |', '| --- | ---: | ---: |');
|
|
387
325
|
for (const b of stats.histogram) {
|
|
388
326
|
md.push(`| ${b.label} | ${b.count} | ${b.bytes.toLocaleString()} |`);
|
|
389
327
|
}
|
|
@@ -392,16 +330,10 @@ program
|
|
|
392
330
|
|
|
393
331
|
// Top Extensions
|
|
394
332
|
if (Array.isArray(stats.byExtension) && stats.byExtension.length > 0) {
|
|
395
|
-
md.push(
|
|
396
|
-
'## 📦 Top Extensions by Bytes (Top 20)',
|
|
397
|
-
'| Ext | Files | Bytes | % of total |',
|
|
398
|
-
'| --- | ---: | ---: | ---: |',
|
|
399
|
-
);
|
|
333
|
+
md.push('## 📦 Top Extensions by Bytes (Top 20)', '| Ext | Files | Bytes | % of total |', '| --- | ---: | ---: | ---: |');
|
|
400
334
|
for (const e of stats.byExtension.slice(0, 20)) {
|
|
401
335
|
const p = pct(e.bytes, stats.totalBytes);
|
|
402
|
-
md.push(
|
|
403
|
-
`| ${e.ext} | ${e.count} | ${e.bytes.toLocaleString()} | ${p.toFixed(2)}% |`,
|
|
404
|
-
);
|
|
336
|
+
md.push(`| ${e.ext} | ${e.count} | ${e.bytes.toLocaleString()} | ${p.toFixed(2)}% |`);
|
|
405
337
|
}
|
|
406
338
|
md.push('');
|
|
407
339
|
}
|
|
@@ -415,9 +347,7 @@ program
|
|
|
415
347
|
);
|
|
416
348
|
for (const d of stats.byDirectory.slice(0, 20)) {
|
|
417
349
|
const p = pct(d.bytes, stats.totalBytes);
|
|
418
|
-
md.push(
|
|
419
|
-
`| ${d.dir} | ${d.count} | ${d.bytes.toLocaleString()} | ${p.toFixed(2)}% |`,
|
|
420
|
-
);
|
|
350
|
+
md.push(`| ${d.dir} | ${d.count} | ${d.bytes.toLocaleString()} | ${p.toFixed(2)}% |`);
|
|
421
351
|
}
|
|
422
352
|
md.push('');
|
|
423
353
|
}
|
|
@@ -433,11 +363,7 @@ program
|
|
|
433
363
|
|
|
434
364
|
// Longest paths
|
|
435
365
|
if (Array.isArray(stats.longestPaths) && stats.longestPaths.length > 0) {
|
|
436
|
-
md.push(
|
|
437
|
-
'## 🧵 Longest Paths (Top 25)',
|
|
438
|
-
'| Path | Length | Bytes |',
|
|
439
|
-
'| --- | ---: | ---: |',
|
|
440
|
-
);
|
|
366
|
+
md.push('## 🧵 Longest Paths (Top 25)', '| Path | Length | Bytes |', '| --- | ---: | ---: |');
|
|
441
367
|
for (const pth of stats.longestPaths) {
|
|
442
368
|
md.push(`| ${pth.path} | ${pth.length} | ${pth.size.toLocaleString()} |`);
|
|
443
369
|
}
|
|
@@ -478,20 +404,14 @@ program
|
|
|
478
404
|
|
|
479
405
|
// Duplicates
|
|
480
406
|
if (Array.isArray(stats.duplicateCandidates) && stats.duplicateCandidates.length > 0) {
|
|
481
|
-
md.push(
|
|
482
|
-
'## 🧬 Duplicate Candidates',
|
|
483
|
-
'| Reason | Files | Size (bytes) |',
|
|
484
|
-
'| --- | ---: | ---: |',
|
|
485
|
-
);
|
|
407
|
+
md.push('## 🧬 Duplicate Candidates', '| Reason | Files | Size (bytes) |', '| --- | ---: | ---: |');
|
|
486
408
|
for (const d of stats.duplicateCandidates) {
|
|
487
409
|
md.push(`| ${d.reason} | ${d.count} | ${d.size.toLocaleString()} |`);
|
|
488
410
|
}
|
|
489
411
|
md.push('', '### 🧬 Duplicate Groups Details');
|
|
490
412
|
let dupIndex = 1;
|
|
491
413
|
for (const d of stats.duplicateCandidates) {
|
|
492
|
-
md.push(
|
|
493
|
-
`#### Group ${dupIndex}: ${d.count} files @ ${d.size.toLocaleString()} bytes (${d.reason})`,
|
|
494
|
-
);
|
|
414
|
+
md.push(`#### Group ${dupIndex}: ${d.count} files @ ${d.size.toLocaleString()} bytes (${d.reason})`);
|
|
495
415
|
if (Array.isArray(d.files) && d.files.length > 0) {
|
|
496
416
|
for (const fp of d.files) {
|
|
497
417
|
md.push(`- ${fp}`);
|
|
@@ -507,11 +427,7 @@ program
|
|
|
507
427
|
|
|
508
428
|
// Compressibility
|
|
509
429
|
if (typeof stats.compressibilityRatio === 'number') {
|
|
510
|
-
md.push(
|
|
511
|
-
'## 🗜️ Compressibility',
|
|
512
|
-
`Sampled compressibility ratio: ${(stats.compressibilityRatio * 100).toFixed(2)}%`,
|
|
513
|
-
'',
|
|
514
|
-
);
|
|
430
|
+
md.push('## 🗜️ Compressibility', `Sampled compressibility ratio: ${(stats.compressibilityRatio * 100).toFixed(2)}%`, '');
|
|
515
431
|
}
|
|
516
432
|
|
|
517
433
|
// Git
|
|
@@ -532,11 +448,7 @@ program
|
|
|
532
448
|
|
|
533
449
|
// Largest Files
|
|
534
450
|
if (Array.isArray(stats.largestFiles) && stats.largestFiles.length > 0) {
|
|
535
|
-
md.push(
|
|
536
|
-
'## 📚 Largest Files (Top 50)',
|
|
537
|
-
'| Path | Size | % of total | LOC |',
|
|
538
|
-
'| --- | ---: | ---: | ---: |',
|
|
539
|
-
);
|
|
451
|
+
md.push('## 📚 Largest Files (Top 50)', '| Path | Size | % of total | LOC |', '| --- | ---: | ---: | ---: |');
|
|
540
452
|
for (const f of stats.largestFiles) {
|
|
541
453
|
let loc = '';
|
|
542
454
|
if (!f.isBinary && Array.isArray(aggregatedContent?.textFiles)) {
|
|
@@ -545,9 +457,7 @@ program
|
|
|
545
457
|
loc = tf.lines.toLocaleString();
|
|
546
458
|
}
|
|
547
459
|
}
|
|
548
|
-
md.push(
|
|
549
|
-
`| ${f.path} | ${f.sizeFormatted} | ${f.percentOfTotal.toFixed(2)}% | ${loc} |`,
|
|
550
|
-
);
|
|
460
|
+
md.push(`| ${f.path} | ${f.sizeFormatted} | ${f.percentOfTotal.toFixed(2)}% | ${loc} |`);
|
|
551
461
|
}
|
|
552
462
|
md.push('');
|
|
553
463
|
}
|
|
@@ -34,9 +34,7 @@ async function _detectVcsTopLevel(startDir) {
|
|
|
34
34
|
if (show) return show;
|
|
35
35
|
const info = await _tryRun('svn', ['info'], startDir);
|
|
36
36
|
if (info) {
|
|
37
|
-
const line = info
|
|
38
|
-
.split(/\r?\n/)
|
|
39
|
-
.find((l) => l.toLowerCase().startsWith('working copy root path:'));
|
|
37
|
+
const line = info.split(/\r?\n/).find((l) => l.toLowerCase().startsWith('working copy root path:'));
|
|
40
38
|
if (line) return line.split(':').slice(1).join(':').trim();
|
|
41
39
|
}
|
|
42
40
|
return null;
|
|
@@ -176,13 +174,10 @@ async function findProjectRoot(startDir) {
|
|
|
176
174
|
|
|
177
175
|
while (true) {
|
|
178
176
|
// Special check: package.json with "workspaces"
|
|
179
|
-
if ((await hasWorkspacePackageJson(dir)) && (!best || 90 >= best.weight))
|
|
180
|
-
best = { dir, weight: 90 };
|
|
177
|
+
if ((await hasWorkspacePackageJson(dir)) && (!best || 90 >= best.weight)) best = { dir, weight: 90 };
|
|
181
178
|
|
|
182
179
|
// Evaluate all other checks in parallel
|
|
183
|
-
const results = await Promise.all(
|
|
184
|
-
checks.map(async (c) => ({ c, ok: await exists(c.makePath(dir)) })),
|
|
185
|
-
);
|
|
180
|
+
const results = await Promise.all(checks.map(async (c) => ({ c, ok: await exists(c.makePath(dir)) })));
|
|
186
181
|
|
|
187
182
|
for (const { c, ok } of results) {
|
|
188
183
|
if (!ok) continue;
|
|
@@ -131,9 +131,7 @@ function computeDepthAndLongest(allFiles) {
|
|
|
131
131
|
.sort((a, b) => b.path.length - a.path.length)
|
|
132
132
|
.slice(0, 25)
|
|
133
133
|
.map((f) => ({ path: f.path, length: f.path.length, size: f.size }));
|
|
134
|
-
const depthDist = [...depthDistribution.entries()]
|
|
135
|
-
.sort((a, b) => a[0] - b[0])
|
|
136
|
-
.map(([depth, count]) => ({ depth, count }));
|
|
134
|
+
const depthDist = [...depthDistribution.entries()].sort((a, b) => a[0] - b[0]).map(([depth, count]) => ({ depth, count }));
|
|
137
135
|
return { depthDist, longestPaths };
|
|
138
136
|
}
|
|
139
137
|
|
|
@@ -161,21 +159,15 @@ function computeTemporal(allFiles, nowMs) {
|
|
|
161
159
|
if (!newest || f.mtimeMs > newest.mtimeMs) newest = f;
|
|
162
160
|
}
|
|
163
161
|
return {
|
|
164
|
-
oldest: oldest
|
|
165
|
-
|
|
166
|
-
: null,
|
|
167
|
-
newest: newest
|
|
168
|
-
? { path: newest.path, mtime: newest.mtimeMs ? new Date(newest.mtimeMs).toISOString() : null }
|
|
169
|
-
: null,
|
|
162
|
+
oldest: oldest ? { path: oldest.path, mtime: oldest.mtimeMs ? new Date(oldest.mtimeMs).toISOString() : null } : null,
|
|
163
|
+
newest: newest ? { path: newest.path, mtime: newest.mtimeMs ? new Date(newest.mtimeMs).toISOString() : null } : null,
|
|
170
164
|
ageBuckets,
|
|
171
165
|
};
|
|
172
166
|
}
|
|
173
167
|
|
|
174
168
|
function computeQuality(allFiles, textFiles) {
|
|
175
169
|
const zeroByteFiles = allFiles.filter((f) => f.size === 0).length;
|
|
176
|
-
const emptyTextFiles = textFiles.filter(
|
|
177
|
-
(f) => (f.size || 0) === 0 || (f.lines || 0) === 0,
|
|
178
|
-
).length;
|
|
170
|
+
const emptyTextFiles = textFiles.filter((f) => (f.size || 0) === 0 || (f.lines || 0) === 0).length;
|
|
179
171
|
const hiddenFiles = allFiles.filter((f) => f.hidden).length;
|
|
180
172
|
const symlinks = allFiles.filter((f) => f.isSymlink).length;
|
|
181
173
|
const largeThreshold = 50 * MB;
|
|
@@ -339,37 +331,18 @@ function buildMarkdownReport(largestFiles, byExtensionArr, byDirectoryArr, total
|
|
|
339
331
|
md.push(
|
|
340
332
|
'\n### Top Largest Files (Top 50)\n',
|
|
341
333
|
mdTable(
|
|
342
|
-
largestFiles.map((f) => [
|
|
343
|
-
f.path,
|
|
344
|
-
f.sizeFormatted,
|
|
345
|
-
`${f.percentOfTotal.toFixed(2)}%`,
|
|
346
|
-
f.ext || '',
|
|
347
|
-
f.isBinary ? 'binary' : 'text',
|
|
348
|
-
]),
|
|
334
|
+
largestFiles.map((f) => [f.path, f.sizeFormatted, `${f.percentOfTotal.toFixed(2)}%`, f.ext || '', f.isBinary ? 'binary' : 'text']),
|
|
349
335
|
['Path', 'Size', '% of total', 'Ext', 'Type'],
|
|
350
336
|
),
|
|
351
337
|
'\n\n### Top Extensions by Bytes (Top 20)\n',
|
|
352
338
|
);
|
|
353
339
|
const topExtRows = byExtensionArr
|
|
354
340
|
.slice(0, 20)
|
|
355
|
-
.map((e) => [
|
|
356
|
-
|
|
357
|
-
String(e.count),
|
|
358
|
-
formatSize(e.bytes),
|
|
359
|
-
`${toPct(e.bytes, totalBytes).toFixed(2)}%`,
|
|
360
|
-
]);
|
|
361
|
-
md.push(
|
|
362
|
-
mdTable(topExtRows, ['Ext', 'Count', 'Bytes', '% of total']),
|
|
363
|
-
'\n\n### Top Directories by Bytes (Top 20)\n',
|
|
364
|
-
);
|
|
341
|
+
.map((e) => [e.ext, String(e.count), formatSize(e.bytes), `${toPct(e.bytes, totalBytes).toFixed(2)}%`]);
|
|
342
|
+
md.push(mdTable(topExtRows, ['Ext', 'Count', 'Bytes', '% of total']), '\n\n### Top Directories by Bytes (Top 20)\n');
|
|
365
343
|
const topDirRows = byDirectoryArr
|
|
366
344
|
.slice(0, 20)
|
|
367
|
-
.map((d) => [
|
|
368
|
-
d.dir,
|
|
369
|
-
String(d.count),
|
|
370
|
-
formatSize(d.bytes),
|
|
371
|
-
`${toPct(d.bytes, totalBytes).toFixed(2)}%`,
|
|
372
|
-
]);
|
|
345
|
+
.map((d) => [d.dir, String(d.count), formatSize(d.bytes), `${toPct(d.bytes, totalBytes).toFixed(2)}%`]);
|
|
373
346
|
md.push(mdTable(topDirRows, ['Directory', 'Files', 'Bytes', '% of total']));
|
|
374
347
|
return md.join('\n');
|
|
375
348
|
}
|
package/tools/flattener/stats.js
CHANGED
|
@@ -26,12 +26,7 @@ async function calculateStatistics(aggregatedContent, xmlFileSize, rootDir) {
|
|
|
26
26
|
const compressibilityRatio = H.estimateCompressibility(textFiles);
|
|
27
27
|
const git = H.computeGitInfo(allFiles, rootDir, quality.largeThreshold);
|
|
28
28
|
const largestFiles = H.computeLargestFiles(allFiles, totalBytes);
|
|
29
|
-
const markdownReport = H.buildMarkdownReport(
|
|
30
|
-
largestFiles,
|
|
31
|
-
byExtensionArr,
|
|
32
|
-
byDirectoryArr,
|
|
33
|
-
totalBytes,
|
|
34
|
-
);
|
|
29
|
+
const markdownReport = H.buildMarkdownReport(largestFiles, byExtensionArr, byDirectoryArr, totalBytes);
|
|
35
30
|
|
|
36
31
|
return {
|
|
37
32
|
// Back-compat summary
|
|
@@ -141,11 +141,7 @@ async function testPackageJsonWorkspaces() {
|
|
|
141
141
|
const root = await mkTmpDir('package-workspaces');
|
|
142
142
|
const pkgA = path.join(root, 'packages', 'a');
|
|
143
143
|
await fs.ensureDir(pkgA);
|
|
144
|
-
await fs.writeJson(
|
|
145
|
-
path.join(root, 'package.json'),
|
|
146
|
-
{ private: true, workspaces: ['packages/*'] },
|
|
147
|
-
{ spaces: 2 },
|
|
148
|
-
);
|
|
144
|
+
await fs.writeJson(path.join(root, 'package.json'), { private: true, workspaces: ['packages/*'] }, { spaces: 2 });
|
|
149
145
|
const found = await findProjectRoot(pkgA);
|
|
150
146
|
await assertEqual(found, root, 'package.json workspaces should be detected');
|
|
151
147
|
return { name: 'package.json-workspaces', ok: true };
|