bmad-method-test-architecture-enterprise 2.0.4-next.3 → 3.0.0
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/.claude-plugin/marketplace.json +10 -10
- package/README.md +29 -13
- package/cli/atdd-red-check.js +1 -1
- package/cli/atdd-runner.js +1 -1
- package/cli/automate.js +3 -3
- package/cli/ci-runner.js +1 -1
- package/cli/lib/automate-prompt.js +1 -1
- package/cli/lib/framework-setup.js +2 -2
- package/cli/lib/resolve-skill.js +2 -2
- package/cli/lib/resolve-tea-config.js +54 -9
- package/cli/lib/teach-turn.js +558 -0
- package/cli/lib/test-design-parser.js +1 -1
- package/cli/lib/workflow-cli.js +5 -1
- package/cli/migrate-customizations.js +254 -0
- package/cli/nfr-runner.js +1 -1
- package/cli/nfr.js +2 -2
- package/cli/teach.js +433 -0
- package/cli/test-design.js +2 -2
- package/cli/test-review.js +3 -3
- package/cli/trace.js +2 -2
- package/cli/transcript-runner.js +1 -1
- package/package.json +8 -4
- package/skills/bmad-tea/SKILL.md +4 -2
- package/skills/bmad-tea/customize.toml +10 -10
- package/skills/{bmad-testarch-automate → bmad-tea-automate}/SKILL.md +3 -1
- package/skills/{bmad-testarch-automate → bmad-tea-automate}/checklist.md +1 -1
- package/skills/{bmad-testarch-nfr → bmad-tea-automate}/customize.toml +1 -1
- package/skills/{bmad-testarch-automate → bmad-tea-automate}/red/customize.toml +1 -1
- package/skills/{bmad-testarch-automate → bmad-tea-automate}/red/instructions.md +1 -1
- package/skills/{bmad-testarch-automate → bmad-tea-automate}/red/workflow.yaml +2 -2
- package/skills/{bmad-testarch-automate → bmad-tea-automate}/resources/test-generation-routing.md +14 -14
- package/skills/{bmad-testarch-automate → bmad-tea-automate}/workflow.yaml +2 -2
- package/skills/{bmad-testarch-evaluate → bmad-tea-evaluate}/SKILL.md +4 -2
- package/skills/{bmad-testarch-evaluate → bmad-tea-evaluate}/assets/inspection-record.md +1 -1
- package/skills/{bmad-testarch-evaluate → bmad-tea-evaluate}/customize.toml +1 -1
- package/skills/{bmad-testarch-evaluate → bmad-tea-evaluate}/references/ci.md +4 -4
- package/skills/{bmad-testarch-framework → bmad-tea-framework}/SKILL.md +5 -3
- package/skills/bmad-tea-framework/ci/customize.toml +10 -0
- package/skills/{bmad-testarch-framework → bmad-tea-framework}/ci/instructions.md +1 -1
- package/skills/{bmad-testarch-framework → bmad-tea-framework}/customize.toml +2 -2
- package/skills/{bmad-testarch-framework → bmad-tea-framework}/resources/framework-setup-progress.example.md +1 -1
- package/skills/{bmad-testarch-framework → bmad-tea-framework}/resources/hooks/tea-enforce.cjs +2 -2
- package/skills/{bmad-testarch-framework → bmad-tea-framework}/resources/setup-phase-completion.md +1 -1
- package/skills/{bmad-testarch-framework → bmad-tea-framework}/resources/setup-routing.md +3 -3
- package/skills/{bmad-testarch-framework → bmad-tea-framework}/resources/setup-run-progress.example.md +1 -1
- package/skills/{bmad-testarch-framework → bmad-tea-framework}/steps-c/step-04-docs-and-scripts.md +2 -2
- package/skills/{bmad-testarch-framework → bmad-tea-framework}/workflow.yaml +2 -2
- package/skills/{bmad-testarch-nfr → bmad-tea-nfr}/SKILL.md +3 -1
- package/skills/{bmad-testarch-nfr → bmad-tea-nfr}/checklist.md +3 -3
- package/skills/{bmad-testarch-trace → bmad-tea-nfr}/customize.toml +1 -1
- package/skills/{bmad-testarch-nfr → bmad-tea-nfr}/instructions.md +1 -1
- package/skills/{bmad-testarch-nfr → bmad-tea-nfr}/nfr-report-template.md +3 -3
- package/skills/{bmad-testarch-nfr → bmad-tea-nfr}/resources/nfr-assessment.example.md +4 -4
- package/skills/{bmad-testarch-nfr → bmad-tea-nfr}/workflow.yaml +2 -2
- package/skills/{bmad-teach-me-testing → bmad-tea-teach-me-testing}/SKILL.md +3 -1
- package/skills/{bmad-teach-me-testing → bmad-tea-teach-me-testing}/customize.toml +1 -1
- package/skills/{bmad-teach-me-testing → bmad-tea-teach-me-testing}/instructions.md +2 -2
- package/skills/{bmad-teach-me-testing → bmad-tea-teach-me-testing}/steps-c/step-01-init.md +1 -2
- package/skills/{bmad-teach-me-testing → bmad-tea-teach-me-testing}/steps-c/step-01b-continue.md +1 -1
- package/skills/{bmad-teach-me-testing → bmad-tea-teach-me-testing}/steps-c/step-04-session-01.md +2 -2
- package/skills/{bmad-teach-me-testing → bmad-tea-teach-me-testing}/steps-c/step-04-session-02.md +1 -1
- package/skills/{bmad-teach-me-testing → bmad-tea-teach-me-testing}/steps-c/step-04-session-03.md +2 -2
- package/skills/{bmad-teach-me-testing → bmad-tea-teach-me-testing}/steps-c/step-04-session-05.md +2 -2
- package/skills/{bmad-teach-me-testing → bmad-tea-teach-me-testing}/steps-e/step-e-02-apply-edits.md +2 -2
- package/skills/{bmad-testarch-test-design → bmad-tea-test-design}/SKILL.md +3 -1
- package/skills/{bmad-testarch-test-design → bmad-tea-test-design}/checklist.md +3 -3
- package/skills/{bmad-testarch-automate → bmad-tea-test-design}/customize.toml +1 -1
- package/skills/{bmad-testarch-test-design → bmad-tea-test-design}/resources/test-design-epic-3.example.md +5 -5
- package/skills/{bmad-testarch-test-design → bmad-tea-test-design}/test-design-qa-template.md +1 -1
- package/skills/{bmad-testarch-test-design → bmad-tea-test-design}/test-design-template.md +3 -3
- package/skills/{bmad-testarch-test-design → bmad-tea-test-design}/workflow.yaml +2 -2
- package/skills/{bmad-testarch-test-review → bmad-tea-test-review}/SKILL.md +3 -1
- package/skills/{bmad-testarch-test-review → bmad-tea-test-review}/customize.toml +1 -1
- package/skills/{bmad-testarch-test-review → bmad-tea-test-review}/instructions.md +1 -1
- package/skills/{bmad-testarch-test-review → bmad-tea-test-review}/workflow.yaml +2 -2
- package/skills/{bmad-testarch-trace → bmad-tea-trace}/SKILL.md +3 -1
- package/skills/{bmad-testarch-trace → bmad-tea-trace}/checklist.md +2 -2
- package/skills/bmad-tea-trace/customize.toml +38 -0
- package/skills/{bmad-testarch-trace → bmad-tea-trace}/instructions.md +1 -1
- package/skills/{bmad-testarch-trace → bmad-tea-trace}/resources/traceability-matrix.example.md +1 -1
- package/skills/{bmad-testarch-trace → bmad-tea-trace}/steps-c/step-04-analyze-gaps.md +3 -3
- package/skills/{bmad-testarch-trace → bmad-tea-trace}/trace-template.md +2 -2
- package/skills/{bmad-testarch-trace → bmad-tea-trace}/workflow.yaml +2 -2
- package/skills/bmod-tea/bmod.toml +11 -11
- package/skills/bmod-tea/help/help.md +10 -10
- package/skills/bmod-tea/help/integrations.md +2 -2
- package/skills/bmod-tea/knowledge/burn-in.md +1 -1
- package/skills/bmod-tea/knowledge/risk-governance.md +1 -1
- package/skills/bmod-tea/knowledge/test-healing-patterns.md +1 -1
- package/skills/bmod-tea/migration-1.toml +11 -11
- package/skills/bmad-testarch-test-design/customize.toml +0 -38
- /package/skills/{bmad-teach-me-testing → bmad-tea-automate}/bmod.toml +0 -0
- /package/skills/{bmad-testarch-automate → bmad-tea-automate}/instructions.md +0 -0
- /package/skills/{bmad-testarch-automate → bmad-tea-automate}/red/atdd-checklist-template.md +0 -0
- /package/skills/{bmad-testarch-automate → bmad-tea-automate}/red/checklist.md +0 -0
- /package/skills/{bmad-testarch-automate → bmad-tea-automate}/red/resources/atdd-checklist-2-4-guest-checkout.example.md +0 -0
- /package/skills/{bmad-testarch-automate → bmad-tea-automate}/red/steps-c/step-01-preflight-and-context.md +0 -0
- /package/skills/{bmad-testarch-automate → bmad-tea-automate}/red/steps-c/step-01b-resume.md +0 -0
- /package/skills/{bmad-testarch-automate → bmad-tea-automate}/red/steps-c/step-02-generation-mode.md +0 -0
- /package/skills/{bmad-testarch-automate → bmad-tea-automate}/red/steps-c/step-03-test-strategy.md +0 -0
- /package/skills/{bmad-testarch-automate → bmad-tea-automate}/red/steps-c/step-04-generate-tests.md +0 -0
- /package/skills/{bmad-testarch-automate → bmad-tea-automate}/red/steps-c/step-04a-subagent-api-failing.md +0 -0
- /package/skills/{bmad-testarch-automate → bmad-tea-automate}/red/steps-c/step-04b-subagent-e2e-failing.md +0 -0
- /package/skills/{bmad-testarch-automate → bmad-tea-automate}/red/steps-c/step-04c-aggregate.md +0 -0
- /package/skills/{bmad-testarch-automate → bmad-tea-automate}/red/steps-c/step-05-validate-and-complete.md +0 -0
- /package/skills/{bmad-testarch-automate → bmad-tea-automate}/red/steps-e/step-01-assess.md +0 -0
- /package/skills/{bmad-testarch-automate → bmad-tea-automate}/red/steps-e/step-02-apply-edit.md +0 -0
- /package/skills/{bmad-testarch-automate → bmad-tea-automate}/red/steps-v/step-01-validate.md +0 -0
- /package/skills/{bmad-testarch-automate → bmad-tea-automate}/resources/automation-summary.example.md +0 -0
- /package/skills/{bmad-testarch-automate → bmad-tea-automate}/resources/run-and-heal.md +0 -0
- /package/skills/{bmad-testarch-automate → bmad-tea-automate}/steps-c/step-01-preflight-and-context.md +0 -0
- /package/skills/{bmad-testarch-automate → bmad-tea-automate}/steps-c/step-01b-resume.md +0 -0
- /package/skills/{bmad-testarch-automate → bmad-tea-automate}/steps-c/step-02-identify-targets.md +0 -0
- /package/skills/{bmad-testarch-automate → bmad-tea-automate}/steps-c/step-03-generate-tests.md +0 -0
- /package/skills/{bmad-testarch-automate → bmad-tea-automate}/steps-c/step-03a-subagent-api.md +0 -0
- /package/skills/{bmad-testarch-automate → bmad-tea-automate}/steps-c/step-03b-subagent-backend.md +0 -0
- /package/skills/{bmad-testarch-automate → bmad-tea-automate}/steps-c/step-03b-subagent-e2e.md +0 -0
- /package/skills/{bmad-testarch-automate → bmad-tea-automate}/steps-c/step-03b-subagent-mobile.md +0 -0
- /package/skills/{bmad-testarch-automate → bmad-tea-automate}/steps-c/step-03c-aggregate.md +0 -0
- /package/skills/{bmad-testarch-automate → bmad-tea-automate}/steps-c/step-04-validate-and-summarize.md +0 -0
- /package/skills/{bmad-testarch-automate → bmad-tea-automate}/steps-e/step-01-assess.md +0 -0
- /package/skills/{bmad-testarch-automate → bmad-tea-automate}/steps-e/step-02-apply-edit.md +0 -0
- /package/skills/{bmad-testarch-automate → bmad-tea-automate}/steps-v/step-01-validate.md +0 -0
- /package/skills/{bmad-testarch-evaluate → bmad-tea-evaluate}/assets/README.md +0 -0
- /package/skills/{bmad-testarch-evaluate → bmad-tea-evaluate}/assets/contract.skeleton.json +0 -0
- /package/skills/{bmad-testarch-evaluate → bmad-tea-evaluate}/assets/evaluation-ci-plan.template.json +0 -0
- /package/skills/{bmad-testarch-evaluate → bmad-tea-evaluate}/assets/evaluation-folder.gitignore +0 -0
- /package/skills/{bmad-testarch-evaluate → bmad-tea-evaluate}/assets/evaluation.json +0 -0
- /package/skills/{bmad-testarch-evaluate → bmad-tea-evaluate}/assets/evaluator-conditions.template.json +0 -0
- /package/skills/{bmad-testarch-evaluate → bmad-tea-evaluate}/assets/evaluators/LEARNED.md +0 -0
- /package/skills/{bmad-testarch-evaluate → bmad-tea-evaluate}/assets/evaluators/agentevals-frameworks.json +0 -0
- /package/skills/{bmad-testarch-evaluate → bmad-tea-evaluate}/assets/evaluators/agentevals-trajectory.mjs +0 -0
- /package/skills/{bmad-testarch-evaluate → bmad-tea-evaluate}/assets/evaluators/command-evaluator.mjs +0 -0
- /package/skills/{bmad-testarch-evaluate → bmad-tea-evaluate}/assets/evaluators/frameworks.json +0 -0
- /package/skills/{bmad-testarch-evaluate → bmad-tea-evaluate}/assets/evaluators/installed-version.mjs +0 -0
- /package/skills/{bmad-testarch-evaluate → bmad-tea-evaluate}/assets/evaluators/mapping.json +0 -0
- /package/skills/{bmad-testarch-evaluate → bmad-tea-evaluate}/assets/evaluators/promptfoo-assertions.mjs +0 -0
- /package/skills/{bmad-testarch-evaluate → bmad-tea-evaluate}/assets/evaluators/promptfoo-frameworks.json +0 -0
- /package/skills/{bmad-testarch-evaluate → bmad-tea-evaluate}/assets/http-probe-port.conformance.mjs +0 -0
- /package/skills/{bmad-testarch-evaluate → bmad-tea-evaluate}/assets/http-probe-port.mjs +0 -0
- /package/skills/{bmad-testarch-evaluate → bmad-tea-evaluate}/assets/requirements-statement.md +0 -0
- /package/skills/{bmad-testarch-evaluate → bmad-tea-evaluate}/assets/scoring-policy.template.json +0 -0
- /package/skills/{bmad-testarch-automate → bmad-tea-evaluate}/bmod.toml +0 -0
- /package/skills/{bmad-testarch-evaluate → bmad-tea-evaluate}/references/adapters.md +0 -0
- /package/skills/{bmad-testarch-evaluate → bmad-tea-evaluate}/references/authoring-routing.md +0 -0
- /package/skills/{bmad-testarch-evaluate → bmad-tea-evaluate}/references/contract.md +0 -0
- /package/skills/{bmad-testarch-evaluate → bmad-tea-evaluate}/references/corpus-agent.md +0 -0
- /package/skills/{bmad-testarch-evaluate → bmad-tea-evaluate}/references/corpus-ai-feature.md +0 -0
- /package/skills/{bmad-testarch-evaluate → bmad-tea-evaluate}/references/corpus-skill.md +0 -0
- /package/skills/{bmad-testarch-evaluate → bmad-tea-evaluate}/references/corpus-test-review-mechanism.md +0 -0
- /package/skills/{bmad-testarch-evaluate → bmad-tea-evaluate}/references/corpus-tool-use-system.md +0 -0
- /package/skills/{bmad-testarch-evaluate → bmad-tea-evaluate}/references/corpus-workflow.md +0 -0
- /package/skills/{bmad-testarch-evaluate → bmad-tea-evaluate}/references/corpus.md +0 -0
- /package/skills/{bmad-testarch-evaluate → bmad-tea-evaluate}/references/evaluator.md +0 -0
- /package/skills/{bmad-testarch-evaluate → bmad-tea-evaluate}/references/gaps.md +0 -0
- /package/skills/{bmad-testarch-evaluate → bmad-tea-evaluate}/references/harness.md +0 -0
- /package/skills/{bmad-testarch-evaluate → bmad-tea-evaluate}/references/inspection.md +0 -0
- /package/skills/{bmad-testarch-evaluate → bmad-tea-evaluate}/references/intake.md +0 -0
- /package/skills/{bmad-testarch-evaluate → bmad-tea-evaluate}/references/mutation.md +0 -0
- /package/skills/{bmad-testarch-evaluate → bmad-tea-evaluate}/references/oracles.md +0 -0
- /package/skills/{bmad-testarch-evaluate → bmad-tea-evaluate}/references/run.md +0 -0
- /package/skills/{bmad-testarch-evaluate → bmad-tea-framework}/bmod.toml +0 -0
- /package/skills/{bmad-testarch-framework → bmad-tea-framework}/checklist.md +0 -0
- /package/skills/{bmad-testarch-framework → bmad-tea-framework}/ci/azure-pipelines-template.yaml +0 -0
- /package/skills/{bmad-testarch-framework → bmad-tea-framework}/ci/checklist.md +0 -0
- /package/skills/{bmad-testarch-framework → bmad-tea-framework}/ci/github-actions-template.yaml +0 -0
- /package/skills/{bmad-testarch-framework → bmad-tea-framework}/ci/gitlab-ci-template.yaml +0 -0
- /package/skills/{bmad-testarch-framework → bmad-tea-framework}/ci/harness-pipeline-template.yaml +0 -0
- /package/skills/{bmad-testarch-framework → bmad-tea-framework}/ci/jenkins-pipeline-template.groovy +0 -0
- /package/skills/{bmad-testarch-framework → bmad-tea-framework}/ci/resources/ci-pipeline-progress.example.md +0 -0
- /package/skills/{bmad-testarch-framework → bmad-tea-framework}/ci/steps-c/step-01-preflight.md +0 -0
- /package/skills/{bmad-testarch-framework → bmad-tea-framework}/ci/steps-c/step-01b-resume.md +0 -0
- /package/skills/{bmad-testarch-framework → bmad-tea-framework}/ci/steps-c/step-02-generate-pipeline.md +0 -0
- /package/skills/{bmad-testarch-framework → bmad-tea-framework}/ci/steps-c/step-03-configure-quality-gates.md +0 -0
- /package/skills/{bmad-testarch-framework → bmad-tea-framework}/ci/steps-c/step-03b-render-evaluation-plans.md +0 -0
- /package/skills/{bmad-testarch-framework → bmad-tea-framework}/ci/steps-c/step-04-validate-and-summary.md +0 -0
- /package/skills/{bmad-testarch-framework → bmad-tea-framework}/ci/steps-e/step-01-assess.md +0 -0
- /package/skills/{bmad-testarch-framework → bmad-tea-framework}/ci/steps-e/step-02-apply-edit.md +0 -0
- /package/skills/{bmad-testarch-framework → bmad-tea-framework}/ci/steps-v/step-01-validate.md +0 -0
- /package/skills/{bmad-testarch-framework → bmad-tea-framework}/instructions.md +0 -0
- /package/skills/{bmad-testarch-framework → bmad-tea-framework}/resources/setup-parallel.md +0 -0
- /package/skills/{bmad-testarch-framework → bmad-tea-framework}/resources/setup-state.md +0 -0
- /package/skills/{bmad-testarch-framework → bmad-tea-framework}/steps-c/step-01-preflight.md +0 -0
- /package/skills/{bmad-testarch-framework → bmad-tea-framework}/steps-c/step-01b-resume.md +0 -0
- /package/skills/{bmad-testarch-framework → bmad-tea-framework}/steps-c/step-02-select-framework.md +0 -0
- /package/skills/{bmad-testarch-framework → bmad-tea-framework}/steps-c/step-03-scaffold-framework.md +0 -0
- /package/skills/{bmad-testarch-framework → bmad-tea-framework}/steps-c/step-05-validate-and-summary.md +0 -0
- /package/skills/{bmad-testarch-framework → bmad-tea-framework}/steps-e/step-01-assess.md +0 -0
- /package/skills/{bmad-testarch-framework → bmad-tea-framework}/steps-e/step-02-apply-edit.md +0 -0
- /package/skills/{bmad-testarch-framework → bmad-tea-framework}/steps-v/step-01-validate.md +0 -0
- /package/skills/{bmad-testarch-framework → bmad-tea-nfr}/bmod.toml +0 -0
- /package/skills/{bmad-testarch-nfr → bmad-tea-nfr}/steps-c/nfr-status-definitions.md +0 -0
- /package/skills/{bmad-testarch-nfr → bmad-tea-nfr}/steps-c/step-01-load-context.md +0 -0
- /package/skills/{bmad-testarch-nfr → bmad-tea-nfr}/steps-c/step-01b-resume.md +0 -0
- /package/skills/{bmad-testarch-nfr → bmad-tea-nfr}/steps-c/step-02-define-thresholds.md +0 -0
- /package/skills/{bmad-testarch-nfr → bmad-tea-nfr}/steps-c/step-03-gather-evidence.md +0 -0
- /package/skills/{bmad-testarch-nfr → bmad-tea-nfr}/steps-c/step-04-evaluate-and-score.md +0 -0
- /package/skills/{bmad-testarch-nfr → bmad-tea-nfr}/steps-c/step-04a-subagent-security.md +0 -0
- /package/skills/{bmad-testarch-nfr → bmad-tea-nfr}/steps-c/step-04b-subagent-performance.md +0 -0
- /package/skills/{bmad-testarch-nfr → bmad-tea-nfr}/steps-c/step-04c-subagent-reliability.md +0 -0
- /package/skills/{bmad-testarch-nfr → bmad-tea-nfr}/steps-c/step-04d-subagent-maintainability.md +0 -0
- /package/skills/{bmad-testarch-nfr → bmad-tea-nfr}/steps-c/step-04e-aggregate-nfr.md +0 -0
- /package/skills/{bmad-testarch-nfr → bmad-tea-nfr}/steps-c/step-05-generate-report.md +0 -0
- /package/skills/{bmad-testarch-nfr → bmad-tea-nfr}/steps-e/step-01-assess.md +0 -0
- /package/skills/{bmad-testarch-nfr → bmad-tea-nfr}/steps-e/step-02-apply-edit.md +0 -0
- /package/skills/{bmad-testarch-nfr → bmad-tea-nfr}/steps-v/step-01-validate.md +0 -0
- /package/skills/{bmad-testarch-nfr → bmad-tea-teach-me-testing}/bmod.toml +0 -0
- /package/skills/{bmad-teach-me-testing → bmad-tea-teach-me-testing}/checklist.md +0 -0
- /package/skills/{bmad-teach-me-testing → bmad-tea-teach-me-testing}/data/curriculum.yaml +0 -0
- /package/skills/{bmad-teach-me-testing → bmad-tea-teach-me-testing}/data/quiz-questions.yaml +0 -0
- /package/skills/{bmad-teach-me-testing → bmad-tea-teach-me-testing}/data/role-paths.yaml +0 -0
- /package/skills/{bmad-teach-me-testing → bmad-tea-teach-me-testing}/data/session-content-map.yaml +0 -0
- /package/skills/{bmad-teach-me-testing → bmad-tea-teach-me-testing}/data/tea-resources-index.yaml +0 -0
- /package/skills/{bmad-teach-me-testing → bmad-tea-teach-me-testing}/resources/tea-completion-summary.example.md +0 -0
- /package/skills/{bmad-teach-me-testing → bmad-tea-teach-me-testing}/steps-c/step-02-assess.md +0 -0
- /package/skills/{bmad-teach-me-testing → bmad-tea-teach-me-testing}/steps-c/step-03-session-menu.md +0 -0
- /package/skills/{bmad-teach-me-testing → bmad-tea-teach-me-testing}/steps-c/step-04-session-04.md +0 -0
- /package/skills/{bmad-teach-me-testing → bmad-tea-teach-me-testing}/steps-c/step-04-session-06.md +0 -0
- /package/skills/{bmad-teach-me-testing → bmad-tea-teach-me-testing}/steps-c/step-04-session-07.md +0 -0
- /package/skills/{bmad-teach-me-testing → bmad-tea-teach-me-testing}/steps-c/step-05-completion.md +0 -0
- /package/skills/{bmad-teach-me-testing → bmad-tea-teach-me-testing}/steps-e/step-e-01-assess-workflow.md +0 -0
- /package/skills/{bmad-teach-me-testing → bmad-tea-teach-me-testing}/steps-v/step-v-01-validate.md +0 -0
- /package/skills/{bmad-teach-me-testing → bmad-tea-teach-me-testing}/templates/completion-summary-template.md +0 -0
- /package/skills/{bmad-teach-me-testing → bmad-tea-teach-me-testing}/templates/progress-template.yaml +0 -0
- /package/skills/{bmad-teach-me-testing → bmad-tea-teach-me-testing}/templates/session-notes-template.md +0 -0
- /package/skills/{bmad-testarch-test-design → bmad-tea-test-design}/bmod.toml +0 -0
- /package/skills/{bmad-testarch-test-design → bmad-tea-test-design}/instructions.md +0 -0
- /package/skills/{bmad-testarch-test-design → bmad-tea-test-design}/steps-c/step-01-detect-mode.md +0 -0
- /package/skills/{bmad-testarch-test-design → bmad-tea-test-design}/steps-c/step-01b-resume.md +0 -0
- /package/skills/{bmad-testarch-test-design → bmad-tea-test-design}/steps-c/step-02-load-context.md +0 -0
- /package/skills/{bmad-testarch-test-design → bmad-tea-test-design}/steps-c/step-03-risk-and-testability.md +0 -0
- /package/skills/{bmad-testarch-test-design → bmad-tea-test-design}/steps-c/step-04-coverage-plan.md +0 -0
- /package/skills/{bmad-testarch-test-design → bmad-tea-test-design}/steps-c/step-05-generate-output.md +0 -0
- /package/skills/{bmad-testarch-test-design → bmad-tea-test-design}/steps-e/step-01-assess.md +0 -0
- /package/skills/{bmad-testarch-test-design → bmad-tea-test-design}/steps-e/step-02-apply-edit.md +0 -0
- /package/skills/{bmad-testarch-test-design → bmad-tea-test-design}/steps-v/step-01-validate.md +0 -0
- /package/skills/{bmad-testarch-test-design → bmad-tea-test-design}/test-design-architecture-template.md +0 -0
- /package/skills/{bmad-testarch-test-design → bmad-tea-test-design}/test-design-handoff-template.md +0 -0
- /package/skills/{bmad-testarch-test-review → bmad-tea-test-review}/bmod.toml +0 -0
- /package/skills/{bmad-testarch-test-review → bmad-tea-test-review}/checklist.md +0 -0
- /package/skills/{bmad-testarch-test-review → bmad-tea-test-review}/resources/test-review.example.md +0 -0
- /package/skills/{bmad-testarch-test-review → bmad-tea-test-review}/steps-c/criteria-registry.md +0 -0
- /package/skills/{bmad-testarch-test-review → bmad-tea-test-review}/steps-c/step-01-load-context.md +0 -0
- /package/skills/{bmad-testarch-test-review → bmad-tea-test-review}/steps-c/step-01b-resume.md +0 -0
- /package/skills/{bmad-testarch-test-review → bmad-tea-test-review}/steps-c/step-02-discover-tests.md +0 -0
- /package/skills/{bmad-testarch-test-review → bmad-tea-test-review}/steps-c/step-03-quality-evaluation.md +0 -0
- /package/skills/{bmad-testarch-test-review → bmad-tea-test-review}/steps-c/step-03a-subagent-determinism.md +0 -0
- /package/skills/{bmad-testarch-test-review → bmad-tea-test-review}/steps-c/step-03b-subagent-isolation.md +0 -0
- /package/skills/{bmad-testarch-test-review → bmad-tea-test-review}/steps-c/step-03c-subagent-maintainability.md +0 -0
- /package/skills/{bmad-testarch-test-review → bmad-tea-test-review}/steps-c/step-03e-subagent-performance.md +0 -0
- /package/skills/{bmad-testarch-test-review → bmad-tea-test-review}/steps-c/step-03f-aggregate-scores.md +0 -0
- /package/skills/{bmad-testarch-test-review → bmad-tea-test-review}/steps-c/step-04-generate-report.md +0 -0
- /package/skills/{bmad-testarch-test-review → bmad-tea-test-review}/steps-e/step-01-assess.md +0 -0
- /package/skills/{bmad-testarch-test-review → bmad-tea-test-review}/steps-e/step-02-apply-edit.md +0 -0
- /package/skills/{bmad-testarch-test-review → bmad-tea-test-review}/steps-v/step-01-validate.md +0 -0
- /package/skills/{bmad-testarch-test-review → bmad-tea-test-review}/test-review-template.md +0 -0
- /package/skills/{bmad-testarch-trace → bmad-tea-trace}/bmod.toml +0 -0
- /package/skills/{bmad-testarch-trace → bmad-tea-trace}/resources/live-verification-results.example.json +0 -0
- /package/skills/{bmad-testarch-trace → bmad-tea-trace}/steps-c/step-01-load-context.md +0 -0
- /package/skills/{bmad-testarch-trace → bmad-tea-trace}/steps-c/step-01b-resume.md +0 -0
- /package/skills/{bmad-testarch-trace → bmad-tea-trace}/steps-c/step-02-discover-tests.md +0 -0
- /package/skills/{bmad-testarch-trace → bmad-tea-trace}/steps-c/step-03-map-criteria.md +0 -0
- /package/skills/{bmad-testarch-trace → bmad-tea-trace}/steps-c/step-05-gate-decision.md +0 -0
- /package/skills/{bmad-testarch-trace → bmad-tea-trace}/steps-e/step-01-assess.md +0 -0
- /package/skills/{bmad-testarch-trace → bmad-tea-trace}/steps-e/step-02-apply-edit.md +0 -0
- /package/skills/{bmad-testarch-trace → bmad-tea-trace}/steps-v/step-01-validate.md +0 -0
|
@@ -30,22 +30,22 @@
|
|
|
30
30
|
{
|
|
31
31
|
"name": "bmad-method-test-architecture-enterprise",
|
|
32
32
|
"source": "./",
|
|
33
|
-
"description": "Master Test Architect module for quality strategy, test generation in red and expand modes with automatic run-and-heal, combined framework and CI setup, CI/CD quality gates, and structured testing education.
|
|
34
|
-
"version": "
|
|
33
|
+
"description": "Master Test Architect module for quality strategy, test generation in red and expand modes with automatic run-and-heal, combined framework and CI setup, CI/CD quality gates, and structured testing education. Existing CI and ATDD customizations can be migrated to the new skill names. Part of the BMad Method ecosystem.",
|
|
34
|
+
"version": "3.0.0",
|
|
35
35
|
"author": {
|
|
36
36
|
"name": "Murat K Ozcan (TEA Creator) & Brian (BMad) Madison"
|
|
37
37
|
},
|
|
38
38
|
"skills": [
|
|
39
39
|
"./skills/bmod-tea",
|
|
40
40
|
"./skills/bmad-tea",
|
|
41
|
-
"./skills/bmad-
|
|
42
|
-
"./skills/bmad-
|
|
43
|
-
"./skills/bmad-
|
|
44
|
-
"./skills/bmad-
|
|
45
|
-
"./skills/bmad-
|
|
46
|
-
"./skills/bmad-
|
|
47
|
-
"./skills/bmad-
|
|
48
|
-
"./skills/bmad-teach-me-testing"
|
|
41
|
+
"./skills/bmad-tea-automate",
|
|
42
|
+
"./skills/bmad-tea-evaluate",
|
|
43
|
+
"./skills/bmad-tea-framework",
|
|
44
|
+
"./skills/bmad-tea-nfr",
|
|
45
|
+
"./skills/bmad-tea-test-design",
|
|
46
|
+
"./skills/bmad-tea-test-review",
|
|
47
|
+
"./skills/bmad-tea-trace",
|
|
48
|
+
"./skills/bmad-tea-teach-me-testing"
|
|
49
49
|
]
|
|
50
50
|
}
|
|
51
51
|
]
|
package/README.md
CHANGED
|
@@ -46,37 +46,52 @@ To install a tagged release, replace `<version>` with the release number:
|
|
|
46
46
|
npx skills add https://github.com/bmad-code-org/bmad-method-test-architecture-enterprise/tree/v<version>/skills
|
|
47
47
|
```
|
|
48
48
|
|
|
49
|
+
### Upgrading to 3.0
|
|
50
|
+
|
|
51
|
+
The eight direct workflow commands now share the `bmad-tea-*` prefix. Replace `bmad-testarch-automate`, `-evaluate`, `-framework`, `-nfr`, `-test-design`, `-test-review`, and `-trace` with the same suffix under `bmad-tea-`. Replace `bmad-teach-me-testing` with `bmad-tea-teach-me-testing`. The 3.0 package does not publish the old slash commands. The `bmad-tea` agent, `bmod-tea` module, menu codes, and `tea-*` CLI executables keep their names.
|
|
52
|
+
|
|
53
|
+
After installing 3.0, move project customizations to the new names:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
npx --package=bmad-method-test-architecture-enterprise@3 tea-migrate-customizations --project-root . --check
|
|
57
|
+
npx --package=bmad-method-test-architecture-enterprise@3 tea-migrate-customizations --project-root .
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
This includes old CI and ATDD customization files and old skill references in custom `bmad-tea` agent menus. The command moves old-only files with their comments and permissions intact. When both old and new filenames exist, it reports both paths and asks for a manual merge so no comments or values are lost. Resolve the reported files, then rerun the command. See the [configuration reference](https://bmad-code-org.github.io/bmad-method-test-architecture-enterprise/reference/configuration/) for details.
|
|
61
|
+
|
|
62
|
+
An existing host may retain the old skill folders after installing 3.0. Check the host's project and global skills folders, back up any edits in the old folders, and move those eight folders out of skill discovery. The [troubleshooting guide](https://bmad-code-org.github.io/bmad-method-test-architecture-enterprise/reference/troubleshooting/#old-slash-commands-still-appear-after-30) lists the exact folders and a safe cleanup sequence. Restart the host so its command list refreshes.
|
|
63
|
+
|
|
49
64
|
<a id="start-with-one-workflow"></a>
|
|
50
65
|
|
|
51
66
|
## Start with one skill
|
|
52
67
|
|
|
53
68
|
Eight commands start the eight workflows: Framework includes CI setup; Automate includes red and expand modes.
|
|
54
69
|
|
|
55
|
-
In Claude Code, Cursor, and Windsurf, type `/bmad-
|
|
56
|
-
In Codex, type `$bmad-
|
|
70
|
+
In Claude Code, Cursor, and Windsurf, type `/bmad-tea-test-design` in chat.
|
|
71
|
+
In Codex, type `$bmad-tea-test-design`.
|
|
57
72
|
You can also load `/bmad-tea` or `$bmad-tea` and choose a menu code.
|
|
58
73
|
Each skill can run directly in a fresh session.
|
|
59
74
|
|
|
60
75
|
| Skill | Command | Menu | Use it to |
|
|
61
76
|
| ------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ---- | ---------------------------------------------------- |
|
|
62
|
-
| [Automate](https://bmad-code-org.github.io/bmad-method-test-architecture-enterprise/how-to/workflows/run-automate/) | `/bmad-
|
|
63
|
-
| [Test Review](https://bmad-code-org.github.io/bmad-method-test-architecture-enterprise/how-to/workflows/run-test-review/) | `/bmad-
|
|
64
|
-
| [Test Design](https://bmad-code-org.github.io/bmad-method-test-architecture-enterprise/how-to/workflows/run-test-design/) | `/bmad-
|
|
65
|
-
| [Framework](https://bmad-code-org.github.io/bmad-method-test-architecture-enterprise/how-to/workflows/setup-test-framework/) | `/bmad-
|
|
66
|
-
| [NFR](https://bmad-code-org.github.io/bmad-method-test-architecture-enterprise/how-to/workflows/run-nfr-assess/) | `/bmad-
|
|
67
|
-
| [Trace](https://bmad-code-org.github.io/bmad-method-test-architecture-enterprise/how-to/workflows/run-trace/) | `/bmad-
|
|
68
|
-
| [Teach Me Testing](https://bmad-code-org.github.io/bmad-method-test-architecture-enterprise/how-to/workflows/teach-me-testing/) | `/bmad-teach-me-testing`
|
|
77
|
+
| [Automate](https://bmad-code-org.github.io/bmad-method-test-architecture-enterprise/how-to/workflows/run-automate/) | `/bmad-tea-automate` | TA | Generate red acceptance scaffolds or expand coverage |
|
|
78
|
+
| [Test Review](https://bmad-code-org.github.io/bmad-method-test-architecture-enterprise/how-to/workflows/run-test-review/) | `/bmad-tea-test-review` | RV | Audit test quality and score findings |
|
|
79
|
+
| [Test Design](https://bmad-code-org.github.io/bmad-method-test-architecture-enterprise/how-to/workflows/run-test-design/) | `/bmad-tea-test-design` | TD | Plan risks, coverage, and NFR evidence |
|
|
80
|
+
| [Framework](https://bmad-code-org.github.io/bmad-method-test-architecture-enterprise/how-to/workflows/setup-test-framework/) | `/bmad-tea-framework` | TF | Set up a test framework, CI, or both |
|
|
81
|
+
| [NFR](https://bmad-code-org.github.io/bmad-method-test-architecture-enterprise/how-to/workflows/run-nfr-assess/) | `/bmad-tea-nfr` | NR | Audit implemented NFR evidence |
|
|
82
|
+
| [Trace](https://bmad-code-org.github.io/bmad-method-test-architecture-enterprise/how-to/workflows/run-trace/) | `/bmad-tea-trace` | TR | Map requirements to tests and decide a release gate |
|
|
83
|
+
| [Teach Me Testing](https://bmad-code-org.github.io/bmad-method-test-architecture-enterprise/how-to/workflows/teach-me-testing/) | `/bmad-tea-teach-me-testing` | TMT | Learn testing through seven sessions |
|
|
69
84
|
|
|
70
85
|
Evaluate:
|
|
71
86
|
|
|
72
|
-
- [Evaluate](https://bmad-code-org.github.io/bmad-method-test-architecture-enterprise/tutorials/evaluate-your-first-skill/): `/bmad-
|
|
87
|
+
- [Evaluate](https://bmad-code-org.github.io/bmad-method-test-architecture-enterprise/tutorials/evaluate-your-first-skill/): `/bmad-tea-evaluate`, menu `EV`. Build and run a behavioral evaluation.
|
|
73
88
|
|
|
74
|
-
Framework and CI setup share one skill, `bmad-
|
|
89
|
+
Framework and CI setup share one skill, `bmad-tea-framework`.
|
|
75
90
|
Ask for framework only, CI only, or both; TEA infers the scope from your prompt and asks "Do you want CI too?" once when CI scope is unclear in an interactive session. An unattended request with unclear scope runs framework setup only and states that CI was excluded.
|
|
76
|
-
Request CI setup through `/bmad-
|
|
91
|
+
Request CI setup through `/bmad-tea-framework` or the agent's `CI` menu code. Migrated CI customizations remain usable.
|
|
77
92
|
Create, Resume, Validate, and Edit remain available for the selected setup scope.
|
|
78
93
|
|
|
79
|
-
Automation uses `red` mode before implementation and `expand` mode for existing code. Request red mode through `/bmad-
|
|
94
|
+
Automation uses `red` mode before implementation and `expand` mode for existing code. Request red mode through `/bmad-tea-automate` or the agent's `AT` menu code; the direct command defaults to expand. Migrated customization files and saved progress remain usable. Create runs execute the generated tests and repair test issues for up to three rounds. Red confirms the intended missing behavior; expand aims for passing coverage and reports product defects.
|
|
80
95
|
|
|
81
96
|
For Codex, replace the leading `/` in the table with `$`.
|
|
82
97
|
The agent menu also accepts `GATE` to route you through test review, NFR evidence audit, and trace Phase 2.
|
|
@@ -113,6 +128,7 @@ It requires Node.js 22.20.0 or later:
|
|
|
113
128
|
npm install --save-dev bmad-method-test-architecture-enterprise
|
|
114
129
|
```
|
|
115
130
|
|
|
131
|
+
- [`tea-teach`](https://bmad-code-org.github.io/bmad-method-test-architecture-enterprise/reference/tea-teach-cli/) teaches one learner turn and keeps conversation and session progress.
|
|
116
132
|
- [`tea-test-review`](https://bmad-code-org.github.io/bmad-method-test-architecture-enterprise/reference/tea-test-review-cli/) runs the review skill against changed tests and returns a gate verdict.
|
|
117
133
|
- [`tea-framework`](https://bmad-code-org.github.io/bmad-method-test-architecture-enterprise/reference/tea-framework-cli/) creates, resumes, validates, and edits test framework and CI setup with retained run evidence.
|
|
118
134
|
- [`tea-trace`](https://bmad-code-org.github.io/bmad-method-test-architecture-enterprise/reference/tea-trace-cli/) maps requirements to existing evidence and returns a coverage gate.
|
package/cli/atdd-red-check.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
3
|
* tea-atdd-red-check — activates and executes the scaffolds
|
|
4
|
-
* `bmad-
|
|
4
|
+
* `bmad-tea-atdd` wrote, and reports what actually happened.
|
|
5
5
|
*
|
|
6
6
|
* This is the deterministic half of the ATDD suite, and it carries no vendor
|
|
7
7
|
* knowledge at all: it never calls a model, never resolves a credential, and
|
package/cli/atdd-runner.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* tea-atdd-runner — the command the ATDD behavioral contract names for
|
|
4
4
|
* generation.
|
|
5
5
|
*
|
|
6
|
-
* `bmad-
|
|
6
|
+
* `bmad-tea-atdd` reads a story's acceptance criteria and writes red-phase
|
|
7
7
|
* test scaffolds under the project's `tests/` directory, one deliverable this
|
|
8
8
|
* eval measures by executing rather than reading. Generation and execution are
|
|
9
9
|
* two separate commands: this one drives the workflow and leaves the scaffolds
|
package/cli/automate.js
CHANGED
|
@@ -135,11 +135,11 @@ async function main(argv) {
|
|
|
135
135
|
if (options.projectSkill) {
|
|
136
136
|
const candidates = ['.claude/skills', '.agents/skills', 'skills', '_bmad/tea/workflows/testarch'];
|
|
137
137
|
options.skillRoot = candidates
|
|
138
|
-
.map((directory) => path.join(root, directory, 'bmad-
|
|
138
|
+
.map((directory) => path.join(root, directory, 'bmad-tea-automate'))
|
|
139
139
|
.find((candidate) => fs.existsSync(path.join(candidate, 'SKILL.md')));
|
|
140
|
-
if (!options.skillRoot) throw new Error('project-installed bmad-
|
|
140
|
+
if (!options.skillRoot) throw new Error('project-installed bmad-tea-automate skill is missing');
|
|
141
141
|
}
|
|
142
|
-
skillRoot = resolveWorkflowSkill({ projectRoot: root, skillName: 'bmad-
|
|
142
|
+
skillRoot = resolveWorkflowSkill({ projectRoot: root, skillName: 'bmad-tea-automate', skillRoot: options.skillRoot });
|
|
143
143
|
if (!fs.existsSync(path.join(skillRoot, '..', 'bmod-tea', 'knowledge', 'tea-index.csv')))
|
|
144
144
|
throw new Error('the selected skill has no sibling bmod-tea knowledge base');
|
|
145
145
|
if (options.story) story = artifactPath(root, options.story, '--story');
|
package/cli/ci-runner.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* tea-ci-runner: the command the CI behavioral contract names.
|
|
4
4
|
*
|
|
5
|
-
* `bmad-
|
|
5
|
+
* `bmad-tea-ci` scaffolds a pipeline for the project it is run in and
|
|
6
6
|
* writes one deliverable a linter can hold to account, the platform's own
|
|
7
7
|
* workflow file, which for GitHub Actions is `.github/workflows/test.yml`.
|
|
8
8
|
* Measuring that needs a command to point at, and this file is that command.
|
|
@@ -27,7 +27,7 @@ function resolveGenerationConfig(projectRoot, checkpointPath, operation, skillRo
|
|
|
27
27
|
};
|
|
28
28
|
if (!['none', 'auto', 'cli', 'mcp'].includes(tea.tea_browser_automation))
|
|
29
29
|
throw new Error('tea_browser_automation must be none, auto, cli or mcp');
|
|
30
|
-
const namespace = mode === 'red' ? 'bmad-
|
|
30
|
+
const namespace = mode === 'red' ? 'bmad-tea-atdd' : 'bmad-tea-automate';
|
|
31
31
|
const sibling = path.join(skillRoot, '..', namespace, 'customize.toml');
|
|
32
32
|
const defaultsPath =
|
|
33
33
|
mode === 'red' && !fs.existsSync(sibling)
|
|
@@ -12,7 +12,7 @@ const { spawnSync } = require('node:child_process');
|
|
|
12
12
|
const { runAgent } = require('./run-agent');
|
|
13
13
|
const { resolveTeaConfig } = require('./resolve-tea-config');
|
|
14
14
|
|
|
15
|
-
const SKILL_NAME = 'bmad-
|
|
15
|
+
const SKILL_NAME = 'bmad-tea-framework';
|
|
16
16
|
const SCOPES = ['framework', 'ci', 'both'];
|
|
17
17
|
const OPERATIONS = ['create', 'resume', 'validate', 'edit'];
|
|
18
18
|
|
|
@@ -607,7 +607,7 @@ function prepareSetup({ projectRoot, skillRoot, config, options }) {
|
|
|
607
607
|
throw problem('Resume has an uncertain started hook. Record explicit operator recovery in the journal before headless execution.');
|
|
608
608
|
const scope = options.operation === 'resume' ? before.data.setup_scope : options.scope;
|
|
609
609
|
const ciConfig = ['ci', 'both'].includes(scope)
|
|
610
|
-
? resolveTeaConfig({ projectRoot, skillRoot: path.join(skillRoot, '
|
|
610
|
+
? resolveTeaConfig({ projectRoot, skillRoot: path.join(skillRoot, 'ci'), skillName: 'bmad-tea-ci' })
|
|
611
611
|
: null;
|
|
612
612
|
const requiredHooks = {};
|
|
613
613
|
for (const [phase, settings] of [
|
package/cli/lib/resolve-skill.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Resolve the installed bmad-
|
|
2
|
+
* Resolve the installed bmad-tea-test-review skill root inside a consuming project.
|
|
3
3
|
*
|
|
4
4
|
* Probe order mirrors BMAD installer outputs: BMAD core layout, Claude Code, Codex.
|
|
5
5
|
* The skill remains the source of truth for review logic; the CLI only locates it.
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
const fs = require('node:fs');
|
|
9
9
|
const path = require('node:path');
|
|
10
10
|
|
|
11
|
-
const SKILL_NAME = 'bmad-
|
|
11
|
+
const SKILL_NAME = 'bmad-tea-test-review';
|
|
12
12
|
|
|
13
13
|
// The classic installer's location comes last: a project upgraded from v6 can still hold that copy, and it must not shadow the skill the v7 install added.
|
|
14
14
|
const SKILL_CANDIDATES = [
|
|
@@ -78,18 +78,22 @@ function configError(message) {
|
|
|
78
78
|
}
|
|
79
79
|
|
|
80
80
|
/** Read configuration from one pinned base commit, or from the working tree. */
|
|
81
|
-
function configSource(projectRoot, baseRef) {
|
|
81
|
+
function configSource(projectRoot, baseRef, inputPaths, inputPatterns) {
|
|
82
82
|
if (baseRef === undefined || baseRef === null) {
|
|
83
83
|
return {
|
|
84
|
+
recordInput: (file) => inputPaths?.add(file),
|
|
84
85
|
label: (relativePath) => path.join(projectRoot, relativePath),
|
|
85
86
|
list(pattern) {
|
|
86
87
|
try {
|
|
87
|
-
|
|
88
|
+
const matches = globSync(pattern, { cwd: projectRoot, dot: true, nodir: true, follow: false });
|
|
89
|
+
inputPatterns?.set(pattern, [...matches].sort());
|
|
90
|
+
return matches;
|
|
88
91
|
} catch (error) {
|
|
89
92
|
throw configError(`Failed to list policy files in ${projectRoot}: ${error.message}`);
|
|
90
93
|
}
|
|
91
94
|
},
|
|
92
95
|
read(relativePath) {
|
|
96
|
+
inputPaths?.add(path.join(projectRoot, relativePath));
|
|
93
97
|
try {
|
|
94
98
|
return fs.readFileSync(path.join(projectRoot, relativePath), 'utf8');
|
|
95
99
|
} catch (error) {
|
|
@@ -281,9 +285,10 @@ function parseToml(content, label) {
|
|
|
281
285
|
}
|
|
282
286
|
|
|
283
287
|
/** Resolve trusted skill defaults and project workflow overrides from the same configuration source. */
|
|
284
|
-
function readWorkflowCustomization(source, skillRoot, projectRoot, skillName = 'bmad-
|
|
288
|
+
function readWorkflowCustomization(source, skillRoot, projectRoot, skillName = 'bmad-tea-test-review') {
|
|
285
289
|
if (!skillRoot) return {};
|
|
286
290
|
const defaultsPath = path.join(skillRoot, 'customize.toml');
|
|
291
|
+
source.recordInput?.(defaultsPath);
|
|
287
292
|
let merged = {};
|
|
288
293
|
try {
|
|
289
294
|
merged = parseToml(fs.readFileSync(defaultsPath, 'utf8'), defaultsPath);
|
|
@@ -291,10 +296,24 @@ function readWorkflowCustomization(source, skillRoot, projectRoot, skillName = '
|
|
|
291
296
|
if (error.code !== 'ENOENT') throw configError(`Failed to load ${defaultsPath}: ${error.message}`);
|
|
292
297
|
}
|
|
293
298
|
if (!/^[a-z0-9][a-z0-9-]*$/.test(skillName)) throw configError('Workflow skill name must be a lowercase kebab-case name');
|
|
294
|
-
const
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
299
|
+
const oldName =
|
|
300
|
+
skillName === 'bmad-tea-teach-me-testing'
|
|
301
|
+
? 'bmad-teach-me-testing'
|
|
302
|
+
: skillName.startsWith('bmad-tea-')
|
|
303
|
+
? skillName.replace('bmad-tea-', 'bmad-testarch-')
|
|
304
|
+
: null;
|
|
305
|
+
for (const suffix of ['.toml', '.user.toml']) {
|
|
306
|
+
const legacyPath = oldName && path.join('_bmad', 'custom', oldName + suffix);
|
|
307
|
+
const currentPath = path.join('_bmad', 'custom', skillName + suffix);
|
|
308
|
+
const legacyContent = legacyPath && source.read(legacyPath);
|
|
309
|
+
const currentContent = source.read(currentPath);
|
|
310
|
+
const legacy = legacyContent === null ? {} : parseToml(legacyContent, source.label(legacyPath));
|
|
311
|
+
const current = currentContent === null ? {} : parseToml(currentContent, source.label(currentPath));
|
|
312
|
+
const conflict = conflictingValue(legacy, current);
|
|
313
|
+
if (conflict) {
|
|
314
|
+
throw configError(`Conflicting workflow customization ${conflict} in ${source.label(legacyPath)} and ${source.label(currentPath)}`);
|
|
315
|
+
}
|
|
316
|
+
merged = mergeTables(merged, unionEqualCustomizationValues(legacy, current));
|
|
298
317
|
}
|
|
299
318
|
if (merged.workflow !== undefined && !isPlainObject(merged.workflow)) {
|
|
300
319
|
throw configError('Workflow customization must contain a [workflow] table');
|
|
@@ -322,6 +341,29 @@ function readWorkflowCustomization(source, skillRoot, projectRoot, skillName = '
|
|
|
322
341
|
return workflow;
|
|
323
342
|
}
|
|
324
343
|
|
|
344
|
+
/** Find the first setting whose legacy and current values disagree. */
|
|
345
|
+
function conflictingValue(legacy, current, prefix = '') {
|
|
346
|
+
for (const [key, oldValue] of Object.entries(legacy)) {
|
|
347
|
+
if (!Object.hasOwn(current, key)) continue;
|
|
348
|
+
const next = prefix ? `${prefix}.${key}` : key;
|
|
349
|
+
const newValue = current[key];
|
|
350
|
+
if (isPlainObject(oldValue) && isPlainObject(newValue)) {
|
|
351
|
+
const nested = conflictingValue(oldValue, newValue, next);
|
|
352
|
+
if (nested) return nested;
|
|
353
|
+
} else if (JSON.stringify(oldValue) !== JSON.stringify(newValue)) return next;
|
|
354
|
+
}
|
|
355
|
+
return null;
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
/** Combine old and new names for one layer without appending an identical array twice. */
|
|
359
|
+
function unionEqualCustomizationValues(legacy, current) {
|
|
360
|
+
const result = { ...legacy };
|
|
361
|
+
for (const [key, value] of Object.entries(current)) {
|
|
362
|
+
result[key] = isPlainObject(result[key]) && isPlainObject(value) ? unionEqualCustomizationValues(result[key], value) : value;
|
|
363
|
+
}
|
|
364
|
+
return result;
|
|
365
|
+
}
|
|
366
|
+
|
|
325
367
|
/** Coerce the keys this CLI cares about out of a raw TEA config table. */
|
|
326
368
|
function pickTeaValues(table, source) {
|
|
327
369
|
const values = {};
|
|
@@ -490,13 +532,16 @@ const KEY_TO_INSTALLED_FIELD = {
|
|
|
490
532
|
* @param {string} [options.skillRoot] - Trusted skill defaults for workflow customization.
|
|
491
533
|
* @param {object} [options.flags] - Parsed CLI options; only the keys in
|
|
492
534
|
* FLAG_TO_KEY are read, and only when not undefined.
|
|
535
|
+
* @param {Set<string>} [options.inputPaths] - Receives working-tree inputs, including missing optional layers.
|
|
536
|
+
* @param {Map<string, string[]>} [options.inputPatterns] - Receives policy glob membership used during resolution.
|
|
493
537
|
* @returns {{values: object, sources: object, installed: object, configSnapshot: object, workflowCustomization: object, configCommit: string|null, configPath: string, configPresent: boolean, configFormat: string|null}}
|
|
494
538
|
* `installed` carries one boolean per library gate, read from the project
|
|
495
539
|
* manifest rather than left to the agent.
|
|
496
540
|
* @throws {Error} With code TEA_CONFIG_INVALID on unusable config content.
|
|
497
541
|
*/
|
|
498
|
-
function resolveTeaConfig({ projectRoot, flags = {}, baseRef, skillRoot, skillName }) {
|
|
499
|
-
const source = configSource(projectRoot, baseRef);
|
|
542
|
+
function resolveTeaConfig({ projectRoot, flags = {}, baseRef, skillRoot, skillName, inputPaths, inputPatterns }) {
|
|
543
|
+
const source = configSource(projectRoot, baseRef, inputPaths, inputPatterns);
|
|
544
|
+
inputPaths?.add(path.join(projectRoot, 'package.json'));
|
|
500
545
|
const file = readTeaConfigFile(projectRoot, baseRef, source);
|
|
501
546
|
const workflowCustomization = readWorkflowCustomization(source, skillRoot, projectRoot, skillName);
|
|
502
547
|
|