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.
- package/package.json +1 -1
- package/src/bmm/agents/analyst.agent.yaml +1 -1
- package/src/bmm/module-help.csv +1 -1
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-02-vision.md +1 -1
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-03-users.md +1 -1
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-04-metrics.md +1 -1
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-05-scope.md +1 -1
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-02-discovery.md +1 -1
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-02b-vision.md +1 -1
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-02c-executive-summary.md +1 -1
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-03-success.md +1 -1
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-04-journeys.md +1 -1
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-05-domain.md +1 -1
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-06-innovation.md +1 -1
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-07-project-type.md +1 -1
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-08-scoping.md +1 -1
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-09-functional.md +1 -1
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-10-nonfunctional.md +1 -1
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-11-polish.md +1 -1
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-01-discovery.md +1 -1
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-01-discovery.md +1 -1
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-02-discovery.md +1 -1
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-03-core-experience.md +2 -2
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-04-emotional-response.md +2 -2
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-05-inspiration.md +2 -2
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-06-design-system.md +2 -2
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-07-defining-experience.md +2 -2
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-08-visual-foundation.md +2 -2
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-09-design-directions.md +2 -2
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-10-user-journeys.md +2 -2
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-11-component-strategy.md +2 -2
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-12-ux-patterns.md +2 -2
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-13-responsive-accessibility.md +2 -2
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-02-context.md +2 -2
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-03-starter.md +2 -2
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-04-decisions.md +2 -2
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-05-patterns.md +2 -2
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-06-structure.md +2 -2
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-07-validation.md +2 -2
- package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-01-validate-prerequisites.md +31 -13
- package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-02-design-epics.md +1 -1
- package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-03-create-stories.md +6 -2
- package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-04-final-validation.md +1 -1
- package/src/bmm/workflows/3-solutioning/create-epics-and-stories/templates/epics-template.md +4 -0
- package/src/bmm/workflows/4-implementation/code-review/workflow.md +4 -7
- package/src/bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview/workflow.md +0 -4
- package/src/bmm/workflows/bmad-quick-flow/quick-dev/workflow.md +1 -1
- package/src/bmm/workflows/bmad-quick-flow/quick-spec/workflow.md +1 -1
- package/src/bmm/workflows/generate-project-context/steps/step-02-generate.md +1 -1
- package/src/core/module-help.csv +2 -2
- package/src/core/workflows/bmad-brainstorming/SKILL.md +6 -0
- package/src/core/workflows/bmad-brainstorming/bmad-skill-manifest.yaml +1 -0
- package/src/core/workflows/{brainstorming → bmad-brainstorming}/workflow.md +2 -5
- package/src/core/workflows/bmad-party-mode/SKILL.md +6 -0
- package/src/core/workflows/bmad-party-mode/bmad-skill-manifest.yaml +1 -0
- package/src/core/workflows/{party-mode → bmad-party-mode}/steps/step-03-graceful-exit.md +0 -1
- package/src/core/workflows/{party-mode → bmad-party-mode}/workflow.md +0 -4
- package/tools/cli/external-official-modules.yaml +18 -18
- package/tools/cli/installers/lib/core/installer.js +25 -8
- package/tools/cli/installers/lib/ide/_base-ide.js +0 -1
- package/tools/cli/installers/lib/ide/_config-driven.js +9 -4
- package/tools/cli/installers/lib/ide/manager.js +3 -3
- package/tools/cli/lib/agent/compiler.js +1 -1
- package/.augment/code_review_guidelines.yaml +0 -231
- package/.coderabbit.yaml +0 -85
- package/.github/CODE_OF_CONDUCT.md +0 -128
- package/.github/FUNDING.yaml +0 -15
- package/.github/ISSUE_TEMPLATE/bug-report.yaml +0 -124
- package/.github/ISSUE_TEMPLATE/config.yaml +0 -8
- package/.github/ISSUE_TEMPLATE/documentation.yaml +0 -55
- package/.github/ISSUE_TEMPLATE/feature-request.md +0 -22
- package/.github/ISSUE_TEMPLATE/issue.md +0 -32
- package/.github/PULL_REQUEST_TEMPLATE.md +0 -13
- package/.github/scripts/discord-helpers.sh +0 -34
- package/.github/workflows/coderabbit-review.yaml +0 -22
- package/.github/workflows/discord.yaml +0 -90
- package/.github/workflows/docs.yaml +0 -64
- package/.github/workflows/publish.yaml +0 -133
- package/.github/workflows/quality.yaml +0 -116
- package/.husky/pre-commit +0 -20
- package/.markdownlint-cli2.yaml +0 -41
- package/.nvmrc +0 -1
- package/.prettierignore +0 -12
- package/.vscode/settings.json +0 -96
- package/CHANGELOG.md +0 -1785
- package/CNAME +0 -1
- package/CONTRIBUTING.md +0 -176
- package/CONTRIBUTORS.md +0 -32
- package/SECURITY.md +0 -85
- package/TRADEMARK.md +0 -55
- package/Wordmark.png +0 -0
- package/banner-bmad-method.png +0 -0
- package/docs/404.md +0 -9
- package/docs/_STYLE_GUIDE.md +0 -370
- package/docs/explanation/advanced-elicitation.md +0 -49
- package/docs/explanation/adversarial-review.md +0 -59
- package/docs/explanation/brainstorming.md +0 -33
- package/docs/explanation/established-projects-faq.md +0 -50
- package/docs/explanation/party-mode.md +0 -59
- package/docs/explanation/preventing-agent-conflicts.md +0 -112
- package/docs/explanation/project-context.md +0 -157
- package/docs/explanation/quick-dev-new-preview.md +0 -73
- package/docs/explanation/quick-flow.md +0 -77
- package/docs/explanation/why-solutioning-matters.md +0 -77
- package/docs/how-to/customize-bmad.md +0 -172
- package/docs/how-to/established-projects.md +0 -117
- package/docs/how-to/get-answers-about-bmad.md +0 -138
- package/docs/how-to/install-bmad.md +0 -116
- package/docs/how-to/non-interactive-installation.md +0 -171
- package/docs/how-to/project-context.md +0 -136
- package/docs/how-to/quick-fixes.md +0 -123
- package/docs/how-to/shard-large-documents.md +0 -78
- package/docs/how-to/upgrade-to-v6.md +0 -100
- package/docs/index.md +0 -60
- package/docs/reference/agents.md +0 -28
- package/docs/reference/commands.md +0 -145
- package/docs/reference/modules.md +0 -76
- package/docs/reference/testing.md +0 -106
- package/docs/reference/workflow-map.md +0 -89
- package/docs/roadmap.mdx +0 -136
- package/docs/tutorials/getting-started.md +0 -275
- package/docs/zh-cn/404.md +0 -9
- package/docs/zh-cn/_STYLE_GUIDE.md +0 -370
- package/docs/zh-cn/explanation/advanced-elicitation.md +0 -62
- package/docs/zh-cn/explanation/adversarial-review.md +0 -71
- package/docs/zh-cn/explanation/brainstorming.md +0 -43
- package/docs/zh-cn/explanation/established-projects-faq.md +0 -60
- package/docs/zh-cn/explanation/party-mode.md +0 -79
- package/docs/zh-cn/explanation/preventing-agent-conflicts.md +0 -137
- package/docs/zh-cn/explanation/project-context.md +0 -176
- package/docs/zh-cn/explanation/quick-flow.md +0 -93
- package/docs/zh-cn/explanation/why-solutioning-matters.md +0 -90
- package/docs/zh-cn/how-to/customize-bmad.md +0 -182
- package/docs/zh-cn/how-to/established-projects.md +0 -134
- package/docs/zh-cn/how-to/get-answers-about-bmad.md +0 -144
- package/docs/zh-cn/how-to/install-bmad.md +0 -105
- package/docs/zh-cn/how-to/non-interactive-installation.md +0 -181
- package/docs/zh-cn/how-to/project-context.md +0 -152
- package/docs/zh-cn/how-to/quick-fixes.md +0 -140
- package/docs/zh-cn/how-to/shard-large-documents.md +0 -86
- package/docs/zh-cn/how-to/upgrade-to-v6.md +0 -120
- package/docs/zh-cn/index.md +0 -69
- package/docs/zh-cn/reference/agents.md +0 -41
- package/docs/zh-cn/reference/commands.md +0 -166
- package/docs/zh-cn/reference/modules.md +0 -94
- package/docs/zh-cn/reference/testing.md +0 -122
- package/docs/zh-cn/reference/workflow-map.md +0 -104
- package/docs/zh-cn/roadmap.mdx +0 -152
- package/docs/zh-cn/tutorials/getting-started.md +0 -300
- package/eslint.config.mjs +0 -141
- package/prettier.config.mjs +0 -32
- package/src/core/workflows/brainstorming/bmad-skill-manifest.yaml +0 -3
- package/src/core/workflows/party-mode/bmad-skill-manifest.yaml +0 -3
- package/test/README.md +0 -295
- package/test/adversarial-review-tests/README.md +0 -56
- package/test/adversarial-review-tests/sample-content.md +0 -46
- package/test/adversarial-review-tests/test-cases.yaml +0 -103
- package/test/fixtures/agent-schema/invalid/critical-actions/actions-as-string.agent.yaml +0 -27
- package/test/fixtures/agent-schema/invalid/critical-actions/empty-string-in-actions.agent.yaml +0 -30
- package/test/fixtures/agent-schema/invalid/menu/empty-menu.agent.yaml +0 -22
- package/test/fixtures/agent-schema/invalid/menu/missing-menu.agent.yaml +0 -20
- package/test/fixtures/agent-schema/invalid/menu-commands/empty-command-target.agent.yaml +0 -25
- package/test/fixtures/agent-schema/invalid/menu-commands/no-command-target.agent.yaml +0 -24
- package/test/fixtures/agent-schema/invalid/menu-triggers/camel-case.agent.yaml +0 -25
- package/test/fixtures/agent-schema/invalid/menu-triggers/compound-invalid-format.agent.yaml +0 -25
- package/test/fixtures/agent-schema/invalid/menu-triggers/compound-mismatched-kebab.agent.yaml +0 -25
- package/test/fixtures/agent-schema/invalid/menu-triggers/duplicate-triggers.agent.yaml +0 -31
- package/test/fixtures/agent-schema/invalid/menu-triggers/empty-trigger.agent.yaml +0 -25
- package/test/fixtures/agent-schema/invalid/menu-triggers/leading-asterisk.agent.yaml +0 -25
- package/test/fixtures/agent-schema/invalid/menu-triggers/snake-case.agent.yaml +0 -25
- package/test/fixtures/agent-schema/invalid/menu-triggers/trigger-with-spaces.agent.yaml +0 -25
- package/test/fixtures/agent-schema/invalid/metadata/empty-module-string.agent.yaml +0 -26
- package/test/fixtures/agent-schema/invalid/metadata/empty-name.agent.yaml +0 -24
- package/test/fixtures/agent-schema/invalid/metadata/extra-metadata-fields.agent.yaml +0 -27
- package/test/fixtures/agent-schema/invalid/metadata/missing-id.agent.yaml +0 -23
- package/test/fixtures/agent-schema/invalid/persona/empty-principles-array.agent.yaml +0 -24
- package/test/fixtures/agent-schema/invalid/persona/empty-string-in-principles.agent.yaml +0 -27
- package/test/fixtures/agent-schema/invalid/persona/extra-persona-fields.agent.yaml +0 -27
- package/test/fixtures/agent-schema/invalid/persona/missing-role.agent.yaml +0 -24
- package/test/fixtures/agent-schema/invalid/prompts/empty-content.agent.yaml +0 -29
- package/test/fixtures/agent-schema/invalid/prompts/extra-prompt-fields.agent.yaml +0 -31
- package/test/fixtures/agent-schema/invalid/prompts/missing-content.agent.yaml +0 -28
- package/test/fixtures/agent-schema/invalid/prompts/missing-id.agent.yaml +0 -28
- package/test/fixtures/agent-schema/invalid/top-level/empty-file.agent.yaml +0 -5
- package/test/fixtures/agent-schema/invalid/top-level/extra-top-level-keys.agent.yaml +0 -28
- package/test/fixtures/agent-schema/invalid/top-level/missing-agent-key.agent.yaml +0 -11
- package/test/fixtures/agent-schema/invalid/yaml-errors/invalid-indentation.agent.yaml +0 -19
- package/test/fixtures/agent-schema/invalid/yaml-errors/malformed-yaml.agent.yaml +0 -18
- package/test/fixtures/agent-schema/valid/critical-actions/empty-critical-actions.agent.yaml +0 -24
- package/test/fixtures/agent-schema/valid/critical-actions/no-critical-actions.agent.yaml +0 -22
- package/test/fixtures/agent-schema/valid/critical-actions/valid-critical-actions.agent.yaml +0 -27
- package/test/fixtures/agent-schema/valid/menu/multiple-menu-items.agent.yaml +0 -31
- package/test/fixtures/agent-schema/valid/menu/single-menu-item.agent.yaml +0 -22
- package/test/fixtures/agent-schema/valid/menu-commands/all-command-types.agent.yaml +0 -38
- package/test/fixtures/agent-schema/valid/menu-commands/multiple-commands.agent.yaml +0 -23
- package/test/fixtures/agent-schema/valid/menu-triggers/compound-triggers.agent.yaml +0 -31
- package/test/fixtures/agent-schema/valid/menu-triggers/kebab-case-triggers.agent.yaml +0 -34
- package/test/fixtures/agent-schema/valid/metadata/core-agent-with-module.agent.yaml +0 -24
- package/test/fixtures/agent-schema/valid/metadata/empty-module-name-in-path.agent.yaml +0 -24
- package/test/fixtures/agent-schema/valid/metadata/malformed-path-treated-as-core.agent.yaml +0 -24
- package/test/fixtures/agent-schema/valid/metadata/module-agent-correct.agent.yaml +0 -24
- package/test/fixtures/agent-schema/valid/metadata/module-agent-missing-module.agent.yaml +0 -23
- package/test/fixtures/agent-schema/valid/metadata/wrong-module-value.agent.yaml +0 -24
- package/test/fixtures/agent-schema/valid/persona/complete-persona.agent.yaml +0 -24
- package/test/fixtures/agent-schema/valid/prompts/empty-prompts.agent.yaml +0 -24
- package/test/fixtures/agent-schema/valid/prompts/no-prompts.agent.yaml +0 -22
- package/test/fixtures/agent-schema/valid/prompts/valid-prompts-minimal.agent.yaml +0 -28
- package/test/fixtures/agent-schema/valid/prompts/valid-prompts-with-description.agent.yaml +0 -30
- package/test/fixtures/agent-schema/valid/top-level/minimal-core-agent.agent.yaml +0 -24
- package/test/fixtures/file-refs-csv/invalid/all-empty-workflow.csv +0 -3
- package/test/fixtures/file-refs-csv/invalid/empty-data.csv +0 -1
- package/test/fixtures/file-refs-csv/invalid/no-workflow-column.csv +0 -3
- package/test/fixtures/file-refs-csv/invalid/unresolvable-vars.csv +0 -3
- package/test/fixtures/file-refs-csv/valid/bmm-style.csv +0 -3
- package/test/fixtures/file-refs-csv/valid/core-style.csv +0 -3
- package/test/fixtures/file-refs-csv/valid/minimal.csv +0 -2
- package/test/test-agent-schema.js +0 -387
- package/test/test-cli-integration.sh +0 -159
- package/test/test-file-refs-csv.js +0 -133
- package/test/test-install-to-bmad.js +0 -154
- package/test/test-installation-components.js +0 -1796
- package/test/test-rehype-plugins.mjs +0 -1050
- package/test/test-workflow-path-regex.js +0 -88
- package/test/unit-test-schema.js +0 -133
- package/tools/build-docs.mjs +0 -464
- package/tools/docs/_prompt-external-modules-page.md +0 -59
- package/tools/docs/fix-refs.md +0 -91
- package/tools/docs/native-skills-migration-checklist.md +0 -281
- package/tools/fix-doc-links.js +0 -285
- package/tools/validate-agent-schema.js +0 -110
- package/tools/validate-doc-links.js +0 -407
- package/tools/validate-file-refs.js +0 -556
- package/website/README.md +0 -75
- package/website/astro.config.mjs +0 -157
- package/website/public/diagrams/quick-dev-diagram.png +0 -0
- package/website/public/favicon.ico +0 -0
- package/website/public/img/bmad-dark.png +0 -0
- package/website/public/img/bmad-light.png +0 -0
- package/website/public/workflow-map-diagram.html +0 -361
- package/website/src/components/Banner.astro +0 -62
- package/website/src/components/Header.astro +0 -96
- package/website/src/components/MobileMenuFooter.astro +0 -33
- package/website/src/content/config.ts +0 -7
- package/website/src/content/i18n/zh-CN.json +0 -28
- package/website/src/lib/site-url.mjs +0 -25
- package/website/src/pages/404.astro +0 -11
- package/website/src/pages/robots.txt.ts +0 -48
- package/website/src/rehype-base-paths.js +0 -112
- package/website/src/rehype-markdown-links.js +0 -119
- package/website/src/styles/custom.css +0 -805
- /package/src/core/workflows/{brainstorming → bmad-brainstorming}/brain-methods.csv +0 -0
- /package/src/core/workflows/{brainstorming → bmad-brainstorming}/steps/step-01-session-setup.md +0 -0
- /package/src/core/workflows/{brainstorming → bmad-brainstorming}/steps/step-01b-continue.md +0 -0
- /package/src/core/workflows/{brainstorming → bmad-brainstorming}/steps/step-02a-user-selected.md +0 -0
- /package/src/core/workflows/{brainstorming → bmad-brainstorming}/steps/step-02b-ai-recommended.md +0 -0
- /package/src/core/workflows/{brainstorming → bmad-brainstorming}/steps/step-02c-random-selection.md +0 -0
- /package/src/core/workflows/{brainstorming → bmad-brainstorming}/steps/step-02d-progressive-flow.md +0 -0
- /package/src/core/workflows/{brainstorming → bmad-brainstorming}/steps/step-03-technique-execution.md +0 -0
- /package/src/core/workflows/{brainstorming → bmad-brainstorming}/steps/step-04-idea-organization.md +0 -0
- /package/src/core/workflows/{brainstorming → bmad-brainstorming}/template.md +0 -0
- /package/src/core/workflows/{party-mode → bmad-party-mode}/steps/step-01-agent-loading.md +0 -0
- /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
|
-
}
|