wizz-method 1.0.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/.claude-plugin/marketplace.json +80 -0
- package/AGENTS.md +12 -0
- package/LICENSE +30 -0
- package/README.md +72 -0
- package/bmad-modules.yaml +77 -0
- package/build/artifacts/llms-full.txt +4049 -0
- package/build/artifacts/llms.txt +28 -0
- package/build/site/404.html +55 -0
- package/build/site/_astro/MobileTableOfContents.astro_astro_type_script_index_0_lang.hwBsy0Mo.js +1 -0
- package/build/site/_astro/Search.astro_astro_type_script_index_0_lang.cjYDvRdi.js +1 -0
- package/build/site/_astro/TableOfContents.astro_astro_type_script_index_0_lang.FuRcXuRY.js +1 -0
- package/build/site/_astro/ec.0vx5m.js +3 -0
- package/build/site/_astro/ec.v4551.css +1 -0
- package/build/site/_astro/index.DdjI3lF_.css +1 -0
- package/build/site/_astro/page.B1D-nYk3.js +1 -0
- package/build/site/_astro/print.DNXP8c50.css +1 -0
- package/build/site/_astro/ui-core.D_Lfcn_I.js +2 -0
- package/build/site/cs/404/index.html +42 -0
- package/build/site/cs/explanation/advanced-elicitation/index.html +105 -0
- package/build/site/cs/explanation/adversarial-review/index.html +109 -0
- package/build/site/cs/explanation/analysis-phase/index.html +129 -0
- package/build/site/cs/explanation/brainstorming/index.html +92 -0
- package/build/site/cs/explanation/checkpoint-preview/index.html +121 -0
- package/build/site/cs/explanation/established-projects-faq/index.html +107 -0
- package/build/site/cs/explanation/forensic-investigation/index.html +167 -0
- package/build/site/cs/explanation/named-agents/index.html +187 -0
- package/build/site/cs/explanation/party-mode/index.html +101 -0
- package/build/site/cs/explanation/preventing-agent-conflicts/index.html +185 -0
- package/build/site/cs/explanation/project-context/index.html +198 -0
- package/build/site/cs/explanation/quick-dev/index.html +113 -0
- package/build/site/cs/explanation/web-bundles/index.html +178 -0
- package/build/site/cs/explanation/why-solutioning-matters/index.html +168 -0
- package/build/site/cs/how-to/customize-bmad/index.html +197 -0
- package/build/site/cs/how-to/established-projects/index.html +165 -0
- package/build/site/cs/how-to/expand-bmad-for-your-org/index.html +245 -0
- package/build/site/cs/how-to/get-answers-about-bmad/index.html +179 -0
- package/build/site/cs/how-to/install-bmad/index.html +124 -0
- package/build/site/cs/how-to/install-custom-modules/index.html +197 -0
- package/build/site/cs/how-to/non-interactive-installation/index.html +255 -0
- package/build/site/cs/how-to/project-context/index.html +138 -0
- package/build/site/cs/how-to/quick-fixes/index.html +122 -0
- package/build/site/cs/how-to/shard-large-documents/index.html +103 -0
- package/build/site/cs/how-to/upgrade-to-v6/index.html +185 -0
- package/build/site/cs/how-to/use-web-bundles/index.html +99 -0
- package/build/site/cs/index.html +129 -0
- package/build/site/cs/reference/agents/index.html +173 -0
- package/build/site/cs/reference/commands/index.html +250 -0
- package/build/site/cs/reference/core-tools/index.html +337 -0
- package/build/site/cs/reference/modules/index.html +132 -0
- package/build/site/cs/reference/testing/index.html +218 -0
- package/build/site/cs/reference/workflow-map/index.html +240 -0
- package/build/site/cs/roadmap/index.html +77 -0
- package/build/site/cs/tutorials/getting-started/index.html +382 -0
- package/build/site/diagrams/checkpoint-preview-diagram-fr.webp +0 -0
- package/build/site/diagrams/checkpoint-preview-diagram.png +0 -0
- package/build/site/diagrams/quick-dev-diagram-fr.webp +0 -0
- package/build/site/diagrams/quick-dev-diagram.png +0 -0
- package/build/site/explanation/advanced-elicitation/index.html +105 -0
- package/build/site/explanation/adversarial-review/index.html +109 -0
- package/build/site/explanation/analysis-phase/index.html +129 -0
- package/build/site/explanation/brainstorming/index.html +92 -0
- package/build/site/explanation/checkpoint-preview/index.html +121 -0
- package/build/site/explanation/established-projects-faq/index.html +107 -0
- package/build/site/explanation/forensic-investigation/index.html +167 -0
- package/build/site/explanation/named-agents/index.html +187 -0
- package/build/site/explanation/party-mode/index.html +256 -0
- package/build/site/explanation/preventing-agent-conflicts/index.html +185 -0
- package/build/site/explanation/project-context/index.html +198 -0
- package/build/site/explanation/quick-dev/index.html +113 -0
- package/build/site/explanation/web-bundles/index.html +178 -0
- package/build/site/explanation/why-solutioning-matters/index.html +168 -0
- package/build/site/fr/404/index.html +42 -0
- package/build/site/fr/explanation/advanced-elicitation/index.html +105 -0
- package/build/site/fr/explanation/adversarial-review/index.html +126 -0
- package/build/site/fr/explanation/analysis-phase/index.html +137 -0
- package/build/site/fr/explanation/brainstorming/index.html +92 -0
- package/build/site/fr/explanation/checkpoint-preview/index.html +121 -0
- package/build/site/fr/explanation/established-projects-faq/index.html +107 -0
- package/build/site/fr/explanation/forensic-investigation/index.html +194 -0
- package/build/site/fr/explanation/named-agents/index.html +187 -0
- package/build/site/fr/explanation/party-mode/index.html +112 -0
- package/build/site/fr/explanation/preventing-agent-conflicts/index.html +196 -0
- package/build/site/fr/explanation/project-context/index.html +198 -0
- package/build/site/fr/explanation/quick-dev/index.html +127 -0
- package/build/site/fr/explanation/web-bundles/index.html +198 -0
- package/build/site/fr/explanation/why-solutioning-matters/index.html +191 -0
- package/build/site/fr/how-to/customize-bmad/index.html +277 -0
- package/build/site/fr/how-to/established-projects/index.html +176 -0
- package/build/site/fr/how-to/expand-bmad-for-your-org/index.html +245 -0
- package/build/site/fr/how-to/get-answers-about-bmad/index.html +129 -0
- package/build/site/fr/how-to/install-bmad/index.html +330 -0
- package/build/site/fr/how-to/install-custom-modules/index.html +197 -0
- package/build/site/fr/how-to/non-interactive-installation/index.html +73 -0
- package/build/site/fr/how-to/project-context/index.html +138 -0
- package/build/site/fr/how-to/quick-fixes/index.html +130 -0
- package/build/site/fr/how-to/shard-large-documents/index.html +103 -0
- package/build/site/fr/how-to/upgrade-to-v6/index.html +202 -0
- package/build/site/fr/how-to/use-web-bundles/index.html +99 -0
- package/build/site/fr/index.html +144 -0
- package/build/site/fr/reference/agents/index.html +179 -0
- package/build/site/fr/reference/commands/index.html +264 -0
- package/build/site/fr/reference/core-tools/index.html +392 -0
- package/build/site/fr/reference/modules/index.html +146 -0
- package/build/site/fr/reference/testing/index.html +229 -0
- package/build/site/fr/reference/workflow-map/index.html +282 -0
- package/build/site/fr/roadmap/index.html +77 -0
- package/build/site/fr/tutorials/getting-started/index.html +406 -0
- package/build/site/how-to/customize-bmad/index.html +277 -0
- package/build/site/how-to/established-projects/index.html +165 -0
- package/build/site/how-to/expand-bmad-for-your-org/index.html +245 -0
- package/build/site/how-to/get-answers-about-bmad/index.html +129 -0
- package/build/site/how-to/install-bmad/index.html +330 -0
- package/build/site/how-to/install-custom-modules/index.html +197 -0
- package/build/site/how-to/non-interactive-installation/index.html +73 -0
- package/build/site/how-to/project-context/index.html +141 -0
- package/build/site/how-to/quick-fixes/index.html +122 -0
- package/build/site/how-to/shard-large-documents/index.html +103 -0
- package/build/site/how-to/upgrade-to-v6/index.html +185 -0
- package/build/site/how-to/use-web-bundles/index.html +99 -0
- package/build/site/img/bmad-dark.png +0 -0
- package/build/site/img/bmad-light.png +0 -0
- package/build/site/index.html +128 -0
- package/build/site/llms-full.txt +4049 -0
- package/build/site/llms.txt +28 -0
- package/build/site/pagefind/fragment/cs-cz_178b946.pf_fragment +0 -0
- package/build/site/pagefind/fragment/cs-cz_19e1744.pf_fragment +0 -0
- package/build/site/pagefind/fragment/cs-cz_1b81518.pf_fragment +0 -0
- package/build/site/pagefind/fragment/cs-cz_24fd94a.pf_fragment +0 -0
- package/build/site/pagefind/fragment/cs-cz_25c5ff1.pf_fragment +0 -0
- package/build/site/pagefind/fragment/cs-cz_2a7d8c4.pf_fragment +0 -0
- package/build/site/pagefind/fragment/cs-cz_2b14d1f.pf_fragment +0 -0
- package/build/site/pagefind/fragment/cs-cz_34d3775.pf_fragment +0 -0
- package/build/site/pagefind/fragment/cs-cz_366f93d.pf_fragment +0 -0
- package/build/site/pagefind/fragment/cs-cz_4761b65.pf_fragment +0 -0
- package/build/site/pagefind/fragment/cs-cz_4d1a40a.pf_fragment +0 -0
- package/build/site/pagefind/fragment/cs-cz_57dfabb.pf_fragment +0 -0
- package/build/site/pagefind/fragment/cs-cz_5c68f33.pf_fragment +0 -0
- package/build/site/pagefind/fragment/cs-cz_5efaba9.pf_fragment +0 -0
- package/build/site/pagefind/fragment/cs-cz_5f63a83.pf_fragment +0 -0
- package/build/site/pagefind/fragment/cs-cz_73bbdce.pf_fragment +0 -0
- package/build/site/pagefind/fragment/cs-cz_7b6af37.pf_fragment +0 -0
- package/build/site/pagefind/fragment/cs-cz_7d51fe5.pf_fragment +0 -0
- package/build/site/pagefind/fragment/cs-cz_7db5922.pf_fragment +0 -0
- package/build/site/pagefind/fragment/cs-cz_83e7116.pf_fragment +0 -0
- package/build/site/pagefind/fragment/cs-cz_83fec4e.pf_fragment +0 -0
- package/build/site/pagefind/fragment/cs-cz_84972ee.pf_fragment +0 -0
- package/build/site/pagefind/fragment/cs-cz_94e9289.pf_fragment +0 -0
- package/build/site/pagefind/fragment/cs-cz_a0a122c.pf_fragment +0 -0
- package/build/site/pagefind/fragment/cs-cz_a3e7fad.pf_fragment +0 -0
- package/build/site/pagefind/fragment/cs-cz_af43e66.pf_fragment +0 -0
- package/build/site/pagefind/fragment/cs-cz_b4f4e0a.pf_fragment +0 -0
- package/build/site/pagefind/fragment/cs-cz_b51b8b3.pf_fragment +0 -0
- package/build/site/pagefind/fragment/cs-cz_ba705d5.pf_fragment +0 -0
- package/build/site/pagefind/fragment/cs-cz_c315625.pf_fragment +0 -0
- package/build/site/pagefind/fragment/cs-cz_cf5138a.pf_fragment +0 -0
- package/build/site/pagefind/fragment/cs-cz_df8bdfe.pf_fragment +0 -0
- package/build/site/pagefind/fragment/cs-cz_e1b56f8.pf_fragment +0 -0
- package/build/site/pagefind/fragment/cs-cz_e3e33bb.pf_fragment +0 -0
- package/build/site/pagefind/fragment/cs-cz_f9d07b3.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_026af96.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_132ea1f.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_15ee460.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_171773c.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_1a7ec42.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_1bb5ebb.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_229434b.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_22b33a0.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_38efcf3.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_3d17cef.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_426a8fd.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_446b27a.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_582ecad.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_5d6b1f1.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_6465dfb.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_66f3f7a.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_68872f8.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_6e9deef.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_70a6a7e.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_73f0b1e.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_768fd99.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_7e52baa.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_8068cdc.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_9385c94.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_95b9c04.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_9a95e82.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_a66c4ef.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_ac6318c.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_bba8f66.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_d9f7193.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_e0e52b1.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_ece4cbe.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_ed6969c.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_f12187d.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_f643df1.pf_fragment +0 -0
- package/build/site/pagefind/fragment/fr-fr_10fdc25.pf_fragment +0 -0
- package/build/site/pagefind/fragment/fr-fr_132e2e0.pf_fragment +0 -0
- package/build/site/pagefind/fragment/fr-fr_1529d31.pf_fragment +0 -0
- package/build/site/pagefind/fragment/fr-fr_1531e2c.pf_fragment +0 -0
- package/build/site/pagefind/fragment/fr-fr_1d51fb7.pf_fragment +0 -0
- package/build/site/pagefind/fragment/fr-fr_27d0aaf.pf_fragment +0 -0
- package/build/site/pagefind/fragment/fr-fr_583aea8.pf_fragment +0 -0
- package/build/site/pagefind/fragment/fr-fr_5c4f14f.pf_fragment +0 -0
- package/build/site/pagefind/fragment/fr-fr_654bb96.pf_fragment +0 -0
- package/build/site/pagefind/fragment/fr-fr_65e37ae.pf_fragment +0 -0
- package/build/site/pagefind/fragment/fr-fr_6898afa.pf_fragment +0 -0
- package/build/site/pagefind/fragment/fr-fr_68d0a0b.pf_fragment +0 -0
- package/build/site/pagefind/fragment/fr-fr_6ce4bc1.pf_fragment +0 -0
- package/build/site/pagefind/fragment/fr-fr_7ddd126.pf_fragment +0 -0
- package/build/site/pagefind/fragment/fr-fr_7f50a2e.pf_fragment +0 -0
- package/build/site/pagefind/fragment/fr-fr_8d2df1b.pf_fragment +0 -0
- package/build/site/pagefind/fragment/fr-fr_9b8d33d.pf_fragment +0 -0
- package/build/site/pagefind/fragment/fr-fr_9c7f851.pf_fragment +0 -0
- package/build/site/pagefind/fragment/fr-fr_9cf6892.pf_fragment +0 -0
- package/build/site/pagefind/fragment/fr-fr_a512e53.pf_fragment +0 -0
- package/build/site/pagefind/fragment/fr-fr_a7ad3f6.pf_fragment +0 -0
- package/build/site/pagefind/fragment/fr-fr_afeac81.pf_fragment +0 -0
- package/build/site/pagefind/fragment/fr-fr_b364826.pf_fragment +0 -0
- package/build/site/pagefind/fragment/fr-fr_bdb3e1e.pf_fragment +0 -0
- package/build/site/pagefind/fragment/fr-fr_c4884c3.pf_fragment +0 -0
- package/build/site/pagefind/fragment/fr-fr_c54c827.pf_fragment +0 -0
- package/build/site/pagefind/fragment/fr-fr_ca664c2.pf_fragment +0 -0
- package/build/site/pagefind/fragment/fr-fr_ce3562d.pf_fragment +0 -0
- package/build/site/pagefind/fragment/fr-fr_d086476.pf_fragment +0 -0
- package/build/site/pagefind/fragment/fr-fr_d0b4e62.pf_fragment +0 -0
- package/build/site/pagefind/fragment/fr-fr_df4c57f.pf_fragment +0 -0
- package/build/site/pagefind/fragment/fr-fr_e1c2fa8.pf_fragment +0 -0
- package/build/site/pagefind/fragment/fr-fr_eaa1363.pf_fragment +0 -0
- package/build/site/pagefind/fragment/fr-fr_f456c69.pf_fragment +0 -0
- package/build/site/pagefind/fragment/fr-fr_fe8d783.pf_fragment +0 -0
- package/build/site/pagefind/fragment/vi-vn_1e5b1da.pf_fragment +0 -0
- package/build/site/pagefind/fragment/vi-vn_3268948.pf_fragment +0 -0
- package/build/site/pagefind/fragment/vi-vn_37f0bf6.pf_fragment +0 -0
- package/build/site/pagefind/fragment/vi-vn_485232c.pf_fragment +0 -0
- package/build/site/pagefind/fragment/vi-vn_4d3bd13.pf_fragment +0 -0
- package/build/site/pagefind/fragment/vi-vn_4e578d2.pf_fragment +0 -0
- package/build/site/pagefind/fragment/vi-vn_4ed2533.pf_fragment +0 -0
- package/build/site/pagefind/fragment/vi-vn_533743c.pf_fragment +0 -0
- package/build/site/pagefind/fragment/vi-vn_5ffd258.pf_fragment +0 -0
- package/build/site/pagefind/fragment/vi-vn_6bfed03.pf_fragment +0 -0
- package/build/site/pagefind/fragment/vi-vn_6f2ed6d.pf_fragment +0 -0
- package/build/site/pagefind/fragment/vi-vn_71aa305.pf_fragment +0 -0
- package/build/site/pagefind/fragment/vi-vn_7577c2c.pf_fragment +0 -0
- package/build/site/pagefind/fragment/vi-vn_7883435.pf_fragment +0 -0
- package/build/site/pagefind/fragment/vi-vn_7f2e496.pf_fragment +0 -0
- package/build/site/pagefind/fragment/vi-vn_7fce614.pf_fragment +0 -0
- package/build/site/pagefind/fragment/vi-vn_86274a6.pf_fragment +0 -0
- package/build/site/pagefind/fragment/vi-vn_8c4fd62.pf_fragment +0 -0
- package/build/site/pagefind/fragment/vi-vn_a06c773.pf_fragment +0 -0
- package/build/site/pagefind/fragment/vi-vn_a2e535b.pf_fragment +0 -0
- package/build/site/pagefind/fragment/vi-vn_a4b9dbc.pf_fragment +0 -0
- package/build/site/pagefind/fragment/vi-vn_b2d8e01.pf_fragment +0 -0
- package/build/site/pagefind/fragment/vi-vn_b631cf6.pf_fragment +0 -0
- package/build/site/pagefind/fragment/vi-vn_c970ebb.pf_fragment +0 -0
- package/build/site/pagefind/fragment/vi-vn_d229f2a.pf_fragment +0 -0
- package/build/site/pagefind/fragment/vi-vn_d685e88.pf_fragment +0 -0
- package/build/site/pagefind/fragment/vi-vn_dab2c52.pf_fragment +0 -0
- package/build/site/pagefind/fragment/vi-vn_df5a829.pf_fragment +0 -0
- package/build/site/pagefind/fragment/vi-vn_dfcf280.pf_fragment +0 -0
- package/build/site/pagefind/fragment/vi-vn_e8ec8cf.pf_fragment +0 -0
- package/build/site/pagefind/fragment/vi-vn_e9f3439.pf_fragment +0 -0
- package/build/site/pagefind/fragment/vi-vn_f0bfe83.pf_fragment +0 -0
- package/build/site/pagefind/fragment/vi-vn_f5462f7.pf_fragment +0 -0
- package/build/site/pagefind/fragment/vi-vn_fcc9bb7.pf_fragment +0 -0
- package/build/site/pagefind/fragment/vi-vn_fd55264.pf_fragment +0 -0
- package/build/site/pagefind/fragment/vi-vn_ffd39df.pf_fragment +0 -0
- package/build/site/pagefind/fragment/zh-cn_119c5bb.pf_fragment +0 -0
- package/build/site/pagefind/fragment/zh-cn_198e8ce.pf_fragment +0 -0
- package/build/site/pagefind/fragment/zh-cn_19b87a8.pf_fragment +0 -0
- package/build/site/pagefind/fragment/zh-cn_1edc3a5.pf_fragment +0 -0
- package/build/site/pagefind/fragment/zh-cn_36ae67a.pf_fragment +0 -0
- package/build/site/pagefind/fragment/zh-cn_37ab313.pf_fragment +0 -0
- package/build/site/pagefind/fragment/zh-cn_3b56778.pf_fragment +0 -0
- package/build/site/pagefind/fragment/zh-cn_5735cd4.pf_fragment +0 -0
- package/build/site/pagefind/fragment/zh-cn_6110769.pf_fragment +0 -0
- package/build/site/pagefind/fragment/zh-cn_6d66d9e.pf_fragment +0 -0
- package/build/site/pagefind/fragment/zh-cn_731b3f5.pf_fragment +0 -0
- package/build/site/pagefind/fragment/zh-cn_82885ff.pf_fragment +0 -0
- package/build/site/pagefind/fragment/zh-cn_8be7aac.pf_fragment +0 -0
- package/build/site/pagefind/fragment/zh-cn_8c3fa9e.pf_fragment +0 -0
- package/build/site/pagefind/fragment/zh-cn_8f452f7.pf_fragment +0 -0
- package/build/site/pagefind/fragment/zh-cn_96ccc61.pf_fragment +0 -0
- package/build/site/pagefind/fragment/zh-cn_9f29932.pf_fragment +0 -0
- package/build/site/pagefind/fragment/zh-cn_a24d786.pf_fragment +0 -0
- package/build/site/pagefind/fragment/zh-cn_a598178.pf_fragment +0 -0
- package/build/site/pagefind/fragment/zh-cn_a603f17.pf_fragment +0 -0
- package/build/site/pagefind/fragment/zh-cn_a9cffcf.pf_fragment +0 -0
- package/build/site/pagefind/fragment/zh-cn_c1bebbd.pf_fragment +0 -0
- package/build/site/pagefind/fragment/zh-cn_c38cf84.pf_fragment +0 -0
- package/build/site/pagefind/fragment/zh-cn_c42a851.pf_fragment +0 -0
- package/build/site/pagefind/fragment/zh-cn_ce57c6e.pf_fragment +0 -0
- package/build/site/pagefind/fragment/zh-cn_d4b5cd5.pf_fragment +0 -0
- package/build/site/pagefind/fragment/zh-cn_da40e6b.pf_fragment +0 -0
- package/build/site/pagefind/fragment/zh-cn_da777ec.pf_fragment +0 -0
- package/build/site/pagefind/fragment/zh-cn_de145f9.pf_fragment +0 -0
- package/build/site/pagefind/fragment/zh-cn_e376bf7.pf_fragment +0 -0
- package/build/site/pagefind/fragment/zh-cn_e663978.pf_fragment +0 -0
- package/build/site/pagefind/fragment/zh-cn_e97a13b.pf_fragment +0 -0
- package/build/site/pagefind/fragment/zh-cn_f13873d.pf_fragment +0 -0
- package/build/site/pagefind/fragment/zh-cn_f25fad4.pf_fragment +0 -0
- package/build/site/pagefind/fragment/zh-cn_f7edf48.pf_fragment +0 -0
- package/build/site/pagefind/index/cs-cz_24147b6.pf_index +0 -0
- package/build/site/pagefind/index/cs-cz_82fc657.pf_index +0 -0
- package/build/site/pagefind/index/cs-cz_8f6a83c.pf_index +0 -0
- package/build/site/pagefind/index/en_432f933.pf_index +0 -0
- package/build/site/pagefind/index/en_70c744a.pf_index +0 -0
- package/build/site/pagefind/index/en_fd84991.pf_index +0 -0
- package/build/site/pagefind/index/fr-fr_7275484.pf_index +0 -0
- package/build/site/pagefind/index/fr-fr_8096dd3.pf_index +0 -0
- package/build/site/pagefind/index/fr-fr_b34df12.pf_index +0 -0
- package/build/site/pagefind/index/fr-fr_e6ad665.pf_index +0 -0
- package/build/site/pagefind/index/vi-vn_129cf7e.pf_index +0 -0
- package/build/site/pagefind/index/vi-vn_7f54472.pf_index +0 -0
- package/build/site/pagefind/index/vi-vn_c1f31ce.pf_index +0 -0
- package/build/site/pagefind/index/vi-vn_c56f634.pf_index +0 -0
- package/build/site/pagefind/index/zh-cn_5ed0486.pf_index +0 -0
- package/build/site/pagefind/index/zh-cn_ad4d724.pf_index +0 -0
- package/build/site/pagefind/index/zh-cn_bc9f7b6.pf_index +0 -0
- package/build/site/pagefind/pagefind-entry.json +1 -0
- package/build/site/pagefind/pagefind-highlight.js +1064 -0
- package/build/site/pagefind/pagefind-modular-ui.css +214 -0
- package/build/site/pagefind/pagefind-modular-ui.js +8 -0
- package/build/site/pagefind/pagefind-ui.css +1 -0
- package/build/site/pagefind/pagefind-ui.js +2 -0
- package/build/site/pagefind/pagefind.cs-cz_cd39a8505eabf.pf_meta +0 -0
- package/build/site/pagefind/pagefind.en_8ae84a1b9c.pf_meta +0 -0
- package/build/site/pagefind/pagefind.fr-fr_20fca6f342d9a.pf_meta +0 -0
- package/build/site/pagefind/pagefind.js +6 -0
- package/build/site/pagefind/pagefind.vi-vn_6a45d08c2bbc8.pf_meta +0 -0
- package/build/site/pagefind/pagefind.zh-cn_ae911ac338eae.pf_meta +0 -0
- package/build/site/pagefind/wasm.en.pagefind +0 -0
- package/build/site/pagefind/wasm.fr-fr.pagefind +0 -0
- package/build/site/pagefind/wasm.unknown.pagefind +0 -0
- package/build/site/reference/agents/index.html +168 -0
- package/build/site/reference/commands/index.html +254 -0
- package/build/site/reference/core-tools/index.html +384 -0
- package/build/site/reference/modules/index.html +132 -0
- package/build/site/reference/testing/index.html +218 -0
- package/build/site/reference/workflow-map/index.html +266 -0
- package/build/site/roadmap/index.html +77 -0
- package/build/site/robots.txt +37 -0
- package/build/site/sitemap-0.xml +1 -0
- package/build/site/sitemap-index.xml +1 -0
- package/build/site/tutorials/getting-started/index.html +386 -0
- package/build/site/vi-vn/404/index.html +42 -0
- package/build/site/vi-vn/bmad-developer-guide/index.html +794 -0
- package/build/site/vi-vn/explanation/advanced-elicitation/index.html +105 -0
- package/build/site/vi-vn/explanation/adversarial-review/index.html +109 -0
- package/build/site/vi-vn/explanation/analysis-phase/index.html +129 -0
- package/build/site/vi-vn/explanation/brainstorming/index.html +92 -0
- package/build/site/vi-vn/explanation/checkpoint-preview/index.html +121 -0
- package/build/site/vi-vn/explanation/established-projects-faq/index.html +107 -0
- package/build/site/vi-vn/explanation/forensic-investigation/index.html +167 -0
- package/build/site/vi-vn/explanation/named-agents/index.html +187 -0
- package/build/site/vi-vn/explanation/party-mode/index.html +101 -0
- package/build/site/vi-vn/explanation/preventing-agent-conflicts/index.html +185 -0
- package/build/site/vi-vn/explanation/project-context/index.html +198 -0
- package/build/site/vi-vn/explanation/quick-dev/index.html +113 -0
- package/build/site/vi-vn/explanation/web-bundles/index.html +178 -0
- package/build/site/vi-vn/explanation/why-solutioning-matters/index.html +168 -0
- package/build/site/vi-vn/how-to/customize-bmad/index.html +277 -0
- package/build/site/vi-vn/how-to/established-projects/index.html +165 -0
- package/build/site/vi-vn/how-to/expand-bmad-for-your-org/index.html +228 -0
- package/build/site/vi-vn/how-to/get-answers-about-bmad/index.html +129 -0
- package/build/site/vi-vn/how-to/install-bmad/index.html +124 -0
- package/build/site/vi-vn/how-to/install-custom-modules/index.html +197 -0
- package/build/site/vi-vn/how-to/non-interactive-installation/index.html +300 -0
- package/build/site/vi-vn/how-to/project-context/index.html +138 -0
- package/build/site/vi-vn/how-to/quick-fixes/index.html +122 -0
- package/build/site/vi-vn/how-to/shard-large-documents/index.html +103 -0
- package/build/site/vi-vn/how-to/upgrade-to-v6/index.html +185 -0
- package/build/site/vi-vn/how-to/use-web-bundles/index.html +99 -0
- package/build/site/vi-vn/index.html +129 -0
- package/build/site/vi-vn/reference/agents/index.html +173 -0
- package/build/site/vi-vn/reference/commands/index.html +250 -0
- package/build/site/vi-vn/reference/core-tools/index.html +337 -0
- package/build/site/vi-vn/reference/modules/index.html +132 -0
- package/build/site/vi-vn/reference/testing/index.html +218 -0
- package/build/site/vi-vn/reference/workflow-map/index.html +240 -0
- package/build/site/vi-vn/roadmap/index.html +77 -0
- package/build/site/vi-vn/tutorials/getting-started/index.html +382 -0
- package/build/site/wizz-icon-orange.svg +7 -0
- package/build/site/workflow-map-diagram-fr.html +375 -0
- package/build/site/workflow-map-diagram.html +375 -0
- package/build/site/zh-cn/404/index.html +42 -0
- package/build/site/zh-cn/explanation/advanced-elicitation/index.html +142 -0
- package/build/site/zh-cn/explanation/adversarial-review/index.html +132 -0
- package/build/site/zh-cn/explanation/analysis-phase/index.html +129 -0
- package/build/site/zh-cn/explanation/brainstorming/index.html +147 -0
- package/build/site/zh-cn/explanation/checkpoint-preview/index.html +121 -0
- package/build/site/zh-cn/explanation/established-projects-faq/index.html +122 -0
- package/build/site/zh-cn/explanation/forensic-investigation/index.html +167 -0
- package/build/site/zh-cn/explanation/named-agents/index.html +187 -0
- package/build/site/zh-cn/explanation/party-mode/index.html +144 -0
- package/build/site/zh-cn/explanation/preventing-agent-conflicts/index.html +191 -0
- package/build/site/zh-cn/explanation/project-context/index.html +153 -0
- package/build/site/zh-cn/explanation/quick-dev/index.html +139 -0
- package/build/site/zh-cn/explanation/web-bundles/index.html +178 -0
- package/build/site/zh-cn/explanation/why-solutioning-matters/index.html +175 -0
- package/build/site/zh-cn/how-to/customize-bmad/index.html +202 -0
- package/build/site/zh-cn/how-to/established-projects/index.html +166 -0
- package/build/site/zh-cn/how-to/expand-bmad-for-your-org/index.html +223 -0
- package/build/site/zh-cn/how-to/get-answers-about-bmad/index.html +198 -0
- package/build/site/zh-cn/how-to/install-bmad/index.html +126 -0
- package/build/site/zh-cn/how-to/install-custom-modules/index.html +197 -0
- package/build/site/zh-cn/how-to/non-interactive-installation/index.html +254 -0
- package/build/site/zh-cn/how-to/project-context/index.html +143 -0
- package/build/site/zh-cn/how-to/quick-fixes/index.html +122 -0
- package/build/site/zh-cn/how-to/shard-large-documents/index.html +110 -0
- package/build/site/zh-cn/how-to/upgrade-to-v6/index.html +198 -0
- package/build/site/zh-cn/how-to/use-web-bundles/index.html +99 -0
- package/build/site/zh-cn/index.html +129 -0
- package/build/site/zh-cn/reference/agents/index.html +178 -0
- package/build/site/zh-cn/reference/commands/index.html +245 -0
- package/build/site/zh-cn/reference/core-tools/index.html +313 -0
- package/build/site/zh-cn/reference/modules/index.html +181 -0
- package/build/site/zh-cn/reference/testing/index.html +226 -0
- package/build/site/zh-cn/reference/workflow-map/index.html +238 -0
- package/build/site/zh-cn/roadmap/index.html +77 -0
- package/build/site/zh-cn/tutorials/getting-started/index.html +381 -0
- package/evals/bmm-skills/bmad-product-brief/evals.json +237 -0
- package/evals/bmm-skills/bmad-product-brief/files/branfield-memo.md +46 -0
- package/evals/bmm-skills/bmad-product-brief/files/forkbird-brief/addendum.md +40 -0
- package/evals/bmm-skills/bmad-product-brief/files/forkbird-brief/brief.md +56 -0
- package/evals/bmm-skills/bmad-product-brief/files/forkbird-brief/decision-log.md +27 -0
- package/evals/bmm-skills/bmad-product-brief/files/meridian-mobility-report.md +116 -0
- package/evals/bmm-skills/bmad-product-brief/files/mossridge-brief/addendum.md +41 -0
- package/evals/bmm-skills/bmad-product-brief/files/mossridge-brief/brief.md +57 -0
- package/evals/bmm-skills/bmad-product-brief/files/mossridge-brief/decision-log.md +29 -0
- package/evals/bmm-skills/bmad-product-brief/files/pantry-bridge-interviews.md +90 -0
- package/evals/bmm-skills/bmad-product-brief/files/q2-brainstorm.md +101 -0
- package/evals/bmm-skills/bmad-product-brief/triggers.json +18 -0
- package/package.json +114 -0
- package/removals.txt +62 -0
- package/src/bmm-skills/1-analysis/bmad-agent-analyst/SKILL.md +76 -0
- package/src/bmm-skills/1-analysis/bmad-agent-analyst/customize.toml +90 -0
- package/src/bmm-skills/1-analysis/bmad-agent-tech-writer/SKILL.md +76 -0
- package/src/bmm-skills/1-analysis/bmad-agent-tech-writer/customize.toml +81 -0
- package/src/bmm-skills/1-analysis/bmad-agent-tech-writer/explain-concept.md +20 -0
- package/src/bmm-skills/1-analysis/bmad-agent-tech-writer/mermaid-gen.md +20 -0
- package/src/bmm-skills/1-analysis/bmad-agent-tech-writer/validate-doc.md +19 -0
- package/src/bmm-skills/1-analysis/bmad-agent-tech-writer/write-document.md +20 -0
- package/src/bmm-skills/1-analysis/bmad-document-project/SKILL.md +62 -0
- package/src/bmm-skills/1-analysis/bmad-document-project/checklist.md +245 -0
- package/src/bmm-skills/1-analysis/bmad-document-project/customize.toml +41 -0
- package/src/bmm-skills/1-analysis/bmad-document-project/documentation-requirements.csv +12 -0
- package/src/bmm-skills/1-analysis/bmad-document-project/instructions.md +128 -0
- package/src/bmm-skills/1-analysis/bmad-document-project/templates/deep-dive-template.md +345 -0
- package/src/bmm-skills/1-analysis/bmad-document-project/templates/index-template.md +169 -0
- package/src/bmm-skills/1-analysis/bmad-document-project/templates/project-overview-template.md +103 -0
- package/src/bmm-skills/1-analysis/bmad-document-project/templates/project-scan-report-schema.json +160 -0
- package/src/bmm-skills/1-analysis/bmad-document-project/templates/source-tree-template.md +135 -0
- package/src/bmm-skills/1-analysis/bmad-document-project/workflows/deep-dive-instructions.md +300 -0
- package/src/bmm-skills/1-analysis/bmad-document-project/workflows/deep-dive-workflow.md +34 -0
- package/src/bmm-skills/1-analysis/bmad-document-project/workflows/full-scan-instructions.md +1108 -0
- package/src/bmm-skills/1-analysis/bmad-document-project/workflows/full-scan-workflow.md +34 -0
- package/src/bmm-skills/1-analysis/bmad-prfaq/SKILL.md +135 -0
- package/src/bmm-skills/1-analysis/bmad-prfaq/agents/artifact-analyzer.md +60 -0
- package/src/bmm-skills/1-analysis/bmad-prfaq/agents/web-researcher.md +49 -0
- package/src/bmm-skills/1-analysis/bmad-prfaq/assets/prfaq-template.md +62 -0
- package/src/bmm-skills/1-analysis/bmad-prfaq/bmad-manifest.json +16 -0
- package/src/bmm-skills/1-analysis/bmad-prfaq/customize.toml +41 -0
- package/src/bmm-skills/1-analysis/bmad-prfaq/references/customer-faq.md +55 -0
- package/src/bmm-skills/1-analysis/bmad-prfaq/references/internal-faq.md +51 -0
- package/src/bmm-skills/1-analysis/bmad-prfaq/references/press-release.md +60 -0
- package/src/bmm-skills/1-analysis/bmad-prfaq/references/verdict.md +83 -0
- package/src/bmm-skills/1-analysis/bmad-product-brief/SKILL.md +91 -0
- package/src/bmm-skills/1-analysis/bmad-product-brief/assets/brief-template.md +41 -0
- package/src/bmm-skills/1-analysis/bmad-product-brief/customize.toml +99 -0
- package/src/bmm-skills/1-analysis/research/bmad-domain-research/SKILL.md +96 -0
- package/src/bmm-skills/1-analysis/research/bmad-domain-research/customize.toml +41 -0
- package/src/bmm-skills/1-analysis/research/bmad-domain-research/domain-steps/step-01-init.md +137 -0
- package/src/bmm-skills/1-analysis/research/bmad-domain-research/domain-steps/step-02-domain-analysis.md +229 -0
- package/src/bmm-skills/1-analysis/research/bmad-domain-research/domain-steps/step-03-competitive-landscape.md +238 -0
- package/src/bmm-skills/1-analysis/research/bmad-domain-research/domain-steps/step-04-regulatory-focus.md +206 -0
- package/src/bmm-skills/1-analysis/research/bmad-domain-research/domain-steps/step-05-technical-trends.md +234 -0
- package/src/bmm-skills/1-analysis/research/bmad-domain-research/domain-steps/step-06-research-synthesis.md +450 -0
- package/src/bmm-skills/1-analysis/research/bmad-domain-research/research.template.md +29 -0
- package/src/bmm-skills/1-analysis/research/bmad-market-research/SKILL.md +96 -0
- package/src/bmm-skills/1-analysis/research/bmad-market-research/customize.toml +41 -0
- package/src/bmm-skills/1-analysis/research/bmad-market-research/research.template.md +29 -0
- package/src/bmm-skills/1-analysis/research/bmad-market-research/steps/step-01-init.md +184 -0
- package/src/bmm-skills/1-analysis/research/bmad-market-research/steps/step-02-customer-behavior.md +239 -0
- package/src/bmm-skills/1-analysis/research/bmad-market-research/steps/step-03-customer-pain-points.md +251 -0
- package/src/bmm-skills/1-analysis/research/bmad-market-research/steps/step-04-customer-decisions.md +261 -0
- package/src/bmm-skills/1-analysis/research/bmad-market-research/steps/step-05-competitive-analysis.md +173 -0
- package/src/bmm-skills/1-analysis/research/bmad-market-research/steps/step-06-research-completion.md +484 -0
- package/src/bmm-skills/1-analysis/research/bmad-technical-research/SKILL.md +96 -0
- package/src/bmm-skills/1-analysis/research/bmad-technical-research/customize.toml +41 -0
- package/src/bmm-skills/1-analysis/research/bmad-technical-research/research.template.md +29 -0
- package/src/bmm-skills/1-analysis/research/bmad-technical-research/technical-steps/step-01-init.md +137 -0
- package/src/bmm-skills/1-analysis/research/bmad-technical-research/technical-steps/step-02-technical-overview.md +239 -0
- package/src/bmm-skills/1-analysis/research/bmad-technical-research/technical-steps/step-03-integration-patterns.md +248 -0
- package/src/bmm-skills/1-analysis/research/bmad-technical-research/technical-steps/step-04-architectural-patterns.md +202 -0
- package/src/bmm-skills/1-analysis/research/bmad-technical-research/technical-steps/step-05-implementation-research.md +233 -0
- package/src/bmm-skills/1-analysis/research/bmad-technical-research/technical-steps/step-06-research-synthesis.md +493 -0
- package/src/bmm-skills/2-plan-workflows/bmad-agent-pm/SKILL.md +76 -0
- package/src/bmm-skills/2-plan-workflows/bmad-agent-pm/customize.toml +75 -0
- package/src/bmm-skills/2-plan-workflows/bmad-agent-ux-designer/SKILL.md +76 -0
- package/src/bmm-skills/2-plan-workflows/bmad-agent-ux-designer/customize.toml +60 -0
- package/src/bmm-skills/2-plan-workflows/bmad-create-prd/SKILL.md +30 -0
- package/src/bmm-skills/2-plan-workflows/bmad-create-prd/customize.toml +41 -0
- package/src/bmm-skills/2-plan-workflows/bmad-edit-prd/SKILL.md +30 -0
- package/src/bmm-skills/2-plan-workflows/bmad-edit-prd/customize.toml +42 -0
- package/src/bmm-skills/2-plan-workflows/bmad-prd/SKILL.md +92 -0
- package/src/bmm-skills/2-plan-workflows/bmad-prd/assets/headless-schemas.md +76 -0
- package/src/bmm-skills/2-plan-workflows/bmad-prd/assets/prd-template.md +165 -0
- package/src/bmm-skills/2-plan-workflows/bmad-prd/assets/prd-validation-checklist.md +135 -0
- package/src/bmm-skills/2-plan-workflows/bmad-prd/assets/validation-report-template.html +325 -0
- package/src/bmm-skills/2-plan-workflows/bmad-prd/customize.toml +147 -0
- package/src/bmm-skills/2-plan-workflows/bmad-prd/references/headless.md +39 -0
- package/src/bmm-skills/2-plan-workflows/bmad-prd/references/validate.md +97 -0
- package/src/bmm-skills/2-plan-workflows/bmad-ux/SKILL.md +90 -0
- package/src/bmm-skills/2-plan-workflows/bmad-ux/assets/color-themes.md +9 -0
- package/src/bmm-skills/2-plan-workflows/bmad-ux/assets/design-directions.md +9 -0
- package/src/bmm-skills/2-plan-workflows/bmad-ux/assets/design-example-editorial.md +158 -0
- package/src/bmm-skills/2-plan-workflows/bmad-ux/assets/design-example-mobile.md +93 -0
- package/src/bmm-skills/2-plan-workflows/bmad-ux/assets/design-example-shadcn.md +109 -0
- package/src/bmm-skills/2-plan-workflows/bmad-ux/assets/excalidraw-wireframe.md +19 -0
- package/src/bmm-skills/2-plan-workflows/bmad-ux/assets/experience-example-mobile.md +112 -0
- package/src/bmm-skills/2-plan-workflows/bmad-ux/assets/experience-example-shadcn.md +133 -0
- package/src/bmm-skills/2-plan-workflows/bmad-ux/assets/headless-schemas.md +84 -0
- package/src/bmm-skills/2-plan-workflows/bmad-ux/assets/key-screens.md +29 -0
- package/src/bmm-skills/2-plan-workflows/bmad-ux/assets/validation-report-template.html +319 -0
- package/src/bmm-skills/2-plan-workflows/bmad-ux/customize.toml +100 -0
- package/src/bmm-skills/2-plan-workflows/bmad-ux/references/creative-tools.md +19 -0
- package/src/bmm-skills/2-plan-workflows/bmad-ux/references/design-md-spec.md +50 -0
- package/src/bmm-skills/2-plan-workflows/bmad-ux/references/headless.md +37 -0
- package/src/bmm-skills/2-plan-workflows/bmad-ux/references/validate.md +115 -0
- package/src/bmm-skills/2-plan-workflows/bmad-validate-prd/SKILL.md +30 -0
- package/src/bmm-skills/2-plan-workflows/bmad-validate-prd/customize.toml +42 -0
- package/src/bmm-skills/3-solutioning/bmad-agent-architect/SKILL.md +76 -0
- package/src/bmm-skills/3-solutioning/bmad-agent-architect/customize.toml +65 -0
- package/src/bmm-skills/3-solutioning/bmad-architecture/SKILL.md +85 -0
- package/src/bmm-skills/3-solutioning/bmad-architecture/assets/spine-template.md +79 -0
- package/src/bmm-skills/3-solutioning/bmad-architecture/customize.toml +100 -0
- package/src/bmm-skills/3-solutioning/bmad-architecture/references/headless.md +26 -0
- package/src/bmm-skills/3-solutioning/bmad-architecture/references/reviewer-gate.md +13 -0
- package/src/bmm-skills/3-solutioning/bmad-architecture/scripts/lint_spine.py +257 -0
- package/src/bmm-skills/3-solutioning/bmad-architecture/scripts/tests/test_lint_spine.py +270 -0
- package/src/bmm-skills/3-solutioning/bmad-check-implementation-readiness/SKILL.md +91 -0
- package/src/bmm-skills/3-solutioning/bmad-check-implementation-readiness/customize.toml +41 -0
- package/src/bmm-skills/3-solutioning/bmad-check-implementation-readiness/steps/step-01-document-discovery.md +179 -0
- package/src/bmm-skills/3-solutioning/bmad-check-implementation-readiness/steps/step-02-prd-analysis.md +168 -0
- package/src/bmm-skills/3-solutioning/bmad-check-implementation-readiness/steps/step-03-epic-coverage-validation.md +169 -0
- package/src/bmm-skills/3-solutioning/bmad-check-implementation-readiness/steps/step-04-ux-alignment.md +129 -0
- package/src/bmm-skills/3-solutioning/bmad-check-implementation-readiness/steps/step-05-epic-quality-review.md +241 -0
- package/src/bmm-skills/3-solutioning/bmad-check-implementation-readiness/steps/step-06-final-assessment.md +132 -0
- package/src/bmm-skills/3-solutioning/bmad-check-implementation-readiness/templates/readiness-report-template.md +4 -0
- package/src/bmm-skills/3-solutioning/bmad-create-architecture/SKILL.md +30 -0
- package/src/bmm-skills/3-solutioning/bmad-create-architecture/customize.toml +41 -0
- package/src/bmm-skills/3-solutioning/bmad-create-epics-and-stories/SKILL.md +93 -0
- package/src/bmm-skills/3-solutioning/bmad-create-epics-and-stories/customize.toml +41 -0
- package/src/bmm-skills/3-solutioning/bmad-create-epics-and-stories/steps/step-01-validate-prerequisites.md +263 -0
- package/src/bmm-skills/3-solutioning/bmad-create-epics-and-stories/steps/step-02-design-epics.md +242 -0
- package/src/bmm-skills/3-solutioning/bmad-create-epics-and-stories/steps/step-03-create-stories.md +255 -0
- package/src/bmm-skills/3-solutioning/bmad-create-epics-and-stories/steps/step-04-final-validation.md +143 -0
- package/src/bmm-skills/3-solutioning/bmad-create-epics-and-stories/templates/epics-template.md +61 -0
- package/src/bmm-skills/3-solutioning/bmad-generate-project-context/SKILL.md +81 -0
- package/src/bmm-skills/3-solutioning/bmad-generate-project-context/customize.toml +41 -0
- package/src/bmm-skills/3-solutioning/bmad-generate-project-context/project-context-template.md +21 -0
- package/src/bmm-skills/3-solutioning/bmad-generate-project-context/steps/step-01-discover.md +186 -0
- package/src/bmm-skills/3-solutioning/bmad-generate-project-context/steps/step-02-generate.md +321 -0
- package/src/bmm-skills/3-solutioning/bmad-generate-project-context/steps/step-03-complete.md +284 -0
- package/src/bmm-skills/4-implementation/bmad-agent-dev/SKILL.md +76 -0
- package/src/bmm-skills/4-implementation/bmad-agent-dev/customize.toml +95 -0
- package/src/bmm-skills/4-implementation/bmad-checkpoint-preview/SKILL.md +68 -0
- package/src/bmm-skills/4-implementation/bmad-checkpoint-preview/customize.toml +41 -0
- package/src/bmm-skills/4-implementation/bmad-checkpoint-preview/generate-trail.md +38 -0
- package/src/bmm-skills/4-implementation/bmad-checkpoint-preview/step-01-orientation.md +105 -0
- package/src/bmm-skills/4-implementation/bmad-checkpoint-preview/step-02-walkthrough.md +89 -0
- package/src/bmm-skills/4-implementation/bmad-checkpoint-preview/step-03-detail-pass.md +106 -0
- package/src/bmm-skills/4-implementation/bmad-checkpoint-preview/step-04-testing.md +74 -0
- package/src/bmm-skills/4-implementation/bmad-checkpoint-preview/step-05-wrapup.md +30 -0
- package/src/bmm-skills/4-implementation/bmad-code-review/SKILL.md +93 -0
- package/src/bmm-skills/4-implementation/bmad-code-review/customize.toml +41 -0
- package/src/bmm-skills/4-implementation/bmad-code-review/steps/step-01-gather-context.md +85 -0
- package/src/bmm-skills/4-implementation/bmad-code-review/steps/step-02-review.md +35 -0
- package/src/bmm-skills/4-implementation/bmad-code-review/steps/step-03-triage.md +49 -0
- package/src/bmm-skills/4-implementation/bmad-code-review/steps/step-04-present.md +132 -0
- package/src/bmm-skills/4-implementation/bmad-correct-course/SKILL.md +301 -0
- package/src/bmm-skills/4-implementation/bmad-correct-course/checklist.md +288 -0
- package/src/bmm-skills/4-implementation/bmad-correct-course/customize.toml +41 -0
- package/src/bmm-skills/4-implementation/bmad-create-story/SKILL.md +432 -0
- package/src/bmm-skills/4-implementation/bmad-create-story/checklist.md +357 -0
- package/src/bmm-skills/4-implementation/bmad-create-story/customize.toml +41 -0
- package/src/bmm-skills/4-implementation/bmad-create-story/discover-inputs.md +88 -0
- package/src/bmm-skills/4-implementation/bmad-create-story/template.md +49 -0
- package/src/bmm-skills/4-implementation/bmad-dev-story/SKILL.md +500 -0
- package/src/bmm-skills/4-implementation/bmad-dev-story/checklist.md +80 -0
- package/src/bmm-skills/4-implementation/bmad-dev-story/customize.toml +41 -0
- package/src/bmm-skills/4-implementation/bmad-investigate/SKILL.md +196 -0
- package/src/bmm-skills/4-implementation/bmad-investigate/customize.toml +62 -0
- package/src/bmm-skills/4-implementation/bmad-investigate/references/case-file-template.md +127 -0
- package/src/bmm-skills/4-implementation/bmad-qa-generate-e2e-tests/SKILL.md +176 -0
- package/src/bmm-skills/4-implementation/bmad-qa-generate-e2e-tests/checklist.md +33 -0
- package/src/bmm-skills/4-implementation/bmad-qa-generate-e2e-tests/customize.toml +41 -0
- package/src/bmm-skills/4-implementation/bmad-quick-dev/SKILL.md +114 -0
- package/src/bmm-skills/4-implementation/bmad-quick-dev/compile-epic-context.md +62 -0
- package/src/bmm-skills/4-implementation/bmad-quick-dev/customize.toml +41 -0
- package/src/bmm-skills/4-implementation/bmad-quick-dev/spec-template.md +88 -0
- package/src/bmm-skills/4-implementation/bmad-quick-dev/step-01-clarify-and-route.md +100 -0
- package/src/bmm-skills/4-implementation/bmad-quick-dev/step-02-plan.md +47 -0
- package/src/bmm-skills/4-implementation/bmad-quick-dev/step-03-implement.md +41 -0
- package/src/bmm-skills/4-implementation/bmad-quick-dev/step-04-review.md +50 -0
- package/src/bmm-skills/4-implementation/bmad-quick-dev/step-05-present.md +78 -0
- package/src/bmm-skills/4-implementation/bmad-quick-dev/step-oneshot.md +71 -0
- package/src/bmm-skills/4-implementation/bmad-quick-dev/sync-sprint-status.md +19 -0
- package/src/bmm-skills/4-implementation/bmad-retrospective/SKILL.md +1527 -0
- package/src/bmm-skills/4-implementation/bmad-retrospective/customize.toml +41 -0
- package/src/bmm-skills/4-implementation/bmad-sprint-planning/SKILL.md +319 -0
- package/src/bmm-skills/4-implementation/bmad-sprint-planning/checklist.md +34 -0
- package/src/bmm-skills/4-implementation/bmad-sprint-planning/customize.toml +41 -0
- package/src/bmm-skills/4-implementation/bmad-sprint-planning/sprint-status-template.yaml +69 -0
- package/src/bmm-skills/4-implementation/bmad-sprint-status/SKILL.md +311 -0
- package/src/bmm-skills/4-implementation/bmad-sprint-status/customize.toml +41 -0
- package/src/bmm-skills/module-help.csv +32 -0
- package/src/bmm-skills/module.yaml +95 -0
- package/src/core-skills/bmad-advanced-elicitation/SKILL.md +142 -0
- package/src/core-skills/bmad-advanced-elicitation/methods.csv +70 -0
- package/src/core-skills/bmad-brainstorming/SKILL.md +82 -0
- package/src/core-skills/bmad-brainstorming/analysis/catalog-analysis.md +239 -0
- package/src/core-skills/bmad-brainstorming/analysis/method-matrix.csv +109 -0
- package/src/core-skills/bmad-brainstorming/assets/brain-icons.json +166 -0
- package/src/core-skills/bmad-brainstorming/assets/brain-methods.csv +109 -0
- package/src/core-skills/bmad-brainstorming/assets/brain-selector.html +326 -0
- package/src/core-skills/bmad-brainstorming/customize.toml +84 -0
- package/src/core-skills/bmad-brainstorming/references/converge.md +24 -0
- package/src/core-skills/bmad-brainstorming/references/finalize.md +26 -0
- package/src/core-skills/bmad-brainstorming/references/headless.md +54 -0
- package/src/core-skills/bmad-brainstorming/references/in-chat-techniques.md +18 -0
- package/src/core-skills/bmad-brainstorming/references/mode-autonomous.md +10 -0
- package/src/core-skills/bmad-brainstorming/references/mode-facilitator.md +11 -0
- package/src/core-skills/bmad-brainstorming/references/mode-partner.md +16 -0
- package/src/core-skills/bmad-brainstorming/references/resume.md +5 -0
- package/src/core-skills/bmad-brainstorming/scripts/brain.py +740 -0
- package/src/core-skills/bmad-brainstorming/scripts/memlog.py +202 -0
- package/src/core-skills/bmad-brainstorming/scripts/tests/test_brain.py +217 -0
- package/src/core-skills/bmad-brainstorming/scripts/tests/test_memlog.py +265 -0
- package/src/core-skills/bmad-customize/SKILL.md +111 -0
- package/src/core-skills/bmad-customize/scripts/list_customizable_skills.py +231 -0
- package/src/core-skills/bmad-customize/scripts/tests/test_list_customizable_skills.py +249 -0
- package/src/core-skills/bmad-editorial-review-prose/SKILL.md +86 -0
- package/src/core-skills/bmad-editorial-review-structure/SKILL.md +179 -0
- package/src/core-skills/bmad-help/SKILL.md +75 -0
- package/src/core-skills/bmad-index-docs/SKILL.md +66 -0
- package/src/core-skills/bmad-party-mode/SKILL.md +77 -0
- package/src/core-skills/bmad-party-mode/customize.toml +150 -0
- package/src/core-skills/bmad-party-mode/references/create-party.md +65 -0
- package/src/core-skills/bmad-party-mode/references/mode-agent-team.md +11 -0
- package/src/core-skills/bmad-party-mode/references/mode-auto.md +13 -0
- package/src/core-skills/bmad-party-mode/references/mode-subagent.md +19 -0
- package/src/core-skills/bmad-party-mode/scripts/resolve_party.py +267 -0
- package/src/core-skills/bmad-party-mode/scripts/tests/test-resolve_party.py +138 -0
- package/src/core-skills/bmad-review-adversarial-general/SKILL.md +37 -0
- package/src/core-skills/bmad-review-edge-case-hunter/SKILL.md +67 -0
- package/src/core-skills/bmad-shard-doc/SKILL.md +105 -0
- package/src/core-skills/bmad-spec/SKILL.md +145 -0
- package/src/core-skills/bmad-spec/assets/headless-schemas.md +33 -0
- package/src/core-skills/bmad-spec/assets/spec-template.md +49 -0
- package/src/core-skills/bmad-spec/customize.toml +53 -0
- package/src/core-skills/module-help.csv +13 -0
- package/src/core-skills/module.yaml +33 -0
- package/src/modules/wizz/README.md +39 -0
- package/src/modules/wizz/_shared/cerebro.md +24 -0
- package/src/modules/wizz/_shared/encerramento.md +36 -0
- package/src/modules/wizz/_shared/token-economy.md +28 -0
- package/src/modules/wizz/agents/wizz-ads/SKILL.md +30 -0
- package/src/modules/wizz/agents/wizz-ads/customize.toml +53 -0
- package/src/modules/wizz/agents/wizz-copy/SKILL.md +30 -0
- package/src/modules/wizz/agents/wizz-copy/customize.toml +53 -0
- package/src/modules/wizz/agents/wizz-designer/SKILL.md +38 -0
- package/src/modules/wizz/agents/wizz-designer/customize.toml +60 -0
- package/src/modules/wizz/agents/wizz-growth/SKILL.md +31 -0
- package/src/modules/wizz/agents/wizz-growth/customize.toml +58 -0
- package/src/modules/wizz/agents/wizz-maestro/SKILL.md +77 -0
- package/src/modules/wizz/agents/wizz-maestro/customize.toml +78 -0
- package/src/modules/wizz/agents/wizz-memoria/SKILL.md +31 -0
- package/src/modules/wizz/agents/wizz-memoria/customize.toml +57 -0
- package/src/modules/wizz/agents/wizz-qa/SKILL.md +31 -0
- package/src/modules/wizz/agents/wizz-qa/customize.toml +63 -0
- package/src/modules/wizz/agents/wizz-seo/SKILL.md +31 -0
- package/src/modules/wizz/agents/wizz-seo/customize.toml +58 -0
- package/src/modules/wizz/module.yaml +117 -0
- package/src/modules/wizz/overrides/bmad-agent-analyst.toml +35 -0
- package/src/modules/wizz/overrides/bmad-agent-architect.toml +39 -0
- package/src/modules/wizz/overrides/bmad-agent-dev.toml +40 -0
- package/src/modules/wizz/overrides/bmad-agent-pm.toml +23 -0
- package/src/modules/wizz/overrides/bmad-agent-tech-writer.toml +30 -0
- package/src/modules/wizz/overrides/bmad-agent-ux-designer.toml +26 -0
- package/src/modules/wizz/scripts/wizz-init.mjs +163 -0
- package/src/scripts/memlog.py +224 -0
- package/src/scripts/resolve_config.py +176 -0
- package/src/scripts/resolve_customization.py +238 -0
- package/src/scripts/tests/test_memlog.py +306 -0
- package/src/scripts/tests/test_resolve_customization.py +50 -0
- package/tools/bundle-web-bundles.js +117 -0
- package/tools/format-workflow-md.js +263 -0
- package/tools/installer/README.md +60 -0
- package/tools/installer/bmad-cli.js +105 -0
- package/tools/installer/cli-utils.js +53 -0
- package/tools/installer/commands/install.js +149 -0
- package/tools/installer/commands/status.js +65 -0
- package/tools/installer/commands/uninstall.js +167 -0
- package/tools/installer/core/config.js +73 -0
- package/tools/installer/core/existing-install.js +121 -0
- package/tools/installer/core/install-paths.js +132 -0
- package/tools/installer/core/installer.js +1653 -0
- package/tools/installer/core/legacy-warnings.js +151 -0
- package/tools/installer/core/manifest-generator.js +859 -0
- package/tools/installer/core/manifest.js +433 -0
- package/tools/installer/core/python-check.js +199 -0
- package/tools/installer/core/wsl-node-check.js +109 -0
- package/tools/installer/file-ops.js +204 -0
- package/tools/installer/fs-native.js +116 -0
- package/tools/installer/ide/_config-driven.js +972 -0
- package/tools/installer/ide/manager.js +324 -0
- package/tools/installer/ide/platform-codes.js +80 -0
- package/tools/installer/ide/platform-codes.yaml +329 -0
- package/tools/installer/ide/shared/installed-skills.js +50 -0
- package/tools/installer/ide/shared/path-utils.js +219 -0
- package/tools/installer/ide/shared/skill-manifest.js +57 -0
- package/tools/installer/install-messages.yaml +32 -0
- package/tools/installer/list-options.js +210 -0
- package/tools/installer/message-loader.js +83 -0
- package/tools/installer/modules/channel-plan.js +203 -0
- package/tools/installer/modules/channel-resolver.js +241 -0
- package/tools/installer/modules/custom-module-manager.js +912 -0
- package/tools/installer/modules/external-manager.js +527 -0
- package/tools/installer/modules/module-help-schema.js +13 -0
- package/tools/installer/modules/official-modules.js +2217 -0
- package/tools/installer/modules/plugin-resolver.js +398 -0
- package/tools/installer/modules/version-resolver.js +336 -0
- package/tools/installer/project-root.js +224 -0
- package/tools/installer/prompts.js +852 -0
- package/tools/installer/set-overrides.js +330 -0
- package/tools/installer/ui.js +2077 -0
- package/tools/installer/yaml-format.js +245 -0
- package/tools/javascript-conventions.md +5 -0
- package/tools/migrate-custom-module-paths.js +124 -0
- package/tools/skill-validator.md +368 -0
- package/tools/validate-sidebar-order.js +388 -0
- package/tools/validate-skills.js +698 -0
- package/tools/validate-svg-changes.sh +356 -0
- package/web-bundles/README.md +46 -0
- package/web-bundles/brainstorming-coach/INSTRUCTIONS.md +86 -0
- package/web-bundles/brainstorming-coach/SKILL.md +83 -0
- package/web-bundles/brainstorming-coach/brain-methods.csv +62 -0
- package/web-bundles/bundles.json +139 -0
- package/web-bundles/market-and-industry-research/INSTRUCTIONS.md +88 -0
- package/web-bundles/market-and-industry-research/SKILL.md +59 -0
- package/web-bundles/prd-coach/INSTRUCTIONS.md +86 -0
- package/web-bundles/prd-coach/SKILL.md +101 -0
- package/web-bundles/prd-coach/prd-template.md +165 -0
- package/web-bundles/prd-coach/prd-validation-checklist.md +135 -0
- package/web-bundles/prfaq-coach/INSTRUCTIONS.md +86 -0
- package/web-bundles/prfaq-coach/SKILL.md +139 -0
- package/web-bundles/product-brief-coach/INSTRUCTIONS.md +86 -0
- package/web-bundles/product-brief-coach/SKILL.md +113 -0
- package/web-bundles/ux-coach/INSTRUCTIONS.md +92 -0
- package/web-bundles/ux-coach/SKILL.md +187 -0
- package/web-bundles/ux-coach/ux-validation.md +100 -0
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# /// script
|
|
3
|
+
# requires-python = ">=3.8"
|
|
4
|
+
# ///
|
|
5
|
+
"""memlog — an append-only memory log: LLM-optimal working memory for a skill.
|
|
6
|
+
|
|
7
|
+
A memlog is the dense, chronological record of everything that mattered in a piece of
|
|
8
|
+
work — every item the user generated or accepted — kept minimal like human memory: only
|
|
9
|
+
what's important, never bloated. It persists ACROSS sessions, so a fresh session can
|
|
10
|
+
load it and continue. It is NOT a deliverable; downstream artifacts (a brief, a PRD, a
|
|
11
|
+
deck, a report) are *derived* from it on demand. The host skill supplies the vocabulary
|
|
12
|
+
by how it calls `append` — the tool stays neutral.
|
|
13
|
+
|
|
14
|
+
It is a FLAT log: there are no sections or grouping. Every entry is one line, recorded
|
|
15
|
+
at the END in the order it happened. The chronology itself is the structure — an event
|
|
16
|
+
like "started technique X" is just another entry, same as an idea or an insight.
|
|
17
|
+
|
|
18
|
+
Three invariants make it trustworthy:
|
|
19
|
+
|
|
20
|
+
1. Append-only, chronological. Entries land at the end, in the order they happen.
|
|
21
|
+
Nothing is ever inserted backward, reordered, edited, or removed. There is no
|
|
22
|
+
edit or delete subcommand by design; history is never rewritten.
|
|
23
|
+
2. Write-only / blind. Every command is an atomic, context-free write and echoes the
|
|
24
|
+
new state as one line of JSON, so the caller never re-reads the file mid-session.
|
|
25
|
+
The one time the file is read is on resume — and the caller reads it itself, not
|
|
26
|
+
via this script.
|
|
27
|
+
3. No lifecycle status. A memory log has no "complete" flag. Whether the work is done,
|
|
28
|
+
blocked, or paused is itself a fact that happened, so it is recorded as an entry
|
|
29
|
+
(e.g. `append --type event --text "session complete"`), never as frontmatter the
|
|
30
|
+
log would have to mutate. The chronology stays the single source of truth, and a
|
|
31
|
+
resume learns the state by reading the last entries — the same way it learns
|
|
32
|
+
everything else.
|
|
33
|
+
|
|
34
|
+
Atomicity: every write goes to a temp file, is flushed and fsync'd, then atomically
|
|
35
|
+
renamed over the target, so a crash never leaves a half-written entry.
|
|
36
|
+
|
|
37
|
+
The file shape (.memlog.md):
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
topic: Onboarding flow for a budgeting app
|
|
41
|
+
goal: lift week-1 retention
|
|
42
|
+
updated: 2026-06-07T14:22
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
- (note) user picked techniques: SCAMPER, then Six Thinking Hats
|
|
46
|
+
- (technique) started SCAMPER
|
|
47
|
+
- (idea) skip the signup wall: let people try with sample data first
|
|
48
|
+
- (idea) auto-import one bank account so the first screen shows real numbers
|
|
49
|
+
- (question) is open-banking consent too heavy for step one?
|
|
50
|
+
- (insight) the "scary numbers" risk and the "real numbers" idea are one lever: show real data, pre-categorized
|
|
51
|
+
- (direction) optimize for the anxious first-timer, not the power user
|
|
52
|
+
- (decision) lead with one pre-categorized account; defer multi-account import
|
|
53
|
+
- (event) session complete
|
|
54
|
+
|
|
55
|
+
Each entry may carry an optional `--type` — what KIND it is (idea, insight, question,
|
|
56
|
+
decision, direction, assumption, gap, note, event, …) — and an optional `--by` naming
|
|
57
|
+
who it came from (e.g. `user`, `coach`), for sessions where authorship matters. Both
|
|
58
|
+
render into one short inline tag: `(idea)`, `(idea by user)`, `(by coach)`. Omit them
|
|
59
|
+
for a plain note. The host skill names the vocabulary; the script does not enforce one.
|
|
60
|
+
|
|
61
|
+
Commands:
|
|
62
|
+
init (--workspace DIR | --path FILE) [--field k=v ...] create the memlog (errors if it exists)
|
|
63
|
+
append (--workspace DIR | --path FILE) --text STR [--type T] [--by W] append one entry at the end
|
|
64
|
+
set (--workspace DIR | --path FILE) --key K --value V set/replace a descriptive frontmatter field
|
|
65
|
+
|
|
66
|
+
Addressing: `--workspace` is the run folder, and the memlog is always {workspace}/.memlog.md.
|
|
67
|
+
`--path` points straight at the memlog file instead, for callers that already hold the path.
|
|
68
|
+
"""
|
|
69
|
+
from __future__ import annotations # keep type-hint syntax lazy so the script runs on 3.8+
|
|
70
|
+
|
|
71
|
+
import argparse
|
|
72
|
+
import json
|
|
73
|
+
import os
|
|
74
|
+
import sys
|
|
75
|
+
from datetime import datetime
|
|
76
|
+
from pathlib import Path
|
|
77
|
+
|
|
78
|
+
MEMLOG = ".memlog.md"
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def now() -> str:
|
|
82
|
+
return datetime.now().strftime("%Y-%m-%dT%H:%M")
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def resolve(args) -> Path:
|
|
86
|
+
"""The memlog file, from either addressing mode: {workspace}/.memlog.md or an explicit --path."""
|
|
87
|
+
return Path(args.path) if args.path else Path(args.workspace) / MEMLOG
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def split(text: str) -> tuple[dict, str]:
|
|
91
|
+
"""Return (frontmatter dict in source order, body str). Frontmatter is plain key: value.
|
|
92
|
+
|
|
93
|
+
The closing fence is the first line that is *exactly* `---`, so a `---` inside a
|
|
94
|
+
field value (topic/goal are free user text) never truncates the frontmatter.
|
|
95
|
+
"""
|
|
96
|
+
lines = text.splitlines()
|
|
97
|
+
if not lines or lines[0] != "---":
|
|
98
|
+
raise ValueError(".memlog.md has no frontmatter")
|
|
99
|
+
end = next((i for i in range(1, len(lines)) if lines[i] == "---"), None)
|
|
100
|
+
if end is None:
|
|
101
|
+
raise ValueError(".memlog.md frontmatter is not terminated")
|
|
102
|
+
meta: dict[str, str] = {}
|
|
103
|
+
for line in lines[1:end]:
|
|
104
|
+
if ":" in line:
|
|
105
|
+
k, v = line.split(":", 1)
|
|
106
|
+
meta[k.strip()] = v.strip()
|
|
107
|
+
return meta, "\n".join(lines[end + 1:]).lstrip("\n")
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def render(meta: dict, body: str) -> str:
|
|
111
|
+
# Neutralize newlines in values so a multi-line field can't break the fence on re-read.
|
|
112
|
+
fm = "\n".join(f"{k}: {' '.join(str(v).splitlines())}" for k, v in meta.items())
|
|
113
|
+
return "---\n" + fm + "\n---\n\n" + body.rstrip("\n") + "\n"
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def touch(meta: dict) -> None:
|
|
117
|
+
"""Stamp `updated` and keep it last so the field order stays predictable."""
|
|
118
|
+
meta.pop("updated", None)
|
|
119
|
+
meta["updated"] = now()
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def write_atomic(path: Path, text: str) -> None:
|
|
123
|
+
"""Temp + flush + fsync + atomic rename, so a crash never half-writes an entry."""
|
|
124
|
+
tmp = path.with_suffix(path.suffix + ".tmp")
|
|
125
|
+
with open(tmp, "w", encoding="utf-8") as f:
|
|
126
|
+
f.write(text)
|
|
127
|
+
f.flush()
|
|
128
|
+
os.fsync(f.fileno())
|
|
129
|
+
os.replace(tmp, path)
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def entry_count(body: str) -> int:
|
|
133
|
+
return sum(1 for ln in body.splitlines() if ln.startswith("- "))
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def ack(path: Path, body: str) -> None:
|
|
137
|
+
"""Echo new state so the caller never re-reads the file to know where it stands."""
|
|
138
|
+
print(json.dumps({
|
|
139
|
+
"ok": True,
|
|
140
|
+
"memlog": str(path),
|
|
141
|
+
"entries": entry_count(body),
|
|
142
|
+
}))
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
def cmd_init(args) -> int:
|
|
146
|
+
path = resolve(args)
|
|
147
|
+
if path.exists():
|
|
148
|
+
print(f"error: {path} already exists; use append/set to update it", file=sys.stderr)
|
|
149
|
+
return 2
|
|
150
|
+
path.parent.mkdir(parents=True, exist_ok=True)
|
|
151
|
+
meta: dict[str, str] = {}
|
|
152
|
+
for pair in args.field or []:
|
|
153
|
+
if "=" not in pair:
|
|
154
|
+
print(f"error: --field expects key=value, got {pair!r}", file=sys.stderr)
|
|
155
|
+
return 2
|
|
156
|
+
k, v = pair.split("=", 1)
|
|
157
|
+
meta[k.strip()] = v.strip()
|
|
158
|
+
touch(meta)
|
|
159
|
+
write_atomic(path, render(meta, ""))
|
|
160
|
+
ack(path, "")
|
|
161
|
+
return 0
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
def cmd_append(args) -> int:
|
|
165
|
+
path = resolve(args)
|
|
166
|
+
meta, body = split(path.read_text(encoding="utf-8"))
|
|
167
|
+
text = " ".join(args.text.split()) # collapse newlines/runs → one-line entry, no prose bloat
|
|
168
|
+
label = args.type or ""
|
|
169
|
+
if args.by:
|
|
170
|
+
label = f"{label} by {args.by}".strip() # attribution: "(idea by user)" / "(by coach)"
|
|
171
|
+
tag = f"({label}) " if label else ""
|
|
172
|
+
entry = f"- {tag}{text}"
|
|
173
|
+
body = (body.rstrip("\n") + "\n" + entry) if body.strip() else entry # always at the end
|
|
174
|
+
touch(meta)
|
|
175
|
+
write_atomic(path, render(meta, body))
|
|
176
|
+
ack(path, body)
|
|
177
|
+
return 0
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
def cmd_set(args) -> int:
|
|
181
|
+
path = resolve(args)
|
|
182
|
+
meta, body = split(path.read_text(encoding="utf-8"))
|
|
183
|
+
meta[args.key] = args.value
|
|
184
|
+
touch(meta)
|
|
185
|
+
write_atomic(path, render(meta, body))
|
|
186
|
+
ack(path, body)
|
|
187
|
+
return 0
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
def add_target(sp) -> None:
|
|
191
|
+
"""Every command addresses the memlog the same way: a run folder or an explicit path."""
|
|
192
|
+
g = sp.add_mutually_exclusive_group(required=True)
|
|
193
|
+
g.add_argument("--workspace", help="run folder; the memlog is {workspace}/.memlog.md")
|
|
194
|
+
g.add_argument("--path", help="explicit memlog file path (alternative to --workspace)")
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
def main(argv: list[str] | None = None) -> int:
|
|
198
|
+
p = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter)
|
|
199
|
+
sub = p.add_subparsers(dest="cmd", required=True)
|
|
200
|
+
|
|
201
|
+
pi = sub.add_parser("init", help="create the memlog")
|
|
202
|
+
add_target(pi)
|
|
203
|
+
pi.add_argument("--field", action="append", metavar="KEY=VALUE", help="frontmatter field (repeatable)")
|
|
204
|
+
pi.set_defaults(func=cmd_init)
|
|
205
|
+
|
|
206
|
+
pa = sub.add_parser("append", help="append one entry at the end")
|
|
207
|
+
add_target(pa)
|
|
208
|
+
pa.add_argument("--text", required=True)
|
|
209
|
+
pa.add_argument("--type", help="entry kind, rendered as an inline tag")
|
|
210
|
+
pa.add_argument("--by", help="who the entry came from (e.g. user, coach); rendered into the tag")
|
|
211
|
+
pa.set_defaults(func=cmd_append)
|
|
212
|
+
|
|
213
|
+
pset = sub.add_parser("set", help="set a descriptive frontmatter field")
|
|
214
|
+
add_target(pset)
|
|
215
|
+
pset.add_argument("--key", required=True)
|
|
216
|
+
pset.add_argument("--value", required=True)
|
|
217
|
+
pset.set_defaults(func=cmd_set)
|
|
218
|
+
|
|
219
|
+
args = p.parse_args(argv)
|
|
220
|
+
return args.func(args)
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
if __name__ == "__main__":
|
|
224
|
+
sys.exit(main())
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Resolve BMad's central config using four-layer TOML merge.
|
|
4
|
+
|
|
5
|
+
Reads from four layers (highest priority last):
|
|
6
|
+
1. {project-root}/_bmad/config.toml (installer-owned team)
|
|
7
|
+
2. {project-root}/_bmad/config.user.toml (installer-owned user)
|
|
8
|
+
3. {project-root}/_bmad/custom/config.toml (human-authored team, committed)
|
|
9
|
+
4. {project-root}/_bmad/custom/config.user.toml (human-authored user, gitignored)
|
|
10
|
+
|
|
11
|
+
Outputs merged JSON to stdout. Errors go to stderr.
|
|
12
|
+
|
|
13
|
+
Requires Python 3.11+ (uses stdlib `tomllib`). No `uv`, no `pip install`,
|
|
14
|
+
no virtualenv — plain `python3` is sufficient.
|
|
15
|
+
|
|
16
|
+
python3 resolve_config.py --project-root /abs/path/to/project
|
|
17
|
+
python3 resolve_config.py --project-root ... --key core
|
|
18
|
+
python3 resolve_config.py --project-root ... --key agents
|
|
19
|
+
|
|
20
|
+
Merge rules (same as resolve_customization.py):
|
|
21
|
+
- Scalars: override wins
|
|
22
|
+
- Tables: deep merge
|
|
23
|
+
- Arrays of tables where every item shares `code` or `id`: merge by that key
|
|
24
|
+
- All other arrays: append
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
import argparse
|
|
28
|
+
import json
|
|
29
|
+
import sys
|
|
30
|
+
from pathlib import Path
|
|
31
|
+
|
|
32
|
+
try:
|
|
33
|
+
import tomllib
|
|
34
|
+
except ImportError:
|
|
35
|
+
sys.stderr.write(
|
|
36
|
+
"error: Python 3.11+ is required (stdlib `tomllib` not found).\n"
|
|
37
|
+
)
|
|
38
|
+
sys.exit(3)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
_MISSING = object()
|
|
42
|
+
_KEYED_MERGE_FIELDS = ("code", "id")
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def load_toml(file_path: Path, required: bool = False) -> dict:
|
|
46
|
+
if not file_path.exists():
|
|
47
|
+
if required:
|
|
48
|
+
sys.stderr.write(f"error: required config file not found: {file_path}\n")
|
|
49
|
+
sys.exit(1)
|
|
50
|
+
return {}
|
|
51
|
+
try:
|
|
52
|
+
with file_path.open("rb") as f:
|
|
53
|
+
parsed = tomllib.load(f)
|
|
54
|
+
if not isinstance(parsed, dict):
|
|
55
|
+
return {}
|
|
56
|
+
return parsed
|
|
57
|
+
except tomllib.TOMLDecodeError as error:
|
|
58
|
+
level = "error" if required else "warning"
|
|
59
|
+
sys.stderr.write(f"{level}: failed to parse {file_path}: {error}\n")
|
|
60
|
+
if required:
|
|
61
|
+
sys.exit(1)
|
|
62
|
+
return {}
|
|
63
|
+
except OSError as error:
|
|
64
|
+
level = "error" if required else "warning"
|
|
65
|
+
sys.stderr.write(f"{level}: failed to read {file_path}: {error}\n")
|
|
66
|
+
if required:
|
|
67
|
+
sys.exit(1)
|
|
68
|
+
return {}
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def _detect_keyed_merge_field(items):
|
|
72
|
+
if not items or not all(isinstance(item, dict) for item in items):
|
|
73
|
+
return None
|
|
74
|
+
for candidate in _KEYED_MERGE_FIELDS:
|
|
75
|
+
if all(item.get(candidate) is not None for item in items):
|
|
76
|
+
return candidate
|
|
77
|
+
return None
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def _merge_by_key(base, override, key_name):
|
|
81
|
+
result = []
|
|
82
|
+
index_by_key = {}
|
|
83
|
+
for item in base:
|
|
84
|
+
if not isinstance(item, dict):
|
|
85
|
+
continue
|
|
86
|
+
if item.get(key_name) is not None:
|
|
87
|
+
index_by_key[item[key_name]] = len(result)
|
|
88
|
+
result.append(dict(item))
|
|
89
|
+
for item in override:
|
|
90
|
+
if not isinstance(item, dict):
|
|
91
|
+
result.append(item)
|
|
92
|
+
continue
|
|
93
|
+
key = item.get(key_name)
|
|
94
|
+
if key is not None and key in index_by_key:
|
|
95
|
+
result[index_by_key[key]] = dict(item)
|
|
96
|
+
else:
|
|
97
|
+
if key is not None:
|
|
98
|
+
index_by_key[key] = len(result)
|
|
99
|
+
result.append(dict(item))
|
|
100
|
+
return result
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
def _merge_arrays(base, override):
|
|
104
|
+
base_arr = base if isinstance(base, list) else []
|
|
105
|
+
override_arr = override if isinstance(override, list) else []
|
|
106
|
+
keyed_field = _detect_keyed_merge_field(base_arr + override_arr)
|
|
107
|
+
if keyed_field:
|
|
108
|
+
return _merge_by_key(base_arr, override_arr, keyed_field)
|
|
109
|
+
return base_arr + override_arr
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def deep_merge(base, override):
|
|
113
|
+
if isinstance(base, dict) and isinstance(override, dict):
|
|
114
|
+
result = dict(base)
|
|
115
|
+
for key, over_val in override.items():
|
|
116
|
+
if key in result:
|
|
117
|
+
result[key] = deep_merge(result[key], over_val)
|
|
118
|
+
else:
|
|
119
|
+
result[key] = over_val
|
|
120
|
+
return result
|
|
121
|
+
if isinstance(base, list) and isinstance(override, list):
|
|
122
|
+
return _merge_arrays(base, override)
|
|
123
|
+
return override
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def extract_key(data, dotted_key: str):
|
|
127
|
+
parts = dotted_key.split(".")
|
|
128
|
+
current = data
|
|
129
|
+
for part in parts:
|
|
130
|
+
if isinstance(current, dict) and part in current:
|
|
131
|
+
current = current[part]
|
|
132
|
+
else:
|
|
133
|
+
return _MISSING
|
|
134
|
+
return current
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
def main():
|
|
138
|
+
parser = argparse.ArgumentParser(
|
|
139
|
+
description="Resolve BMad central config using four-layer TOML merge.",
|
|
140
|
+
)
|
|
141
|
+
parser.add_argument(
|
|
142
|
+
"--project-root", "-p", required=True,
|
|
143
|
+
help="Absolute path to the project root (contains _bmad/)",
|
|
144
|
+
)
|
|
145
|
+
parser.add_argument(
|
|
146
|
+
"--key", "-k", action="append", default=[],
|
|
147
|
+
help="Dotted field path to resolve (repeatable). Omit for full dump.",
|
|
148
|
+
)
|
|
149
|
+
args = parser.parse_args()
|
|
150
|
+
|
|
151
|
+
project_root = Path(args.project_root).resolve()
|
|
152
|
+
bmad_dir = project_root / "_bmad"
|
|
153
|
+
|
|
154
|
+
base_team = load_toml(bmad_dir / "config.toml", required=True)
|
|
155
|
+
base_user = load_toml(bmad_dir / "config.user.toml")
|
|
156
|
+
custom_team = load_toml(bmad_dir / "custom" / "config.toml")
|
|
157
|
+
custom_user = load_toml(bmad_dir / "custom" / "config.user.toml")
|
|
158
|
+
|
|
159
|
+
merged = deep_merge(base_team, base_user)
|
|
160
|
+
merged = deep_merge(merged, custom_team)
|
|
161
|
+
merged = deep_merge(merged, custom_user)
|
|
162
|
+
|
|
163
|
+
if args.key:
|
|
164
|
+
output = {}
|
|
165
|
+
for key in args.key:
|
|
166
|
+
value = extract_key(merged, key)
|
|
167
|
+
if value is not _MISSING:
|
|
168
|
+
output[key] = value
|
|
169
|
+
else:
|
|
170
|
+
output = merged
|
|
171
|
+
|
|
172
|
+
sys.stdout.write(json.dumps(output, indent=2, ensure_ascii=False) + "\n")
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
if __name__ == "__main__":
|
|
176
|
+
main()
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Resolve customization for a BMad skill using three-layer TOML merge.
|
|
4
|
+
|
|
5
|
+
Reads customization from three layers (highest priority first):
|
|
6
|
+
1. {project-root}/_bmad/custom/{name}.user.toml (personal, gitignored)
|
|
7
|
+
2. {project-root}/_bmad/custom/{name}.toml (team/org, committed)
|
|
8
|
+
3. {skill-root}/customize.toml (skill defaults)
|
|
9
|
+
|
|
10
|
+
Skill name is derived from the basename of the skill directory.
|
|
11
|
+
|
|
12
|
+
Outputs merged JSON to stdout. Errors go to stderr.
|
|
13
|
+
|
|
14
|
+
Requires Python 3.11+ (uses stdlib `tomllib`). No `uv`, no `pip install`,
|
|
15
|
+
no virtualenv — plain `python3` is sufficient.
|
|
16
|
+
|
|
17
|
+
python3 resolve_customization.py --skill /abs/path/to/skill-dir
|
|
18
|
+
python3 resolve_customization.py --skill ... --key agent
|
|
19
|
+
python3 resolve_customization.py --skill ... --key agent.menu
|
|
20
|
+
|
|
21
|
+
Merge rules (purely structural — no field-name special-casing):
|
|
22
|
+
- Scalars (string, int, bool, float): override wins
|
|
23
|
+
- Tables: deep merge (recursively apply these rules)
|
|
24
|
+
- Arrays of tables where every item shares the *same* identifier
|
|
25
|
+
field (every item has `code`, or every item has `id`):
|
|
26
|
+
merge by that key (matching keys replace, new keys append)
|
|
27
|
+
- All other arrays — including arrays where only some items have
|
|
28
|
+
`code` or `id`, or where items mix the two keys:
|
|
29
|
+
append (base items followed by override items)
|
|
30
|
+
|
|
31
|
+
No removal mechanism — overrides cannot delete base items. To suppress
|
|
32
|
+
a default, fork the skill or override the item by code with a no-op
|
|
33
|
+
description/prompt.
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
import argparse
|
|
37
|
+
import json
|
|
38
|
+
import sys
|
|
39
|
+
from pathlib import Path
|
|
40
|
+
|
|
41
|
+
try:
|
|
42
|
+
import tomllib
|
|
43
|
+
except ImportError:
|
|
44
|
+
sys.stderr.write(
|
|
45
|
+
"error: Python 3.11+ is required (stdlib `tomllib` not found).\n"
|
|
46
|
+
"Install a newer Python or run the resolution manually per the\n"
|
|
47
|
+
"fallback instructions in the skill's SKILL.md.\n"
|
|
48
|
+
)
|
|
49
|
+
sys.exit(3)
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
_MISSING = object()
|
|
53
|
+
_KEYED_MERGE_FIELDS = ("code", "id")
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def find_project_root(start: Path):
|
|
57
|
+
current = start.resolve()
|
|
58
|
+
while True:
|
|
59
|
+
if (current / "_bmad").exists() or (current / ".git").exists():
|
|
60
|
+
return current
|
|
61
|
+
parent = current.parent
|
|
62
|
+
if parent == current:
|
|
63
|
+
return None
|
|
64
|
+
current = parent
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def load_toml(file_path: Path, required: bool = False) -> dict:
|
|
68
|
+
if not file_path.exists():
|
|
69
|
+
if required:
|
|
70
|
+
sys.stderr.write(f"error: required customization file not found: {file_path}\n")
|
|
71
|
+
sys.exit(1)
|
|
72
|
+
return {}
|
|
73
|
+
try:
|
|
74
|
+
with file_path.open("rb") as f:
|
|
75
|
+
parsed = tomllib.load(f)
|
|
76
|
+
if not isinstance(parsed, dict):
|
|
77
|
+
if required:
|
|
78
|
+
sys.stderr.write(f"error: {file_path} did not parse to a table\n")
|
|
79
|
+
sys.exit(1)
|
|
80
|
+
return {}
|
|
81
|
+
return parsed
|
|
82
|
+
except tomllib.TOMLDecodeError as error:
|
|
83
|
+
level = "error" if required else "warning"
|
|
84
|
+
sys.stderr.write(f"{level}: failed to parse {file_path}: {error}\n")
|
|
85
|
+
if required:
|
|
86
|
+
sys.exit(1)
|
|
87
|
+
return {}
|
|
88
|
+
except OSError as error:
|
|
89
|
+
level = "error" if required else "warning"
|
|
90
|
+
sys.stderr.write(f"{level}: failed to read {file_path}: {error}\n")
|
|
91
|
+
if required:
|
|
92
|
+
sys.exit(1)
|
|
93
|
+
return {}
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def _detect_keyed_merge_field(items):
|
|
97
|
+
"""Return 'code' or 'id' if every table item carries that *same* field.
|
|
98
|
+
|
|
99
|
+
All items must share the same identifier (all `code`, or all `id`).
|
|
100
|
+
Mixed arrays — where some items use `code` and others use `id` —
|
|
101
|
+
return None and fall through to append semantics. This is intentional:
|
|
102
|
+
mixing identifier keys within one array is a schema smell, and
|
|
103
|
+
append-fallback is safer than guessing which key should merge.
|
|
104
|
+
"""
|
|
105
|
+
if not items or not all(isinstance(item, dict) for item in items):
|
|
106
|
+
return None
|
|
107
|
+
for candidate in _KEYED_MERGE_FIELDS:
|
|
108
|
+
if all(item.get(candidate) is not None for item in items):
|
|
109
|
+
return candidate
|
|
110
|
+
return None
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def _merge_by_key(base, override, key_name):
|
|
114
|
+
result = []
|
|
115
|
+
index_by_key = {}
|
|
116
|
+
|
|
117
|
+
for item in base:
|
|
118
|
+
if not isinstance(item, dict):
|
|
119
|
+
continue
|
|
120
|
+
if item.get(key_name) is not None:
|
|
121
|
+
index_by_key[item[key_name]] = len(result)
|
|
122
|
+
result.append(dict(item))
|
|
123
|
+
|
|
124
|
+
for item in override:
|
|
125
|
+
if not isinstance(item, dict):
|
|
126
|
+
result.append(item)
|
|
127
|
+
continue
|
|
128
|
+
key = item.get(key_name)
|
|
129
|
+
if key is not None and key in index_by_key:
|
|
130
|
+
result[index_by_key[key]] = dict(item)
|
|
131
|
+
else:
|
|
132
|
+
if key is not None:
|
|
133
|
+
index_by_key[key] = len(result)
|
|
134
|
+
result.append(dict(item))
|
|
135
|
+
|
|
136
|
+
return result
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
def _merge_arrays(base, override):
|
|
140
|
+
"""Shape-aware array merge. Base + override combined tables may opt into
|
|
141
|
+
keyed merge if every item has `code` or `id`. Otherwise: append."""
|
|
142
|
+
base_arr = base if isinstance(base, list) else []
|
|
143
|
+
override_arr = override if isinstance(override, list) else []
|
|
144
|
+
keyed_field = _detect_keyed_merge_field(base_arr + override_arr)
|
|
145
|
+
if keyed_field:
|
|
146
|
+
return _merge_by_key(base_arr, override_arr, keyed_field)
|
|
147
|
+
return base_arr + override_arr
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
def deep_merge(base, override):
|
|
151
|
+
"""Recursively merge override into base using structural rules.
|
|
152
|
+
- Table + table: deep merge
|
|
153
|
+
- Array + array: shape-aware (keyed merge if all items have code/id, else append)
|
|
154
|
+
- Anything else: override wins
|
|
155
|
+
"""
|
|
156
|
+
if isinstance(base, dict) and isinstance(override, dict):
|
|
157
|
+
result = dict(base)
|
|
158
|
+
for key, over_val in override.items():
|
|
159
|
+
if key in result:
|
|
160
|
+
result[key] = deep_merge(result[key], over_val)
|
|
161
|
+
else:
|
|
162
|
+
result[key] = over_val
|
|
163
|
+
return result
|
|
164
|
+
if isinstance(base, list) and isinstance(override, list):
|
|
165
|
+
return _merge_arrays(base, override)
|
|
166
|
+
return override
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
def extract_key(data, dotted_key: str):
|
|
170
|
+
parts = dotted_key.split(".")
|
|
171
|
+
current = data
|
|
172
|
+
for part in parts:
|
|
173
|
+
if isinstance(current, dict) and part in current:
|
|
174
|
+
current = current[part]
|
|
175
|
+
else:
|
|
176
|
+
return _MISSING
|
|
177
|
+
return current
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
def write_json_stdout(output):
|
|
181
|
+
"""Write JSON as UTF-8 so Windows cp1252 stdout can carry emoji icons."""
|
|
182
|
+
reconfigure = getattr(sys.stdout, "reconfigure", None)
|
|
183
|
+
if reconfigure is not None:
|
|
184
|
+
reconfigure(encoding="utf-8")
|
|
185
|
+
sys.stdout.write(json.dumps(output, indent=2, ensure_ascii=False) + "\n")
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
def main():
|
|
189
|
+
parser = argparse.ArgumentParser(
|
|
190
|
+
description="Resolve customization for a BMad skill using three-layer TOML merge.",
|
|
191
|
+
add_help=True,
|
|
192
|
+
)
|
|
193
|
+
parser.add_argument(
|
|
194
|
+
"--skill", "-s", required=True,
|
|
195
|
+
help="Absolute path to the skill directory (must contain customize.toml)",
|
|
196
|
+
)
|
|
197
|
+
parser.add_argument(
|
|
198
|
+
"--key", "-k", action="append", default=[],
|
|
199
|
+
help="Dotted field path to resolve (repeatable). Omit for full dump.",
|
|
200
|
+
)
|
|
201
|
+
args = parser.parse_args()
|
|
202
|
+
|
|
203
|
+
skill_dir = Path(args.skill).resolve()
|
|
204
|
+
skill_name = skill_dir.name
|
|
205
|
+
defaults_path = skill_dir / "customize.toml"
|
|
206
|
+
|
|
207
|
+
defaults = load_toml(defaults_path, required=True)
|
|
208
|
+
|
|
209
|
+
# Prefer the project that contains this skill. Only fall back to cwd if
|
|
210
|
+
# the skill isn't inside a recognizable project tree (unusual but possible
|
|
211
|
+
# for standalone skills invoked directly). Using cwd first is unsafe when
|
|
212
|
+
# an ancestor of cwd happens to have a stray _bmad/ from another project.
|
|
213
|
+
project_root = find_project_root(skill_dir) or find_project_root(Path.cwd())
|
|
214
|
+
|
|
215
|
+
team = {}
|
|
216
|
+
user = {}
|
|
217
|
+
if project_root:
|
|
218
|
+
custom_dir = project_root / "_bmad" / "custom"
|
|
219
|
+
team = load_toml(custom_dir / f"{skill_name}.toml")
|
|
220
|
+
user = load_toml(custom_dir / f"{skill_name}.user.toml")
|
|
221
|
+
|
|
222
|
+
merged = deep_merge(defaults, team)
|
|
223
|
+
merged = deep_merge(merged, user)
|
|
224
|
+
|
|
225
|
+
if args.key:
|
|
226
|
+
output = {}
|
|
227
|
+
for key in args.key:
|
|
228
|
+
value = extract_key(merged, key)
|
|
229
|
+
if value is not _MISSING:
|
|
230
|
+
output[key] = value
|
|
231
|
+
else:
|
|
232
|
+
output = merged
|
|
233
|
+
|
|
234
|
+
write_json_stdout(output)
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
if __name__ == "__main__":
|
|
238
|
+
main()
|