bmad-method-test-architecture-enterprise 0.1.1-beta.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.
Files changed (320) hide show
  1. package/.github/CODE_OF_CONDUCT.md +128 -0
  2. package/.github/FUNDING.yaml +15 -0
  3. package/.github/ISSUE_TEMPLATE/config.yaml +11 -0
  4. package/.github/ISSUE_TEMPLATE/feature_request.md +70 -0
  5. package/.github/ISSUE_TEMPLATE/issue.md +61 -0
  6. package/.github/workflows/docs.yaml +66 -0
  7. package/.github/workflows/manual-release.yaml +195 -0
  8. package/.github/workflows/quality.yaml +114 -0
  9. package/.husky/pre-commit +20 -0
  10. package/.markdownlint-cli2.yaml +36 -0
  11. package/.nvmrc +1 -0
  12. package/.prettierignore +9 -0
  13. package/.vscode/settings.json +47 -0
  14. package/CHANGELOG.md +217 -0
  15. package/CONTRIBUTING.md +268 -0
  16. package/LICENSE +26 -0
  17. package/README.md +300 -0
  18. package/SECURITY.md +85 -0
  19. package/TEA-MODULE-MIGRATION-PLAN.md +3788 -0
  20. package/docs/404.md +20 -0
  21. package/docs/MIGRATION.md +447 -0
  22. package/docs/explanation/engagement-models.md +767 -0
  23. package/docs/explanation/fixture-architecture.md +484 -0
  24. package/docs/explanation/knowledge-base-system.md +599 -0
  25. package/docs/explanation/network-first-patterns.md +884 -0
  26. package/docs/explanation/risk-based-testing.md +628 -0
  27. package/docs/explanation/step-file-architecture.md +609 -0
  28. package/docs/explanation/subprocess-architecture.md +578 -0
  29. package/docs/explanation/subprocess-implementation-status.md +327 -0
  30. package/docs/explanation/tea-overview.md +425 -0
  31. package/docs/explanation/test-quality-standards.md +965 -0
  32. package/docs/explanation/testing-as-engineering.md +111 -0
  33. package/docs/glossary/index.md +160 -0
  34. package/docs/how-to/brownfield/use-tea-for-enterprise.md +571 -0
  35. package/docs/how-to/brownfield/use-tea-with-existing-tests.md +631 -0
  36. package/docs/how-to/customization/enable-tea-mcp-enhancements.md +455 -0
  37. package/docs/how-to/customization/integrate-playwright-utils.md +846 -0
  38. package/docs/how-to/workflows/run-atdd.md +460 -0
  39. package/docs/how-to/workflows/run-automate.md +690 -0
  40. package/docs/how-to/workflows/run-nfr-assess.md +731 -0
  41. package/docs/how-to/workflows/run-test-design.md +144 -0
  42. package/docs/how-to/workflows/run-test-review.md +638 -0
  43. package/docs/how-to/workflows/run-trace.md +951 -0
  44. package/docs/how-to/workflows/setup-ci.md +761 -0
  45. package/docs/how-to/workflows/setup-test-framework.md +99 -0
  46. package/docs/index.md +122 -0
  47. package/docs/reference/commands.md +300 -0
  48. package/docs/reference/configuration.md +729 -0
  49. package/docs/reference/knowledge-base.md +365 -0
  50. package/docs/reference/troubleshooting.md +717 -0
  51. package/docs/tutorials/tea-lite-quickstart.md +465 -0
  52. package/eslint.config.mjs +152 -0
  53. package/package.json +117 -0
  54. package/prettier.config.mjs +32 -0
  55. package/release_notes.md +28 -0
  56. package/src/_module-installer/installer.js +92 -0
  57. package/src/agents/tea.agent.yaml +63 -0
  58. package/src/module-help.csv +9 -0
  59. package/src/module.yaml +91 -0
  60. package/src/testarch/knowledge/adr-quality-readiness-checklist.md +377 -0
  61. package/src/testarch/knowledge/api-request.md +442 -0
  62. package/src/testarch/knowledge/api-testing-patterns.md +851 -0
  63. package/src/testarch/knowledge/auth-session.md +548 -0
  64. package/src/testarch/knowledge/burn-in.md +273 -0
  65. package/src/testarch/knowledge/ci-burn-in.md +675 -0
  66. package/src/testarch/knowledge/component-tdd.md +486 -0
  67. package/src/testarch/knowledge/contract-testing.md +957 -0
  68. package/src/testarch/knowledge/data-factories.md +500 -0
  69. package/src/testarch/knowledge/email-auth.md +721 -0
  70. package/src/testarch/knowledge/error-handling.md +725 -0
  71. package/src/testarch/knowledge/feature-flags.md +750 -0
  72. package/src/testarch/knowledge/file-utils.md +456 -0
  73. package/src/testarch/knowledge/fixture-architecture.md +401 -0
  74. package/src/testarch/knowledge/fixtures-composition.md +382 -0
  75. package/src/testarch/knowledge/intercept-network-call.md +426 -0
  76. package/src/testarch/knowledge/log.md +426 -0
  77. package/src/testarch/knowledge/network-error-monitor.md +401 -0
  78. package/src/testarch/knowledge/network-first.md +486 -0
  79. package/src/testarch/knowledge/network-recorder.md +527 -0
  80. package/src/testarch/knowledge/nfr-criteria.md +670 -0
  81. package/src/testarch/knowledge/overview.md +286 -0
  82. package/src/testarch/knowledge/playwright-config.md +730 -0
  83. package/src/testarch/knowledge/probability-impact.md +601 -0
  84. package/src/testarch/knowledge/recurse.md +421 -0
  85. package/src/testarch/knowledge/risk-governance.md +615 -0
  86. package/src/testarch/knowledge/selective-testing.md +732 -0
  87. package/src/testarch/knowledge/selector-resilience.md +527 -0
  88. package/src/testarch/knowledge/test-healing-patterns.md +644 -0
  89. package/src/testarch/knowledge/test-levels-framework.md +473 -0
  90. package/src/testarch/knowledge/test-priorities-matrix.md +373 -0
  91. package/src/testarch/knowledge/test-quality.md +664 -0
  92. package/src/testarch/knowledge/timing-debugging.md +372 -0
  93. package/src/testarch/knowledge/visual-debugging.md +524 -0
  94. package/src/testarch/tea-index.csv +35 -0
  95. package/src/workflows/testarch/README.md +74 -0
  96. package/src/workflows/testarch/atdd/atdd-checklist-template.md +363 -0
  97. package/src/workflows/testarch/atdd/checklist.md +374 -0
  98. package/src/workflows/testarch/atdd/instructions.md +38 -0
  99. package/src/workflows/testarch/atdd/steps-c/step-01-preflight-and-context.md +110 -0
  100. package/src/workflows/testarch/atdd/steps-c/step-02-generation-mode.md +79 -0
  101. package/src/workflows/testarch/atdd/steps-c/step-03-test-strategy.md +76 -0
  102. package/src/workflows/testarch/atdd/steps-c/step-04-generate-tests.md +228 -0
  103. package/src/workflows/testarch/atdd/steps-c/step-04a-subprocess-api-failing.md +215 -0
  104. package/src/workflows/testarch/atdd/steps-c/step-04b-subprocess-e2e-failing.md +212 -0
  105. package/src/workflows/testarch/atdd/steps-c/step-04c-aggregate.md +329 -0
  106. package/src/workflows/testarch/atdd/steps-c/step-05-validate-and-complete.md +68 -0
  107. package/src/workflows/testarch/atdd/steps-e/step-01-assess.md +65 -0
  108. package/src/workflows/testarch/atdd/steps-e/step-02-apply-edit.md +60 -0
  109. package/src/workflows/testarch/atdd/steps-v/step-01-validate.md +67 -0
  110. package/src/workflows/testarch/atdd/validation-report-20260127-095021.md +73 -0
  111. package/src/workflows/testarch/atdd/validation-report-20260127-102401.md +116 -0
  112. package/src/workflows/testarch/atdd/workflow-plan.md +21 -0
  113. package/src/workflows/testarch/atdd/workflow.md +39 -0
  114. package/src/workflows/testarch/atdd/workflow.yaml +47 -0
  115. package/src/workflows/testarch/automate/checklist.md +582 -0
  116. package/src/workflows/testarch/automate/instructions.md +43 -0
  117. package/src/workflows/testarch/automate/steps-c/step-01-preflight-and-context.md +127 -0
  118. package/src/workflows/testarch/automate/steps-c/step-02-identify-targets.md +95 -0
  119. package/src/workflows/testarch/automate/steps-c/step-03-generate-tests.md +199 -0
  120. package/src/workflows/testarch/automate/steps-c/step-03a-subprocess-api.md +183 -0
  121. package/src/workflows/testarch/automate/steps-c/step-03b-subprocess-e2e.md +181 -0
  122. package/src/workflows/testarch/automate/steps-c/step-03c-aggregate.md +300 -0
  123. package/src/workflows/testarch/automate/steps-c/step-04-validate-and-summarize.md +69 -0
  124. package/src/workflows/testarch/automate/steps-e/step-01-assess.md +65 -0
  125. package/src/workflows/testarch/automate/steps-e/step-02-apply-edit.md +60 -0
  126. package/src/workflows/testarch/automate/steps-v/step-01-validate.md +67 -0
  127. package/src/workflows/testarch/automate/validation-report-20260127-095021.md +72 -0
  128. package/src/workflows/testarch/automate/validation-report-20260127-102401.md +114 -0
  129. package/src/workflows/testarch/automate/workflow-plan.md +20 -0
  130. package/src/workflows/testarch/automate/workflow.md +39 -0
  131. package/src/workflows/testarch/automate/workflow.yaml +54 -0
  132. package/src/workflows/testarch/ci/checklist.md +247 -0
  133. package/src/workflows/testarch/ci/github-actions-template.yaml +198 -0
  134. package/src/workflows/testarch/ci/gitlab-ci-template.yaml +149 -0
  135. package/src/workflows/testarch/ci/instructions.md +38 -0
  136. package/src/workflows/testarch/ci/steps-c/step-01-preflight.md +92 -0
  137. package/src/workflows/testarch/ci/steps-c/step-02-generate-pipeline.md +82 -0
  138. package/src/workflows/testarch/ci/steps-c/step-03-configure-quality-gates.md +75 -0
  139. package/src/workflows/testarch/ci/steps-c/step-04-validate-and-summary.md +67 -0
  140. package/src/workflows/testarch/ci/steps-e/step-01-assess.md +65 -0
  141. package/src/workflows/testarch/ci/steps-e/step-02-apply-edit.md +60 -0
  142. package/src/workflows/testarch/ci/steps-v/step-01-validate.md +67 -0
  143. package/src/workflows/testarch/ci/validation-report-20260127-095021.md +72 -0
  144. package/src/workflows/testarch/ci/validation-report-20260127-102401.md +114 -0
  145. package/src/workflows/testarch/ci/workflow-plan.md +20 -0
  146. package/src/workflows/testarch/ci/workflow.md +39 -0
  147. package/src/workflows/testarch/ci/workflow.yaml +47 -0
  148. package/src/workflows/testarch/framework/checklist.md +320 -0
  149. package/src/workflows/testarch/framework/instructions.md +38 -0
  150. package/src/workflows/testarch/framework/steps-c/step-01-preflight.md +75 -0
  151. package/src/workflows/testarch/framework/steps-c/step-02-select-framework.md +73 -0
  152. package/src/workflows/testarch/framework/steps-c/step-03-scaffold-framework.md +120 -0
  153. package/src/workflows/testarch/framework/steps-c/step-04-docs-and-scripts.md +70 -0
  154. package/src/workflows/testarch/framework/steps-c/step-05-validate-and-summary.md +68 -0
  155. package/src/workflows/testarch/framework/steps-e/step-01-assess.md +65 -0
  156. package/src/workflows/testarch/framework/steps-e/step-02-apply-edit.md +60 -0
  157. package/src/workflows/testarch/framework/steps-v/step-01-validate.md +67 -0
  158. package/src/workflows/testarch/framework/validation-report-20260127-095021.md +73 -0
  159. package/src/workflows/testarch/framework/validation-report-20260127-102401.md +116 -0
  160. package/src/workflows/testarch/framework/workflow-plan.md +22 -0
  161. package/src/workflows/testarch/framework/workflow.md +39 -0
  162. package/src/workflows/testarch/framework/workflow.yaml +49 -0
  163. package/src/workflows/testarch/nfr-assess/checklist.md +407 -0
  164. package/src/workflows/testarch/nfr-assess/instructions.md +36 -0
  165. package/src/workflows/testarch/nfr-assess/nfr-report-template.md +462 -0
  166. package/src/workflows/testarch/nfr-assess/steps-c/step-01-load-context.md +85 -0
  167. package/src/workflows/testarch/nfr-assess/steps-c/step-02-define-thresholds.md +82 -0
  168. package/src/workflows/testarch/nfr-assess/steps-c/step-03-gather-evidence.md +64 -0
  169. package/src/workflows/testarch/nfr-assess/steps-c/step-04-evaluate-and-score.md +140 -0
  170. package/src/workflows/testarch/nfr-assess/steps-c/step-04a-subprocess-security.md +138 -0
  171. package/src/workflows/testarch/nfr-assess/steps-c/step-04b-subprocess-performance.md +84 -0
  172. package/src/workflows/testarch/nfr-assess/steps-c/step-04c-subprocess-reliability.md +85 -0
  173. package/src/workflows/testarch/nfr-assess/steps-c/step-04d-subprocess-scalability.md +88 -0
  174. package/src/workflows/testarch/nfr-assess/steps-c/step-04e-aggregate-nfr.md +219 -0
  175. package/src/workflows/testarch/nfr-assess/steps-c/step-05-generate-report.md +71 -0
  176. package/src/workflows/testarch/nfr-assess/steps-e/step-01-assess.md +65 -0
  177. package/src/workflows/testarch/nfr-assess/steps-e/step-02-apply-edit.md +60 -0
  178. package/src/workflows/testarch/nfr-assess/steps-v/step-01-validate.md +67 -0
  179. package/src/workflows/testarch/nfr-assess/validation-report-20260127-095021.md +73 -0
  180. package/src/workflows/testarch/nfr-assess/validation-report-20260127-102401.md +116 -0
  181. package/src/workflows/testarch/nfr-assess/workflow-plan.md +19 -0
  182. package/src/workflows/testarch/nfr-assess/workflow.md +39 -0
  183. package/src/workflows/testarch/nfr-assess/workflow.yaml +49 -0
  184. package/src/workflows/testarch/test-design/checklist.md +410 -0
  185. package/src/workflows/testarch/test-design/instructions.md +52 -0
  186. package/src/workflows/testarch/test-design/steps-c/step-01-detect-mode.md +109 -0
  187. package/src/workflows/testarch/test-design/steps-c/step-02-load-context.md +127 -0
  188. package/src/workflows/testarch/test-design/steps-c/step-03-risk-and-testability.md +85 -0
  189. package/src/workflows/testarch/test-design/steps-c/step-04-coverage-plan.md +98 -0
  190. package/src/workflows/testarch/test-design/steps-c/step-05-generate-output.md +97 -0
  191. package/src/workflows/testarch/test-design/steps-e/step-01-assess.md +65 -0
  192. package/src/workflows/testarch/test-design/steps-e/step-02-apply-edit.md +60 -0
  193. package/src/workflows/testarch/test-design/steps-v/step-01-validate.md +67 -0
  194. package/src/workflows/testarch/test-design/test-design-architecture-template.md +222 -0
  195. package/src/workflows/testarch/test-design/test-design-qa-template.md +296 -0
  196. package/src/workflows/testarch/test-design/test-design-template.md +294 -0
  197. package/src/workflows/testarch/test-design/validation-report-20260127-095021.md +73 -0
  198. package/src/workflows/testarch/test-design/validation-report-20260127-102401.md +116 -0
  199. package/src/workflows/testarch/test-design/workflow-plan.md +22 -0
  200. package/src/workflows/testarch/test-design/workflow.md +39 -0
  201. package/src/workflows/testarch/test-design/workflow.yaml +71 -0
  202. package/src/workflows/testarch/test-review/checklist.md +472 -0
  203. package/src/workflows/testarch/test-review/instructions.md +36 -0
  204. package/src/workflows/testarch/test-review/steps-c/step-01-load-context.md +101 -0
  205. package/src/workflows/testarch/test-review/steps-c/step-02-discover-tests.md +69 -0
  206. package/src/workflows/testarch/test-review/steps-c/step-03-quality-evaluation.md +184 -0
  207. package/src/workflows/testarch/test-review/steps-c/step-03a-subprocess-determinism.md +214 -0
  208. package/src/workflows/testarch/test-review/steps-c/step-03b-subprocess-isolation.md +125 -0
  209. package/src/workflows/testarch/test-review/steps-c/step-03c-subprocess-maintainability.md +102 -0
  210. package/src/workflows/testarch/test-review/steps-c/step-03d-subprocess-coverage.md +111 -0
  211. package/src/workflows/testarch/test-review/steps-c/step-03e-subprocess-performance.md +117 -0
  212. package/src/workflows/testarch/test-review/steps-c/step-03f-aggregate-scores.md +246 -0
  213. package/src/workflows/testarch/test-review/steps-c/step-04-generate-report.md +72 -0
  214. package/src/workflows/testarch/test-review/steps-e/step-01-assess.md +65 -0
  215. package/src/workflows/testarch/test-review/steps-e/step-02-apply-edit.md +60 -0
  216. package/src/workflows/testarch/test-review/steps-v/step-01-validate.md +67 -0
  217. package/src/workflows/testarch/test-review/test-review-template.md +390 -0
  218. package/src/workflows/testarch/test-review/validation-report-20260127-095021.md +72 -0
  219. package/src/workflows/testarch/test-review/validation-report-20260127-102401.md +114 -0
  220. package/src/workflows/testarch/test-review/workflow-plan.md +18 -0
  221. package/src/workflows/testarch/test-review/workflow.md +39 -0
  222. package/src/workflows/testarch/test-review/workflow.yaml +48 -0
  223. package/src/workflows/testarch/trace/checklist.md +642 -0
  224. package/src/workflows/testarch/trace/instructions.md +36 -0
  225. package/src/workflows/testarch/trace/steps-c/step-01-load-context.md +80 -0
  226. package/src/workflows/testarch/trace/steps-c/step-02-discover-tests.md +69 -0
  227. package/src/workflows/testarch/trace/steps-c/step-03-map-criteria.md +65 -0
  228. package/src/workflows/testarch/trace/steps-c/step-04-analyze-gaps.md +244 -0
  229. package/src/workflows/testarch/trace/steps-c/step-05-gate-decision.md +232 -0
  230. package/src/workflows/testarch/trace/steps-e/step-01-assess.md +65 -0
  231. package/src/workflows/testarch/trace/steps-e/step-02-apply-edit.md +60 -0
  232. package/src/workflows/testarch/trace/steps-v/step-01-validate.md +67 -0
  233. package/src/workflows/testarch/trace/trace-template.md +675 -0
  234. package/src/workflows/testarch/trace/validation-report-20260127-095021.md +73 -0
  235. package/src/workflows/testarch/trace/validation-report-20260127-102401.md +116 -0
  236. package/src/workflows/testarch/trace/workflow-plan.md +21 -0
  237. package/src/workflows/testarch/trace/workflow.md +39 -0
  238. package/src/workflows/testarch/trace/workflow.yaml +57 -0
  239. package/test/README.md +23 -0
  240. package/test/fixtures/agent-schema/invalid/critical-actions/actions-as-string.agent.yaml +27 -0
  241. package/test/fixtures/agent-schema/invalid/critical-actions/empty-string-in-actions.agent.yaml +30 -0
  242. package/test/fixtures/agent-schema/invalid/menu/empty-menu.agent.yaml +22 -0
  243. package/test/fixtures/agent-schema/invalid/menu/missing-menu.agent.yaml +20 -0
  244. package/test/fixtures/agent-schema/invalid/menu-commands/empty-command-target.agent.yaml +25 -0
  245. package/test/fixtures/agent-schema/invalid/menu-commands/no-command-target.agent.yaml +24 -0
  246. package/test/fixtures/agent-schema/invalid/menu-triggers/camel-case.agent.yaml +25 -0
  247. package/test/fixtures/agent-schema/invalid/menu-triggers/compound-invalid-format.agent.yaml +25 -0
  248. package/test/fixtures/agent-schema/invalid/menu-triggers/compound-mismatched-kebab.agent.yaml +25 -0
  249. package/test/fixtures/agent-schema/invalid/menu-triggers/duplicate-triggers.agent.yaml +31 -0
  250. package/test/fixtures/agent-schema/invalid/menu-triggers/empty-trigger.agent.yaml +25 -0
  251. package/test/fixtures/agent-schema/invalid/menu-triggers/leading-asterisk.agent.yaml +25 -0
  252. package/test/fixtures/agent-schema/invalid/menu-triggers/snake-case.agent.yaml +25 -0
  253. package/test/fixtures/agent-schema/invalid/menu-triggers/trigger-with-spaces.agent.yaml +25 -0
  254. package/test/fixtures/agent-schema/invalid/metadata/empty-module-string.agent.yaml +26 -0
  255. package/test/fixtures/agent-schema/invalid/metadata/empty-name.agent.yaml +24 -0
  256. package/test/fixtures/agent-schema/invalid/metadata/extra-metadata-fields.agent.yaml +27 -0
  257. package/test/fixtures/agent-schema/invalid/metadata/missing-id.agent.yaml +23 -0
  258. package/test/fixtures/agent-schema/invalid/persona/empty-principles-array.agent.yaml +24 -0
  259. package/test/fixtures/agent-schema/invalid/persona/empty-string-in-principles.agent.yaml +27 -0
  260. package/test/fixtures/agent-schema/invalid/persona/extra-persona-fields.agent.yaml +27 -0
  261. package/test/fixtures/agent-schema/invalid/persona/missing-role.agent.yaml +24 -0
  262. package/test/fixtures/agent-schema/invalid/prompts/empty-content.agent.yaml +29 -0
  263. package/test/fixtures/agent-schema/invalid/prompts/extra-prompt-fields.agent.yaml +31 -0
  264. package/test/fixtures/agent-schema/invalid/prompts/missing-content.agent.yaml +28 -0
  265. package/test/fixtures/agent-schema/invalid/prompts/missing-id.agent.yaml +28 -0
  266. package/test/fixtures/agent-schema/invalid/top-level/empty-file.agent.yaml +5 -0
  267. package/test/fixtures/agent-schema/invalid/top-level/extra-top-level-keys.agent.yaml +28 -0
  268. package/test/fixtures/agent-schema/invalid/top-level/missing-agent-key.agent.yaml +11 -0
  269. package/test/fixtures/agent-schema/invalid/yaml-errors/invalid-indentation.agent.yaml +19 -0
  270. package/test/fixtures/agent-schema/invalid/yaml-errors/malformed-yaml.agent.yaml +18 -0
  271. package/test/fixtures/agent-schema/valid/critical-actions/empty-critical-actions.agent.yaml +24 -0
  272. package/test/fixtures/agent-schema/valid/critical-actions/no-critical-actions.agent.yaml +22 -0
  273. package/test/fixtures/agent-schema/valid/critical-actions/valid-critical-actions.agent.yaml +27 -0
  274. package/test/fixtures/agent-schema/valid/menu/multiple-menu-items.agent.yaml +31 -0
  275. package/test/fixtures/agent-schema/valid/menu/single-menu-item.agent.yaml +22 -0
  276. package/test/fixtures/agent-schema/valid/menu-commands/all-command-types.agent.yaml +38 -0
  277. package/test/fixtures/agent-schema/valid/menu-commands/multiple-commands.agent.yaml +24 -0
  278. package/test/fixtures/agent-schema/valid/menu-triggers/compound-triggers.agent.yaml +31 -0
  279. package/test/fixtures/agent-schema/valid/menu-triggers/kebab-case-triggers.agent.yaml +34 -0
  280. package/test/fixtures/agent-schema/valid/metadata/core-agent-with-module.agent.yaml +24 -0
  281. package/test/fixtures/agent-schema/valid/metadata/empty-module-name-in-path.agent.yaml +24 -0
  282. package/test/fixtures/agent-schema/valid/metadata/malformed-path-treated-as-core.agent.yaml +24 -0
  283. package/test/fixtures/agent-schema/valid/metadata/module-agent-correct.agent.yaml +24 -0
  284. package/test/fixtures/agent-schema/valid/metadata/module-agent-missing-module.agent.yaml +23 -0
  285. package/test/fixtures/agent-schema/valid/metadata/wrong-module-value.agent.yaml +24 -0
  286. package/test/fixtures/agent-schema/valid/persona/complete-persona.agent.yaml +24 -0
  287. package/test/fixtures/agent-schema/valid/prompts/empty-prompts.agent.yaml +24 -0
  288. package/test/fixtures/agent-schema/valid/prompts/no-prompts.agent.yaml +22 -0
  289. package/test/fixtures/agent-schema/valid/prompts/valid-prompts-minimal.agent.yaml +28 -0
  290. package/test/fixtures/agent-schema/valid/prompts/valid-prompts-with-description.agent.yaml +30 -0
  291. package/test/fixtures/agent-schema/valid/top-level/minimal-core-agent.agent.yaml +24 -0
  292. package/test/schema/agent.js +491 -0
  293. package/test/test-agent-schema.js +387 -0
  294. package/test/test-installation-components.js +183 -0
  295. package/test/test-knowledge-base.js +199 -0
  296. package/test/unit-test-schema.js +133 -0
  297. package/test/validate-agent-schema.js +110 -0
  298. package/tools/build-docs.js +575 -0
  299. package/tools/fix-doc-links.js +288 -0
  300. package/tools/schema/agent.js +491 -0
  301. package/tools/validate-agent-schema.js +111 -0
  302. package/tools/validate-doc-links.js +371 -0
  303. package/tools/verify-paths.js +100 -0
  304. package/website/README.md +137 -0
  305. package/website/astro.config.mjs +158 -0
  306. package/website/package-lock.json +6856 -0
  307. package/website/package.json +23 -0
  308. package/website/public/favicon.ico +0 -0
  309. package/website/public/img/tea-logo.svg +7 -0
  310. package/website/public/robots.txt +37 -0
  311. package/website/src/components/Banner.astro +59 -0
  312. package/website/src/components/Header.astro +121 -0
  313. package/website/src/components/MobileMenuFooter.astro +53 -0
  314. package/website/src/content/config.ts +6 -0
  315. package/website/src/lib/site-url.js +25 -0
  316. package/website/src/pages/404.astro +11 -0
  317. package/website/src/rehype-base-paths.js +89 -0
  318. package/website/src/rehype-markdown-links.js +117 -0
  319. package/website/src/styles/custom.css +499 -0
  320. package/website/tsconfig.json +9 -0
@@ -0,0 +1,23 @@
1
+ {
2
+ "$schema": "https://json.schemastore.org/package.json",
3
+ "name": "tea-docs-website",
4
+ "version": "1.0.0",
5
+ "private": true,
6
+ "description": "Test Architect (TEA) documentation website",
7
+ "type": "module",
8
+ "scripts": {
9
+ "build": "astro check && astro build",
10
+ "check": "astro check",
11
+ "dev": "astro dev",
12
+ "preview": "astro preview"
13
+ },
14
+ "dependencies": {
15
+ "@astrojs/sitemap": "^3.6.0",
16
+ "@astrojs/starlight": "^0.37.0",
17
+ "astro": "^5.16.0",
18
+ "sharp": "^0.33.5"
19
+ },
20
+ "devDependencies": {
21
+ "@types/node": "^22.10.5"
22
+ }
23
+ }
Binary file
@@ -0,0 +1,7 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="120" height="40" viewBox="0 0 120 40">
2
+ <!-- TEA Logo Placeholder -->
3
+ <rect width="120" height="40" fill="#1e3a8a" rx="4"/>
4
+ <text x="10" y="28" font-family="Arial, sans-serif" font-size="24" font-weight="bold" fill="#ffffff">
5
+ TEA
6
+ </text>
7
+ </svg>
@@ -0,0 +1,37 @@
1
+ # Test Architect (TEA) Documentation
2
+ # https://test-architect.bmad-method.org
3
+ #
4
+ # This file controls web crawler access to the documentation site.
5
+
6
+ User-agent: *
7
+ Allow: /
8
+
9
+ # LLM-friendly documentation files
10
+ # These are specifically designed for AI consumption
11
+ # llms.txt - Concise overview with navigation
12
+ # llms-full.txt - Complete documentation in plain text
13
+
14
+ # AI Crawlers - Welcome!
15
+ User-agent: GPTBot
16
+ Allow: /
17
+
18
+ User-agent: ChatGPT-User
19
+ Allow: /
20
+
21
+ User-agent: Google-Extended
22
+ Allow: /
23
+
24
+ User-agent: CCBot
25
+ Allow: /
26
+
27
+ User-agent: anthropic-ai
28
+ Allow: /
29
+
30
+ User-agent: Claude-Web
31
+ Allow: /
32
+
33
+ User-agent: cohere-ai
34
+ Allow: /
35
+
36
+ # Sitemap
37
+ Sitemap: https://test-architect.bmad-method.org/sitemap.xml
@@ -0,0 +1,59 @@
1
+ ---
2
+ import { getSiteUrl } from '../lib/site-url.js';
3
+
4
+ const SITE_URL = getSiteUrl();
5
+ const fullDocsUrl = `${SITE_URL}/llms-full.txt`;
6
+ ---
7
+
8
+ <div class="ai-banner">
9
+ <span>🤖 Consolidated, AI-optimized BMAD docs: <a href={fullDocsUrl}>llms-full.txt</a>. Fetch this plain text file for complete context.</span>
10
+ </div>
11
+
12
+ <style>
13
+ .ai-banner {
14
+ width: 100vw; /* Full viewport width */
15
+ margin-left: calc(-50vw + 50%); /* Center and break out of container */
16
+ height: var(--ai-banner-height, 2.75rem);
17
+ background: #334155;
18
+ color: rgb(148, 163, 184);
19
+ padding: 0.5rem 1rem;
20
+ font-size: 0.875rem;
21
+ border-bottom: 1px solid rgba(140, 140, 255, 0.15);
22
+ display: flex;
23
+ align-items: center;
24
+ justify-content: center;
25
+ box-sizing: border-box;
26
+ font-family: system-ui, sans-serif;
27
+ }
28
+
29
+ /* Truncate text on narrow screens */
30
+ .ai-banner span {
31
+ white-space: nowrap;
32
+ overflow: hidden;
33
+ text-overflow: ellipsis;
34
+ max-width: 100%;
35
+ }
36
+ .ai-banner a {
37
+ color: #8C8CFF;
38
+ text-decoration: none;
39
+ font-weight: 600;
40
+ }
41
+ .ai-banner a:hover {
42
+ text-decoration: underline;
43
+ }
44
+
45
+ /* Match navbar padding at breakpoints */
46
+ @media (min-width: 50rem) {
47
+ .ai-banner {
48
+ padding-left: 2.5rem;
49
+ padding-right: 2.5rem;
50
+ }
51
+ }
52
+
53
+ @media (min-width: 72rem) {
54
+ .ai-banner {
55
+ padding-left: 3rem;
56
+ padding-right: 3rem;
57
+ }
58
+ }
59
+ </style>
@@ -0,0 +1,121 @@
1
+ ---
2
+ import config from 'virtual:starlight/user-config';
3
+ import type { Props } from '@astrojs/starlight/props';
4
+
5
+ import LanguageSelect from 'virtual:starlight/components/LanguageSelect';
6
+ import Search from 'virtual:starlight/components/Search';
7
+ import SiteTitle from 'virtual:starlight/components/SiteTitle';
8
+ import SocialIcons from 'virtual:starlight/components/SocialIcons';
9
+ import ThemeSelect from 'virtual:starlight/components/ThemeSelect';
10
+
11
+ import Banner from './Banner.astro';
12
+
13
+ /**
14
+ * Render the `Search` component if Pagefind is enabled or the default search component has been overridden.
15
+ */
16
+ const shouldRenderSearch =
17
+ config.pagefind || config.components.Search !== '@astrojs/starlight/components/Search.astro';
18
+ ---
19
+
20
+ <Banner />
21
+ <div class="header sl-flex">
22
+ <div class="title-wrapper sl-flex">
23
+ <SiteTitle {...Astro.props} />
24
+ </div>
25
+ <div class="sl-flex print:hidden">
26
+ {shouldRenderSearch && <Search {...Astro.props} />}
27
+ </div>
28
+ <div class="sl-hidden md:sl-flex print:hidden right-group">
29
+ <nav class="sl-flex nav-links">
30
+ <a href={`${import.meta.env.BASE_URL}downloads/`}>Downloads</a>
31
+ </nav>
32
+ <div class="sl-flex social-icons">
33
+ <SocialIcons {...Astro.props} />
34
+ </div>
35
+ <ThemeSelect {...Astro.props} />
36
+ <LanguageSelect {...Astro.props} />
37
+ </div>
38
+ </div>
39
+
40
+ <style>
41
+ .header {
42
+ gap: var(--sl-nav-gap);
43
+ justify-content: space-between;
44
+ align-items: center;
45
+ height: 100%;
46
+ }
47
+
48
+ .title-wrapper {
49
+ /* Prevent long titles overflowing and covering the search and menu buttons on narrow viewports. */
50
+ overflow: clip;
51
+ /* Avoid clipping focus ring around link inside title wrapper. */
52
+ padding: 0.25rem;
53
+ margin: -0.25rem;
54
+ min-width: 0;
55
+ }
56
+
57
+ .right-group,
58
+ .social-icons,
59
+ .nav-links {
60
+ gap: 1rem;
61
+ align-items: center;
62
+ }
63
+
64
+ .nav-links a {
65
+ color: var(--sl-color-white);
66
+ text-decoration: none;
67
+ font-size: 0.875rem;
68
+ font-weight: 500;
69
+ padding: 0.25rem 0.5rem;
70
+ border-radius: 4px;
71
+ transition: color 0.15s ease, background-color 0.15s ease;
72
+ }
73
+
74
+ .nav-links a:hover {
75
+ color: var(--sl-color-accent);
76
+ background-color: rgba(140, 140, 255, 0.1);
77
+ }
78
+
79
+ .nav-links::after {
80
+ content: '';
81
+ height: 2rem;
82
+ border-inline-end: 1px solid var(--sl-color-gray-5);
83
+ }
84
+
85
+ .social-icons::after {
86
+ content: '';
87
+ height: 2rem;
88
+ border-inline-end: 1px solid var(--sl-color-gray-5);
89
+ }
90
+
91
+ @media (min-width: 50rem) {
92
+ :global(:root[data-has-sidebar]) {
93
+ --__sidebar-pad: calc(2 * var(--sl-nav-pad-x));
94
+ }
95
+ :global(:root:not([data-has-toc])) {
96
+ --__toc-width: 0rem;
97
+ }
98
+ .header {
99
+ --__sidebar-width: max(0rem, var(--sl-content-inline-start, 0rem) - var(--sl-nav-pad-x));
100
+ --__main-column-fr: calc(
101
+ (
102
+ 100% + var(--__sidebar-pad, 0rem) - var(--__toc-width, var(--sl-sidebar-width)) -
103
+ (2 * var(--__toc-width, var(--sl-nav-pad-x))) - var(--sl-content-inline-start, 0rem) -
104
+ var(--sl-content-width)
105
+ ) / 2
106
+ );
107
+ display: grid;
108
+ grid-template-columns:
109
+ /* 1 (site title): runs up until the main content column’s left edge or the width of the title, whichever is the largest */
110
+ minmax(
111
+ calc(var(--__sidebar-width) + max(0rem, var(--__main-column-fr) - var(--sl-nav-gap))),
112
+ auto
113
+ )
114
+ /* 2 (search box): all free space that is available. */
115
+ 1fr
116
+ /* 3 (right items): use the space that these need. */
117
+ auto;
118
+ align-content: center;
119
+ }
120
+ }
121
+ </style>
@@ -0,0 +1,53 @@
1
+ ---
2
+ import LanguageSelect from 'virtual:starlight/components/LanguageSelect';
3
+ import SocialIcons from 'virtual:starlight/components/SocialIcons';
4
+ import ThemeSelect from 'virtual:starlight/components/ThemeSelect';
5
+ import type { Props } from '@astrojs/starlight/props';
6
+ ---
7
+
8
+ <div class="mobile-preferences sl-flex">
9
+ <div class="sl-flex social-icons">
10
+ <SocialIcons {...Astro.props} />
11
+ </div>
12
+ <nav class="sl-flex nav-links">
13
+ <a href={`${import.meta.env.BASE_URL}downloads/`}>Downloads</a>
14
+ </nav>
15
+ <ThemeSelect {...Astro.props} />
16
+ <LanguageSelect {...Astro.props} />
17
+ </div>
18
+
19
+ <style>
20
+ .social-icons {
21
+ gap: 1rem;
22
+ align-items: center;
23
+ padding-block: 1rem;
24
+ }
25
+ .social-icons:empty {
26
+ display: none;
27
+ }
28
+ .mobile-preferences {
29
+ justify-content: space-between;
30
+ flex-wrap: wrap;
31
+ border-top: 1px solid var(--sl-color-gray-6);
32
+ column-gap: 1rem;
33
+ padding: 0.5rem 0;
34
+ align-items: center;
35
+ }
36
+ .nav-links {
37
+ gap: 1rem;
38
+ align-items: center;
39
+ }
40
+ .nav-links a {
41
+ color: var(--sl-color-white);
42
+ text-decoration: none;
43
+ font-size: 0.875rem;
44
+ font-weight: 500;
45
+ padding: 0.5rem 0.75rem;
46
+ border-radius: 4px;
47
+ transition: color 0.15s ease, background-color 0.15s ease;
48
+ }
49
+ .nav-links a:hover {
50
+ color: var(--sl-color-accent);
51
+ background-color: rgba(140, 140, 255, 0.1);
52
+ }
53
+ </style>
@@ -0,0 +1,6 @@
1
+ import { defineCollection } from 'astro:content';
2
+ import { docsSchema } from '@astrojs/starlight/schema';
3
+
4
+ export const collections = {
5
+ docs: defineCollection({ schema: docsSchema() }),
6
+ };
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Resolve the site's base URL using cascading environment defaults.
3
+ *
4
+ * Preference order: use SITE_URL if set; otherwise derive a GitHub Pages URL from GITHUB_REPOSITORY; otherwise use the local development URL.
5
+ * @returns {string} The resolved site URL (SITE_URL override, or `https://{owner}.github.io/{repo}`, or `http://localhost:3000`).
6
+ */
7
+ export function getSiteUrl() {
8
+ // Explicit override (works in both local and GitHub Actions)
9
+ if (process.env.SITE_URL) {
10
+ return process.env.SITE_URL;
11
+ }
12
+
13
+ // GitHub Actions: compute from repository context
14
+ if (process.env.GITHUB_REPOSITORY) {
15
+ const parts = process.env.GITHUB_REPOSITORY.split('/');
16
+ if (parts.length !== 2 || !parts[0] || !parts[1]) {
17
+ throw new Error(`Invalid GITHUB_REPOSITORY format: "${process.env.GITHUB_REPOSITORY}". Expected "owner/repo".`);
18
+ }
19
+ const [owner, repo] = parts;
20
+ return `https://${owner}.github.io/${repo}`;
21
+ }
22
+
23
+ // Local development: use dev server
24
+ return 'http://localhost:3000';
25
+ }
@@ -0,0 +1,11 @@
1
+ ---
2
+ import StarlightPage from '@astrojs/starlight/components/StarlightPage.astro';
3
+ import { getEntry } from 'astro:content';
4
+
5
+ const entry = await getEntry('docs', '404');
6
+ const { Content } = await entry.render();
7
+ ---
8
+
9
+ <StarlightPage frontmatter={{ title: entry.data.title, template: entry.data.template }}>
10
+ <Content />
11
+ </StarlightPage>
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Rehype plugin to prepend base path to absolute URLs
3
+ *
4
+ * Transforms:
5
+ * /img/foo.png → /BMAD-METHOD/img/foo.png (when base is /BMAD-METHOD/)
6
+ * /downloads/file.zip → /BMAD-METHOD/downloads/file.zip
7
+ * /llms.txt → /BMAD-METHOD/llms.txt
8
+ *
9
+ * Only affects absolute paths (/) - relative paths and external URLs are unchanged.
10
+ * Does NOT process .md links (those are handled by rehype-markdown-links).
11
+ */
12
+
13
+ import { visit } from 'unist-util-visit';
14
+
15
+ /**
16
+ * Create a rehype plugin that prepends the base path to absolute URLs.
17
+ *
18
+ * @param {Object} options - Plugin options
19
+ * @param {string} options.base - The base path to prepend (e.g., '/BMAD-METHOD/')
20
+ * @returns {function} A HAST tree transformer
21
+ */
22
+ export default function rehypeBasePaths(options = {}) {
23
+ const base = options.base || '/';
24
+
25
+ // Normalize base: ensure it ends with / and doesn't have double slashes
26
+ const normalizedBase = base === '/' ? '/' : base.endsWith('/') ? base : base + '/';
27
+
28
+ return (tree) => {
29
+ visit(tree, 'element', (node) => {
30
+ // Process img tags with src attribute
31
+ if (node.tagName === 'img' && node.properties?.src) {
32
+ const src = node.properties.src;
33
+
34
+ if (typeof src === 'string' && src.startsWith('/') && !src.startsWith('//')) {
35
+ // Don't transform if already has the base path
36
+ if (normalizedBase !== '/' && !src.startsWith(normalizedBase)) {
37
+ node.properties.src = normalizedBase + src.slice(1);
38
+ }
39
+ }
40
+ }
41
+
42
+ // Process iframe tags with src attribute
43
+ if (node.tagName === 'iframe' && node.properties?.src) {
44
+ const src = node.properties.src;
45
+
46
+ if (typeof src === 'string' && src.startsWith('/') && !src.startsWith('//')) {
47
+ // Don't transform if already has the base path
48
+ if (normalizedBase !== '/' && !src.startsWith(normalizedBase)) {
49
+ node.properties.src = normalizedBase + src.slice(1);
50
+ }
51
+ }
52
+ }
53
+
54
+ // Process anchor tags with href attribute
55
+ if (node.tagName === 'a' && node.properties?.href) {
56
+ const href = node.properties.href;
57
+
58
+ if (typeof href !== 'string') {
59
+ return;
60
+ }
61
+
62
+ // Only transform absolute paths starting with / (but not //)
63
+ if (!href.startsWith('/') || href.startsWith('//')) {
64
+ return;
65
+ }
66
+
67
+ // Skip if already has the base path
68
+ if (normalizedBase !== '/' && href.startsWith(normalizedBase)) {
69
+ return;
70
+ }
71
+
72
+ // Skip .md links - those are handled by rehype-markdown-links
73
+ // Extract path portion (before ? and #)
74
+ const firstDelimiter = Math.min(
75
+ href.indexOf('?') === -1 ? Infinity : href.indexOf('?'),
76
+ href.indexOf('#') === -1 ? Infinity : href.indexOf('#'),
77
+ );
78
+ const pathPortion = firstDelimiter === Infinity ? href : href.substring(0, firstDelimiter);
79
+
80
+ if (pathPortion.endsWith('.md')) {
81
+ return; // Let rehype-markdown-links handle this
82
+ }
83
+
84
+ // Prepend base path
85
+ node.properties.href = normalizedBase + href.slice(1);
86
+ }
87
+ });
88
+ };
89
+ }
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Rehype plugin to transform markdown file links (.md) to page routes
3
+ *
4
+ * Transforms:
5
+ * ./path/to/file.md → ./path/to/file/
6
+ * ./path/index.md → ./path/ (index.md becomes directory root)
7
+ * ../path/file.md#anchor → ../path/file/#anchor
8
+ * ./file.md?query=param → ./file/?query=param
9
+ * /docs/absolute/path/file.md → {base}/absolute/path/file/
10
+ *
11
+ * For absolute paths starting with /docs/, the /docs prefix is stripped
12
+ * since the Astro site serves content from the docs directory as the root.
13
+ * The base path is prepended to absolute paths for subdirectory deployments.
14
+ *
15
+ * Affects relative links (./, ../) and absolute paths (/) - external links are unchanged
16
+ */
17
+
18
+ import { visit } from 'unist-util-visit';
19
+
20
+ /**
21
+ * Convert Markdown file links (.md) into equivalent page route-style links.
22
+ *
23
+ * The returned transformer walks the HTML tree and rewrites anchor `href` values that are relative paths (./, ../) or absolute paths (/) pointing to `.md` files. It preserves query strings and hash anchors, rewrites `.../index.md` to the directory root path (`.../`), and rewrites other `.md` file paths by removing the `.md` extension and ensuring a trailing slash. External links (http://, https://) and non-.md links are left unchanged.
24
+ *
25
+ * @param {Object} options - Plugin options
26
+ * @param {string} options.base - The base path to prepend to absolute URLs (e.g., '/BMAD-METHOD/')
27
+ * @returns {function} A HAST tree transformer that mutates `a` element `href` properties as described.
28
+ */
29
+ export default function rehypeMarkdownLinks(options = {}) {
30
+ const base = options.base || '/';
31
+ // Normalize base: ensure it ends with / and doesn't have double slashes
32
+ const normalizedBase = base === '/' ? '' : base.endsWith('/') ? base.slice(0, -1) : base;
33
+
34
+ return (tree) => {
35
+ visit(tree, 'element', (node) => {
36
+ // Only process anchor tags with href
37
+ if (node.tagName !== 'a' || !node.properties?.href) {
38
+ return;
39
+ }
40
+
41
+ const href = node.properties.href;
42
+
43
+ // Skip if not a string (shouldn't happen, but be safe)
44
+ if (typeof href !== 'string') {
45
+ return;
46
+ }
47
+
48
+ // Skip external links (http://, https://, mailto:, etc.)
49
+ if (href.includes('://') || href.startsWith('mailto:') || href.startsWith('tel:')) {
50
+ return;
51
+ }
52
+
53
+ // Only transform paths starting with ./, ../, or / (absolute)
54
+ if (!href.startsWith('./') && !href.startsWith('../') && !href.startsWith('/')) {
55
+ return;
56
+ }
57
+
58
+ // Extract path portion (before ? and #) to check if it's a .md file
59
+ const firstDelimiter = Math.min(
60
+ href.indexOf('?') === -1 ? Infinity : href.indexOf('?'),
61
+ href.indexOf('#') === -1 ? Infinity : href.indexOf('#'),
62
+ );
63
+ const pathPortion = firstDelimiter === Infinity ? href : href.substring(0, firstDelimiter);
64
+
65
+ // Don't transform if path doesn't end with .md
66
+ if (!pathPortion.endsWith('.md')) {
67
+ return;
68
+ }
69
+
70
+ // Split the URL into parts: path, anchor, and query
71
+ let urlPath = pathPortion;
72
+ let anchor = '';
73
+ let query = '';
74
+
75
+ // Extract query string and anchor from original href
76
+ if (firstDelimiter !== Infinity) {
77
+ const suffix = href.substring(firstDelimiter);
78
+ const anchorInSuffix = suffix.indexOf('#');
79
+ if (suffix.startsWith('?')) {
80
+ if (anchorInSuffix !== -1) {
81
+ query = suffix.substring(0, anchorInSuffix);
82
+ anchor = suffix.substring(anchorInSuffix);
83
+ } else {
84
+ query = suffix;
85
+ }
86
+ } else {
87
+ // starts with #
88
+ anchor = suffix;
89
+ }
90
+ }
91
+
92
+ // Track if this was an absolute path (for base path prepending)
93
+ const isAbsolute = urlPath.startsWith('/');
94
+
95
+ // Strip /docs/ prefix from absolute paths (repo-relative → site-relative)
96
+ if (urlPath.startsWith('/docs/')) {
97
+ urlPath = urlPath.slice(5); // Remove '/docs' prefix, keeping the leading /
98
+ }
99
+
100
+ // Transform .md to /
101
+ // Special case: index.md → directory root (e.g., ./tutorials/index.md → ./tutorials/)
102
+ if (urlPath.endsWith('/index.md')) {
103
+ urlPath = urlPath.replace(/\/index\.md$/, '/');
104
+ } else {
105
+ urlPath = urlPath.replace(/\.md$/, '/');
106
+ }
107
+
108
+ // Prepend base path to absolute URLs for subdirectory deployments
109
+ if (isAbsolute && normalizedBase) {
110
+ urlPath = normalizedBase + urlPath;
111
+ }
112
+
113
+ // Reconstruct the href
114
+ node.properties.href = urlPath + query + anchor;
115
+ });
116
+ };
117
+ }