ma-agents 3.5.3 → 3.5.5

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 (82) hide show
  1. package/_bmad-output/implementation-artifacts/21-1-install-time-profile-prompt.md +181 -0
  2. package/_bmad-output/implementation-artifacts/21-10-profile-reconfigure.md +137 -0
  3. package/_bmad-output/implementation-artifacts/21-11-profile-uninstall.md +149 -0
  4. package/_bmad-output/implementation-artifacts/21-2-universal-instruction-block-expansion.md +98 -0
  5. package/_bmad-output/implementation-artifacts/21-3-roomodes-template-bmad-modes.md +106 -0
  6. package/_bmad-output/implementation-artifacts/21-4-agents-md-template-opencode.md +86 -0
  7. package/_bmad-output/implementation-artifacts/21-5-clinerules-template-extension.md +82 -0
  8. package/_bmad-output/implementation-artifacts/21-6-onprem-layered-guardrails.md +112 -0
  9. package/_bmad-output/implementation-artifacts/21-7-bmad-persona-phase-prefix.md +126 -0
  10. package/_bmad-output/implementation-artifacts/21-8-vllm-reference-doc-readme.md +100 -0
  11. package/_bmad-output/implementation-artifacts/21-9-tests-validation.md +97 -0
  12. package/_bmad-output/implementation-artifacts/bug-experimentalwarning-about-commonjs-loading-es-module-during-install.md +57 -0
  13. package/_bmad-output/implementation-artifacts/sprint-status.yaml +43 -1
  14. package/_bmad-output/methodology/BMAD_AI_Development_Training.pptx +0 -0
  15. package/_bmad-output/methodology/version.json +1 -1
  16. package/_bmad-output/planning-artifacts/architecture.md +52 -0
  17. package/_bmad-output/planning-artifacts/epics.md +397 -0
  18. package/_bmad-output/planning-artifacts/prd.md +46 -1
  19. package/bin/cli.js +109 -1
  20. package/docs/BMAD_AI_Development_Training.pptx +0 -0
  21. package/lib/bmad-cache/bmb/_git_preserved/index +0 -0
  22. package/lib/bmad-cache/bmb/_git_preserved/logs/HEAD +1 -1
  23. package/lib/bmad-cache/bmb/_git_preserved/logs/refs/heads/main +1 -1
  24. package/lib/bmad-cache/bmb/_git_preserved/logs/refs/remotes/origin/HEAD +1 -1
  25. package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-554778ad4e7254827618ebd2497c3f4bce9054a4.idx +0 -0
  26. package/lib/bmad-cache/bmb/_git_preserved/objects/pack/{pack-4b395d030ca386fc5748f1b670dcf8c0ef41c94c.pack → pack-554778ad4e7254827618ebd2497c3f4bce9054a4.pack} +0 -0
  27. package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-554778ad4e7254827618ebd2497c3f4bce9054a4.rev +0 -0
  28. package/lib/bmad-cache/bmb/_git_preserved/packed-refs +1 -1
  29. package/lib/bmad-cache/bmb/_git_preserved/refs/heads/main +1 -1
  30. package/lib/bmad-cache/bmb/_git_preserved/shallow +1 -1
  31. package/lib/bmad-cache/bmb/skills/bmad-module-builder/scripts/tests/test-scaffold-setup-skill.py +7 -0
  32. package/lib/bmad-cache/cache-manifest.json +5 -5
  33. package/lib/bmad-cache/tea/_git_preserved/index +0 -0
  34. package/lib/bmad-cache/tea/_git_preserved/objects/pack/pack-e75385cd52b693dbb8a3b2afb50058952543b3a2.idx +0 -0
  35. package/lib/bmad-cache/tea/_git_preserved/objects/pack/{pack-c79805bb3fee27fa6d8c612a971af7fc86fc80e1.pack → pack-e75385cd52b693dbb8a3b2afb50058952543b3a2.pack} +0 -0
  36. package/lib/bmad-cache/tea/_git_preserved/objects/pack/pack-e75385cd52b693dbb8a3b2afb50058952543b3a2.rev +0 -0
  37. package/lib/bmad-cache/tea/_git_preserved/packed-refs +1 -1
  38. package/lib/bmad-cache/tea/_git_preserved/refs/heads/main +1 -1
  39. package/lib/bmad-cache/tea/_git_preserved/refs/tags/v1.10.0 +1 -0
  40. package/lib/bmad-cache/tea/_git_preserved/shallow +1 -1
  41. package/lib/bmad-cache/tea/docs/explanation/tea-overview.md +2 -2
  42. package/lib/bmad-cache/tea/docs/how-to/workflows/run-atdd.md +28 -30
  43. package/lib/bmad-cache/tea/docs/reference/commands.md +4 -4
  44. package/lib/bmad-cache/tea/docs/reference/configuration.md +1 -1
  45. package/lib/bmad-cache/tea/package-lock.json +2 -2
  46. package/lib/bmad-cache/tea/package.json +1 -1
  47. package/lib/bmad-cache/tea/src/module-help.csv +1 -1
  48. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/SKILL.md +1 -1
  49. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/atdd-checklist-template.md +50 -27
  50. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/checklist.md +18 -17
  51. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/instructions.md +1 -1
  52. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/steps-c/step-01-preflight-and-context.md +21 -3
  53. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/steps-c/step-01b-resume.md +1 -1
  54. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/steps-c/step-02-generation-mode.md +1 -1
  55. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/steps-c/step-03-test-strategy.md +1 -1
  56. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/steps-c/step-04-generate-tests.md +20 -19
  57. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/steps-c/step-04a-subagent-api-failing.md +13 -13
  58. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/steps-c/step-04b-subagent-e2e-failing.md +13 -13
  59. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/steps-c/step-04c-aggregate.md +42 -18
  60. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/steps-c/step-05-validate-and-complete.md +12 -3
  61. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/workflow-plan.md +2 -2
  62. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/workflow.md +2 -2
  63. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/workflow.yaml +2 -2
  64. package/lib/bmad.js +25 -4
  65. package/lib/installer.js +2 -1
  66. package/lib/methodology/BMAD_AI_Development_Training.pptx +0 -0
  67. package/lib/methodology/version.json +1 -1
  68. package/lib/profile.js +107 -0
  69. package/lib/warning-filter.js +245 -0
  70. package/package.json +2 -2
  71. package/test/experimental-warning.test.js +314 -0
  72. package/test/fixtures/README.md +74 -0
  73. package/test/fixtures/empty-project/README.md +5 -0
  74. package/test/fixtures/empty-project/package.json +5 -0
  75. package/test/fixtures/onprem-profile-baseline/.gitkeep +2 -0
  76. package/test/fixtures/standard-profile-baseline/.gitkeep +2 -0
  77. package/test/onprem-injection.test.js +48 -0
  78. package/test/profile.test.js +301 -0
  79. package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-4b395d030ca386fc5748f1b670dcf8c0ef41c94c.idx +0 -0
  80. package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-4b395d030ca386fc5748f1b670dcf8c0ef41c94c.rev +0 -0
  81. package/lib/bmad-cache/tea/_git_preserved/objects/pack/pack-c79805bb3fee27fa6d8c612a971af7fc86fc80e1.idx +0 -0
  82. package/lib/bmad-cache/tea/_git_preserved/objects/pack/pack-c79805bb3fee27fa6d8c612a971af7fc86fc80e1.rev +0 -0
package/bin/cli.js CHANGED
@@ -1,11 +1,40 @@
1
1
  #!/usr/bin/env node
2
2
 
3
+ // Bug A fix — suppress the cosmetic Node.js ExperimentalWarning about
4
+ // CommonJS require() of an ES Module. Must be installed BEFORE any
5
+ // other require() so the filter catches warnings fired by the very
6
+ // first dependency-loading call below. See lib/warning-filter.js.
7
+ //
8
+ // Re-exec gating:
9
+ // - Only when this file is launched as the CLI (require.main === module).
10
+ // When imported by the test suite or another script, skip the re-exec
11
+ // path — otherwise the importing process would silently fork itself.
12
+ // - Only for commands that can trigger the CJS-require-ESM warning,
13
+ // i.e. those that spawn bmad-method or otherwise load the heavy
14
+ // transitive dependency graph. Informational commands (--help,
15
+ // --version, status, list, agents) stay single-process for fast
16
+ // cold start. The listener-only fallback is still attached so
17
+ // in-process warnings still route through our filter.
18
+ const { installExperimentalWarningFilter } = require('../lib/warning-filter');
19
+ const _reexecCommands = new Set([
20
+ 'install', 'uninstall', 'remove',
21
+ 'create-skill', 'validate-skill', 'set-mandatory',
22
+ 'customize-agent', 'create-agent',
23
+ 'config',
24
+ undefined, // bare `ma-agents` → interactive wizard
25
+ ]);
26
+ const _firstArg = process.argv[2];
27
+ installExperimentalWarningFilter({
28
+ reexec: require.main === module && _reexecCommands.has(_firstArg),
29
+ });
30
+
3
31
  const prompts = require('prompts');
4
32
  const chalk = require('chalk');
5
33
  const path = require('path');
6
34
  const fs = require('fs');
7
35
  const { execFileSync } = require('child_process');
8
36
  const { installSkill, uninstallSkill, getStatus, listSkills, listAgents, updateProjectContextRepoLayout } = require('../lib/installer');
37
+ const { getProfile, setProfile, resolveProfile } = require('../lib/profile');
9
38
  const bmad = require('../lib/bmad');
10
39
  const { getBmadPlatformCode } = require('../lib/agents');
11
40
  const { handleCreateSkill, handleValidateSkill, handleSetMandatory, handleCustomizeAgent, handleCreateAgent } = require('../lib/skill-authoring');
@@ -173,7 +202,10 @@ function parseFlags(args) {
173
202
  const yesFlag = args.includes('--yes');
174
203
  let customPath = '';
175
204
  let agentFlag = '';
176
- let positional = [...args].filter(a => a !== '--global' && a !== '--force' && a !== '--yes');
205
+
206
+ let positional = [...args].filter(a =>
207
+ a !== '--global' && a !== '--force' && a !== '--yes'
208
+ );
177
209
 
178
210
  const pathIdx = positional.indexOf('--path');
179
211
  if (pathIdx !== -1) {
@@ -824,6 +856,43 @@ async function installWizard(preselectedSkill, preselectedAgents, customPath, fo
824
856
  }
825
857
  }
826
858
 
859
+ // Step 2.4: Profile resolution (Story 21.1, ACs #7–#9)
860
+ // Must run AFTER agent selection and BEFORE repo layout, so downstream stories
861
+ // can gate layout-related guidance on profile. setProfile() is called BEFORE
862
+ // any agent install runs — guaranteeing persistence even if a later step fails.
863
+ // Profile lives at the project root (cwd), NOT the custom skills-install path.
864
+ const projectRootForProfile = process.cwd();
865
+ const persistedProfile = getProfile(projectRootForProfile);
866
+ let resolvedProfile = resolveProfile({
867
+ persisted: persistedProfile,
868
+ yesMode: yesFlag
869
+ });
870
+ let profileSource;
871
+ if (persistedProfile) profileSource = '.ma-agents.json';
872
+ else if (resolvedProfile === 'standard' && yesFlag) profileSource = '--yes default';
873
+
874
+ if (resolvedProfile === null) {
875
+ const { chosenProfile } = await prompts({
876
+ type: 'select',
877
+ name: 'chosenProfile',
878
+ message: 'Is this an on-prem / air-gapped install using a local LLM (e.g. Nemotron)?',
879
+ choices: [
880
+ { title: 'Yes — apply local-LLM guardrails (recommended for non-Claude models)', value: 'on-prem' },
881
+ { title: 'No — standard install (Claude on web, Anthropic API, etc.)', value: 'standard' }
882
+ ],
883
+ initial: 1
884
+ });
885
+ if (!chosenProfile) process.exit(0);
886
+ resolvedProfile = chosenProfile;
887
+ profileSource = 'interactive prompt';
888
+ }
889
+
890
+ console.log(chalk.cyan(`Using profile: ${resolvedProfile} (from ${profileSource})`));
891
+
892
+ // Persist BEFORE any agent install step (AC #9). setProfile bootstraps the
893
+ // manifest via ensureManifest when absent.
894
+ setProfile(projectRootForProfile, resolvedProfile);
895
+
827
896
  // Step 2.5: Repository layout (preserve existing config on update)
828
897
  const existingLayout = isUpdate ? readExistingLayout() : null;
829
898
  const repoLayout = await collectRepoLayout({ yes: yesFlag }, existingLayout);
@@ -1077,6 +1146,45 @@ async function handleInstall(args) {
1077
1146
  return;
1078
1147
  }
1079
1148
 
1149
+ // Direct install path — Story 21.1 AC #9, #11: resolve + persist profile BEFORE install.
1150
+ // Profile lives at the project root (cwd), not the custom skills-install path.
1151
+ // When stdin is not a TTY and nothing is resolvable, default to 'standard' (same
1152
+ // behavior as --yes) rather than aborting — keeps CI/CD direct installs working.
1153
+ const projectRootForProfile = process.cwd();
1154
+ const persistedProfile = getProfile(projectRootForProfile);
1155
+ let resolvedProfile = resolveProfile({
1156
+ persisted: persistedProfile,
1157
+ yesMode: yesFlag
1158
+ });
1159
+ let profileSource;
1160
+ if (persistedProfile) profileSource = '.ma-agents.json';
1161
+ else if (resolvedProfile === 'standard' && yesFlag) profileSource = '--yes default';
1162
+
1163
+ if (resolvedProfile === null) {
1164
+ if (!process.stdin.isTTY) {
1165
+ // Non-interactive fallback: default to 'standard' and persist (mirrors --yes).
1166
+ resolvedProfile = 'standard';
1167
+ profileSource = '--yes default';
1168
+ } else {
1169
+ const { chosenProfile } = await prompts({
1170
+ type: 'select',
1171
+ name: 'chosenProfile',
1172
+ message: 'Is this an on-prem / air-gapped install using a local LLM (e.g. Nemotron)?',
1173
+ choices: [
1174
+ { title: 'Yes — apply local-LLM guardrails (recommended for non-Claude models)', value: 'on-prem' },
1175
+ { title: 'No — standard install (Claude on web, Anthropic API, etc.)', value: 'standard' }
1176
+ ],
1177
+ initial: 1
1178
+ });
1179
+ if (!chosenProfile) process.exit(0);
1180
+ resolvedProfile = chosenProfile;
1181
+ profileSource = 'interactive prompt';
1182
+ }
1183
+ }
1184
+
1185
+ console.log(chalk.cyan(`Using profile: ${resolvedProfile} (from ${profileSource})`));
1186
+ setProfile(projectRootForProfile, resolvedProfile);
1187
+
1080
1188
  // Full args → direct install (Task 3.5)
1081
1189
  const targetAgents = agentFlag ? [agentFlag] : agentIds;
1082
1190
  try {
@@ -1 +1 @@
1
- 0000000000000000000000000000000000000000 605e07656f9f633b5e429297388e1db9687d1996 Alon Mayaffit <alon.mayafit@gmail.com> 1775729260 +0300 clone: from https://github.com/bmad-code-org/bmad-builder
1
+ 0000000000000000000000000000000000000000 f8b793001493ec991b718a3f41cf73e6743f3dc6 Alon Mayaffit <alon.mayafit@gmail.com> 1776150101 +0300 clone: from https://github.com/bmad-code-org/bmad-builder
@@ -1 +1 @@
1
- 0000000000000000000000000000000000000000 605e07656f9f633b5e429297388e1db9687d1996 Alon Mayaffit <alon.mayafit@gmail.com> 1775729260 +0300 clone: from https://github.com/bmad-code-org/bmad-builder
1
+ 0000000000000000000000000000000000000000 f8b793001493ec991b718a3f41cf73e6743f3dc6 Alon Mayaffit <alon.mayafit@gmail.com> 1776150101 +0300 clone: from https://github.com/bmad-code-org/bmad-builder
@@ -1 +1 @@
1
- 0000000000000000000000000000000000000000 605e07656f9f633b5e429297388e1db9687d1996 Alon Mayaffit <alon.mayafit@gmail.com> 1775729260 +0300 clone: from https://github.com/bmad-code-org/bmad-builder
1
+ 0000000000000000000000000000000000000000 f8b793001493ec991b718a3f41cf73e6743f3dc6 Alon Mayaffit <alon.mayafit@gmail.com> 1776150101 +0300 clone: from https://github.com/bmad-code-org/bmad-builder
@@ -1,2 +1,2 @@
1
1
  # pack-refs with: peeled fully-peeled sorted
2
- 605e07656f9f633b5e429297388e1db9687d1996 refs/remotes/origin/main
2
+ f8b793001493ec991b718a3f41cf73e6743f3dc6 refs/remotes/origin/main
@@ -1 +1 @@
1
- 605e07656f9f633b5e429297388e1db9687d1996
1
+ f8b793001493ec991b718a3f41cf73e6743f3dc6
@@ -1 +1 @@
1
- 605e07656f9f633b5e429297388e1db9687d1996
1
+ f8b793001493ec991b718a3f41cf73e6743f3dc6
@@ -95,6 +95,12 @@ def test_skill_md_frontmatter_substitution():
95
95
  assert "{module-code}" not in skill_md
96
96
 
97
97
 
98
+ def test_template_frontmatter_uses_quoted_name_placeholder():
99
+ """Test that the template frontmatter is valid before substitution."""
100
+ template_skill_md = (TEMPLATE_DIR / "SKILL.md").read_text()
101
+ assert 'name: "{setup-skill-name}"' in template_skill_md
102
+
103
+
98
104
  def test_generated_files_written():
99
105
  """Test that module.yaml and module-help.csv contain generated content."""
100
106
  with tempfile.TemporaryDirectory() as tmp:
@@ -201,6 +207,7 @@ if __name__ == "__main__":
201
207
  tests = [
202
208
  test_basic_scaffold,
203
209
  test_skill_md_frontmatter_substitution,
210
+ test_template_frontmatter_uses_quoted_name_placeholder,
204
211
  test_generated_files_written,
205
212
  test_anti_zombie_replaces_existing,
206
213
  test_missing_target_dir,
@@ -1,12 +1,12 @@
1
1
  {
2
- "generated": "2026-04-09T16:00:08.461Z",
2
+ "generated": "2026-04-14T07:01:59.067Z",
3
3
  "bmadMethodVersion": "6.2.2",
4
4
  "modules": {
5
5
  "bmb": {
6
6
  "url": "https://github.com/bmad-code-org/bmad-builder",
7
7
  "branch": "main",
8
- "commitSha": "605e07656f9f633b5e429297388e1db9687d1996",
9
- "clonedAt": "2026-04-09T10:07:44.090Z"
8
+ "commitSha": "f8b793001493ec991b718a3f41cf73e6743f3dc6",
9
+ "clonedAt": "2026-04-14T07:01:41.831Z"
10
10
  },
11
11
  "cis": {
12
12
  "url": "https://github.com/bmad-code-org/bmad-module-creative-intelligence-suite",
@@ -23,8 +23,8 @@
23
23
  "tea": {
24
24
  "url": "https://github.com/bmad-code-org/bmad-method-test-architecture-enterprise",
25
25
  "branch": "main",
26
- "commitSha": "05472f9f4ad0a3aeeff445252bd4dd342667f34a",
27
- "clonedAt": "2026-04-08T21:19:51.612Z"
26
+ "commitSha": "a7dfc0d9bd1b1b75203e8eedfb940ae130fe15e5",
27
+ "clonedAt": "2026-04-14T07:01:58.082Z"
28
28
  },
29
29
  "wds": {
30
30
  "url": "https://github.com/bmad-code-org/bmad-method-wds-expansion",
@@ -1,2 +1,2 @@
1
1
  # pack-refs with: peeled fully-peeled sorted
2
- 05472f9f4ad0a3aeeff445252bd4dd342667f34a refs/remotes/origin/main
2
+ a7dfc0d9bd1b1b75203e8eedfb940ae130fe15e5 refs/remotes/origin/main
@@ -1 +1 @@
1
- 05472f9f4ad0a3aeeff445252bd4dd342667f34a
1
+ a7dfc0d9bd1b1b75203e8eedfb940ae130fe15e5
@@ -0,0 +1 @@
1
+ 1cad3ab608bd2ac19c1d4f866bdf69b0f00e363c
@@ -1 +1 @@
1
- 05472f9f4ad0a3aeeff445252bd4dd342667f34a
1
+ a7dfc0d9bd1b1b75203e8eedfb940ae130fe15e5
@@ -69,7 +69,7 @@ If you are unsure, default to the integrated path for your track and adjust late
69
69
  | `framework` | Playwright/Cypress scaffold, `.env.example`, `.nvmrc`, sample specs | Use when no production-ready harness exists | - |
70
70
  | `ci` | CI workflow, selective test scripts, secrets checklist | Platform-aware (GitHub Actions default) | - |
71
71
  | `test-design` | Combined risk assessment, mitigation plan, and coverage strategy | Risk scoring + optional exploratory mode | **+ Exploratory**: Interactive UI discovery with browser automation (uncover actual functionality) |
72
- | `atdd` | Failing acceptance tests + implementation checklist | TDD red phase + optional recording mode | **+ Recording**: UI selectors verified with live browser; API tests benefit from trace analysis |
72
+ | `atdd` | Red-phase acceptance test scaffolds + implementation checklist | TDD red phase + optional recording mode | **+ Recording**: UI selectors verified with live browser; API tests benefit from trace analysis |
73
73
  | `automate` | Prioritized specs, fixtures, README/script updates, DoD summary | Optional healing/recording, avoid duplicate coverage | **+ Healing**: Visual debugging + trace analysis for test fixes; **+ Recording**: Verified selectors (UI) + network inspection (API) |
74
74
  | `test-review` | Test quality review report with 0-100 score, violations, fixes | Reviews tests against knowledge base patterns | - |
75
75
  | `nfr-assess` | NFR assessment report with actions | Focus on security/performance/reliability | - |
@@ -426,7 +426,7 @@ Optional MCP integration for design-time broker interaction in contract testing
426
426
  2. [How to Set Up a Test Framework with TEA](/docs/how-to/workflows/setup-test-framework.md) - Scaffold Playwright or Cypress
427
427
  3. [How to Set Up CI Pipeline with TEA](/docs/how-to/workflows/setup-ci.md) - Configure CI/CD with selective testing
428
428
  4. [How to Run Test Design with TEA](/docs/how-to/workflows/run-test-design.md) - Risk-based test planning (system or epic)
429
- 5. [How to Run ATDD with TEA](/docs/how-to/workflows/run-atdd.md) - Generate failing tests before implementation
429
+ 5. [How to Run ATDD with TEA](/docs/how-to/workflows/run-atdd.md) - Generate red-phase test scaffolds before implementation
430
430
  6. [How to Run Automate with TEA](/docs/how-to/workflows/run-automate.md) - Expand test coverage after implementation
431
431
  7. [How to Run Test Review with TEA](/docs/how-to/workflows/run-test-review.md) - Audit test quality (0-100 scoring)
432
432
  8. [How to Run NFR Assessment with TEA](/docs/how-to/workflows/run-nfr-assess.md) - Validate non-functional requirements
@@ -1,11 +1,11 @@
1
1
  ---
2
2
  title: 'How to Run ATDD with TEA'
3
- description: Generate failing acceptance tests before implementation using TEA's ATDD workflow
3
+ description: Generate red-phase acceptance test scaffolds before implementation using TEA's ATDD workflow
4
4
  ---
5
5
 
6
6
  # How to Run ATDD with TEA
7
7
 
8
- Use TEA's `atdd` workflow to generate failing acceptance tests BEFORE implementation. This is the TDD (Test-Driven Development) red phase - tests fail first, guide development, then pass.
8
+ Use TEA's `atdd` workflow to generate red-phase acceptance test scaffolds BEFORE implementation. TEA currently emits these scaffolds with `test.skip()` so they can be reviewed, linked into the story, and activated task-by-task during implementation.
9
9
 
10
10
  ## When to Use This
11
11
 
@@ -118,7 +118,7 @@ Generate:
118
118
 
119
119
  ### 5. Review Generated Tests
120
120
 
121
- TEA generates **failing tests** in appropriate directories:
121
+ TEA generates **red-phase test scaffolds** in appropriate directories:
122
122
 
123
123
  #### API Tests (`tests/api/profile.spec.ts`):
124
124
 
@@ -128,7 +128,7 @@ TEA generates **failing tests** in appropriate directories:
128
128
  import { test, expect } from '@playwright/test';
129
129
 
130
130
  test.describe('Profile API', () => {
131
- test('should fetch user profile', async ({ request }) => {
131
+ test.skip('should fetch user profile', async ({ request }) => {
132
132
  const response = await request.get('/api/profile');
133
133
 
134
134
  expect(response.status()).toBe(200);
@@ -138,7 +138,7 @@ test.describe('Profile API', () => {
138
138
  expect(profile).toHaveProperty('avatarUrl');
139
139
  });
140
140
 
141
- test('should update user profile', async ({ request }) => {
141
+ test.skip('should update user profile', async ({ request }) => {
142
142
  const response = await request.patch('/api/profile', {
143
143
  data: {
144
144
  name: 'Updated Name',
@@ -152,7 +152,7 @@ test.describe('Profile API', () => {
152
152
  expect(updated.email).toBe('updated@example.com');
153
153
  });
154
154
 
155
- test('should validate email format', async ({ request }) => {
155
+ test.skip('should validate email format', async ({ request }) => {
156
156
  const response = await request.patch('/api/profile', {
157
157
  data: {
158
158
  email: 'invalid-email',
@@ -180,7 +180,7 @@ const ProfileSchema = z.object({
180
180
  });
181
181
 
182
182
  test.describe('Profile API', () => {
183
- test('should fetch user profile', async ({ apiRequest }) => {
183
+ test.skip('should fetch user profile', async ({ apiRequest }) => {
184
184
  const { status, body } = await apiRequest({
185
185
  method: 'GET',
186
186
  path: '/api/profile',
@@ -192,7 +192,7 @@ test.describe('Profile API', () => {
192
192
  expect(body.email).toContain('@');
193
193
  });
194
194
 
195
- test('should update user profile', async ({ apiRequest }) => {
195
+ test.skip('should update user profile', async ({ apiRequest }) => {
196
196
  const { status, body } = await apiRequest({
197
197
  method: 'PATCH',
198
198
  path: '/api/profile',
@@ -207,7 +207,7 @@ test.describe('Profile API', () => {
207
207
  expect(body.email).toBe('updated@example.com');
208
208
  });
209
209
 
210
- test('should validate email format', async ({ apiRequest }) => {
210
+ test.skip('should validate email format', async ({ apiRequest }) => {
211
211
  const { status, body } = await apiRequest({
212
212
  method: 'PATCH',
213
213
  path: '/api/profile',
@@ -233,7 +233,7 @@ test.describe('Profile API', () => {
233
233
  ```typescript
234
234
  import { test, expect } from '@playwright/test';
235
235
 
236
- test('should edit and save profile', async ({ page }) => {
236
+ test.skip('should edit and save profile', async ({ page }) => {
237
237
  // Login first
238
238
  await page.goto('/login');
239
239
  await page.getByLabel('Email').fill('test@example.com');
@@ -280,14 +280,14 @@ TEA also provides an implementation checklist:
280
280
 
281
281
  ### Tests
282
282
 
283
- - [x] API tests generated (failing)
284
- - [x] E2E tests generated (failing)
285
- - [ ] Run tests after implementation (should pass)
283
+ - [x] API test scaffolds generated (`test.skip()`)
284
+ - [x] E2E test scaffolds generated (`test.skip()`)
285
+ - [ ] Activate and run tests during implementation (should fail before code changes, then pass)
286
286
  ```
287
287
 
288
- ### 6. Verify Tests Fail
288
+ ### 6. Verify Red-Phase Scaffolds
289
289
 
290
- This is the TDD red phase - tests MUST fail before implementation.
290
+ This is the TDD red phase, but TEA keeps generated tests in `test.skip()` until you're ready to work on a task. Review the generated files, then remove `test.skip()` for the current task and confirm that the newly activated test fails before you implement the feature.
291
291
 
292
292
  **For Playwright:**
293
293
 
@@ -301,21 +301,19 @@ npx playwright test
301
301
  npx cypress run
302
302
  ```
303
303
 
304
- Expected output:
304
+ Initial output with scaffolds still skipped:
305
305
 
306
306
  ```
307
307
  Running 6 tests using 1 worker
308
308
 
309
- tests/api/profile.spec.ts:3:3 › should fetch user profile
310
- Error: expect(received).toBe(expected)
311
- Expected: 200
312
- Received: 404
309
+ - tests/api/profile.spec.ts:3:3 › should fetch user profile
310
+ - tests/api/profile.spec.ts:15:3 › should update user profile
311
+ - tests/e2e/profile.spec.ts:10:3 › should edit and save profile
313
312
 
314
- tests/e2e/profile.spec.ts:10:3 › should display current profile information
315
- Error: page.goto: net::ERR_ABORTED
313
+ 6 skipped
316
314
  ```
317
315
 
318
- **All tests should fail!** This confirms:
316
+ After you remove `test.skip()` from the task you are implementing, that activated test should fail first. This confirms:
319
317
 
320
318
  - Feature doesn't exist yet
321
319
  - Tests will guide implementation
@@ -326,9 +324,9 @@ Running 6 tests using 1 worker
326
324
  Now implement the feature following the test guidance:
327
325
 
328
326
  1. Start with API tests (backend first)
329
- 2. Make API tests pass
330
- 3. Move to E2E tests (frontend)
331
- 4. Make E2E tests pass
327
+ 2. Remove `test.skip()` from the first API test and confirm RED
328
+ 3. Implement until that test passes
329
+ 4. Move to the next API or E2E test and repeat
332
330
  5. Refactor with confidence (tests protect you)
333
331
 
334
332
  ### 8. Verify Tests Pass
@@ -362,16 +360,16 @@ Running 6 tests using 1 worker
362
360
  6 passed (9.8s)
363
361
  ```
364
362
 
365
- **Green!** You've completed the TDD cycle: red → green → refactor.
363
+ **Green!** You've completed the active red → green → refactor cycle for the generated scaffolds.
366
364
 
367
365
  ## What You Get
368
366
 
369
- ### Failing Tests
367
+ ### Red-Phase Test Scaffolds
370
368
 
371
369
  - API tests for backend endpoints
372
370
  - E2E tests for user workflows
373
371
  - Component tests (if requested)
374
- - All tests fail initially (red phase)
372
+ - Generated with `test.skip()` until you activate them task-by-task
375
373
 
376
374
  ### Implementation Guidance
377
375
 
@@ -381,7 +379,7 @@ Running 6 tests using 1 worker
381
379
 
382
380
  ### TDD Workflow Support
383
381
 
384
- - Tests guide implementation
382
+ - Activated tests guide implementation
385
383
  - Confidence to refactor
386
384
  - Living documentation of features
387
385
 
@@ -177,7 +177,7 @@ All workflows listed here are current and supported in TEA, including `nfr-asses
177
177
 
178
178
  ## atdd
179
179
 
180
- **Purpose:** Generate failing acceptance tests BEFORE implementation (TDD red phase)
180
+ **Purpose:** Generate red-phase acceptance test scaffolds BEFORE implementation (TDD red phase)
181
181
 
182
182
  **Phase:** Phase 4 (Implementation)
183
183
 
@@ -189,9 +189,9 @@ All workflows listed here are current and supported in TEA, including `nfr-asses
189
189
 
190
190
  **Key Outputs:**
191
191
 
192
- - Failing tests (`tests/api/`, `tests/e2e/`)
193
- - Implementation checklist
194
- - All tests fail initially (red phase)
192
+ - Red-phase test scaffolds (`tests/api/`, `tests/e2e/`) marked with `test.skip()`
193
+ - Implementation checklist keyed to `story_key`
194
+ - Story metadata / handoff paths for downstream `dev-story` consumption
195
195
 
196
196
  **Browser Automation (CLI/MCP):** Recording mode (for skeleton UI only - rare)
197
197
 
@@ -581,7 +581,7 @@ output_folder: _bmad-output
581
581
  - `gate-decision-{gate_type}-{story_id}.md` (from `trace` Phase 2)
582
582
  - `nfr-assessment.md` (from `nfr-assess`)
583
583
  - `automation-summary.md` (from `automate`)
584
- - `atdd-checklist-{story_id}.md` (from `atdd`)
584
+ - `atdd-checklist-{story_key}.md` (from `atdd`)
585
585
 
586
586
  ---
587
587
 
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "bmad-method-test-architecture-enterprise",
3
- "version": "1.9.1",
3
+ "version": "1.10.0",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "bmad-method-test-architecture-enterprise",
9
- "version": "1.9.1",
9
+ "version": "1.10.0",
10
10
  "license": "MIT",
11
11
  "dependencies": {
12
12
  "@clack/prompts": "^0.11.0",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package.json",
3
3
  "name": "bmad-method-test-architecture-enterprise",
4
- "version": "1.9.1",
4
+ "version": "1.10.0",
5
5
  "private": true,
6
6
  "description": "Master Test Architect for quality strategy, test automation, and release gates",
7
7
  "keywords": [
@@ -4,7 +4,7 @@ Test Architecture Enterprise,bmad-teach-me-testing,Teach Me Testing,TMT,Teach te
4
4
  Test Architecture Enterprise,bmad-testarch-test-design,Test Design,TD,Risk-based test planning.,,3-solutioning,,bmad-testarch-framework,false,test_artifacts,test design document
5
5
  Test Architecture Enterprise,bmad-testarch-framework,Test Framework,TF,Initialize production-ready test framework.,,3-solutioning,bmad-testarch-test-design,bmad-testarch-ci,false,test_artifacts,framework scaffold
6
6
  Test Architecture Enterprise,bmad-testarch-ci,CI Setup,CI,Configure CI/CD quality pipeline.,,3-solutioning,bmad-testarch-framework,,false,test_artifacts,ci config
7
- Test Architecture Enterprise,bmad-testarch-atdd,ATDD,AT,Generate failing tests (TDD red phase).,,4-implementation,,,false,test_artifacts,atdd tests
7
+ Test Architecture Enterprise,bmad-testarch-atdd,ATDD,AT,Generate red-phase acceptance test scaffolds before implementation.,,4-implementation,bmad-create-story:create,bmad-dev-story,false,test_artifacts,"atdd-checklist|red-phase acceptance tests"
8
8
  Test Architecture Enterprise,bmad-testarch-automate,Test Automation,TA,Expand test coverage.,,4-implementation,bmad-testarch-atdd,,false,test_artifacts,test suite
9
9
  Test Architecture Enterprise,bmad-testarch-test-review,Test Review,RV,Quality audit (0-100 scoring).,,4-implementation,bmad-testarch-automate,,false,test_artifacts,review report
10
10
  Test Architecture Enterprise,bmad-testarch-nfr,NFR Assessment,NR,Non-functional requirements assessment.,,4-implementation,bmad-testarch-automate,,false,test_artifacts,nfr report
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: bmad-testarch-atdd
3
- description: 'Generate failing acceptance tests using TDD cycle. Use when the user says "lets write acceptance tests" or "I want to do ATDD"'
3
+ description: 'Generate red-phase acceptance test scaffolds using the TDD cycle. Use when the user says "lets write acceptance tests" or "I want to do ATDD"'
4
4
  ---
5
5
 
6
6
  Follow the instructions in [workflow.md](workflow.md).