Compare commits

...

5 Commits

Author SHA1 Message Date
Alex Verkhovsky c9e4db1445
Merge branch 'main' into fix/issue-2066-user-name-spaces 2026-03-21 19:23:50 -06:00
Alex Verkhovsky e3f935fd6d
fix(docs): community feedback — typo, locale 404s, llms-full (#2091)
* fix(docs): correct Hasselhoff spelling, add locale-aware 404 redirect

Fix "Hasslehoff" → "Hasselhoff" typo in customize-bmad.md across all
three locales (en, zh-cn, fr).

Add client-side locale detection to 404.astro so GitHub Pages serves
the correct localized 404 page instead of always showing English.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(build): exclude translated locales from llms-full.txt

llms-full.txt was including zh-cn and fr docs, tripling the content
with duplicate information in different languages. Restrict to English
only — translations add no value for LLM context consumption.

Reduces output from ~393K to ~114K chars (~29k tokens).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* refactor(i18n): extract locale config to shared module

Move locale definitions from astro.config.mjs into a shared
website/src/lib/locales.mjs consumed by astro config, build-docs,
and 404.astro. Adding a new locale is now a single-file change.

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-21 16:42:57 -06:00
Alex Verkhovsky 1a78916e3c
Merge branch 'main' into fix/issue-2066-user-name-spaces 2026-03-21 15:39:19 -06:00
Alex Verkhovsky 10282a4a14
fix(quick-dev): use absolute paths in code -r invocations (#2087)
* fix(quick-dev): use absolute paths in code -r invocations

Agent CWD may differ from the project root in worktree setups,
causing relative paths to silently fail. Resolve paths via
git rev-parse --show-toplevel before invoking code -r.

* fix(quick-dev): add CWD fallback when git rev-parse fails

Adds graceful fallback to current working directory when
git rev-parse --show-toplevel fails (VCS unavailable).
2026-03-21 15:37:04 -06:00
Alex Verkhovsky a59ae5c842
fix(quick-dev): make file path references clickable (#2085)
* fix(quick-dev): make file path references clickable

Spec-file links use paths relative to the spec file's
directory (clickable in VS Code). Terminal output paths
use CWD-relative format for terminal clickability.

* fix(quick-dev): add :line suffix to step-oneshot path example

Aligns the file path example in step-oneshot.md with the clickable
`:line` format already enforced in step-03-implement.md and
step-05-present.md.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-21 12:20:45 -06:00
10 changed files with 70 additions and 26 deletions

View File

@ -84,7 +84,7 @@ Ajouter un contexte persistant que l'agent gardera toujours en mémoire :
```yaml
memories:
- 'Travaille au Krusty Krab'
- 'Célébrité préférée : David Hasslehoff'
- 'Célébrité préférée : David Hasselhoff'
- 'Appris dans lEpic 1 que ce nest pas cool de faire semblant que les tests ont passé'
```

View File

@ -85,7 +85,7 @@ Add persistent context the agent will always remember:
```yaml
memories:
- 'Works at Krusty Krab'
- 'Favorite Celebrity: David Hasslehoff'
- 'Favorite Celebrity: David Hasselhoff'
- 'Learned in Epic 1 that it is not cool to just pretend that tests have passed'
```

View File

@ -85,7 +85,7 @@ persona:
```yaml
memories:
- 'Works at Krusty Krab'
- 'Favorite Celebrity: David Hasslehoff'
- 'Favorite Celebrity: David Hasselhoff'
- 'Learned in Epic 1 that it is not cool to just pretend that tests have passed'
```

View File

@ -26,6 +26,8 @@ Change `{spec_file}` status to `in-progress` in the frontmatter before starting
Hand `{spec_file}` to a sub-agent/task and let it implement. If no sub-agents are available, implement directly.
**Path formatting rule:** Any markdown links written into `{spec_file}` must use paths relative to `{spec_file}`'s directory so they are clickable in VS Code. Any file paths displayed in terminal/conversation output must use CWD-relative format with `:line` notation (e.g., `src/path/file.ts:42`) for terminal clickability. No leading `/` in either case.
## NEXT
Read fully and follow `./step-04-review.md`

View File

@ -22,7 +22,7 @@ Build the trail as an ordered sequence of **stops** — clickable `path:line` re
2. **Lead with the entry point** — the single highest-leverage file:line a reviewer should look at first to grasp the design intent.
3. **Inside each concern**, order stops from most important / architecturally interesting to supporting. Lightly bias toward higher-risk or boundary-crossing stops.
4. **End with peripherals** — tests, config, types, and other supporting changes come last.
5. **Every code reference is a clickable workspace-relative link** (project-root-relative for clickability in the editor). Format each stop as a markdown link: `[short-name:line](/project-root-relative/path/to/file.ts#L42)`. The link target uses a leading `/` (workspace root) with a `#L` line anchor. Use the file's basename (or shortest unambiguous suffix) plus line number as the link text.
5. **Every code reference is a clickable spec-file-relative link.** Compute each link target as a relative path from `{spec_file}`'s directory to the changed file. Format each stop as a markdown link: `[short-name:line](../../path/to/file.ts#L42)`. Use a `#L` line anchor. Use the file's basename (or shortest unambiguous suffix) plus line number as the link text. The relative path must be dynamically derived — never hardcode the depth.
6. **Each stop gets one ultra-concise line of framing** (≤15 words) — why this approach was chosen here and what it achieves in the context of the change. No paragraphs.
Format each stop as framing first, link on the next indented line:
@ -33,17 +33,19 @@ Format each stop as framing first, link on the next indented line:
**{Concern name}**
- {one-line framing}
[`file.ts:42`](/src/path/to/file.ts#L42)
[`file.ts:42`](../../src/path/to/file.ts#L42)
- {one-line framing}
[`other.ts:17`](/src/path/to/other.ts#L17)
[`other.ts:17`](../../src/path/to/other.ts#L17)
**{Next concern}**
- {one-line framing}
[`file.ts:88`](/src/path/to/file.ts#L88)
[`file.ts:88`](../../src/path/to/file.ts#L88)
```
> The `../../` prefix above is illustrative — compute the actual relative path from `{spec_file}`'s directory to each target file.
When there is only one concern, omit the bold label — just list the stops directly.
### Commit and Present
@ -51,9 +53,9 @@ When there is only one concern, omit the bold label — just list the stops dire
1. Change `{spec_file}` status to `done` in the frontmatter.
2. If version control is available and the tree is dirty, create a local commit with a conventional message derived from the spec title.
3. Open the spec in the user's editor so they can click through the Suggested Review Order:
- Run `code -r "{spec_file}"` to open the spec in the current VS Code window (reuses the window where the project or worktree is open). Always double-quote the path to handle spaces and special characters.
- Resolve two absolute paths: (1) the repository root (`git rev-parse --show-toplevel` — returns the worktree root when in a worktree, project root otherwise; if this fails, fall back to the current working directory), (2) `{spec_file}`. Run `code -r "{absolute-root}" "{absolute-spec-file}"` — the root first so VS Code opens in the right context, then the spec file. Always double-quote paths to handle spaces and special characters.
- If `code` is not available (command fails), skip gracefully and tell the user the spec file path instead.
4. Display summary of your work to the user, including the commit hash if one was created. Any file paths shown in conversation/terminal output must use CWD-relative format (no leading `/`) for terminal clickability — this differs from spec-file links which use project-root-relative paths. Include:
4. Display summary of your work to the user, including the commit hash if one was created. Any file paths shown in conversation/terminal output must use CWD-relative format (no leading `/`) with `:line` notation (e.g., `src/path/file.ts:42`) for terminal clickability — the goal is to make paths clickable in terminal emulators. Include:
- A note that the spec is open in their editor (or the file path if it couldn't be opened). Mention that `{spec_file}` now contains a Suggested Review Order.
- **Navigation tip:** "Ctrl+click (Cmd+click on macOS) the links in the Suggested Review Order to jump to each stop."
- Offer to push and/or create a pull request.

View File

@ -36,11 +36,11 @@ If version control is available and the tree is dirty, create a local commit wit
### Present
1. Open all changed files in the user's editor so they can review the code directly:
- Run `code -r "{project-root}" <changed-file-paths>` — the project root as the first argument, then each changed file path. Always double-quote paths with spaces.
- Resolve two sets of absolute paths: (1) the repository root (`git rev-parse --show-toplevel` — returns the worktree root when in a worktree, project root otherwise; if this fails, fall back to the current working directory), (2) each changed file. Run `code -r "{absolute-root}" <absolute-changed-file-paths>` — the root first so VS Code opens in the right context, then each changed file. Always double-quote paths to handle spaces and special characters.
- If `code` is not available (command fails), skip gracefully and list the file paths instead.
2. Display a summary in conversation output, including:
- The commit hash (if one was created).
- List of files changed with one-line descriptions.
- List of files changed with one-line descriptions. Use CWD-relative paths with `:line` notation (e.g., `src/path/file.ts:42`) for terminal clickability. No leading `/`.
- Review findings breakdown: patches applied, items deferred, items rejected. If all findings were rejected, say so.
3. Offer to push and/or create a pull request.

View File

@ -14,6 +14,7 @@ import fs from 'node:fs';
import path from 'node:path';
import { fileURLToPath } from 'node:url';
import { getSiteUrl } from '../website/src/lib/site-url.mjs';
import { translatedLocales } from '../website/src/lib/locales.mjs';
// =============================================================================
// Configuration
@ -288,6 +289,9 @@ function shouldExcludeFromLlm(filePath) {
const pathParts = filePath.split(path.sep);
if (pathParts.some((part) => part.startsWith('_'))) return true;
// Exclude non-root locale directories (translations duplicate English content)
if (translatedLocales.some((locale) => filePath.startsWith(`${locale}/`) || filePath.startsWith(`${locale}${path.sep}`))) return true;
// Check configured patterns
return LLM_EXCLUDE_PATTERNS.some((pattern) => filePath.includes(pattern));
}

View File

@ -5,6 +5,7 @@ import sitemap from '@astrojs/sitemap';
import rehypeMarkdownLinks from './src/rehype-markdown-links.js';
import rehypeBasePaths from './src/rehype-base-paths.js';
import { getSiteUrl } from './src/lib/site-url.mjs';
import { locales } from './src/lib/locales.mjs';
const siteUrl = getSiteUrl();
const urlParts = new URL(siteUrl);
@ -45,22 +46,9 @@ export default defineConfig({
title: 'BMAD Method',
tagline: 'AI-driven agile development with specialized agents and workflows that scale from bug fixes to enterprise platforms.',
// i18n: English as root (no URL prefix), Chinese at /zh-cn/, French at /fr/
// i18n: locale config from shared module (website/src/lib/locales.mjs)
defaultLocale: 'root',
locales: {
root: {
label: 'English',
lang: 'en',
},
'zh-cn': {
label: '简体中文',
lang: 'zh-CN',
},
fr: {
label: 'Français',
lang: 'fr-FR',
},
},
locales,
logo: {
light: './public/img/bmad-light.png',

View File

@ -0,0 +1,32 @@
/**
* Shared i18n locale configuration.
*
* Single source of truth for locale definitions used by:
* - website/astro.config.mjs (Starlight i18n)
* - tools/build-docs.mjs (llms-full.txt locale exclusion)
* - website/src/pages/404.astro (client-side locale redirect)
*
* The root locale (English) uses Starlight's 'root' key convention
* (no URL prefix). All other locales get a URL prefix matching their key.
*/
export const locales = {
root: {
label: 'English',
lang: 'en',
},
'zh-cn': {
label: '简体中文',
lang: 'zh-CN',
},
fr: {
label: 'Français',
lang: 'fr-FR',
},
};
/**
* Non-root locale keys (the URL prefixes for translated content).
* @type {string[]}
*/
export const translatedLocales = Object.keys(locales).filter((k) => k !== 'root');

View File

@ -1,6 +1,7 @@
---
import StarlightPage from '@astrojs/starlight/components/StarlightPage.astro';
import { getEntry } from 'astro:content';
import { translatedLocales } from '../lib/locales.mjs';
const entry = await getEntry('docs', '404');
const { Content } = await entry.render();
@ -9,3 +10,18 @@ const { Content } = await entry.render();
<StarlightPage frontmatter={{ title: entry.data.title, template: entry.data.template }}>
<Content />
</StarlightPage>
<!-- GitHub Pages serves this single 404.html for all paths.
Redirect to the locale-specific 404 page when the URL has a locale prefix. -->
<script is:inline define:vars={{ translatedLocales }}>
(function () {
var path = window.location.pathname;
for (var i = 0; i < translatedLocales.length; i++) {
var prefix = '/' + translatedLocales[i] + '/';
if (path.startsWith(prefix) && path !== prefix + '404/') {
window.location.replace(prefix + '404/');
return;
}
}
})();
</script>