bmad-method 6.11.1-next.35 → 6.11.1-next.37
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/AGENTS.md +12 -0
- package/CLAUDE.md +1 -0
- package/greptile.json +52 -0
- package/package.json +3 -3
- package/src/bmm-skills/plan/bmad-sprint-planning/scripts/__pycache__/sprint_plan.cpython-311.pyc +0 -0
- package/src/bmm-skills/plan/bmad-sprint-planning/scripts/tests/__pycache__/test_sprint_plan.cpython-311-pytest-9.1.1.pyc +0 -0
- package/src/bmm-skills/ship/bmad-build/step-04-review.md +1 -1
- package/src/bmm-skills/ship/bmad-build/step-oneshot.md +1 -1
- package/src/bmm-skills/ship/bmad-build-auto/step-04-review.md +2 -2
- package/src/bmm-skills/ship/bmad-code-review/steps/step-03-triage.md +1 -1
- package/src/bmm-skills/ship/bmad-retrospective/scripts/__pycache__/sprint_status.cpython-311.pyc +0 -0
- package/src/bmm-skills/ship/bmad-retrospective/scripts/tests/__pycache__/test_git_evidence.cpython-311-pytest-9.1.1.pyc +0 -0
- package/src/bmm-skills/ship/bmad-retrospective/scripts/tests/__pycache__/test_sprint_status.cpython-311-pytest-9.1.1.pyc +0 -0
- package/src/scripts/__pycache__/config_utils.cpython-311.pyc +0 -0
- package/src/scripts/tests/__pycache__/test_config_utils.cpython-311.pyc +0 -0
- package/src/scripts/tests/__pycache__/test_resolve_config.cpython-311.pyc +0 -0
- package/src/scripts/tests/__pycache__/test_resolve_customization.cpython-311.pyc +0 -0
- package/tools/installer/core/shim-policy.js +1 -1
- package/tools/skill-validator.md +2 -26
- package/tools/tests/__pycache__/test_validate_skills.cpython-311.pyc +0 -0
- package/tools/tests/fixtures/validate-skills/bmad/SKILL.md +8 -0
- package/tools/tests/fixtures/validate-skills/deprecated-shim/SKILL.md +9 -0
- package/tools/tests/fixtures/validate-skills/missing-trigger/SKILL.md +9 -0
- package/tools/tests/fixtures/validate-skills/with-trigger/SKILL.md +8 -0
- package/tools/tests/test_validate_skills.py +476 -0
- package/tools/validate_skills.py +698 -0
- package/tools/validate-skills.js +0 -735
package/AGENTS.md
CHANGED
|
@@ -10,3 +10,15 @@ Open source framework for structured, agent-assisted software delivery.
|
|
|
10
10
|
|
|
11
11
|
- Skill validation rules are in `tools/skill-validator.md`.
|
|
12
12
|
- Deterministic skill checks run via `npm run validate:skills` (included in `quality`).
|
|
13
|
+
- Documentation conventions are in `docs/_STYLE_GUIDE.md`.
|
|
14
|
+
|
|
15
|
+
## Writing prompts
|
|
16
|
+
|
|
17
|
+
Skills, workflows, tasks, and agent definitions are prompt text that an agent reads in full on every run. Length and
|
|
18
|
+
ambiguity are paid on every run; a corner case is paid only when it occurs. So do not add instructions for exotic
|
|
19
|
+
cases — the model usually handles them from context, and the reviewing human can correct it when it does not.
|
|
20
|
+
|
|
21
|
+
## Testing
|
|
22
|
+
|
|
23
|
+
Automated tests assert outcomes produced by deterministic code. Do not write automated tests for LLM output or for
|
|
24
|
+
static source text.
|
package/CLAUDE.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@AGENTS.md
|
package/greptile.json
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
{
|
|
2
|
+
"strictness": 2,
|
|
3
|
+
"commentTypes": ["logic", "syntax"],
|
|
4
|
+
"triggerOnUpdates": false,
|
|
5
|
+
"excludeAuthors": ["dependabot[bot]"],
|
|
6
|
+
"ignorePatterns": "greptile.json\neslint.config.mjs\n.claude/**\n.codex/**\n.agent/**\n.agentvibes/**\n.kiro/**\n.roo/**\n.github/chatmodes/**\ndist/**\nbuild/**\ncoverage/**\n.bundler-temp/**\n**/node_modules/**\n**/*.min.js\n**/*.generated.*\n**/*.bundle.md\npackage-lock.json\n**/*.png\n**/*.jpg\n**/*.svg\ntest/fixtures/**\ntools/tests/fixtures/**\ntest/template-test-generator/**\ntools/template-test-generator/test-scenarios/**\n_bmad*/**\nwebsite/public/**\nwebsite/diagrams/**\nz*/**\nsample-project/**\ntest-project-install/**\n**/validation-report-*.html\nCHANGELOG.md",
|
|
7
|
+
"instructions": "Most of this repo's source is prompt text read by agents at runtime, not executable code. Confine review of it to claims that can be checked against the repository: file paths and cross-references that do not resolve, invocation syntax that does not match the referenced skill, instructions that contradict another file, documented behavior that the code does not implement, and violations of the conventions in AGENTS.md. Do not comment on prompt wording, tone, phrasing, length, or how thorough an instruction feels \u2014 those are authoring decisions and are not yours to judge.",
|
|
8
|
+
"customContext": {
|
|
9
|
+
"files": [
|
|
10
|
+
{
|
|
11
|
+
"path": "AGENTS.md",
|
|
12
|
+
"description": "Repo conventions every change must satisfy"
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"path": "tools/skill-validator.md",
|
|
16
|
+
"description": "Authoritative rule catalog for skills \u2014 SKILL.md metadata, workflow constraints, step file structure, path references, variable resolution, sequential execution, skill invocation syntax. Apply the whole catalog to changed skill files.",
|
|
17
|
+
"scope": ["src/bmm-skills/**", "src/core-skills/**"]
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"path": "docs/_STYLE_GUIDE.md",
|
|
21
|
+
"description": "Documentation conventions: Google style, Diataxis structure, plus project-specific rules on headers, admonitions, and nesting",
|
|
22
|
+
"scope": ["docs/**"]
|
|
23
|
+
}
|
|
24
|
+
],
|
|
25
|
+
"rules": [
|
|
26
|
+
{
|
|
27
|
+
"id": "docs-follow-source",
|
|
28
|
+
"rule": "Source changed. Check whether docs/ needs a matching update \u2014 new features, changed behavior, renamed concepts, altered CLI flags, or modified configuration options should all be reflected in the relevant doc pages. Flag missing or outdated docs.",
|
|
29
|
+
"scope": ["src/**"],
|
|
30
|
+
"severity": "medium"
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"id": "agent-skill-shape",
|
|
34
|
+
"rule": "Agent skill. The persona is configured in customize.toml under [agent]: check that every {agent.*} placeholder the SKILL.md interpolates has a corresponding key there, and that menu entries name skills that exist in this repo.",
|
|
35
|
+
"scope": ["src/bmm-skills/agents/**"],
|
|
36
|
+
"severity": "high"
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"id": "docs-links-resolve",
|
|
40
|
+
"rule": "Check that internal markdown links point at files that exist.",
|
|
41
|
+
"scope": ["docs/**/*.md"],
|
|
42
|
+
"severity": "medium"
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"id": "tooling-exit-codes",
|
|
46
|
+
"rule": "Build and tooling script. Check error handling and that failures exit non-zero.",
|
|
47
|
+
"scope": ["tools/**", "src/scripts/**"],
|
|
48
|
+
"severity": "medium"
|
|
49
|
+
}
|
|
50
|
+
]
|
|
51
|
+
}
|
|
52
|
+
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json.schemastore.org/package.json",
|
|
3
3
|
"name": "bmad-method",
|
|
4
|
-
"version": "6.11.1-next.
|
|
4
|
+
"version": "6.11.1-next.37",
|
|
5
5
|
"description": "Breakthrough Method of Agile AI-driven Development",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"agile",
|
|
@@ -50,11 +50,11 @@
|
|
|
50
50
|
"test:renderer": "uv run --python 3.11 python -m unittest src/scripts/tests/test_config_utils.py src/scripts/tests/test_resolve_config.py src/scripts/tests/test_resolve_customization.py && node test/test-build-auto-renderer.js",
|
|
51
51
|
"test:retrospective": "uv run --python 3.11 src/bmm-skills/ship/bmad-retrospective/scripts/tests/test_git_evidence.py && uv run --python 3.11 src/bmm-skills/ship/bmad-retrospective/scripts/tests/test_sprint_status.py",
|
|
52
52
|
"test:site-url": "node test/test-site-url.mjs",
|
|
53
|
-
"test:skills": "
|
|
53
|
+
"test:skills": "uv run --python 3.11 python -m unittest tools/tests/test_validate_skills.py",
|
|
54
54
|
"test:sprint-planning": "uv run --python 3.11 src/bmm-skills/plan/bmad-sprint-planning/scripts/tests/test_sprint_plan.py && node test/test-template-sync.js",
|
|
55
55
|
"test:urls": "node test/test-parse-source-urls.js",
|
|
56
56
|
"validate:refs": "node tools/validate-file-refs.js --strict",
|
|
57
|
-
"validate:skills": "
|
|
57
|
+
"validate:skills": "uv run --python 3.11 tools/validate_skills.py --strict"
|
|
58
58
|
},
|
|
59
59
|
"lint-staged": {
|
|
60
60
|
"*.{js,cjs,mjs}": [
|
package/src/bmm-skills/plan/bmad-sprint-planning/scripts/__pycache__/sprint_plan.cpython-311.pyc
CHANGED
|
Binary file
|
|
Binary file
|
|
@@ -54,7 +54,7 @@ If a layer's instruction requires subagents and none are available, for each suc
|
|
|
54
54
|
- **intent_gap** — caused by the change; cannot be resolved from the spec because the captured intent is incomplete. Do not infer intent unless there is exactly one possible reading.
|
|
55
55
|
- **bad_spec** — caused by the change, including direct deviations from spec. The spec should have been clear enough to prevent it. When in doubt between bad_spec and patch, prefer bad_spec — a spec-level fix is more likely to produce coherent code.
|
|
56
56
|
- **patch** — caused by the change; its smallest fix is trivial, adds no public surface, and guards no state you did not demonstrate. Just part of the diff. A finding whose smallest fix fails any of those conditions routes to intent_gap when the spec does not settle that fix, otherwise to bad_spec.
|
|
57
|
-
- **defer** — pre-existing issue not caused by this story; or an entry whose members are all `maybe-false
|
|
57
|
+
- **defer** — pre-existing issue not caused by this story; or an entry whose members are all `maybe-false` and the claim, if true, would be `medium` or `high` — record that severity marked unverified, plus what would settle it (if it would only be `low`, reject it with the same note); or any entry whose fix edits agent-context files (CLAUDE.md, AGENTS.md, rules, etc).
|
|
58
58
|
|
|
59
59
|
4. Process entries in cascading order. If intent_gap or bad_spec entries exist, they trigger a loopback — lower entries are moot since code will be re-derived. If neither exists, process patch and defer normally. Before each loopback, read `{spec_file}` frontmatter `review_loop_iteration` (missing means `0`), increment it by 1, and write it back. If it exceeds 5, HALT and escalate to the human.
|
|
60
60
|
- **intent_gap** — Root cause is inside `<frozen-after-approval>`. Revert code changes. Loop back to the human to resolve. Once resolved, read fully and follow `[[bmad-snapshot:step-02-plan.md]]` to re-run steps 2–4.
|
|
@@ -51,7 +51,7 @@ Group the survivors by shared root cause — two findings belong in one entry on
|
|
|
51
51
|
|
|
52
52
|
- **patch** — Patch every entry caused or exposed by this change that shows a defect that actually occurs, missing coverage for a specific case, or a broken gate or convention — not a state nothing reaches — and whose smallest fix is trivial, adds no public surface, and guards no state the finding did not demonstrate. Apply that smallest fix immediately.
|
|
53
53
|
- **HALT** — HALT on every entry caused or exposed by this change that shows the same evidence but whose smallest fix fails any of those conditions. Present it to the human for decision before proceeding.
|
|
54
|
-
- **defer** — Defer every other entry: pre-existing issues, improvement ideas, entries whose members are all `maybe-false` (record what would settle
|
|
54
|
+
- **defer** — Defer every other entry: pre-existing issues, improvement ideas, entries whose members are all `maybe-false` where the claim, if true, would be `medium` or `high` (record that severity marked unverified, plus what would settle it; if it would only be `low`, reject it with the same note), and any entry whose fix edits agent-context files (CLAUDE.md, AGENTS.md, rules, specs). Append one new entry to `{{.implementation_artifacts}}/deferred-work.md` using this format. Do not modify existing entries or look for duplicates.
|
|
55
55
|
```markdown
|
|
56
56
|
- source_spec: `{spec_file}`
|
|
57
57
|
summary: <one sentence>
|
|
@@ -54,7 +54,7 @@ Announce skipped layers first, then launch every active layer before handling an
|
|
|
54
54
|
- **intent_gap** — caused by the change; cannot be resolved from the spec because the captured intent is incomplete. Do not infer intent unless there is exactly one possible reading.
|
|
55
55
|
- **bad_spec** — caused by the change, including direct deviations from spec. The spec should have been clear enough to prevent it. When in doubt between bad_spec and patch, prefer bad_spec — a spec-level fix is more likely to produce coherent code.
|
|
56
56
|
- **patch** — caused by the change; its smallest fix is trivial, adds no public surface, and guards no state you did not demonstrate. Just part of the diff. A finding whose smallest fix fails any of those conditions routes to intent_gap when the spec does not settle that fix, otherwise to bad_spec.
|
|
57
|
-
- **defer** — pre-existing issue not caused by this story; or an entry whose members are all `maybe-false
|
|
57
|
+
- **defer** — pre-existing issue not caused by this story; or an entry whose members are all `maybe-false` and the claim, if true, would be `medium` or `high` — record that severity marked unverified, plus what would settle it (if it would only be `low`, reject it with the same note); or any entry whose fix edits agent-context files (CLAUDE.md, AGENTS.md, rules, etc).
|
|
58
58
|
|
|
59
59
|
4. Append a new entry to the `## Review Triage Log` section in `{spec_file}`, in this format:
|
|
60
60
|
```markdown
|
|
@@ -77,7 +77,7 @@ Announce skipped layers first, then launch every active layer before handling an
|
|
|
77
77
|
<why this is real; for a maybe-false finding, what evidence would settle it>
|
|
78
78
|
location: >- # optional — file:line or component
|
|
79
79
|
src/foo.py:42
|
|
80
|
-
severity: medium # optional — high | medium | low
|
|
80
|
+
severity: medium # optional — high | medium | low; for a maybe-false entry, its if-true grade plus " (unverified)"
|
|
81
81
|
```
|
|
82
82
|
After all appends, parse the complete frontmatter as YAML and verify that `deferred` is one list containing every prior item plus the new items with their intended text. Repair serialization errors before continuing.
|
|
83
83
|
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
4. **Route** each entry into exactly one triage bucket. A group that includes verified `high`, `medium`, or `low` members routes by its highest such verdict -- not to defer just because a member is `maybe-false`.
|
|
41
41
|
- **decision_needed** -- There is an ambiguous choice that requires human input. The code cannot be correctly patched without knowing the user's intent. Only possible if `{review_mode}` = `"full"`.
|
|
42
42
|
- **patch** -- Code issue that is fixable without human input. The correct fix is unambiguous, adds no public surface, and guards no state you did not demonstrate; otherwise `decision_needed`.
|
|
43
|
-
- **defer** -- Pre-existing issue not caused by the current change, real but not actionable now; or an entry whose members are all `maybe-false
|
|
43
|
+
- **defer** -- Pre-existing issue not caused by the current change, real but not actionable now; or an entry whose members are all `maybe-false` and the claim, if true, would be `medium` or `high` -- record that severity marked unverified, plus what would settle it (if it would only be `low`, reject it with the same note); or any entry whose fix edits agent-context files (CLAUDE.md, AGENTS.md, rules, other specs).
|
|
44
44
|
|
|
45
45
|
If `{review_mode}` = `"no-spec"` and an entry would otherwise be `decision_needed`, reclassify it as `patch` (if the fix is unambiguous) or `defer` (if not).
|
|
46
46
|
|
package/src/bmm-skills/ship/bmad-retrospective/scripts/__pycache__/sprint_status.cpython-311.pyc
CHANGED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -79,7 +79,7 @@ async function readInstalledSkillIds(bmadDir) {
|
|
|
79
79
|
|
|
80
80
|
// The installed manifest carries no lifecycle column, so the description
|
|
81
81
|
// prefix every shim ships with is the only record of what was a shim. This
|
|
82
|
-
// is the same signal
|
|
82
|
+
// is the same signal validate_skills.py uses to exempt them.
|
|
83
83
|
async function readInstalledShims(bmadDir) {
|
|
84
84
|
const shims = [];
|
|
85
85
|
for (const record of await readSkillManifest(bmadDir)) {
|
package/tools/skill-validator.md
CHANGED
|
@@ -7,10 +7,10 @@ An LLM-readable validation prompt for skills following the Agent Skills open sta
|
|
|
7
7
|
Before running inference-based validation, run the deterministic validator:
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
|
-
|
|
10
|
+
uv run --python 3.11 tools/validate_skills.py --json path/to/skill-dir
|
|
11
11
|
```
|
|
12
12
|
|
|
13
|
-
This checks
|
|
13
|
+
This checks 10 rules deterministically: SKILL-01, SKILL-02, SKILL-03, SKILL-04, SKILL-05, SKILL-06, SKILL-07, PATH-02, SEQ-02, TPL-01.
|
|
14
14
|
|
|
15
15
|
Review its JSON output. For any rule that produced **zero findings** in the first pass, **skip it** during inference-based validation below — it has already been verified. If a rule produced any findings, the inference validator should still review that rule (some rules like SKILL-04 and SKILL-06 have sub-checks that benefit from judgment). Focus your inference effort on the remaining rules that require judgment (PATH-01, PATH-03, PATH-04, PATH-05, WF-03, STEP-02, STEP-03, STEP-04, STEP-05, SEQ-01, REF-01, REF-02, REF-03).
|
|
16
16
|
|
|
@@ -176,14 +176,6 @@ If no findings are generated (from either pass), the skill passes validation.
|
|
|
176
176
|
|
|
177
177
|
---
|
|
178
178
|
|
|
179
|
-
### STEP-01 — Step File Naming
|
|
180
|
-
|
|
181
|
-
- **Severity:** MEDIUM
|
|
182
|
-
- **Applies to:** files in `steps/` directory
|
|
183
|
-
- **Rule:** Step files must be named `step-NN-description.md` where NN is a zero-padded two-digit number. An optional single-letter variant suffix is allowed for branching steps (e.g., `step-01b-continue.md`).
|
|
184
|
-
- **Detection:** Regex: `^step-\d{2}[a-z]?-[a-z0-9-]+\.md$`
|
|
185
|
-
- **Fix:** Rename to match the pattern.
|
|
186
|
-
|
|
187
179
|
### STEP-02 — Step Must Have a Goal Section
|
|
188
180
|
|
|
189
181
|
- **Severity:** HIGH
|
|
@@ -217,22 +209,6 @@ If no findings are generated (from either pass), the skill passes validation.
|
|
|
217
209
|
- **Detection:** Look for instructions to read multiple step files simultaneously, or unconditional references to step files with higher numbers than the current step. Exempt locations: `## NEXT` sections, navigation/dispatch sections that list valid resumption targets, and conditional routing branches.
|
|
218
210
|
- **Fix:** Remove premature step loading. Ensure only the current step is active.
|
|
219
211
|
|
|
220
|
-
### STEP-06 — Step File Frontmatter: No `name` or `description`
|
|
221
|
-
|
|
222
|
-
- **Severity:** MEDIUM
|
|
223
|
-
- **Applies to:** step files
|
|
224
|
-
- **Rule:** Step files should not have `name:` or `description:` in their YAML frontmatter. These are metadata noise — the step's purpose is conveyed by its goal section and filename.
|
|
225
|
-
- **Detection:** Parse step file frontmatter for `name:` or `description:` keys.
|
|
226
|
-
- **Fix:** Remove `name:` and `description:` from step file frontmatter.
|
|
227
|
-
|
|
228
|
-
### STEP-07 — Step Count
|
|
229
|
-
|
|
230
|
-
- **Severity:** LOW
|
|
231
|
-
- **Applies to:** workflow as a whole
|
|
232
|
-
- **Rule:** A sharded workflow should have between 2 and 10 step files. More than 10 risks LLM context degradation.
|
|
233
|
-
- **Detection:** Count files matching `step-*.md` in the `steps/` directory.
|
|
234
|
-
- **Fix:** Consider consolidating steps if over 10.
|
|
235
|
-
|
|
236
212
|
---
|
|
237
213
|
|
|
238
214
|
### SEQ-01 — No Skip Instructions
|
|
Binary file
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: deprecated-shim
|
|
3
|
+
description: 'DEPRECATED — consolidated into bmad-foo; this skill will be removed in v7 in favor of `bmad-foo`.'
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# DEPRECATED — forwards to bmad-foo
|
|
7
|
+
|
|
8
|
+
This skill was consolidated into `bmad-foo` and is retained as a thin compatibility
|
|
9
|
+
shim so existing invocations keep working. New work should invoke `bmad-foo` directly.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: missing-trigger
|
|
3
|
+
description: 'Generates a thing and writes it to disk for the user.'
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Missing Trigger
|
|
7
|
+
|
|
8
|
+
An active (non-deprecated) skill whose description omits a "Use when" trigger phrase.
|
|
9
|
+
This fixture guards against regressions: SKILL-06 must still flag it.
|