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.
- package/_bmad-output/implementation-artifacts/21-1-install-time-profile-prompt.md +181 -0
- package/_bmad-output/implementation-artifacts/21-10-profile-reconfigure.md +137 -0
- package/_bmad-output/implementation-artifacts/21-11-profile-uninstall.md +149 -0
- package/_bmad-output/implementation-artifacts/21-2-universal-instruction-block-expansion.md +98 -0
- package/_bmad-output/implementation-artifacts/21-3-roomodes-template-bmad-modes.md +106 -0
- package/_bmad-output/implementation-artifacts/21-4-agents-md-template-opencode.md +86 -0
- package/_bmad-output/implementation-artifacts/21-5-clinerules-template-extension.md +82 -0
- package/_bmad-output/implementation-artifacts/21-6-onprem-layered-guardrails.md +112 -0
- package/_bmad-output/implementation-artifacts/21-7-bmad-persona-phase-prefix.md +126 -0
- package/_bmad-output/implementation-artifacts/21-8-vllm-reference-doc-readme.md +100 -0
- package/_bmad-output/implementation-artifacts/21-9-tests-validation.md +97 -0
- package/_bmad-output/implementation-artifacts/bug-experimentalwarning-about-commonjs-loading-es-module-during-install.md +57 -0
- package/_bmad-output/implementation-artifacts/sprint-status.yaml +43 -1
- package/_bmad-output/methodology/BMAD_AI_Development_Training.pptx +0 -0
- package/_bmad-output/methodology/version.json +1 -1
- package/_bmad-output/planning-artifacts/architecture.md +52 -0
- package/_bmad-output/planning-artifacts/epics.md +397 -0
- package/_bmad-output/planning-artifacts/prd.md +46 -1
- package/bin/cli.js +109 -1
- package/docs/BMAD_AI_Development_Training.pptx +0 -0
- package/lib/bmad-cache/bmb/_git_preserved/index +0 -0
- package/lib/bmad-cache/bmb/_git_preserved/logs/HEAD +1 -1
- package/lib/bmad-cache/bmb/_git_preserved/logs/refs/heads/main +1 -1
- package/lib/bmad-cache/bmb/_git_preserved/logs/refs/remotes/origin/HEAD +1 -1
- package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-554778ad4e7254827618ebd2497c3f4bce9054a4.idx +0 -0
- package/lib/bmad-cache/bmb/_git_preserved/objects/pack/{pack-4b395d030ca386fc5748f1b670dcf8c0ef41c94c.pack → pack-554778ad4e7254827618ebd2497c3f4bce9054a4.pack} +0 -0
- package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-554778ad4e7254827618ebd2497c3f4bce9054a4.rev +0 -0
- package/lib/bmad-cache/bmb/_git_preserved/packed-refs +1 -1
- package/lib/bmad-cache/bmb/_git_preserved/refs/heads/main +1 -1
- package/lib/bmad-cache/bmb/_git_preserved/shallow +1 -1
- package/lib/bmad-cache/bmb/skills/bmad-module-builder/scripts/tests/test-scaffold-setup-skill.py +7 -0
- package/lib/bmad-cache/cache-manifest.json +5 -5
- package/lib/bmad-cache/tea/_git_preserved/index +0 -0
- package/lib/bmad-cache/tea/_git_preserved/objects/pack/pack-e75385cd52b693dbb8a3b2afb50058952543b3a2.idx +0 -0
- package/lib/bmad-cache/tea/_git_preserved/objects/pack/{pack-c79805bb3fee27fa6d8c612a971af7fc86fc80e1.pack → pack-e75385cd52b693dbb8a3b2afb50058952543b3a2.pack} +0 -0
- package/lib/bmad-cache/tea/_git_preserved/objects/pack/pack-e75385cd52b693dbb8a3b2afb50058952543b3a2.rev +0 -0
- package/lib/bmad-cache/tea/_git_preserved/packed-refs +1 -1
- package/lib/bmad-cache/tea/_git_preserved/refs/heads/main +1 -1
- package/lib/bmad-cache/tea/_git_preserved/refs/tags/v1.10.0 +1 -0
- package/lib/bmad-cache/tea/_git_preserved/shallow +1 -1
- package/lib/bmad-cache/tea/docs/explanation/tea-overview.md +2 -2
- package/lib/bmad-cache/tea/docs/how-to/workflows/run-atdd.md +28 -30
- package/lib/bmad-cache/tea/docs/reference/commands.md +4 -4
- package/lib/bmad-cache/tea/docs/reference/configuration.md +1 -1
- package/lib/bmad-cache/tea/package-lock.json +2 -2
- package/lib/bmad-cache/tea/package.json +1 -1
- package/lib/bmad-cache/tea/src/module-help.csv +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/SKILL.md +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/atdd-checklist-template.md +50 -27
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/checklist.md +18 -17
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/instructions.md +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/steps-c/step-01-preflight-and-context.md +21 -3
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/steps-c/step-01b-resume.md +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/steps-c/step-02-generation-mode.md +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/steps-c/step-03-test-strategy.md +1 -1
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/steps-c/step-04-generate-tests.md +20 -19
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/steps-c/step-04a-subagent-api-failing.md +13 -13
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/steps-c/step-04b-subagent-e2e-failing.md +13 -13
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/steps-c/step-04c-aggregate.md +42 -18
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/steps-c/step-05-validate-and-complete.md +12 -3
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/workflow-plan.md +2 -2
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/workflow.md +2 -2
- package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/workflow.yaml +2 -2
- package/lib/bmad.js +25 -4
- package/lib/installer.js +2 -1
- package/lib/methodology/BMAD_AI_Development_Training.pptx +0 -0
- package/lib/methodology/version.json +1 -1
- package/lib/profile.js +107 -0
- package/lib/warning-filter.js +245 -0
- package/package.json +2 -2
- package/test/experimental-warning.test.js +314 -0
- package/test/fixtures/README.md +74 -0
- package/test/fixtures/empty-project/README.md +5 -0
- package/test/fixtures/empty-project/package.json +5 -0
- package/test/fixtures/onprem-profile-baseline/.gitkeep +2 -0
- package/test/fixtures/standard-profile-baseline/.gitkeep +2 -0
- package/test/onprem-injection.test.js +48 -0
- package/test/profile.test.js +301 -0
- package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-4b395d030ca386fc5748f1b670dcf8c0ef41c94c.idx +0 -0
- package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-4b395d030ca386fc5748f1b670dcf8c0ef41c94c.rev +0 -0
- package/lib/bmad-cache/tea/_git_preserved/objects/pack/pack-c79805bb3fee27fa6d8c612a971af7fc86fc80e1.idx +0 -0
- 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
|
-
|
|
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 {
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
0000000000000000000000000000000000000000
|
|
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
|
|
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
|
|
1
|
+
0000000000000000000000000000000000000000 f8b793001493ec991b718a3f41cf73e6743f3dc6 Alon Mayaffit <alon.mayafit@gmail.com> 1776150101 +0300 clone: from https://github.com/bmad-code-org/bmad-builder
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
# pack-refs with: peeled fully-peeled sorted
|
|
2
|
-
|
|
2
|
+
f8b793001493ec991b718a3f41cf73e6743f3dc6 refs/remotes/origin/main
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
f8b793001493ec991b718a3f41cf73e6743f3dc6
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
f8b793001493ec991b718a3f41cf73e6743f3dc6
|
package/lib/bmad-cache/bmb/skills/bmad-module-builder/scripts/tests/test-scaffold-setup-skill.py
CHANGED
|
@@ -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-
|
|
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": "
|
|
9
|
-
"clonedAt": "2026-04-
|
|
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": "
|
|
27
|
-
"clonedAt": "2026-04-
|
|
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",
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
# pack-refs with: peeled fully-peeled sorted
|
|
2
|
-
|
|
2
|
+
a7dfc0d9bd1b1b75203e8eedfb940ae130fe15e5 refs/remotes/origin/main
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
a7dfc0d9bd1b1b75203e8eedfb940ae130fe15e5
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
1cad3ab608bd2ac19c1d4f866bdf69b0f00e363c
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
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` |
|
|
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
|
|
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
|
|
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
|
|
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 **
|
|
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
|
|
284
|
-
- [x] E2E
|
|
285
|
-
- [ ]
|
|
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
|
|
288
|
+
### 6. Verify Red-Phase Scaffolds
|
|
289
289
|
|
|
290
|
-
This is the TDD red phase
|
|
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
|
-
|
|
304
|
+
Initial output with scaffolds still skipped:
|
|
305
305
|
|
|
306
306
|
```
|
|
307
307
|
Running 6 tests using 1 worker
|
|
308
308
|
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
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
|
-
|
|
315
|
-
Error: page.goto: net::ERR_ABORTED
|
|
313
|
+
6 skipped
|
|
316
314
|
```
|
|
317
315
|
|
|
318
|
-
|
|
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.
|
|
330
|
-
3.
|
|
331
|
-
4.
|
|
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
|
|
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
|
-
###
|
|
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
|
-
-
|
|
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
|
-
-
|
|
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
|
|
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
|
-
-
|
|
193
|
-
- Implementation checklist
|
|
194
|
-
-
|
|
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-{
|
|
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.
|
|
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
|
+
"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.
|
|
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
|
|
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
|
|
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).
|