ma-agents 3.12.3 → 3.13.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.
Files changed (257) hide show
  1. package/bin/cli.js +67 -13
  2. package/docs/architecture.md +18 -0
  3. package/lib/bmad-cache/bmb/.claude-plugin/marketplace.json +1 -1
  4. package/lib/bmad-cache/bmb/_git_preserved/hooks/commit-msg.sample +52 -2
  5. package/lib/bmad-cache/bmb/_git_preserved/hooks/fsmonitor-watchman.sample +2 -8
  6. package/lib/bmad-cache/bmb/_git_preserved/index +0 -0
  7. package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-8f8b045fef5af6911495cf3b2a89f1ed75e120f7.idx +0 -0
  8. package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-8f8b045fef5af6911495cf3b2a89f1ed75e120f7.pack +0 -0
  9. package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-8f8b045fef5af6911495cf3b2a89f1ed75e120f7.rev +0 -0
  10. package/lib/bmad-cache/bmb/_git_preserved/packed-refs +1 -1
  11. package/lib/bmad-cache/bmb/_git_preserved/refs/heads/main +1 -1
  12. package/lib/bmad-cache/bmb/_git_preserved/shallow +1 -1
  13. package/lib/bmad-cache/bmb/package-lock.json +2 -2
  14. package/lib/bmad-cache/bmb/package.json +1 -1
  15. package/lib/bmad-cache/bmb/samples/bmad-agent-dream-weaver/assets/module-help.csv +1 -1
  16. package/lib/bmad-cache/bmb/samples/bmad-agent-dream-weaver/scripts/merge-config.py +33 -0
  17. package/lib/bmad-cache/bmb/samples/bmad-agent-dream-weaver/scripts/merge-help-csv.py +28 -0
  18. package/lib/bmad-cache/bmb/samples/sample-module-setup/assets/module-help.csv +1 -1
  19. package/lib/bmad-cache/bmb/samples/sample-module-setup/scripts/cleanup-legacy.py +28 -0
  20. package/lib/bmad-cache/bmb/samples/sample-module-setup/scripts/merge-config.py +33 -0
  21. package/lib/bmad-cache/bmb/samples/sample-module-setup/scripts/merge-help-csv.py +28 -0
  22. package/lib/bmad-cache/bmb/skills/bmad-bmb-setup/assets/module-help.csv +1 -1
  23. package/lib/bmad-cache/bmb/skills/bmad-bmb-setup/scripts/cleanup-legacy.py +28 -0
  24. package/lib/bmad-cache/bmb/skills/bmad-bmb-setup/scripts/merge-config.py +33 -0
  25. package/lib/bmad-cache/bmb/skills/bmad-bmb-setup/scripts/merge-help-csv.py +28 -0
  26. package/lib/bmad-cache/bmb/skills/bmad-eval-runner/assets/Dockerfile +29 -0
  27. package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/docker_setup.py +115 -0
  28. package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/generate_report.py +184 -0
  29. package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/pty_runner.py +171 -0
  30. package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/run_evals.py +492 -0
  31. package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/run_triggers.py +366 -0
  32. package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/utils.py +260 -0
  33. package/lib/bmad-cache/bmb/skills/bmad-module-builder/assets/setup-skill-template/assets/module-help.csv +1 -1
  34. package/lib/bmad-cache/bmb/skills/bmad-module-builder/assets/setup-skill-template/scripts/cleanup-legacy.py +28 -0
  35. package/lib/bmad-cache/bmb/skills/bmad-module-builder/assets/setup-skill-template/scripts/merge-config.py +33 -0
  36. package/lib/bmad-cache/bmb/skills/bmad-module-builder/assets/setup-skill-template/scripts/merge-help-csv.py +28 -0
  37. package/lib/bmad-cache/bmb/skills/bmad-module-builder/assets/standalone-module-template/merge-config.py +33 -0
  38. package/lib/bmad-cache/bmb/skills/bmad-module-builder/assets/standalone-module-template/merge-help-csv.py +28 -0
  39. package/lib/bmad-cache/bmb/skills/bmad-module-builder/scripts/tests/test-validate-module.py +74 -1
  40. package/lib/bmad-cache/bmb/skills/bmad-module-builder/scripts/validate-module.py +24 -13
  41. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/assets/sample-customize-product-brief.toml +48 -33
  42. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/extract-report-json.py +287 -0
  43. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/generate-html-report.py +57 -8
  44. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/prepass-prompt-metrics.py +7 -7
  45. package/lib/bmad-cache/bmb/skills/module-help.csv +1 -1
  46. package/lib/bmad-cache/bmb/website/public/img/eval-test-types.png +0 -0
  47. package/lib/bmad-cache/cache-manifest.json +17 -18
  48. package/lib/bmad-cache/cis/_git_preserved/hooks/commit-msg.sample +52 -2
  49. package/lib/bmad-cache/cis/_git_preserved/hooks/fsmonitor-watchman.sample +2 -8
  50. package/lib/bmad-cache/cis/_git_preserved/index +0 -0
  51. package/lib/bmad-cache/cis/_git_preserved/objects/pack/pack-18c8290560a98bcb7bf0676e6cc9b2ac5ca2823e.idx +0 -0
  52. package/lib/bmad-cache/cis/_git_preserved/objects/pack/{pack-42ffc048f54e58ce94c6331bc6be97ebbb7936f2.pack → pack-18c8290560a98bcb7bf0676e6cc9b2ac5ca2823e.pack} +0 -0
  53. package/lib/bmad-cache/cis/_git_preserved/objects/pack/pack-18c8290560a98bcb7bf0676e6cc9b2ac5ca2823e.rev +0 -0
  54. package/lib/bmad-cache/cis/_git_preserved/packed-refs +1 -1
  55. package/lib/bmad-cache/cis/_git_preserved/refs/heads/main +1 -1
  56. package/lib/bmad-cache/cis/_git_preserved/refs/tags/v0.2.1 +1 -0
  57. package/lib/bmad-cache/cis/_git_preserved/shallow +1 -1
  58. package/lib/bmad-cache/cis/package-lock.json +2 -2
  59. package/lib/bmad-cache/cis/package.json +1 -1
  60. package/lib/bmad-cache/cis/src/module-help.csv +1 -1
  61. package/lib/bmad-cache/gds/.claude-plugin/marketplace.json +4 -7
  62. package/lib/bmad-cache/gds/README.md +3 -1
  63. package/lib/bmad-cache/gds/_git_preserved/hooks/commit-msg.sample +52 -2
  64. package/lib/bmad-cache/gds/_git_preserved/hooks/fsmonitor-watchman.sample +2 -8
  65. package/lib/bmad-cache/gds/_git_preserved/index +0 -0
  66. package/lib/bmad-cache/gds/_git_preserved/objects/pack/pack-dcb7c556d9bb6b6b70d2301e094eaac6d7300552.idx +0 -0
  67. package/lib/bmad-cache/gds/_git_preserved/objects/pack/{pack-9427a146a90c00bb542cba038874bf9671ba4dc0.pack → pack-dcb7c556d9bb6b6b70d2301e094eaac6d7300552.pack} +0 -0
  68. package/lib/bmad-cache/gds/_git_preserved/objects/pack/pack-dcb7c556d9bb6b6b70d2301e094eaac6d7300552.rev +0 -0
  69. package/lib/bmad-cache/gds/_git_preserved/packed-refs +1 -1
  70. package/lib/bmad-cache/gds/_git_preserved/refs/heads/main +1 -1
  71. package/lib/bmad-cache/gds/_git_preserved/shallow +1 -1
  72. package/lib/bmad-cache/gds/package.json +1 -1
  73. package/lib/bmad-cache/gds/src/agents/gds-agent-game-designer/customize.toml +5 -5
  74. package/lib/bmad-cache/gds/src/agents/gds-agent-game-dev/customize.toml +5 -5
  75. package/lib/bmad-cache/gds/src/agents/gds-agent-game-solo-dev/customize.toml +0 -5
  76. package/lib/bmad-cache/gds/src/module-help.csv +6 -12
  77. package/lib/bmad-cache/gds/src/module.yaml +1 -1
  78. package/lib/bmad-cache/gds/src/workflows/1-preproduction/gds-create-game-brief/customize.toml +97 -22
  79. package/lib/bmad-cache/gds/src/workflows/2-design/gds-gdd/assets/validation-report-template.html +190 -0
  80. package/lib/bmad-cache/gds/src/workflows/2-design/gds-gdd/customize.toml +99 -0
  81. package/lib/bmad-cache/gds/src/workflows/2-design/gds-gdd/scripts/render-validation-html.py +290 -0
  82. package/lib/bmad-cache/gds/src/workflows/2-design/gds-prd/assets/validation-report-template.html +190 -0
  83. package/lib/bmad-cache/gds/src/workflows/2-design/gds-prd/customize.toml +84 -0
  84. package/lib/bmad-cache/gds/src/workflows/2-design/gds-ux/assets/validation-report-template.html +319 -0
  85. package/lib/bmad-cache/gds/src/workflows/2-design/gds-ux/customize.toml +101 -0
  86. package/lib/bmad-cache/gds/src/workflows/3-technical/gds-game-architecture/architecture-patterns.yaml +1 -0
  87. package/lib/bmad-cache/gds/src/workflows/3-technical/gds-game-architecture/decision-catalog.yaml +88 -0
  88. package/lib/bmad-cache/gds/src/workflows/3-technical/gds-game-architecture/engine-mcps.yaml +124 -2
  89. package/lib/bmad-cache/gds/src/workflows/4-production/gds-investigate/customize.toml +62 -0
  90. package/lib/bmad-cache/tea/.claude-plugin/marketplace.json +1 -1
  91. package/lib/bmad-cache/tea/.github/workflows/docs.yaml +3 -3
  92. package/lib/bmad-cache/tea/.github/workflows/quality.yaml +10 -10
  93. package/lib/bmad-cache/tea/AGENTS.md +31 -0
  94. package/lib/bmad-cache/tea/CHANGELOG.md +42 -1
  95. package/lib/bmad-cache/tea/README.md +8 -5
  96. package/lib/bmad-cache/tea/_git_preserved/hooks/commit-msg.sample +52 -2
  97. package/lib/bmad-cache/tea/_git_preserved/hooks/fsmonitor-watchman.sample +2 -8
  98. package/lib/bmad-cache/tea/_git_preserved/index +0 -0
  99. package/lib/bmad-cache/tea/_git_preserved/objects/pack/pack-9e4197e37df7763dd7a05c2965ee921dfd2eb617.idx +0 -0
  100. package/lib/bmad-cache/tea/_git_preserved/objects/pack/{pack-f0df537f2649464ff6c5aee241165eb9c8664227.pack → pack-9e4197e37df7763dd7a05c2965ee921dfd2eb617.pack} +0 -0
  101. package/lib/bmad-cache/tea/_git_preserved/objects/pack/pack-9e4197e37df7763dd7a05c2965ee921dfd2eb617.rev +0 -0
  102. package/lib/bmad-cache/tea/_git_preserved/packed-refs +1 -1
  103. package/lib/bmad-cache/tea/_git_preserved/refs/heads/main +1 -1
  104. package/lib/bmad-cache/tea/_git_preserved/refs/tags/v1.19.0 +1 -0
  105. package/lib/bmad-cache/tea/_git_preserved/shallow +1 -1
  106. package/lib/bmad-cache/tea/docs/explanation/engagement-models.md +15 -16
  107. package/lib/bmad-cache/tea/docs/explanation/knowledge-base-system.md +2 -0
  108. package/lib/bmad-cache/tea/docs/explanation/risk-based-testing.md +1 -1
  109. package/lib/bmad-cache/tea/docs/explanation/tea-overview.md +88 -52
  110. package/lib/bmad-cache/tea/docs/explanation/testing-as-engineering.md +13 -12
  111. package/lib/bmad-cache/tea/docs/glossary/index.md +2 -2
  112. package/lib/bmad-cache/tea/docs/how-to/brownfield/use-tea-for-enterprise.md +19 -18
  113. package/lib/bmad-cache/tea/docs/how-to/brownfield/use-tea-with-existing-tests.md +1 -1
  114. package/lib/bmad-cache/tea/docs/how-to/workflows/run-nfr-assess.md +32 -26
  115. package/lib/bmad-cache/tea/docs/how-to/workflows/run-test-design.md +20 -14
  116. package/lib/bmad-cache/tea/docs/how-to/workflows/run-trace.md +3 -3
  117. package/lib/bmad-cache/tea/docs/index.md +13 -11
  118. package/lib/bmad-cache/tea/docs/reference/commands.md +37 -13
  119. package/lib/bmad-cache/tea/docs/reference/knowledge-base.md +2 -2
  120. package/lib/bmad-cache/tea/package-lock.json +2 -2
  121. package/lib/bmad-cache/tea/package.json +1 -1
  122. package/lib/bmad-cache/tea/src/agents/bmad-tea/customize.toml +20 -15
  123. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/confidence-gate.md +73 -0
  124. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/test-quality.md +1 -0
  125. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/tea-index.csv +2 -1
  126. package/lib/bmad-cache/tea/src/module-help.csv +2 -2
  127. package/lib/bmad-cache/tea/src/workflows/testarch/README.md +5 -4
  128. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/data/role-paths.yaml +1 -1
  129. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/data/tea-resources-index.yaml +1 -1
  130. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/steps-c/step-04-session-01.md +2 -2
  131. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/steps-c/step-04-session-07.md +1 -1
  132. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/templates/certificate-template.md +1 -1
  133. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/tea-index.csv +1 -1
  134. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/tea-index.csv +1 -1
  135. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/tea-index.csv +1 -1
  136. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/tea-index.csv +1 -1
  137. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/SKILL.md +3 -3
  138. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/checklist.md +11 -11
  139. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/instructions.md +4 -2
  140. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/nfr-report-template.md +5 -5
  141. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/tea-index.csv +1 -1
  142. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-01-load-context.md +1 -1
  143. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-01b-resume.md +1 -1
  144. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-02-define-thresholds.md +14 -3
  145. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-04-evaluate-and-score.md +7 -7
  146. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-04a-subagent-security.md +4 -4
  147. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-04b-subagent-performance.md +4 -4
  148. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-04c-subagent-reliability.md +4 -4
  149. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-04d-subagent-scalability.md +4 -4
  150. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-04e-aggregate-nfr.md +4 -4
  151. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-05-generate-report.md +1 -1
  152. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/workflow-plan.md +1 -1
  153. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/workflow.yaml +3 -3
  154. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/checklist.md +23 -3
  155. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/tea-index.csv +1 -1
  156. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/steps-c/step-02-load-context.md +7 -0
  157. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/steps-c/step-03-risk-and-testability.md +16 -2
  158. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/steps-c/step-04-coverage-plan.md +20 -4
  159. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/steps-c/step-05-generate-output.md +2 -0
  160. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/test-design-architecture-template.md +17 -0
  161. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/test-design-qa-template.md +15 -0
  162. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/test-design-template.md +16 -0
  163. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/tea-index.csv +1 -1
  164. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/checklist.md +1 -1
  165. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/tea-index.csv +1 -1
  166. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/trace-template.md +1 -1
  167. package/lib/bmad-cache/tea/test/test-installation-components.js +49 -0
  168. package/lib/bmad-cache/tea/website/astro.config.mjs +2 -2
  169. package/lib/bmad-cache/wds/README.md +1 -1
  170. package/lib/bmad-cache/wds/_git_preserved/hooks/commit-msg.sample +52 -2
  171. package/lib/bmad-cache/wds/_git_preserved/hooks/fsmonitor-watchman.sample +2 -8
  172. package/lib/bmad-cache/wds/_git_preserved/index +0 -0
  173. package/lib/bmad-cache/wds/_git_preserved/objects/pack/pack-656c3d8d5426e73043b6a7f45eedaab74e3c419e.idx +0 -0
  174. package/lib/bmad-cache/wds/_git_preserved/objects/pack/{pack-96877c1c09123cccb1f91c1412184b11d2b492ad.pack → pack-656c3d8d5426e73043b6a7f45eedaab74e3c419e.pack} +0 -0
  175. package/lib/bmad-cache/wds/_git_preserved/objects/pack/pack-656c3d8d5426e73043b6a7f45eedaab74e3c419e.rev +0 -0
  176. package/lib/bmad-cache/wds/_git_preserved/packed-refs +1 -1
  177. package/lib/bmad-cache/wds/_git_preserved/refs/heads/main +1 -1
  178. package/lib/bmad-cache/wds/_git_preserved/refs/tags/v0.4.3 +1 -0
  179. package/lib/bmad-cache/wds/_git_preserved/shallow +1 -1
  180. package/lib/bmad-cache/wds/eslint.config.mjs +1 -1
  181. package/lib/bmad-cache/wds/package.json +1 -1
  182. package/lib/bmad-cache/wds/src/agents/wds-agent-freya-ux/customize.toml +80 -0
  183. package/lib/bmad-cache/wds/src/agents/wds-agent-mimir-builder/customize.toml +52 -0
  184. package/lib/bmad-cache/wds/src/agents/wds-agent-saga-analyst/customize.toml +70 -0
  185. package/lib/bmad-cache/wds/src/module-help.csv +19 -19
  186. package/lib/bmad-cache/wds/src/module.yaml +28 -0
  187. package/lib/bmad-cache/wds/src/scripts/README.md +155 -0
  188. package/lib/bmad-cache/wds/src/scripts/wds-add-object.js +202 -0
  189. package/lib/bmad-cache/wds/src/scripts/wds-add-spacing.js +158 -0
  190. package/lib/bmad-cache/wds/src/scripts/wds-init-page.js +229 -0
  191. package/lib/bmad-cache/wds/src/scripts/wds-init-scenario.js +120 -0
  192. package/lib/bmad-cache/wds/src/scripts/wds-nav.js +201 -0
  193. package/lib/bmad-cache/wds/src/scripts/wds-validate.js +301 -0
  194. package/lib/bmad-cache/wds/src/workflows/wds-3-scenarios/workflow.xml +450 -0
  195. package/lib/bmad-cache/wds/src/workflows/wds-4-ux-design/workflow-specify.xml +387 -0
  196. package/lib/bmad-extension/.claude-plugin/marketplace.json.template +1 -1
  197. package/lib/bmad-extension-plugin/.claude-plugin/marketplace.json +2 -2
  198. package/lib/bmad.js +361 -18
  199. package/lib/installer.js +296 -26
  200. package/lib/mil498-templates/OCD.md +169 -169
  201. package/lib/mil498-templates/README.md +4 -4
  202. package/lib/mil498-templates/SDD.md +163 -163
  203. package/lib/mil498-templates/SDP.md +307 -307
  204. package/lib/mil498-templates/SRS.md +219 -219
  205. package/lib/mil498-templates/SSDD.md +154 -154
  206. package/lib/mil498-templates/SSS.md +225 -225
  207. package/lib/mil498-templates/STD.md +188 -188
  208. package/lib/profile.js +96 -5
  209. package/lib/templates/instruction-block-git.template.md +25 -0
  210. package/lib/templates/instruction-block-onprem.template.md +86 -86
  211. package/lib/templates/instruction-block-universal.template.md +29 -29
  212. package/package.json +5 -4
  213. package/scripts/build-bmad-cache.js +143 -42
  214. package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-6ecd9fc6445b1281449c5ec49a6c5794708e662e.idx +0 -0
  215. package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-6ecd9fc6445b1281449c5ec49a6c5794708e662e.pack +0 -0
  216. package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-6ecd9fc6445b1281449c5ec49a6c5794708e662e.rev +0 -0
  217. package/lib/bmad-cache/bmb/_git_preserved/refs/remotes/origin/HEAD +0 -1
  218. package/lib/bmad-cache/bmb/_git_preserved/refs/tags/v1.7.0 +0 -1
  219. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/generate-convert-report.py +0 -406
  220. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/tests/test_generate_convert_report.py +0 -243
  221. package/lib/bmad-cache/cis/_git_preserved/objects/pack/pack-42ffc048f54e58ce94c6331bc6be97ebbb7936f2.idx +0 -0
  222. package/lib/bmad-cache/cis/_git_preserved/objects/pack/pack-42ffc048f54e58ce94c6331bc6be97ebbb7936f2.rev +0 -0
  223. package/lib/bmad-cache/cis/_git_preserved/refs/remotes/origin/HEAD +0 -1
  224. package/lib/bmad-cache/gds/_git_preserved/objects/pack/pack-9427a146a90c00bb542cba038874bf9671ba4dc0.idx +0 -0
  225. package/lib/bmad-cache/gds/_git_preserved/objects/pack/pack-9427a146a90c00bb542cba038874bf9671ba4dc0.rev +0 -0
  226. package/lib/bmad-cache/gds/_git_preserved/refs/remotes/origin/HEAD +0 -1
  227. package/lib/bmad-cache/gds/src/workflows/2-design/gds-create-gdd/customize.toml +0 -41
  228. package/lib/bmad-cache/gds/src/workflows/2-design/gds-create-prd/customize.toml +0 -41
  229. package/lib/bmad-cache/gds/src/workflows/2-design/gds-create-prd/data/domain-complexity.csv +0 -15
  230. package/lib/bmad-cache/gds/src/workflows/2-design/gds-create-prd/data/project-types.csv +0 -11
  231. package/lib/bmad-cache/gds/src/workflows/2-design/gds-create-ux-design/customize.toml +0 -41
  232. package/lib/bmad-cache/gds/src/workflows/2-design/gds-edit-gdd/customize.toml +0 -41
  233. package/lib/bmad-cache/gds/src/workflows/2-design/gds-edit-prd/customize.toml +0 -41
  234. package/lib/bmad-cache/gds/src/workflows/2-design/gds-validate-gdd/customize.toml +0 -41
  235. package/lib/bmad-cache/gds/src/workflows/2-design/gds-validate-prd/customize.toml +0 -41
  236. package/lib/bmad-cache/gds/src/workflows/2-design/gds-validate-prd/data/domain-complexity.csv +0 -15
  237. package/lib/bmad-cache/gds/src/workflows/2-design/gds-validate-prd/data/project-types.csv +0 -11
  238. package/lib/bmad-cache/tea/_git_preserved/objects/pack/pack-f0df537f2649464ff6c5aee241165eb9c8664227.idx +0 -0
  239. package/lib/bmad-cache/tea/_git_preserved/objects/pack/pack-f0df537f2649464ff6c5aee241165eb9c8664227.rev +0 -0
  240. package/lib/bmad-cache/tea/_git_preserved/refs/remotes/origin/HEAD +0 -1
  241. package/lib/bmad-cache/wds/_git_preserved/objects/pack/pack-96877c1c09123cccb1f91c1412184b11d2b492ad.idx +0 -0
  242. package/lib/bmad-cache/wds/_git_preserved/objects/pack/pack-96877c1c09123cccb1f91c1412184b11d2b492ad.rev +0 -0
  243. package/lib/bmad-cache/wds/_git_preserved/refs/remotes/origin/HEAD +0 -1
  244. package/lib/bmad-cache/wds/src/agents/wds-agent-freya-ux/bmad-skill-manifest.yaml +0 -12
  245. package/lib/bmad-cache/wds/src/agents/wds-agent-saga-analyst/bmad-skill-manifest.yaml +0 -12
  246. package/lib/bmad-cache/wds/src/workflows/wds-0-alignment-signoff/bmad-skill-manifest.yaml +0 -1
  247. package/lib/bmad-cache/wds/src/workflows/wds-0-project-setup/bmad-skill-manifest.yaml +0 -1
  248. package/lib/bmad-cache/wds/src/workflows/wds-1-project-brief/bmad-skill-manifest.yaml +0 -1
  249. package/lib/bmad-cache/wds/src/workflows/wds-2-trigger-mapping/bmad-skill-manifest.yaml +0 -1
  250. package/lib/bmad-cache/wds/src/workflows/wds-3-scenarios/bmad-skill-manifest.yaml +0 -1
  251. package/lib/bmad-cache/wds/src/workflows/wds-4-ux-design/bmad-skill-manifest.yaml +0 -1
  252. package/lib/bmad-cache/wds/src/workflows/wds-5-agentic-development/bmad-skill-manifest.yaml +0 -1
  253. package/lib/bmad-cache/wds/src/workflows/wds-6-asset-generation/bmad-skill-manifest.yaml +0 -1
  254. package/lib/bmad-cache/wds/src/workflows/wds-7-design-system/bmad-skill-manifest.yaml +0 -1
  255. package/lib/bmad-cache/wds/src/workflows/wds-8-product-evolution/bmad-skill-manifest.yaml +0 -1
  256. /package/lib/bmad-cache/gds/src/workflows/2-design/{gds-create-gdd → gds-gdd/assets}/game-types.csv +0 -0
  257. /package/lib/bmad-cache/gds/src/workflows/2-design/{gds-validate-gdd/data → gds-gdd/assets}/genre-complexity.csv +0 -0
@@ -0,0 +1,229 @@
1
+ // wds-init-page.js — WDS scaffold: initialize new page spec
2
+ // Usage: node src/scripts/wds-init-page.js --page "01 Start" --scenario "01 Onboarding"
3
+
4
+ 'use strict';
5
+
6
+ const fs = require('node:fs');
7
+ const path = require('node:path');
8
+
9
+ function parseArgs(argv) {
10
+ const args = {};
11
+ for (let i = 0; i < argv.length; i++) {
12
+ if (argv[i].startsWith('--')) {
13
+ const key = argv[i].slice(2);
14
+ const value = argv[i + 1] && !argv[i + 1].startsWith('--') ? argv[i + 1] : true;
15
+ args[key] = value;
16
+ if (value !== true) i++;
17
+ }
18
+ }
19
+ return args;
20
+ }
21
+
22
+ function toSlug(str) {
23
+ return str.toLowerCase().replaceAll(/\s+/g, '-');
24
+ }
25
+
26
+ function printUsage() {
27
+ process.stdout.write(
28
+ [
29
+ 'Usage: node src/scripts/wds-init-page.js --page "01 Start" --scenario "01 Onboarding" [options]',
30
+ '',
31
+ 'Required:',
32
+ ' --page Page name with number, e.g. "01 Start"',
33
+ ' --scenario Scenario name, e.g. "01 New User Onboarding"',
34
+ '',
35
+ 'Optional:',
36
+ ' --platform Platform value (default: "Mobile web")',
37
+ ' --visibility Visibility value (default: "Public")',
38
+ ' --output Base path to write to (default: current directory)',
39
+ '',
40
+ ].join('\n'),
41
+ );
42
+ }
43
+
44
+ function buildTemplate({ pageSlug, pageName, scenarioSlug, scenarioName, platform, visibility }) {
45
+ const sketchFile = `sketches/${pageSlug}-concept.jpg`;
46
+
47
+ const navEmpty = `← [Previous]() | [Next →]()`;
48
+
49
+ const metaTable = [
50
+ '| Property | Value |',
51
+ '|----------|-------|',
52
+ `| Scenario | ${scenarioName} |`,
53
+ `| Page Number | ${pageName.split(' ')[0]} |`,
54
+ `| Platform | ${platform} |`,
55
+ `| Page Type | — |`,
56
+ `| Viewport | — |`,
57
+ `| Interaction | — |`,
58
+ `| Visibility | ${visibility} |`,
59
+ ].join('\n');
60
+
61
+ const overviewSection = [
62
+ '| Property | Value |',
63
+ '|----------|-------|',
64
+ '| Purpose | — |',
65
+ '| User Situation | — |',
66
+ '| Success Criteria | — |',
67
+ '| Entry Points | — |',
68
+ '| Exit Points | — |',
69
+ ].join('\n');
70
+
71
+ const spacingTable = [
72
+ '| Token | Direction | Type | Size | Reason |',
73
+ '|-------|-----------|------|------|--------|',
74
+ `| \`${pageSlug}-v-space-md\` | Vertical | space | md | — |`,
75
+ ].join('\n');
76
+
77
+ const typographyTable = [
78
+ '| Element | Semantic | Size | Weight | Typeface |',
79
+ '|---------|----------|------|--------|----------|',
80
+ '| Page title | H1 | — | — | — |',
81
+ ].join('\n');
82
+
83
+ const statesTable = [
84
+ '| State | When | Appearance | Actions |',
85
+ '|-------|------|------------|---------|',
86
+ '| Default | On load | — | — |',
87
+ ].join('\n');
88
+
89
+ return [
90
+ navEmpty,
91
+ '',
92
+ `![${pageName}](${sketchFile})`,
93
+ '',
94
+ navEmpty,
95
+ '',
96
+ '---',
97
+ '',
98
+ `# ${pageName}`,
99
+ '',
100
+ '## Page Metadata',
101
+ '',
102
+ metaTable,
103
+ '',
104
+ '---',
105
+ '',
106
+ '## Overview',
107
+ '',
108
+ overviewSection,
109
+ '',
110
+ '---',
111
+ '',
112
+ '## Reference Materials',
113
+ '',
114
+ '- —',
115
+ '',
116
+ '---',
117
+ '',
118
+ '## Layout Structure',
119
+ '',
120
+ '```',
121
+ '+---------------------------+',
122
+ '| Header |',
123
+ '+---------------------------+',
124
+ '| |',
125
+ '| Content |',
126
+ '| |',
127
+ '+---------------------------+',
128
+ '| Footer |',
129
+ '+---------------------------+',
130
+ '```',
131
+ '',
132
+ '---',
133
+ '',
134
+ '## Spacing',
135
+ '',
136
+ spacingTable,
137
+ '',
138
+ '---',
139
+ '',
140
+ '## Typography',
141
+ '',
142
+ typographyTable,
143
+ '',
144
+ '---',
145
+ '',
146
+ '## Page Sections',
147
+ '',
148
+ `### Section: Main`,
149
+ '',
150
+ `<!-- Objects go here. Use wds-add-object.js to append. -->`,
151
+ '',
152
+ '---',
153
+ '',
154
+ '## Page States',
155
+ '',
156
+ statesTable,
157
+ '',
158
+ '---',
159
+ '',
160
+ '## Open Questions',
161
+ '',
162
+ '- —',
163
+ '',
164
+ '---',
165
+ '',
166
+ '## Checklist',
167
+ '',
168
+ '- [ ] Navigation links updated',
169
+ '- [ ] Sketch added',
170
+ '- [ ] All objects have SE + EN content',
171
+ '- [ ] All Object IDs use correct prefix',
172
+ '- [ ] Page States defined',
173
+ '- [ ] Spacing tokens defined',
174
+ '',
175
+ navEmpty,
176
+ '',
177
+ ].join('\n');
178
+ }
179
+
180
+ function main() {
181
+ const args = parseArgs(process.argv.slice(2));
182
+
183
+ if (args.help) {
184
+ printUsage();
185
+ process.exit(0);
186
+ }
187
+
188
+ if (!args.page || !args.scenario) {
189
+ process.stderr.write('Error: --page and --scenario are required.\n\n');
190
+ printUsage();
191
+ process.exit(1);
192
+ }
193
+
194
+ const pageName = args.page;
195
+ const scenarioName = args.scenario;
196
+ const platform = args.platform || 'Mobile web';
197
+ const visibility = args.visibility || 'Public';
198
+ const outputBase = args.output || process.cwd();
199
+
200
+ const pageSlug = toSlug(pageName);
201
+ const scenarioSlug = toSlug(scenarioName);
202
+
203
+ const pageDir = path.join(outputBase, 'C-UX-Scenarios', scenarioSlug, pageSlug);
204
+ const sketchesDir = path.join(pageDir, 'sketches');
205
+ const pageFile = path.join(pageDir, `${pageSlug}.md`);
206
+
207
+ try {
208
+ fs.mkdirSync(pageDir, { recursive: true });
209
+ fs.mkdirSync(sketchesDir, { recursive: true });
210
+ } catch (error) {
211
+ process.stderr.write(`Error creating directories: ${error.message}\n`);
212
+ process.exit(1);
213
+ }
214
+
215
+ const content = buildTemplate({ pageSlug, pageName, scenarioSlug, scenarioName, platform, visibility });
216
+
217
+ try {
218
+ fs.writeFileSync(pageFile, content, 'utf8');
219
+ } catch (error) {
220
+ process.stderr.write(`Error writing file: ${error.message}\n`);
221
+ process.exit(1);
222
+ }
223
+
224
+ process.stdout.write(`✓ Created ${pageSlug}.md\n`);
225
+ process.stdout.write(` Path: ${pageFile}\n`);
226
+ process.stdout.write(` Run wds-nav.js to update navigation links.\n`);
227
+ }
228
+
229
+ main();
@@ -0,0 +1,120 @@
1
+ // wds-init-scenario.js — WDS scaffold: initialize new scenario folder
2
+ // Usage: node src/scripts/wds-init-scenario.js --scenario "01 Onboarding" --description "New user first visit to account creation"
3
+
4
+ 'use strict';
5
+
6
+ const fs = require('node:fs');
7
+ const path = require('node:path');
8
+
9
+ function parseArgs(argv) {
10
+ const args = {};
11
+ for (let i = 0; i < argv.length; i++) {
12
+ if (argv[i].startsWith('--')) {
13
+ const key = argv[i].slice(2);
14
+ const value = argv[i + 1] && !argv[i + 1].startsWith('--') ? argv[i + 1] : true;
15
+ args[key] = value;
16
+ if (value !== true) i++;
17
+ }
18
+ }
19
+ return args;
20
+ }
21
+
22
+ function toSlug(str) {
23
+ return str.toLowerCase().replaceAll(/\s+/g, '-');
24
+ }
25
+
26
+ function printUsage() {
27
+ process.stdout.write(
28
+ [
29
+ 'Usage: node src/scripts/wds-init-scenario.js --scenario "01 Onboarding" [options]',
30
+ '',
31
+ 'Required:',
32
+ ' --scenario Scenario name with number, e.g. "01 New User Onboarding"',
33
+ '',
34
+ 'Optional:',
35
+ ' --description Short description of the scenario',
36
+ ' --output Base path to write to (default: current directory)',
37
+ '',
38
+ ].join('\n'),
39
+ );
40
+ }
41
+
42
+ function buildReadme({ scenarioName, scenarioSlug, description }) {
43
+ const scenarioNumber = scenarioName.split(' ')[0];
44
+ const desc = description || '—';
45
+
46
+ return [
47
+ `# Scenario ${scenarioNumber}: ${scenarioName}`,
48
+ '',
49
+ `**Description:** ${desc}`,
50
+ '',
51
+ '**Trigger Map:** [Link to trigger map]()',
52
+ '',
53
+ '---',
54
+ '',
55
+ '## Pages',
56
+ '',
57
+ '| # | Page | File | Status |',
58
+ '|---|------|------|--------|',
59
+ '| — | (no pages yet) | — | — |',
60
+ '',
61
+ '---',
62
+ '',
63
+ '## Notes',
64
+ '',
65
+ '- Add pages with: `node src/scripts/wds-init-page.js --scenario "' + scenarioName + '" --page "01 Start"`',
66
+ '- Update navigation after adding pages: `node src/scripts/wds-nav.js --scenario "' + scenarioName + '"`',
67
+ '- Validate pages: `node src/scripts/wds-validate.js --scenario "' + scenarioName + '"`',
68
+ '',
69
+ ].join('\n');
70
+ }
71
+
72
+ function main() {
73
+ const args = parseArgs(process.argv.slice(2));
74
+
75
+ if (args.help) {
76
+ printUsage();
77
+ process.exit(0);
78
+ }
79
+
80
+ if (!args.scenario) {
81
+ process.stderr.write('Error: --scenario is required.\n\n');
82
+ printUsage();
83
+ process.exit(1);
84
+ }
85
+
86
+ const scenarioName = args.scenario;
87
+ const description = args.description || '';
88
+ const outputBase = args.output || process.cwd();
89
+
90
+ const scenarioSlug = toSlug(scenarioName);
91
+ const scenarioDir = path.join(outputBase, 'C-UX-Scenarios', scenarioSlug);
92
+ const readmeFile = path.join(scenarioDir, 'README.md');
93
+
94
+ if (fs.existsSync(scenarioDir)) {
95
+ process.stderr.write(`Error: Scenario folder already exists: ${scenarioDir}\n`);
96
+ process.exit(1);
97
+ }
98
+
99
+ try {
100
+ fs.mkdirSync(scenarioDir, { recursive: true });
101
+ } catch (error) {
102
+ process.stderr.write(`Error creating directory: ${error.message}\n`);
103
+ process.exit(1);
104
+ }
105
+
106
+ const content = buildReadme({ scenarioName, scenarioSlug, description });
107
+
108
+ try {
109
+ fs.writeFileSync(readmeFile, content, 'utf8');
110
+ } catch (error) {
111
+ process.stderr.write(`Error writing README: ${error.message}\n`);
112
+ process.exit(1);
113
+ }
114
+
115
+ process.stdout.write(`✓ Created scenario ${scenarioSlug}/\n`);
116
+ process.stdout.write(` Path: ${scenarioDir}\n`);
117
+ process.stdout.write(` README: ${readmeFile}\n`);
118
+ }
119
+
120
+ main();
@@ -0,0 +1,201 @@
1
+ // wds-nav.js — WDS scaffold: generate/update navigation links across all pages in a scenario
2
+ // Usage: node src/scripts/wds-nav.js --scenario "01 Onboarding"
3
+ // node src/scripts/wds-nav.js --all
4
+
5
+ 'use strict';
6
+
7
+ const fs = require('node:fs');
8
+ const path = require('node:path');
9
+
10
+ function parseArgs(argv) {
11
+ const args = {};
12
+ for (let i = 0; i < argv.length; i++) {
13
+ if (argv[i].startsWith('--')) {
14
+ const key = argv[i].slice(2);
15
+ const value = argv[i + 1] && !argv[i + 1].startsWith('--') ? argv[i + 1] : true;
16
+ args[key] = value;
17
+ if (value !== true) i++;
18
+ }
19
+ }
20
+ return args;
21
+ }
22
+
23
+ function toSlug(str) {
24
+ return str.toLowerCase().replaceAll(/\s+/g, '-');
25
+ }
26
+
27
+ function printUsage() {
28
+ process.stdout.write(
29
+ [
30
+ 'Usage: node src/scripts/wds-nav.js --scenario "01 Onboarding"',
31
+ ' node src/scripts/wds-nav.js --all',
32
+ '',
33
+ 'Options:',
34
+ ' --scenario Scenario name or slug to update',
35
+ ' --all Update all scenarios',
36
+ ' --output Base path (default: current directory)',
37
+ '',
38
+ ].join('\n'),
39
+ );
40
+ }
41
+
42
+ // Build a human-readable page name from the slug for nav labels
43
+ // e.g. "01-start" -> "01 Start"
44
+ function slugToLabel(slug) {
45
+ return slug
46
+ .split('-')
47
+ .map((part, i) => (i === 0 ? part : part.charAt(0).toUpperCase() + part.slice(1)))
48
+ .join(' ');
49
+ }
50
+
51
+ function buildNavRow(prev, next) {
52
+ const leftPart = prev ? `← [${slugToLabel(prev.slug)}](../${prev.slug}/${prev.slug}.md)` : '←';
53
+ const rightPart = next ? `[${slugToLabel(next.slug)} →](../${next.slug}/${next.slug}.md)` : '→';
54
+ return `${leftPart} | ${rightPart}`;
55
+ }
56
+
57
+ // Replace all 3 occurrences of navigation rows in a page file.
58
+ // Nav rows are lines matching the pattern: starts with '←' or contains '| [' and ends with '→'
59
+ // We identify them by a simple pattern: line that starts with "←" (after trim).
60
+ function updateNavInContent(content, navRow) {
61
+ const lines = content.split('\n');
62
+ const result = [];
63
+ let navCount = 0;
64
+
65
+ for (const line of lines) {
66
+ const trimmed = line.trim();
67
+ // Match navigation rows: lines that start with "←" (our nav format)
68
+ if (trimmed.startsWith('←')) {
69
+ result.push(navRow);
70
+ navCount++;
71
+ } else {
72
+ result.push(line);
73
+ }
74
+ }
75
+
76
+ return { content: result.join('\n'), navCount };
77
+ }
78
+
79
+ function getPageFolders(scenarioDir) {
80
+ let entries;
81
+ try {
82
+ entries = fs.readdirSync(scenarioDir, { withFileTypes: true });
83
+ } catch {
84
+ return [];
85
+ }
86
+
87
+ return entries
88
+ .filter((e) => e.isDirectory())
89
+ .map((e) => e.name)
90
+ .filter((name) => {
91
+ // Must have a matching .md file inside
92
+ const mdFile = path.join(scenarioDir, name, `${name}.md`);
93
+ return fs.existsSync(mdFile);
94
+ })
95
+ .sort(); // Sort alphabetically — page numbers ensure correct order
96
+ }
97
+
98
+ function processScenario(scenariosBase, scenarioSlug) {
99
+ const scenarioDir = path.join(scenariosBase, scenarioSlug);
100
+
101
+ if (!fs.existsSync(scenarioDir)) {
102
+ process.stderr.write(`Error: Scenario not found: ${scenarioDir}\n`);
103
+ return false;
104
+ }
105
+
106
+ const pageSlugs = getPageFolders(scenarioDir);
107
+
108
+ if (pageSlugs.length === 0) {
109
+ process.stdout.write(` ${scenarioSlug}: no pages found, skipping.\n`);
110
+ return true;
111
+ }
112
+
113
+ let updated = 0;
114
+
115
+ for (let i = 0; i < pageSlugs.length; i++) {
116
+ const slug = pageSlugs[i];
117
+ const prev = i > 0 ? { slug: pageSlugs[i - 1] } : null;
118
+ const next = i < pageSlugs.length - 1 ? { slug: pageSlugs[i + 1] } : null;
119
+ const navRow = buildNavRow(prev, next);
120
+
121
+ const mdFile = path.join(scenarioDir, slug, `${slug}.md`);
122
+ let content;
123
+ try {
124
+ content = fs.readFileSync(mdFile, 'utf8');
125
+ } catch (error) {
126
+ process.stderr.write(` Error reading ${mdFile}: ${error.message}\n`);
127
+ continue;
128
+ }
129
+
130
+ const { content: newContent, navCount } = updateNavInContent(content, navRow);
131
+
132
+ if (navCount === 0) {
133
+ process.stderr.write(` Warning: No navigation rows found in ${slug}.md\n`);
134
+ }
135
+
136
+ try {
137
+ fs.writeFileSync(mdFile, newContent, 'utf8');
138
+ updated++;
139
+ } catch (error) {
140
+ process.stderr.write(` Error writing ${mdFile}: ${error.message}\n`);
141
+ }
142
+ }
143
+
144
+ process.stdout.write(`✓ Updated navigation for ${updated} pages in ${scenarioSlug}\n`);
145
+ return true;
146
+ }
147
+
148
+ function main() {
149
+ const args = parseArgs(process.argv.slice(2));
150
+
151
+ if (args.help) {
152
+ printUsage();
153
+ process.exit(0);
154
+ }
155
+
156
+ if (!args.scenario && !args.all) {
157
+ process.stderr.write('Error: --scenario or --all is required.\n\n');
158
+ printUsage();
159
+ process.exit(1);
160
+ }
161
+
162
+ const outputBase = args.output || process.cwd();
163
+ const scenariosBase = path.join(outputBase, 'C-UX-Scenarios');
164
+
165
+ if (!fs.existsSync(scenariosBase)) {
166
+ process.stderr.write(`Error: C-UX-Scenarios directory not found at: ${scenariosBase}\n`);
167
+ process.exit(1);
168
+ }
169
+
170
+ if (args.all) {
171
+ let entries;
172
+ try {
173
+ entries = fs.readdirSync(scenariosBase, { withFileTypes: true });
174
+ } catch (error) {
175
+ process.stderr.write(`Error reading C-UX-Scenarios: ${error.message}\n`);
176
+ process.exit(1);
177
+ }
178
+
179
+ const scenarios = entries
180
+ .filter((e) => e.isDirectory())
181
+ .map((e) => e.name)
182
+ .sort();
183
+
184
+ if (scenarios.length === 0) {
185
+ process.stdout.write('No scenarios found.\n');
186
+ process.exit(0);
187
+ }
188
+
189
+ let allOk = true;
190
+ for (const slug of scenarios) {
191
+ if (!processScenario(scenariosBase, slug)) allOk = false;
192
+ }
193
+ process.exit(allOk ? 0 : 1);
194
+ } else {
195
+ const scenarioSlug = toSlug(args.scenario);
196
+ const ok = processScenario(scenariosBase, scenarioSlug);
197
+ process.exit(ok ? 0 : 1);
198
+ }
199
+ }
200
+
201
+ main();