bmad-method-test-architecture-enterprise 1.0.0 → 1.0.1
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/docs/explanation/tea-overview.md +1 -1
- package/docs/how-to/customization/configure-browser-automation.md +1 -1
- package/eslint.config.mjs +0 -11
- package/package.json +1 -3
- package/release_notes.md +11 -2
- package/src/module.yaml +4 -0
- package/src/testarch/knowledge/playwright-cli.md +1 -1
- package/test/test-installation-components.js +14 -5
- package/tools/build-docs.js +1 -1
- package/src/_module-installer/installer.js +0 -92
|
@@ -359,7 +359,7 @@ Production-ready fixtures and utilities that enhance TEA workflows.
|
|
|
359
359
|
|
|
360
360
|
**Setup:**
|
|
361
361
|
|
|
362
|
-
- CLI: `npm install -g @playwright/cli@latest` then `playwright-cli install --skills`
|
|
362
|
+
- CLI: `npm install -g @playwright/cli@latest` (global, one-time) then `playwright-cli install --skills` (from project root)
|
|
363
363
|
- MCP: Configure MCP servers in your IDE (see [Configure Browser Automation](/docs/how-to/customization/configure-browser-automation.md))
|
|
364
364
|
|
|
365
365
|
**Which workflows benefit:**
|
|
@@ -33,7 +33,7 @@ npm install -g @playwright/cli@latest # Install globally (Node.js 18+)
|
|
|
33
33
|
playwright-cli install --skills # Register as an agent skill
|
|
34
34
|
```
|
|
35
35
|
|
|
36
|
-
|
|
36
|
+
The global npm install is one-time. The skills install (`playwright-cli install --skills`) should be run from your project root — it registers skills in your project's `.claude/skills/` directory (Claude Code, GitHub Copilot, and other coding agents that support the skills convention). Agents without skills support can still use the CLI directly via `playwright-cli --help`.
|
|
37
37
|
|
|
38
38
|
### For MCP (`mcp` or `auto` mode)
|
|
39
39
|
|
package/eslint.config.mjs
CHANGED
|
@@ -114,17 +114,6 @@ export default [
|
|
|
114
114
|
},
|
|
115
115
|
},
|
|
116
116
|
|
|
117
|
-
// Module installer scripts use CommonJS for compatibility
|
|
118
|
-
{
|
|
119
|
-
files: ['**/_module-installer/**/*.js'],
|
|
120
|
-
rules: {
|
|
121
|
-
// Allow CommonJS patterns for installer scripts
|
|
122
|
-
'unicorn/prefer-module': 'off',
|
|
123
|
-
'n/no-missing-require': 'off',
|
|
124
|
-
'n/no-unpublished-require': 'off',
|
|
125
|
-
},
|
|
126
|
-
},
|
|
127
|
-
|
|
128
117
|
// ESLint config file should not be checked for publish-related Node rules
|
|
129
118
|
{
|
|
130
119
|
files: ['eslint.config.mjs'],
|
package/package.json
CHANGED
|
@@ -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.0.
|
|
4
|
+
"version": "1.0.1",
|
|
5
5
|
"description": "Master Test Architect for quality strategy, test automation, and release gates",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"bmad",
|
|
@@ -73,11 +73,9 @@
|
|
|
73
73
|
"dependencies": {
|
|
74
74
|
"@clack/prompts": "^0.11.0",
|
|
75
75
|
"boxen": "^5.1.2",
|
|
76
|
-
"chalk": "^4.1.2",
|
|
77
76
|
"cli-table3": "^0.6.5",
|
|
78
77
|
"commander": "^14.0.0",
|
|
79
78
|
"csv-parse": "^6.1.0",
|
|
80
|
-
"fs-extra": "^11.3.0",
|
|
81
79
|
"glob": "^11.0.3",
|
|
82
80
|
"ignore": "^7.0.5",
|
|
83
81
|
"js-yaml": "^4.1.0",
|
package/release_notes.md
CHANGED
|
@@ -1,4 +1,13 @@
|
|
|
1
|
-
## 🚀 What's New in v1.0.
|
|
1
|
+
## 🚀 What's New in v1.0.1
|
|
2
|
+
|
|
3
|
+
### 🐛 Bug Fixes
|
|
4
|
+
- fix: playwright cli docs alignment
|
|
5
|
+
- fix: CI failures
|
|
6
|
+
|
|
7
|
+
### 📦 Other Changes
|
|
8
|
+
- Remove _module-installer pattern for declarative directory creation
|
|
9
|
+
- re-run checks
|
|
10
|
+
- Merge pull request #24 from bmad-code-org/fix/playwright-cli-docs-alignment
|
|
2
11
|
|
|
3
12
|
|
|
4
13
|
## 📦 Installation
|
|
@@ -8,4 +17,4 @@ npx bmad-method install
|
|
|
8
17
|
# Select "Test Architect" from module menu
|
|
9
18
|
```
|
|
10
19
|
|
|
11
|
-
**Full Changelog**: https://github.com/bmad-code-org/bmad-method-test-architecture-enterprise/compare/
|
|
20
|
+
**Full Changelog**: https://github.com/bmad-code-org/bmad-method-test-architecture-enterprise/compare/v1.0.0...v1.0.1
|
package/src/module.yaml
CHANGED
|
@@ -24,7 +24,7 @@ npm install -g @playwright/cli@latest # Install globally (Node.js 18+)
|
|
|
24
24
|
playwright-cli install --skills # Register as an agent skill
|
|
25
25
|
```
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
The global npm install is one-time. Run `playwright-cli install --skills` from your project root to register skills in `.claude/skills/` (works with Claude Code, GitHub Copilot, and other coding agents). Agents without skills support can use the CLI directly via `playwright-cli --help`. TEA documents this during installation but does not run it for you.
|
|
28
28
|
|
|
29
29
|
## How It Works
|
|
30
30
|
|
|
@@ -11,9 +11,18 @@
|
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
13
|
const path = require('node:path');
|
|
14
|
-
const fs = require('fs
|
|
14
|
+
const fs = require('node:fs/promises');
|
|
15
15
|
const yaml = require('js-yaml');
|
|
16
16
|
|
|
17
|
+
async function pathExists(filePath) {
|
|
18
|
+
try {
|
|
19
|
+
await fs.access(filePath);
|
|
20
|
+
return true;
|
|
21
|
+
} catch {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
17
26
|
// ANSI colors
|
|
18
27
|
const colors = {
|
|
19
28
|
reset: '\u001B[0m',
|
|
@@ -80,7 +89,7 @@ async function runTests() {
|
|
|
80
89
|
try {
|
|
81
90
|
const teaAgentPath = path.join(projectRoot, 'src/agents/tea.agent.yaml');
|
|
82
91
|
|
|
83
|
-
if (await
|
|
92
|
+
if (await pathExists(teaAgentPath)) {
|
|
84
93
|
const teaAgent = yaml.load(await fs.readFile(teaAgentPath, 'utf8'));
|
|
85
94
|
|
|
86
95
|
assert(teaAgent.agent !== undefined, 'tea.agent.yaml has agent root key');
|
|
@@ -113,7 +122,7 @@ async function runTests() {
|
|
|
113
122
|
try {
|
|
114
123
|
const teaIndexPath = path.join(projectRoot, 'src/testarch/tea-index.csv');
|
|
115
124
|
|
|
116
|
-
if (await
|
|
125
|
+
if (await pathExists(teaIndexPath)) {
|
|
117
126
|
const csvContent = await fs.readFile(teaIndexPath, 'utf8');
|
|
118
127
|
const lines = csvContent.trim().split('\n');
|
|
119
128
|
|
|
@@ -138,7 +147,7 @@ async function runTests() {
|
|
|
138
147
|
|
|
139
148
|
const teachMeWorkflowPath = path.join(projectRoot, 'src/workflows/testarch/teach-me-testing/workflow.md');
|
|
140
149
|
try {
|
|
141
|
-
if (await
|
|
150
|
+
if (await pathExists(teachMeWorkflowPath)) {
|
|
142
151
|
const teachMeContent = await fs.readFile(teachMeWorkflowPath, 'utf8');
|
|
143
152
|
assert(teachMeContent.length > 0, 'teach-me-testing/workflow.md exists');
|
|
144
153
|
assert(!teachMeContent.includes('_bmad/bmm/'), 'teach-me-testing has no _bmad/bmm/ references');
|
|
@@ -154,7 +163,7 @@ async function runTests() {
|
|
|
154
163
|
for (const workflowName of workflowNames) {
|
|
155
164
|
const workflowYamlPath = path.join(projectRoot, `src/workflows/testarch/${workflowName}/workflow.yaml`);
|
|
156
165
|
|
|
157
|
-
if (await
|
|
166
|
+
if (await pathExists(workflowYamlPath)) {
|
|
158
167
|
try {
|
|
159
168
|
const workflowYaml = yaml.load(await fs.readFile(workflowYamlPath, 'utf8'));
|
|
160
169
|
assert(workflowYaml !== undefined, `${workflowName}/workflow.yaml is valid YAML`);
|
package/tools/build-docs.js
CHANGED
|
@@ -334,7 +334,7 @@ async function generatePromptsBundle(downloadsDir) {
|
|
|
334
334
|
if (!fs.existsSync(srcDir)) return;
|
|
335
335
|
|
|
336
336
|
const zipPath = path.join(downloadsDir, 'tea-prompts.zip');
|
|
337
|
-
await createZipArchive(srcDir, zipPath, ['docs', '.DS_Store', '__pycache__', 'node_modules'
|
|
337
|
+
await createZipArchive(srcDir, zipPath, ['docs', '.DS_Store', '__pycache__', 'node_modules']);
|
|
338
338
|
|
|
339
339
|
const size = Math.floor(fs.statSync(zipPath).size / 1024);
|
|
340
340
|
console.log(` tea-prompts.zip (${size}K)`);
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
const fs = require('fs-extra');
|
|
2
|
-
const path = require('node:path');
|
|
3
|
-
const chalk = require('chalk');
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* CIS Module Installer
|
|
7
|
-
* Standard module installer function that executes after IDE installations
|
|
8
|
-
*
|
|
9
|
-
* @param {Object} options - Installation options
|
|
10
|
-
* @param {string} options.projectRoot - The root directory of the target project
|
|
11
|
-
* @param {Object} options.config - Module configuration from module.yaml
|
|
12
|
-
* @param {Array<string>} options.installedIDEs - Array of IDE codes that were installed
|
|
13
|
-
* @param {Object} options.logger - Logger instance for output
|
|
14
|
-
* @returns {Promise<boolean>} - Success status
|
|
15
|
-
*/
|
|
16
|
-
async function install(options) {
|
|
17
|
-
const { projectRoot, config, installedIDEs, logger } = options;
|
|
18
|
-
|
|
19
|
-
try {
|
|
20
|
-
logger.log(chalk.blue('🎨 Installing CIS Module...'));
|
|
21
|
-
|
|
22
|
-
// Create output directory if configured
|
|
23
|
-
if (config['output_folder']) {
|
|
24
|
-
// Strip {project-root}/ prefix if present
|
|
25
|
-
const outputConfig = config['output_folder'].replace('{project-root}/', '');
|
|
26
|
-
const outputPath = path.join(projectRoot, outputConfig);
|
|
27
|
-
if (!(await fs.pathExists(outputPath))) {
|
|
28
|
-
logger.log(chalk.yellow(`Creating CIS output directory: ${outputConfig}`));
|
|
29
|
-
await fs.ensureDir(outputPath);
|
|
30
|
-
|
|
31
|
-
// Add any default CIS templates or assets here
|
|
32
|
-
const templatesSource = path.join(__dirname, 'assets');
|
|
33
|
-
const templateFiles = await fs.readdir(templatesSource).catch(() => []);
|
|
34
|
-
|
|
35
|
-
for (const file of templateFiles) {
|
|
36
|
-
const source = path.join(templatesSource, file);
|
|
37
|
-
const dest = path.join(outputPath, file);
|
|
38
|
-
|
|
39
|
-
if (!(await fs.pathExists(dest))) {
|
|
40
|
-
await fs.copy(source, dest);
|
|
41
|
-
logger.log(chalk.green(`✓ Added ${file}`));
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
// Handle IDE-specific configurations if needed
|
|
48
|
-
if (installedIDEs && installedIDEs.length > 0) {
|
|
49
|
-
logger.log(chalk.cyan(`Configuring CIS for IDEs: ${installedIDEs.join(', ')}`));
|
|
50
|
-
|
|
51
|
-
// Add any IDE-specific CIS configurations here
|
|
52
|
-
for (const ide of installedIDEs) {
|
|
53
|
-
await configureForIDE(ide, projectRoot, config, logger);
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
logger.log(chalk.green('✓ CIS Module installation complete'));
|
|
58
|
-
return true;
|
|
59
|
-
} catch (error) {
|
|
60
|
-
logger.error(chalk.red(`Error installing CIS module: ${error.message}`));
|
|
61
|
-
return false;
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
/**
|
|
66
|
-
* Configure CIS module for specific IDE
|
|
67
|
-
* @private
|
|
68
|
-
*/
|
|
69
|
-
async function configureForIDE(ide) {
|
|
70
|
-
// Add IDE-specific configurations here
|
|
71
|
-
switch (ide) {
|
|
72
|
-
case 'claude-code': {
|
|
73
|
-
// Claude Code specific CIS configurations
|
|
74
|
-
break;
|
|
75
|
-
}
|
|
76
|
-
case 'cursor': {
|
|
77
|
-
// Cursor specific CIS configurations
|
|
78
|
-
break;
|
|
79
|
-
}
|
|
80
|
-
case 'windsurf': {
|
|
81
|
-
// Windsurf specific CIS configurations
|
|
82
|
-
break;
|
|
83
|
-
}
|
|
84
|
-
// Add more IDEs as needed
|
|
85
|
-
default: {
|
|
86
|
-
// No specific configuration needed
|
|
87
|
-
break;
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
module.exports = { install };
|