bmad-method 6.0.5-next.8 → 6.1.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.
Files changed (262) hide show
  1. package/package.json +1 -1
  2. package/src/bmm/agents/analyst.agent.yaml +1 -1
  3. package/src/bmm/module-help.csv +1 -1
  4. package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-02-vision.md +1 -1
  5. package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-03-users.md +1 -1
  6. package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-04-metrics.md +1 -1
  7. package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-05-scope.md +1 -1
  8. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-02-discovery.md +1 -1
  9. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-02b-vision.md +1 -1
  10. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-02c-executive-summary.md +1 -1
  11. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-03-success.md +1 -1
  12. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-04-journeys.md +1 -1
  13. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-05-domain.md +1 -1
  14. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-06-innovation.md +1 -1
  15. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-07-project-type.md +1 -1
  16. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-08-scoping.md +1 -1
  17. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-09-functional.md +1 -1
  18. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-10-nonfunctional.md +1 -1
  19. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-11-polish.md +1 -1
  20. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-01-discovery.md +1 -1
  21. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-01-discovery.md +1 -1
  22. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-02-discovery.md +1 -1
  23. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-03-core-experience.md +2 -2
  24. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-04-emotional-response.md +2 -2
  25. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-05-inspiration.md +2 -2
  26. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-06-design-system.md +2 -2
  27. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-07-defining-experience.md +2 -2
  28. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-08-visual-foundation.md +2 -2
  29. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-09-design-directions.md +2 -2
  30. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-10-user-journeys.md +2 -2
  31. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-11-component-strategy.md +2 -2
  32. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-12-ux-patterns.md +2 -2
  33. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-13-responsive-accessibility.md +2 -2
  34. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-02-context.md +2 -2
  35. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-03-starter.md +2 -2
  36. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-04-decisions.md +2 -2
  37. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-05-patterns.md +2 -2
  38. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-06-structure.md +2 -2
  39. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-07-validation.md +2 -2
  40. package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-01-validate-prerequisites.md +31 -13
  41. package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-02-design-epics.md +1 -1
  42. package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-03-create-stories.md +6 -2
  43. package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-04-final-validation.md +1 -1
  44. package/src/bmm/workflows/3-solutioning/create-epics-and-stories/templates/epics-template.md +4 -0
  45. package/src/bmm/workflows/4-implementation/code-review/workflow.md +4 -7
  46. package/src/bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview/workflow.md +0 -4
  47. package/src/bmm/workflows/bmad-quick-flow/quick-dev/workflow.md +1 -1
  48. package/src/bmm/workflows/bmad-quick-flow/quick-spec/workflow.md +1 -1
  49. package/src/bmm/workflows/generate-project-context/steps/step-02-generate.md +1 -1
  50. package/src/core/module-help.csv +2 -2
  51. package/src/core/workflows/bmad-brainstorming/SKILL.md +6 -0
  52. package/src/core/workflows/bmad-brainstorming/bmad-skill-manifest.yaml +1 -0
  53. package/src/core/workflows/{brainstorming → bmad-brainstorming}/workflow.md +2 -5
  54. package/src/core/workflows/bmad-party-mode/SKILL.md +6 -0
  55. package/src/core/workflows/bmad-party-mode/bmad-skill-manifest.yaml +1 -0
  56. package/src/core/workflows/{party-mode → bmad-party-mode}/steps/step-03-graceful-exit.md +0 -1
  57. package/src/core/workflows/{party-mode → bmad-party-mode}/workflow.md +0 -4
  58. package/tools/cli/external-official-modules.yaml +18 -18
  59. package/tools/cli/installers/lib/core/installer.js +25 -8
  60. package/tools/cli/installers/lib/ide/_base-ide.js +0 -1
  61. package/tools/cli/installers/lib/ide/_config-driven.js +9 -4
  62. package/tools/cli/installers/lib/ide/manager.js +3 -3
  63. package/tools/cli/lib/agent/compiler.js +1 -1
  64. package/.augment/code_review_guidelines.yaml +0 -231
  65. package/.coderabbit.yaml +0 -85
  66. package/.github/CODE_OF_CONDUCT.md +0 -128
  67. package/.github/FUNDING.yaml +0 -15
  68. package/.github/ISSUE_TEMPLATE/bug-report.yaml +0 -124
  69. package/.github/ISSUE_TEMPLATE/config.yaml +0 -8
  70. package/.github/ISSUE_TEMPLATE/documentation.yaml +0 -55
  71. package/.github/ISSUE_TEMPLATE/feature-request.md +0 -22
  72. package/.github/ISSUE_TEMPLATE/issue.md +0 -32
  73. package/.github/PULL_REQUEST_TEMPLATE.md +0 -13
  74. package/.github/scripts/discord-helpers.sh +0 -34
  75. package/.github/workflows/coderabbit-review.yaml +0 -22
  76. package/.github/workflows/discord.yaml +0 -90
  77. package/.github/workflows/docs.yaml +0 -64
  78. package/.github/workflows/publish.yaml +0 -133
  79. package/.github/workflows/quality.yaml +0 -116
  80. package/.husky/pre-commit +0 -20
  81. package/.markdownlint-cli2.yaml +0 -41
  82. package/.nvmrc +0 -1
  83. package/.prettierignore +0 -12
  84. package/.vscode/settings.json +0 -96
  85. package/CHANGELOG.md +0 -1785
  86. package/CNAME +0 -1
  87. package/CONTRIBUTING.md +0 -176
  88. package/CONTRIBUTORS.md +0 -32
  89. package/SECURITY.md +0 -85
  90. package/TRADEMARK.md +0 -55
  91. package/Wordmark.png +0 -0
  92. package/banner-bmad-method.png +0 -0
  93. package/docs/404.md +0 -9
  94. package/docs/_STYLE_GUIDE.md +0 -370
  95. package/docs/explanation/advanced-elicitation.md +0 -49
  96. package/docs/explanation/adversarial-review.md +0 -59
  97. package/docs/explanation/brainstorming.md +0 -33
  98. package/docs/explanation/established-projects-faq.md +0 -50
  99. package/docs/explanation/party-mode.md +0 -59
  100. package/docs/explanation/preventing-agent-conflicts.md +0 -112
  101. package/docs/explanation/project-context.md +0 -157
  102. package/docs/explanation/quick-dev-new-preview.md +0 -73
  103. package/docs/explanation/quick-flow.md +0 -77
  104. package/docs/explanation/why-solutioning-matters.md +0 -77
  105. package/docs/how-to/customize-bmad.md +0 -172
  106. package/docs/how-to/established-projects.md +0 -117
  107. package/docs/how-to/get-answers-about-bmad.md +0 -138
  108. package/docs/how-to/install-bmad.md +0 -116
  109. package/docs/how-to/non-interactive-installation.md +0 -171
  110. package/docs/how-to/project-context.md +0 -136
  111. package/docs/how-to/quick-fixes.md +0 -123
  112. package/docs/how-to/shard-large-documents.md +0 -78
  113. package/docs/how-to/upgrade-to-v6.md +0 -100
  114. package/docs/index.md +0 -60
  115. package/docs/reference/agents.md +0 -28
  116. package/docs/reference/commands.md +0 -145
  117. package/docs/reference/modules.md +0 -76
  118. package/docs/reference/testing.md +0 -106
  119. package/docs/reference/workflow-map.md +0 -89
  120. package/docs/roadmap.mdx +0 -136
  121. package/docs/tutorials/getting-started.md +0 -275
  122. package/docs/zh-cn/404.md +0 -9
  123. package/docs/zh-cn/_STYLE_GUIDE.md +0 -370
  124. package/docs/zh-cn/explanation/advanced-elicitation.md +0 -62
  125. package/docs/zh-cn/explanation/adversarial-review.md +0 -71
  126. package/docs/zh-cn/explanation/brainstorming.md +0 -43
  127. package/docs/zh-cn/explanation/established-projects-faq.md +0 -60
  128. package/docs/zh-cn/explanation/party-mode.md +0 -79
  129. package/docs/zh-cn/explanation/preventing-agent-conflicts.md +0 -137
  130. package/docs/zh-cn/explanation/project-context.md +0 -176
  131. package/docs/zh-cn/explanation/quick-flow.md +0 -93
  132. package/docs/zh-cn/explanation/why-solutioning-matters.md +0 -90
  133. package/docs/zh-cn/how-to/customize-bmad.md +0 -182
  134. package/docs/zh-cn/how-to/established-projects.md +0 -134
  135. package/docs/zh-cn/how-to/get-answers-about-bmad.md +0 -144
  136. package/docs/zh-cn/how-to/install-bmad.md +0 -105
  137. package/docs/zh-cn/how-to/non-interactive-installation.md +0 -181
  138. package/docs/zh-cn/how-to/project-context.md +0 -152
  139. package/docs/zh-cn/how-to/quick-fixes.md +0 -140
  140. package/docs/zh-cn/how-to/shard-large-documents.md +0 -86
  141. package/docs/zh-cn/how-to/upgrade-to-v6.md +0 -120
  142. package/docs/zh-cn/index.md +0 -69
  143. package/docs/zh-cn/reference/agents.md +0 -41
  144. package/docs/zh-cn/reference/commands.md +0 -166
  145. package/docs/zh-cn/reference/modules.md +0 -94
  146. package/docs/zh-cn/reference/testing.md +0 -122
  147. package/docs/zh-cn/reference/workflow-map.md +0 -104
  148. package/docs/zh-cn/roadmap.mdx +0 -152
  149. package/docs/zh-cn/tutorials/getting-started.md +0 -300
  150. package/eslint.config.mjs +0 -141
  151. package/prettier.config.mjs +0 -32
  152. package/src/core/workflows/brainstorming/bmad-skill-manifest.yaml +0 -3
  153. package/src/core/workflows/party-mode/bmad-skill-manifest.yaml +0 -3
  154. package/test/README.md +0 -295
  155. package/test/adversarial-review-tests/README.md +0 -56
  156. package/test/adversarial-review-tests/sample-content.md +0 -46
  157. package/test/adversarial-review-tests/test-cases.yaml +0 -103
  158. package/test/fixtures/agent-schema/invalid/critical-actions/actions-as-string.agent.yaml +0 -27
  159. package/test/fixtures/agent-schema/invalid/critical-actions/empty-string-in-actions.agent.yaml +0 -30
  160. package/test/fixtures/agent-schema/invalid/menu/empty-menu.agent.yaml +0 -22
  161. package/test/fixtures/agent-schema/invalid/menu/missing-menu.agent.yaml +0 -20
  162. package/test/fixtures/agent-schema/invalid/menu-commands/empty-command-target.agent.yaml +0 -25
  163. package/test/fixtures/agent-schema/invalid/menu-commands/no-command-target.agent.yaml +0 -24
  164. package/test/fixtures/agent-schema/invalid/menu-triggers/camel-case.agent.yaml +0 -25
  165. package/test/fixtures/agent-schema/invalid/menu-triggers/compound-invalid-format.agent.yaml +0 -25
  166. package/test/fixtures/agent-schema/invalid/menu-triggers/compound-mismatched-kebab.agent.yaml +0 -25
  167. package/test/fixtures/agent-schema/invalid/menu-triggers/duplicate-triggers.agent.yaml +0 -31
  168. package/test/fixtures/agent-schema/invalid/menu-triggers/empty-trigger.agent.yaml +0 -25
  169. package/test/fixtures/agent-schema/invalid/menu-triggers/leading-asterisk.agent.yaml +0 -25
  170. package/test/fixtures/agent-schema/invalid/menu-triggers/snake-case.agent.yaml +0 -25
  171. package/test/fixtures/agent-schema/invalid/menu-triggers/trigger-with-spaces.agent.yaml +0 -25
  172. package/test/fixtures/agent-schema/invalid/metadata/empty-module-string.agent.yaml +0 -26
  173. package/test/fixtures/agent-schema/invalid/metadata/empty-name.agent.yaml +0 -24
  174. package/test/fixtures/agent-schema/invalid/metadata/extra-metadata-fields.agent.yaml +0 -27
  175. package/test/fixtures/agent-schema/invalid/metadata/missing-id.agent.yaml +0 -23
  176. package/test/fixtures/agent-schema/invalid/persona/empty-principles-array.agent.yaml +0 -24
  177. package/test/fixtures/agent-schema/invalid/persona/empty-string-in-principles.agent.yaml +0 -27
  178. package/test/fixtures/agent-schema/invalid/persona/extra-persona-fields.agent.yaml +0 -27
  179. package/test/fixtures/agent-schema/invalid/persona/missing-role.agent.yaml +0 -24
  180. package/test/fixtures/agent-schema/invalid/prompts/empty-content.agent.yaml +0 -29
  181. package/test/fixtures/agent-schema/invalid/prompts/extra-prompt-fields.agent.yaml +0 -31
  182. package/test/fixtures/agent-schema/invalid/prompts/missing-content.agent.yaml +0 -28
  183. package/test/fixtures/agent-schema/invalid/prompts/missing-id.agent.yaml +0 -28
  184. package/test/fixtures/agent-schema/invalid/top-level/empty-file.agent.yaml +0 -5
  185. package/test/fixtures/agent-schema/invalid/top-level/extra-top-level-keys.agent.yaml +0 -28
  186. package/test/fixtures/agent-schema/invalid/top-level/missing-agent-key.agent.yaml +0 -11
  187. package/test/fixtures/agent-schema/invalid/yaml-errors/invalid-indentation.agent.yaml +0 -19
  188. package/test/fixtures/agent-schema/invalid/yaml-errors/malformed-yaml.agent.yaml +0 -18
  189. package/test/fixtures/agent-schema/valid/critical-actions/empty-critical-actions.agent.yaml +0 -24
  190. package/test/fixtures/agent-schema/valid/critical-actions/no-critical-actions.agent.yaml +0 -22
  191. package/test/fixtures/agent-schema/valid/critical-actions/valid-critical-actions.agent.yaml +0 -27
  192. package/test/fixtures/agent-schema/valid/menu/multiple-menu-items.agent.yaml +0 -31
  193. package/test/fixtures/agent-schema/valid/menu/single-menu-item.agent.yaml +0 -22
  194. package/test/fixtures/agent-schema/valid/menu-commands/all-command-types.agent.yaml +0 -38
  195. package/test/fixtures/agent-schema/valid/menu-commands/multiple-commands.agent.yaml +0 -23
  196. package/test/fixtures/agent-schema/valid/menu-triggers/compound-triggers.agent.yaml +0 -31
  197. package/test/fixtures/agent-schema/valid/menu-triggers/kebab-case-triggers.agent.yaml +0 -34
  198. package/test/fixtures/agent-schema/valid/metadata/core-agent-with-module.agent.yaml +0 -24
  199. package/test/fixtures/agent-schema/valid/metadata/empty-module-name-in-path.agent.yaml +0 -24
  200. package/test/fixtures/agent-schema/valid/metadata/malformed-path-treated-as-core.agent.yaml +0 -24
  201. package/test/fixtures/agent-schema/valid/metadata/module-agent-correct.agent.yaml +0 -24
  202. package/test/fixtures/agent-schema/valid/metadata/module-agent-missing-module.agent.yaml +0 -23
  203. package/test/fixtures/agent-schema/valid/metadata/wrong-module-value.agent.yaml +0 -24
  204. package/test/fixtures/agent-schema/valid/persona/complete-persona.agent.yaml +0 -24
  205. package/test/fixtures/agent-schema/valid/prompts/empty-prompts.agent.yaml +0 -24
  206. package/test/fixtures/agent-schema/valid/prompts/no-prompts.agent.yaml +0 -22
  207. package/test/fixtures/agent-schema/valid/prompts/valid-prompts-minimal.agent.yaml +0 -28
  208. package/test/fixtures/agent-schema/valid/prompts/valid-prompts-with-description.agent.yaml +0 -30
  209. package/test/fixtures/agent-schema/valid/top-level/minimal-core-agent.agent.yaml +0 -24
  210. package/test/fixtures/file-refs-csv/invalid/all-empty-workflow.csv +0 -3
  211. package/test/fixtures/file-refs-csv/invalid/empty-data.csv +0 -1
  212. package/test/fixtures/file-refs-csv/invalid/no-workflow-column.csv +0 -3
  213. package/test/fixtures/file-refs-csv/invalid/unresolvable-vars.csv +0 -3
  214. package/test/fixtures/file-refs-csv/valid/bmm-style.csv +0 -3
  215. package/test/fixtures/file-refs-csv/valid/core-style.csv +0 -3
  216. package/test/fixtures/file-refs-csv/valid/minimal.csv +0 -2
  217. package/test/test-agent-schema.js +0 -387
  218. package/test/test-cli-integration.sh +0 -159
  219. package/test/test-file-refs-csv.js +0 -133
  220. package/test/test-install-to-bmad.js +0 -154
  221. package/test/test-installation-components.js +0 -1796
  222. package/test/test-rehype-plugins.mjs +0 -1050
  223. package/test/test-workflow-path-regex.js +0 -88
  224. package/test/unit-test-schema.js +0 -133
  225. package/tools/build-docs.mjs +0 -464
  226. package/tools/docs/_prompt-external-modules-page.md +0 -59
  227. package/tools/docs/fix-refs.md +0 -91
  228. package/tools/docs/native-skills-migration-checklist.md +0 -281
  229. package/tools/fix-doc-links.js +0 -285
  230. package/tools/validate-agent-schema.js +0 -110
  231. package/tools/validate-doc-links.js +0 -407
  232. package/tools/validate-file-refs.js +0 -556
  233. package/website/README.md +0 -75
  234. package/website/astro.config.mjs +0 -157
  235. package/website/public/diagrams/quick-dev-diagram.png +0 -0
  236. package/website/public/favicon.ico +0 -0
  237. package/website/public/img/bmad-dark.png +0 -0
  238. package/website/public/img/bmad-light.png +0 -0
  239. package/website/public/workflow-map-diagram.html +0 -361
  240. package/website/src/components/Banner.astro +0 -62
  241. package/website/src/components/Header.astro +0 -96
  242. package/website/src/components/MobileMenuFooter.astro +0 -33
  243. package/website/src/content/config.ts +0 -7
  244. package/website/src/content/i18n/zh-CN.json +0 -28
  245. package/website/src/lib/site-url.mjs +0 -25
  246. package/website/src/pages/404.astro +0 -11
  247. package/website/src/pages/robots.txt.ts +0 -48
  248. package/website/src/rehype-base-paths.js +0 -112
  249. package/website/src/rehype-markdown-links.js +0 -119
  250. package/website/src/styles/custom.css +0 -805
  251. /package/src/core/workflows/{brainstorming → bmad-brainstorming}/brain-methods.csv +0 -0
  252. /package/src/core/workflows/{brainstorming → bmad-brainstorming}/steps/step-01-session-setup.md +0 -0
  253. /package/src/core/workflows/{brainstorming → bmad-brainstorming}/steps/step-01b-continue.md +0 -0
  254. /package/src/core/workflows/{brainstorming → bmad-brainstorming}/steps/step-02a-user-selected.md +0 -0
  255. /package/src/core/workflows/{brainstorming → bmad-brainstorming}/steps/step-02b-ai-recommended.md +0 -0
  256. /package/src/core/workflows/{brainstorming → bmad-brainstorming}/steps/step-02c-random-selection.md +0 -0
  257. /package/src/core/workflows/{brainstorming → bmad-brainstorming}/steps/step-02d-progressive-flow.md +0 -0
  258. /package/src/core/workflows/{brainstorming → bmad-brainstorming}/steps/step-03-technique-execution.md +0 -0
  259. /package/src/core/workflows/{brainstorming → bmad-brainstorming}/steps/step-04-idea-organization.md +0 -0
  260. /package/src/core/workflows/{brainstorming → bmad-brainstorming}/template.md +0 -0
  261. /package/src/core/workflows/{party-mode → bmad-party-mode}/steps/step-01-agent-loading.md +0 -0
  262. /package/src/core/workflows/{party-mode → bmad-party-mode}/steps/step-02-discussion-orchestration.md +0 -0
@@ -1,96 +0,0 @@
1
- ---
2
- import config from 'virtual:starlight/user-config';
3
- import type { Props } from '@astrojs/starlight/props';
4
-
5
- import LanguageSelect from 'virtual:starlight/components/LanguageSelect';
6
- import Search from 'virtual:starlight/components/Search';
7
- import SiteTitle from 'virtual:starlight/components/SiteTitle';
8
- import SocialIcons from 'virtual:starlight/components/SocialIcons';
9
- import ThemeSelect from 'virtual:starlight/components/ThemeSelect';
10
-
11
- import Banner from './Banner.astro';
12
-
13
- /**
14
- * Render the `Search` component if Pagefind is enabled or the default search component has been overridden.
15
- */
16
- const shouldRenderSearch =
17
- config.pagefind || config.components.Search !== '@astrojs/starlight/components/Search.astro';
18
- ---
19
-
20
- <Banner />
21
- <div class="header sl-flex">
22
- <div class="title-wrapper sl-flex">
23
- <SiteTitle {...Astro.props} />
24
- </div>
25
- <div class="sl-flex print:hidden">
26
- {shouldRenderSearch && <Search {...Astro.props} />}
27
- </div>
28
- <div class="sl-hidden md:sl-flex print:hidden right-group">
29
- <div class="sl-flex social-icons">
30
- <SocialIcons {...Astro.props} />
31
- </div>
32
- <ThemeSelect {...Astro.props} />
33
- <LanguageSelect {...Astro.props} />
34
- </div>
35
- </div>
36
-
37
- <style>
38
- .header {
39
- gap: var(--sl-nav-gap);
40
- justify-content: space-between;
41
- align-items: center;
42
- height: 100%;
43
- }
44
-
45
- .title-wrapper {
46
- /* Prevent long titles overflowing and covering the search and menu buttons on narrow viewports. */
47
- overflow: clip;
48
- /* Avoid clipping focus ring around link inside title wrapper. */
49
- padding: 0.25rem;
50
- margin: -0.25rem;
51
- min-width: 0;
52
- }
53
-
54
- .right-group,
55
- .social-icons {
56
- gap: 1rem;
57
- align-items: center;
58
- }
59
-
60
- .social-icons::after {
61
- content: '';
62
- height: 2rem;
63
- border-inline-end: 1px solid var(--sl-color-gray-5);
64
- }
65
-
66
- @media (min-width: 50rem) {
67
- :global(:root[data-has-sidebar]) {
68
- --__sidebar-pad: calc(2 * var(--sl-nav-pad-x));
69
- }
70
- :global(:root:not([data-has-toc])) {
71
- --__toc-width: 0rem;
72
- }
73
- .header {
74
- --__sidebar-width: max(0rem, var(--sl-content-inline-start, 0rem) - var(--sl-nav-pad-x));
75
- --__main-column-fr: calc(
76
- (
77
- 100% + var(--__sidebar-pad, 0rem) - var(--__toc-width, var(--sl-sidebar-width)) -
78
- (2 * var(--__toc-width, var(--sl-nav-pad-x))) - var(--sl-content-inline-start, 0rem) -
79
- var(--sl-content-width)
80
- ) / 2
81
- );
82
- display: grid;
83
- grid-template-columns:
84
- /* 1 (site title): runs up until the main content column’s left edge or the width of the title, whichever is the largest */
85
- minmax(
86
- calc(var(--__sidebar-width) + max(0rem, var(--__main-column-fr) - var(--sl-nav-gap))),
87
- auto
88
- )
89
- /* 2 (search box): all free space that is available. */
90
- 1fr
91
- /* 3 (right items): use the space that these need. */
92
- auto;
93
- align-content: center;
94
- }
95
- }
96
- </style>
@@ -1,33 +0,0 @@
1
- ---
2
- import LanguageSelect from 'virtual:starlight/components/LanguageSelect';
3
- import SocialIcons from 'virtual:starlight/components/SocialIcons';
4
- import ThemeSelect from 'virtual:starlight/components/ThemeSelect';
5
- import type { Props } from '@astrojs/starlight/props';
6
- ---
7
-
8
- <div class="mobile-preferences sl-flex">
9
- <div class="sl-flex social-icons">
10
- <SocialIcons {...Astro.props} />
11
- </div>
12
- <ThemeSelect {...Astro.props} />
13
- <LanguageSelect {...Astro.props} />
14
- </div>
15
-
16
- <style>
17
- .social-icons {
18
- gap: 1rem;
19
- align-items: center;
20
- padding-block: 1rem;
21
- }
22
- .social-icons:empty {
23
- display: none;
24
- }
25
- .mobile-preferences {
26
- justify-content: space-between;
27
- flex-wrap: wrap;
28
- border-top: 1px solid var(--sl-color-gray-6);
29
- column-gap: 1rem;
30
- padding: 0.5rem 0;
31
- align-items: center;
32
- }
33
- </style>
@@ -1,7 +0,0 @@
1
- import { defineCollection } from 'astro:content';
2
- import { docsSchema, i18nSchema } from '@astrojs/starlight/schema';
3
-
4
- export const collections = {
5
- docs: defineCollection({ schema: docsSchema() }),
6
- i18n: defineCollection({ type: 'data', schema: i18nSchema() }),
7
- };
@@ -1,28 +0,0 @@
1
- {
2
- "skipLink.label": "跳转到内容",
3
- "search.label": "搜索",
4
- "search.ctrlKey": "Ctrl",
5
- "search.cancelLabel": "取消",
6
- "themeSelect.accessibleLabel": "选择主题",
7
- "themeSelect.dark": "深色",
8
- "themeSelect.light": "浅色",
9
- "themeSelect.auto": "自动",
10
- "languageSelect.accessibleLabel": "选择语言",
11
- "menuButton.accessibleLabel": "菜单",
12
- "sidebarNav.accessibleLabel": "主导航",
13
- "tableOfContents.onThisPage": "本页内容",
14
- "tableOfContents.overview": "概述",
15
- "i18n.untranslatedContent": "此内容尚未提供中文翻译。",
16
- "page.editLink": "编辑页面",
17
- "page.lastUpdated": "最后更新:",
18
- "page.previousLink": "上一页",
19
- "page.nextLink": "下一页",
20
- "page.draft": "此内容为草稿,不会包含在正式版本中。",
21
- "404.text": "页面未找到。请检查 URL 或尝试使用搜索。",
22
- "aside.note": "注意",
23
- "aside.tip": "提示",
24
- "aside.caution": "警告",
25
- "aside.danger": "危险",
26
- "fileTree.directory": "目录",
27
- "builtWithStarlight.label": "使用 Starlight 构建"
28
- }
@@ -1,25 +0,0 @@
1
- /**
2
- * Resolve the site's base URL using cascading environment defaults.
3
- *
4
- * Preference order: use SITE_URL if set; otherwise derive a GitHub Pages URL from GITHUB_REPOSITORY; otherwise use the local development URL.
5
- * @returns {string} The resolved site URL (SITE_URL override, or `https://{owner}.github.io/{repo}`, or `http://localhost:3000`).
6
- */
7
- export function getSiteUrl() {
8
- // Explicit override (works in both local and GitHub Actions)
9
- if (process.env.SITE_URL) {
10
- return process.env.SITE_URL;
11
- }
12
-
13
- // GitHub Actions: compute from repository context
14
- if (process.env.GITHUB_REPOSITORY) {
15
- const parts = process.env.GITHUB_REPOSITORY.split('/');
16
- if (parts.length !== 2 || !parts[0] || !parts[1]) {
17
- throw new Error(`Invalid GITHUB_REPOSITORY format: "${process.env.GITHUB_REPOSITORY}". Expected "owner/repo".`);
18
- }
19
- const [owner, repo] = parts;
20
- return `https://${owner}.github.io/${repo}`;
21
- }
22
-
23
- // Local development: use dev server
24
- return 'http://localhost:3000';
25
- }
@@ -1,11 +0,0 @@
1
- ---
2
- import StarlightPage from '@astrojs/starlight/components/StarlightPage.astro';
3
- import { getEntry } from 'astro:content';
4
-
5
- const entry = await getEntry('docs', '404');
6
- const { Content } = await entry.render();
7
- ---
8
-
9
- <StarlightPage frontmatter={{ title: entry.data.title, template: entry.data.template }}>
10
- <Content />
11
- </StarlightPage>
@@ -1,48 +0,0 @@
1
- import type { APIRoute } from 'astro';
2
-
3
- export const GET: APIRoute = ({ site }) => {
4
- const siteUrl = site?.href.replace(/\/$/, '') ?? '';
5
-
6
- const body = `# BMAD Method Documentation
7
- # ${siteUrl}/
8
- #
9
- # This file controls web crawler access to the documentation site.
10
-
11
- User-agent: *
12
- Allow: /
13
-
14
- # LLM-friendly documentation files
15
- # These are specifically designed for AI consumption
16
- # llms.txt - Concise overview with navigation
17
- # llms-full.txt - Complete documentation in plain text
18
-
19
- # AI Crawlers - Welcome!
20
- User-agent: GPTBot
21
- Allow: /
22
-
23
- User-agent: ChatGPT-User
24
- Allow: /
25
-
26
- User-agent: Google-Extended
27
- Allow: /
28
-
29
- User-agent: CCBot
30
- Allow: /
31
-
32
- User-agent: anthropic-ai
33
- Allow: /
34
-
35
- User-agent: Claude-Web
36
- Allow: /
37
-
38
- User-agent: cohere-ai
39
- Allow: /
40
-
41
- # Sitemap
42
- Sitemap: ${siteUrl}/sitemap-index.xml
43
- `;
44
-
45
- return new Response(body, {
46
- headers: { 'Content-Type': 'text/plain; charset=utf-8' },
47
- });
48
- };
@@ -1,112 +0,0 @@
1
- /**
2
- * Rehype plugin to prepend base path to absolute URLs
3
- *
4
- * Transforms:
5
- * /img/foo.png → /BMAD-METHOD/img/foo.png (when base is /BMAD-METHOD/)
6
- * /llms.txt → /BMAD-METHOD/llms.txt
7
- *
8
- * Supported elements:
9
- * - img[src], iframe[src], video[src], source[src], audio[src]
10
- * - a[href], link[href]
11
- *
12
- * Only affects absolute paths (/) - relative paths and external URLs are unchanged.
13
- * Does NOT process .md links (those are handled by rehype-markdown-links).
14
- */
15
-
16
- import { visit } from 'unist-util-visit';
17
-
18
- /**
19
- * Create a rehype plugin that prepends the base path to absolute URLs.
20
- *
21
- * @param {Object} options - Plugin options
22
- * @param {string} options.base - The base path to prepend (e.g., '/BMAD-METHOD/')
23
- * @returns {function} A HAST tree transformer
24
- */
25
- export default function rehypeBasePaths(options = {}) {
26
- const base = options.base || '/';
27
-
28
- // Normalize base: ensure trailing slash so concatenation with path.slice(1) (no leading /)
29
- // produces correct paths like /BMAD-METHOD/img/foo.png.
30
- // Note: rehype-markdown-links uses the opposite convention (strips trailing slash) because
31
- // it concatenates with paths that start with /.
32
- const normalizedBase = base === '/' ? '/' : base.endsWith('/') ? base : base + '/';
33
-
34
- /**
35
- * Prepend base path to an absolute URL attribute if needed.
36
- * Skips protocol-relative URLs (//) and paths that already include the base.
37
- *
38
- * @param {object} node - HAST element node
39
- * @param {string} attr - Attribute name ('src' or 'href')
40
- */
41
- function prependBase(node, attr) {
42
- const value = node.properties?.[attr];
43
- if (typeof value !== 'string' || !value.startsWith('/') || value.startsWith('//')) {
44
- return;
45
- }
46
- if (normalizedBase !== '/' && !value.startsWith(normalizedBase)) {
47
- node.properties[attr] = normalizedBase + value.slice(1);
48
- }
49
- }
50
-
51
- return (tree) => {
52
- // Handle raw HTML blocks (inline HTML in markdown that isn't parsed into HAST elements)
53
- if (normalizedBase !== '/') {
54
- visit(tree, 'raw', (node) => {
55
- // Replace absolute src="/..." and href="/..." attributes, skipping protocol-relative
56
- // and paths that already have the base prefix
57
- node.value = node.value.replace(/(?<attr>\b(?:src|href))="(?<path>\/(?!\/)[^"]*)"/g, (match, attr, pathValue) => {
58
- if (pathValue.startsWith(normalizedBase)) return match;
59
- return `${attr}="${normalizedBase}${pathValue.slice(1)}"`;
60
- });
61
- });
62
- }
63
-
64
- visit(tree, 'element', (node) => {
65
- const tag = node.tagName;
66
-
67
- // Tags with src attribute
68
- if (['img', 'iframe', 'video', 'source', 'audio'].includes(tag)) {
69
- prependBase(node, 'src');
70
- }
71
-
72
- // Link tags with href attribute (stylesheets, preloads, etc.)
73
- if (tag === 'link') {
74
- prependBase(node, 'href');
75
- }
76
-
77
- // Anchor tags need special handling - skip .md links
78
- if (tag === 'a' && node.properties?.href) {
79
- const href = node.properties.href;
80
-
81
- if (typeof href !== 'string') {
82
- return;
83
- }
84
-
85
- // Only transform absolute paths starting with / (but not //)
86
- if (!href.startsWith('/') || href.startsWith('//')) {
87
- return;
88
- }
89
-
90
- // Skip if already has the base path
91
- if (normalizedBase !== '/' && href.startsWith(normalizedBase)) {
92
- return;
93
- }
94
-
95
- // Skip .md links - those are handled by rehype-markdown-links
96
- // Extract path portion (before ? and #)
97
- const firstDelimiter = Math.min(
98
- href.indexOf('?') === -1 ? Infinity : href.indexOf('?'),
99
- href.indexOf('#') === -1 ? Infinity : href.indexOf('#'),
100
- );
101
- const pathPortion = firstDelimiter === Infinity ? href : href.substring(0, firstDelimiter);
102
-
103
- if (pathPortion.endsWith('.md')) {
104
- return; // Let rehype-markdown-links handle this
105
- }
106
-
107
- // Prepend base path
108
- node.properties.href = normalizedBase + href.slice(1);
109
- }
110
- });
111
- };
112
- }
@@ -1,119 +0,0 @@
1
- /**
2
- * Rehype plugin to transform relative .md links into correct site URLs.
3
- *
4
- * Uses the source file's disk path (via vfile) to resolve the link target,
5
- * then computes the output URL relative to the content root directory.
6
- * This correctly handles Starlight's directory-per-page URL structure
7
- * where ./sibling.md from reference/testing.md must become /reference/sibling/
8
- * (not ./sibling/ which would resolve to /reference/testing/sibling/).
9
- *
10
- * Supports: ./sibling.md, ../other/page.md, bare.md, /docs/absolute.md
11
- * Preserves: query strings, hash anchors
12
- * Skips: external URLs, non-.md links
13
- */
14
-
15
- import { visit } from 'unist-util-visit';
16
- import path from 'node:path';
17
-
18
- /**
19
- * @param {Object} options
20
- * @param {string} options.base - Site base path (e.g., '/BMAD-METHOD/')
21
- * @param {string} [options.contentDir] - Absolute path to content root; auto-detected if omitted
22
- */
23
- export default function rehypeMarkdownLinks(options = {}) {
24
- const base = options.base || '/';
25
- const normalizedBase = base === '/' ? '' : base.replace(/\/$/, '');
26
-
27
- return (tree, file) => {
28
- // The current file's absolute path on disk, set by Astro's markdown pipeline
29
- const currentFilePath = file.path;
30
- if (!currentFilePath) return;
31
-
32
- // Auto-detect content root: walk up from current file to find src/content/docs
33
- const contentDir = options.contentDir || detectContentDir(currentFilePath);
34
- if (!contentDir) {
35
- throw new Error(`[rehype-markdown-links] Could not detect content directory for: ${currentFilePath}`);
36
- }
37
-
38
- visit(tree, 'element', (node) => {
39
- if (node.tagName !== 'a' || typeof node.properties?.href !== 'string') {
40
- return;
41
- }
42
-
43
- const href = node.properties.href;
44
-
45
- // Skip external links (including protocol-relative URLs like //cdn.example.com)
46
- if (href.includes('://') || href.startsWith('//') || href.startsWith('mailto:') || href.startsWith('tel:')) {
47
- return;
48
- }
49
-
50
- // Split href into path vs query+fragment suffix
51
- const delimIdx = findFirstDelimiter(href);
52
- const linkPath = delimIdx === -1 ? href : href.substring(0, delimIdx);
53
- const suffix = delimIdx === -1 ? '' : href.substring(delimIdx);
54
-
55
- // Only process .md links
56
- if (!linkPath.endsWith('.md')) return;
57
-
58
- // Resolve the target file's absolute path on disk
59
- let targetPath;
60
- if (linkPath.startsWith('/docs/')) {
61
- // Absolute /docs/ path — resolve from content root
62
- targetPath = path.join(contentDir, linkPath.slice(5)); // strip '/docs'
63
- } else if (linkPath.startsWith('/')) {
64
- // Other absolute paths — resolve from content root
65
- targetPath = path.join(contentDir, linkPath);
66
- } else {
67
- // Relative path (./sibling.md, ../other.md, bare.md) — resolve from current file
68
- targetPath = path.resolve(path.dirname(currentFilePath), linkPath);
69
- }
70
-
71
- // Compute the target's path relative to content root
72
- const relativeToContent = path.relative(contentDir, targetPath);
73
-
74
- // Safety: skip if target resolves outside content root
75
- if (relativeToContent.startsWith('..')) return;
76
-
77
- // Convert file path to URL: strip .md, handle index, ensure leading/trailing slashes
78
- let urlPath = relativeToContent.replace(/\.md$/, '');
79
-
80
- // index.md becomes the directory root
81
- if (urlPath.endsWith('/index') || urlPath === 'index') {
82
- urlPath = urlPath.slice(0, -'index'.length);
83
- }
84
-
85
- // Build absolute URL with base path, normalizing any double slashes
86
- const raw = normalizedBase + '/' + urlPath.replace(/\/?$/, '/') + suffix;
87
- node.properties.href = raw.replace(/\/\/+/g, '/');
88
- });
89
- };
90
- }
91
-
92
- /** Find the index of the first ? or # in a string, or -1 if neither exists. */
93
- export function findFirstDelimiter(str) {
94
- const q = str.indexOf('?');
95
- const h = str.indexOf('#');
96
- if (q === -1) return h;
97
- if (h === -1) return q;
98
- return Math.min(q, h);
99
- }
100
-
101
- /** Walk up from a file path to find the content docs directory. */
102
- export function detectContentDir(filePath) {
103
- const segments = filePath.split(path.sep);
104
- // Look for src/content/docs in the path (standard Astro)
105
- for (let i = segments.length - 1; i >= 2; i--) {
106
- if (segments[i - 2] === 'src' && segments[i - 1] === 'content' && segments[i] === 'docs') {
107
- return segments.slice(0, i + 1).join(path.sep);
108
- }
109
- }
110
- // Also check for a standalone 'docs' directory (BMAD project structure)
111
- // Path format: .../bmm/docs/file.mdx or .../bmm/website/...
112
- for (let i = segments.length - 1; i >= 0; i--) {
113
- if (segments[i] === 'docs') {
114
- // Found docs directory - use its parent as the content root
115
- return segments.slice(0, i + 1).join(path.sep);
116
- }
117
- }
118
- return null;
119
- }