frappe-builder 1.1.0-dev.8

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 (423) hide show
  1. package/.fb/state.db +0 -0
  2. package/AGENTS.md +167 -0
  3. package/README.md +89 -0
  4. package/_bmad/_config/agent-manifest.csv +10 -0
  5. package/_bmad/_config/agents/bmm-analyst.customize.yaml +41 -0
  6. package/_bmad/_config/agents/bmm-architect.customize.yaml +41 -0
  7. package/_bmad/_config/agents/bmm-dev.customize.yaml +41 -0
  8. package/_bmad/_config/agents/bmm-pm.customize.yaml +41 -0
  9. package/_bmad/_config/agents/bmm-qa.customize.yaml +41 -0
  10. package/_bmad/_config/agents/bmm-quick-flow-solo-dev.customize.yaml +41 -0
  11. package/_bmad/_config/agents/bmm-sm.customize.yaml +41 -0
  12. package/_bmad/_config/agents/bmm-tech-writer.customize.yaml +41 -0
  13. package/_bmad/_config/agents/bmm-ux-designer.customize.yaml +41 -0
  14. package/_bmad/_config/bmad-help.csv +47 -0
  15. package/_bmad/_config/files-manifest.csv +369 -0
  16. package/_bmad/_config/ides/claude-code.yaml +5 -0
  17. package/_bmad/_config/manifest.yaml +28 -0
  18. package/_bmad/_config/skill-manifest.csv +41 -0
  19. package/_bmad/_config/task-manifest.csv +1 -0
  20. package/_bmad/_config/tool-manifest.csv +1 -0
  21. package/_bmad/_config/workflow-manifest.csv +1 -0
  22. package/_bmad/_memory/config.yaml +11 -0
  23. package/_bmad/_memory/tech-writer-sidecar/documentation-standards.md +224 -0
  24. package/_bmad/bmm/agents/analyst.md +69 -0
  25. package/_bmad/bmm/agents/architect.md +59 -0
  26. package/_bmad/bmm/agents/bmad-skill-manifest.yaml +39 -0
  27. package/_bmad/bmm/agents/dev.md +66 -0
  28. package/_bmad/bmm/agents/pm.md +63 -0
  29. package/_bmad/bmm/agents/qa.md +89 -0
  30. package/_bmad/bmm/agents/quick-flow-solo-dev.md +61 -0
  31. package/_bmad/bmm/agents/sm.md +67 -0
  32. package/_bmad/bmm/agents/tech-writer/bmad-skill-manifest.yaml +3 -0
  33. package/_bmad/bmm/agents/tech-writer/tech-writer.md +67 -0
  34. package/_bmad/bmm/agents/ux-designer.md +58 -0
  35. package/_bmad/bmm/config.yaml +16 -0
  36. package/_bmad/bmm/data/project-context-template.md +26 -0
  37. package/_bmad/bmm/module-help.csv +32 -0
  38. package/_bmad/bmm/teams/default-party.csv +20 -0
  39. package/_bmad/bmm/teams/team-fullstack.yaml +12 -0
  40. package/_bmad/bmm/workflows/1-analysis/bmad-create-product-brief/SKILL.md +6 -0
  41. package/_bmad/bmm/workflows/1-analysis/bmad-create-product-brief/bmad-skill-manifest.yaml +1 -0
  42. package/_bmad/bmm/workflows/1-analysis/bmad-create-product-brief/product-brief.template.md +10 -0
  43. package/_bmad/bmm/workflows/1-analysis/bmad-create-product-brief/steps/step-01-init.md +170 -0
  44. package/_bmad/bmm/workflows/1-analysis/bmad-create-product-brief/steps/step-01b-continue.md +158 -0
  45. package/_bmad/bmm/workflows/1-analysis/bmad-create-product-brief/steps/step-02-vision.md +193 -0
  46. package/_bmad/bmm/workflows/1-analysis/bmad-create-product-brief/steps/step-03-users.md +196 -0
  47. package/_bmad/bmm/workflows/1-analysis/bmad-create-product-brief/steps/step-04-metrics.md +199 -0
  48. package/_bmad/bmm/workflows/1-analysis/bmad-create-product-brief/steps/step-05-scope.md +213 -0
  49. package/_bmad/bmm/workflows/1-analysis/bmad-create-product-brief/steps/step-06-complete.md +159 -0
  50. package/_bmad/bmm/workflows/1-analysis/bmad-create-product-brief/workflow.md +55 -0
  51. package/_bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/SKILL.md +88 -0
  52. package/_bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/agents/artifact-analyzer.md +60 -0
  53. package/_bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/agents/opportunity-reviewer.md +44 -0
  54. package/_bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/agents/skeptic-reviewer.md +44 -0
  55. package/_bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/agents/web-researcher.md +49 -0
  56. package/_bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/bmad-manifest.json +17 -0
  57. package/_bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/bmad-skill-manifest.yaml +1 -0
  58. package/_bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/prompts/contextual-discovery.md +57 -0
  59. package/_bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/prompts/draft-and-review.md +86 -0
  60. package/_bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/prompts/finalize.md +75 -0
  61. package/_bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/prompts/guided-elicitation.md +70 -0
  62. package/_bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/resources/brief-template.md +60 -0
  63. package/_bmad/bmm/workflows/1-analysis/research/bmad-domain-research/SKILL.md +6 -0
  64. package/_bmad/bmm/workflows/1-analysis/research/bmad-domain-research/bmad-skill-manifest.yaml +1 -0
  65. package/_bmad/bmm/workflows/1-analysis/research/bmad-domain-research/domain-steps/step-01-init.md +137 -0
  66. package/_bmad/bmm/workflows/1-analysis/research/bmad-domain-research/domain-steps/step-02-domain-analysis.md +229 -0
  67. package/_bmad/bmm/workflows/1-analysis/research/bmad-domain-research/domain-steps/step-03-competitive-landscape.md +238 -0
  68. package/_bmad/bmm/workflows/1-analysis/research/bmad-domain-research/domain-steps/step-04-regulatory-focus.md +206 -0
  69. package/_bmad/bmm/workflows/1-analysis/research/bmad-domain-research/domain-steps/step-05-technical-trends.md +234 -0
  70. package/_bmad/bmm/workflows/1-analysis/research/bmad-domain-research/domain-steps/step-06-research-synthesis.md +444 -0
  71. package/_bmad/bmm/workflows/1-analysis/research/bmad-domain-research/research.template.md +29 -0
  72. package/_bmad/bmm/workflows/1-analysis/research/bmad-domain-research/workflow.md +49 -0
  73. package/_bmad/bmm/workflows/1-analysis/research/bmad-market-research/SKILL.md +6 -0
  74. package/_bmad/bmm/workflows/1-analysis/research/bmad-market-research/bmad-skill-manifest.yaml +1 -0
  75. package/_bmad/bmm/workflows/1-analysis/research/bmad-market-research/research.template.md +29 -0
  76. package/_bmad/bmm/workflows/1-analysis/research/bmad-market-research/steps/step-01-init.md +184 -0
  77. package/_bmad/bmm/workflows/1-analysis/research/bmad-market-research/steps/step-02-customer-behavior.md +239 -0
  78. package/_bmad/bmm/workflows/1-analysis/research/bmad-market-research/steps/step-03-customer-pain-points.md +251 -0
  79. package/_bmad/bmm/workflows/1-analysis/research/bmad-market-research/steps/step-04-customer-decisions.md +261 -0
  80. package/_bmad/bmm/workflows/1-analysis/research/bmad-market-research/steps/step-05-competitive-analysis.md +173 -0
  81. package/_bmad/bmm/workflows/1-analysis/research/bmad-market-research/steps/step-06-research-completion.md +478 -0
  82. package/_bmad/bmm/workflows/1-analysis/research/bmad-market-research/workflow.md +49 -0
  83. package/_bmad/bmm/workflows/1-analysis/research/bmad-technical-research/SKILL.md +6 -0
  84. package/_bmad/bmm/workflows/1-analysis/research/bmad-technical-research/bmad-skill-manifest.yaml +1 -0
  85. package/_bmad/bmm/workflows/1-analysis/research/bmad-technical-research/research.template.md +29 -0
  86. package/_bmad/bmm/workflows/1-analysis/research/bmad-technical-research/technical-steps/step-01-init.md +137 -0
  87. package/_bmad/bmm/workflows/1-analysis/research/bmad-technical-research/technical-steps/step-02-technical-overview.md +239 -0
  88. package/_bmad/bmm/workflows/1-analysis/research/bmad-technical-research/technical-steps/step-03-integration-patterns.md +248 -0
  89. package/_bmad/bmm/workflows/1-analysis/research/bmad-technical-research/technical-steps/step-04-architectural-patterns.md +202 -0
  90. package/_bmad/bmm/workflows/1-analysis/research/bmad-technical-research/technical-steps/step-05-implementation-research.md +233 -0
  91. package/_bmad/bmm/workflows/1-analysis/research/bmad-technical-research/technical-steps/step-06-research-synthesis.md +487 -0
  92. package/_bmad/bmm/workflows/1-analysis/research/bmad-technical-research/workflow.md +50 -0
  93. package/_bmad/bmm/workflows/1-analysis/research/market-steps/step-01-init.md +182 -0
  94. package/_bmad/bmm/workflows/1-analysis/research/market-steps/step-02-customer-behavior.md +237 -0
  95. package/_bmad/bmm/workflows/1-analysis/research/market-steps/step-03-customer-pain-points.md +249 -0
  96. package/_bmad/bmm/workflows/1-analysis/research/market-steps/step-04-customer-decisions.md +259 -0
  97. package/_bmad/bmm/workflows/1-analysis/research/market-steps/step-05-competitive-analysis.md +177 -0
  98. package/_bmad/bmm/workflows/1-analysis/research/market-steps/step-06-research-completion.md +476 -0
  99. package/_bmad/bmm/workflows/1-analysis/research/research.template.md +29 -0
  100. package/_bmad/bmm/workflows/2-plan-workflows/bmad-create-ux-design/SKILL.md +6 -0
  101. package/_bmad/bmm/workflows/2-plan-workflows/bmad-create-ux-design/bmad-skill-manifest.yaml +1 -0
  102. package/_bmad/bmm/workflows/2-plan-workflows/bmad-create-ux-design/steps/step-01-init.md +135 -0
  103. package/_bmad/bmm/workflows/2-plan-workflows/bmad-create-ux-design/steps/step-01b-continue.md +127 -0
  104. package/_bmad/bmm/workflows/2-plan-workflows/bmad-create-ux-design/steps/step-02-discovery.md +190 -0
  105. package/_bmad/bmm/workflows/2-plan-workflows/bmad-create-ux-design/steps/step-03-core-experience.md +217 -0
  106. package/_bmad/bmm/workflows/2-plan-workflows/bmad-create-ux-design/steps/step-04-emotional-response.md +220 -0
  107. package/_bmad/bmm/workflows/2-plan-workflows/bmad-create-ux-design/steps/step-05-inspiration.md +235 -0
  108. package/_bmad/bmm/workflows/2-plan-workflows/bmad-create-ux-design/steps/step-06-design-system.md +253 -0
  109. package/_bmad/bmm/workflows/2-plan-workflows/bmad-create-ux-design/steps/step-07-defining-experience.md +255 -0
  110. package/_bmad/bmm/workflows/2-plan-workflows/bmad-create-ux-design/steps/step-08-visual-foundation.md +225 -0
  111. package/_bmad/bmm/workflows/2-plan-workflows/bmad-create-ux-design/steps/step-09-design-directions.md +225 -0
  112. package/_bmad/bmm/workflows/2-plan-workflows/bmad-create-ux-design/steps/step-10-user-journeys.md +242 -0
  113. package/_bmad/bmm/workflows/2-plan-workflows/bmad-create-ux-design/steps/step-11-component-strategy.md +249 -0
  114. package/_bmad/bmm/workflows/2-plan-workflows/bmad-create-ux-design/steps/step-12-ux-patterns.md +238 -0
  115. package/_bmad/bmm/workflows/2-plan-workflows/bmad-create-ux-design/steps/step-13-responsive-accessibility.md +265 -0
  116. package/_bmad/bmm/workflows/2-plan-workflows/bmad-create-ux-design/steps/step-14-complete.md +171 -0
  117. package/_bmad/bmm/workflows/2-plan-workflows/bmad-create-ux-design/ux-design-template.md +13 -0
  118. package/_bmad/bmm/workflows/2-plan-workflows/bmad-create-ux-design/workflow.md +36 -0
  119. package/_bmad/bmm/workflows/2-plan-workflows/bmad-edit-prd/SKILL.md +6 -0
  120. package/_bmad/bmm/workflows/2-plan-workflows/bmad-edit-prd/bmad-skill-manifest.yaml +1 -0
  121. package/_bmad/bmm/workflows/2-plan-workflows/bmad-edit-prd/steps-e/step-e-01-discovery.md +242 -0
  122. package/_bmad/bmm/workflows/2-plan-workflows/bmad-edit-prd/steps-e/step-e-01b-legacy-conversion.md +204 -0
  123. package/_bmad/bmm/workflows/2-plan-workflows/bmad-edit-prd/steps-e/step-e-02-review.md +245 -0
  124. package/_bmad/bmm/workflows/2-plan-workflows/bmad-edit-prd/steps-e/step-e-03-edit.md +250 -0
  125. package/_bmad/bmm/workflows/2-plan-workflows/bmad-edit-prd/steps-e/step-e-04-complete.md +165 -0
  126. package/_bmad/bmm/workflows/2-plan-workflows/bmad-edit-prd/workflow.md +63 -0
  127. package/_bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/SKILL.md +6 -0
  128. package/_bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/bmad-skill-manifest.yaml +1 -0
  129. package/_bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/data/domain-complexity.csv +15 -0
  130. package/_bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/data/prd-purpose.md +197 -0
  131. package/_bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/data/project-types.csv +11 -0
  132. package/_bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-01-discovery.md +221 -0
  133. package/_bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-02-format-detection.md +188 -0
  134. package/_bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-02b-parity-check.md +206 -0
  135. package/_bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-03-density-validation.md +171 -0
  136. package/_bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-04-brief-coverage-validation.md +211 -0
  137. package/_bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-05-measurability-validation.md +225 -0
  138. package/_bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-06-traceability-validation.md +214 -0
  139. package/_bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-07-implementation-leakage-validation.md +202 -0
  140. package/_bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-08-domain-compliance-validation.md +240 -0
  141. package/_bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-09-project-type-validation.md +260 -0
  142. package/_bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-10-smart-validation.md +206 -0
  143. package/_bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-11-holistic-quality-validation.md +261 -0
  144. package/_bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-12-completeness-validation.md +239 -0
  145. package/_bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-13-report-complete.md +229 -0
  146. package/_bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/workflow.md +62 -0
  147. package/_bmad/bmm/workflows/2-plan-workflows/create-prd/data/domain-complexity.csv +15 -0
  148. package/_bmad/bmm/workflows/2-plan-workflows/create-prd/data/prd-purpose.md +197 -0
  149. package/_bmad/bmm/workflows/2-plan-workflows/create-prd/data/project-types.csv +11 -0
  150. package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-01-discovery.md +224 -0
  151. package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-02-format-detection.md +191 -0
  152. package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-02b-parity-check.md +209 -0
  153. package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-03-density-validation.md +174 -0
  154. package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-04-brief-coverage-validation.md +214 -0
  155. package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-05-measurability-validation.md +228 -0
  156. package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-06-traceability-validation.md +217 -0
  157. package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-07-implementation-leakage-validation.md +205 -0
  158. package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-08-domain-compliance-validation.md +243 -0
  159. package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-09-project-type-validation.md +263 -0
  160. package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-10-smart-validation.md +209 -0
  161. package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-11-holistic-quality-validation.md +264 -0
  162. package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-12-completeness-validation.md +242 -0
  163. package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-13-report-complete.md +232 -0
  164. package/_bmad/bmm/workflows/2-plan-workflows/create-prd/workflow-validate-prd.md +65 -0
  165. package/_bmad/bmm/workflows/3-solutioning/bmad-check-implementation-readiness/SKILL.md +6 -0
  166. package/_bmad/bmm/workflows/3-solutioning/bmad-check-implementation-readiness/bmad-skill-manifest.yaml +1 -0
  167. package/_bmad/bmm/workflows/3-solutioning/bmad-check-implementation-readiness/steps/step-01-document-discovery.md +179 -0
  168. package/_bmad/bmm/workflows/3-solutioning/bmad-check-implementation-readiness/steps/step-02-prd-analysis.md +168 -0
  169. package/_bmad/bmm/workflows/3-solutioning/bmad-check-implementation-readiness/steps/step-03-epic-coverage-validation.md +169 -0
  170. package/_bmad/bmm/workflows/3-solutioning/bmad-check-implementation-readiness/steps/step-04-ux-alignment.md +129 -0
  171. package/_bmad/bmm/workflows/3-solutioning/bmad-check-implementation-readiness/steps/step-05-epic-quality-review.md +241 -0
  172. package/_bmad/bmm/workflows/3-solutioning/bmad-check-implementation-readiness/steps/step-06-final-assessment.md +126 -0
  173. package/_bmad/bmm/workflows/3-solutioning/bmad-check-implementation-readiness/templates/readiness-report-template.md +4 -0
  174. package/_bmad/bmm/workflows/3-solutioning/bmad-check-implementation-readiness/workflow.md +49 -0
  175. package/_bmad/bmm/workflows/3-solutioning/bmad-create-architecture/SKILL.md +6 -0
  176. package/_bmad/bmm/workflows/3-solutioning/bmad-create-architecture/architecture-decision-template.md +12 -0
  177. package/_bmad/bmm/workflows/3-solutioning/bmad-create-architecture/bmad-skill-manifest.yaml +1 -0
  178. package/_bmad/bmm/workflows/3-solutioning/bmad-create-architecture/data/domain-complexity.csv +13 -0
  179. package/_bmad/bmm/workflows/3-solutioning/bmad-create-architecture/data/project-types.csv +7 -0
  180. package/_bmad/bmm/workflows/3-solutioning/bmad-create-architecture/steps/step-01-init.md +153 -0
  181. package/_bmad/bmm/workflows/3-solutioning/bmad-create-architecture/steps/step-01b-continue.md +173 -0
  182. package/_bmad/bmm/workflows/3-solutioning/bmad-create-architecture/steps/step-02-context.md +224 -0
  183. package/_bmad/bmm/workflows/3-solutioning/bmad-create-architecture/steps/step-03-starter.md +329 -0
  184. package/_bmad/bmm/workflows/3-solutioning/bmad-create-architecture/steps/step-04-decisions.md +318 -0
  185. package/_bmad/bmm/workflows/3-solutioning/bmad-create-architecture/steps/step-05-patterns.md +359 -0
  186. package/_bmad/bmm/workflows/3-solutioning/bmad-create-architecture/steps/step-06-structure.md +379 -0
  187. package/_bmad/bmm/workflows/3-solutioning/bmad-create-architecture/steps/step-07-validation.md +359 -0
  188. package/_bmad/bmm/workflows/3-solutioning/bmad-create-architecture/steps/step-08-complete.md +76 -0
  189. package/_bmad/bmm/workflows/3-solutioning/bmad-create-architecture/workflow.md +38 -0
  190. package/_bmad/bmm/workflows/3-solutioning/bmad-create-epics-and-stories/SKILL.md +6 -0
  191. package/_bmad/bmm/workflows/3-solutioning/bmad-create-epics-and-stories/bmad-skill-manifest.yaml +1 -0
  192. package/_bmad/bmm/workflows/3-solutioning/bmad-create-epics-and-stories/steps/step-01-validate-prerequisites.md +255 -0
  193. package/_bmad/bmm/workflows/3-solutioning/bmad-create-epics-and-stories/steps/step-02-design-epics.md +212 -0
  194. package/_bmad/bmm/workflows/3-solutioning/bmad-create-epics-and-stories/steps/step-03-create-stories.md +255 -0
  195. package/_bmad/bmm/workflows/3-solutioning/bmad-create-epics-and-stories/steps/step-04-final-validation.md +131 -0
  196. package/_bmad/bmm/workflows/3-solutioning/bmad-create-epics-and-stories/templates/epics-template.md +61 -0
  197. package/_bmad/bmm/workflows/3-solutioning/bmad-create-epics-and-stories/workflow.md +53 -0
  198. package/_bmad/bmm/workflows/4-implementation/bmad-code-review/SKILL.md +6 -0
  199. package/_bmad/bmm/workflows/4-implementation/bmad-code-review/bmad-skill-manifest.yaml +1 -0
  200. package/_bmad/bmm/workflows/4-implementation/bmad-code-review/steps/step-01-gather-context.md +61 -0
  201. package/_bmad/bmm/workflows/4-implementation/bmad-code-review/steps/step-02-review.md +41 -0
  202. package/_bmad/bmm/workflows/4-implementation/bmad-code-review/steps/step-03-triage.md +50 -0
  203. package/_bmad/bmm/workflows/4-implementation/bmad-code-review/steps/step-04-present.md +38 -0
  204. package/_bmad/bmm/workflows/4-implementation/bmad-code-review/workflow.md +54 -0
  205. package/_bmad/bmm/workflows/4-implementation/bmad-correct-course/SKILL.md +6 -0
  206. package/_bmad/bmm/workflows/4-implementation/bmad-correct-course/bmad-skill-manifest.yaml +1 -0
  207. package/_bmad/bmm/workflows/4-implementation/bmad-correct-course/checklist.md +288 -0
  208. package/_bmad/bmm/workflows/4-implementation/bmad-correct-course/workflow.md +267 -0
  209. package/_bmad/bmm/workflows/4-implementation/bmad-create-story/SKILL.md +6 -0
  210. package/_bmad/bmm/workflows/4-implementation/bmad-create-story/bmad-skill-manifest.yaml +1 -0
  211. package/_bmad/bmm/workflows/4-implementation/bmad-create-story/checklist.md +357 -0
  212. package/_bmad/bmm/workflows/4-implementation/bmad-create-story/discover-inputs.md +88 -0
  213. package/_bmad/bmm/workflows/4-implementation/bmad-create-story/template.md +49 -0
  214. package/_bmad/bmm/workflows/4-implementation/bmad-create-story/workflow.md +380 -0
  215. package/_bmad/bmm/workflows/4-implementation/bmad-dev-story/SKILL.md +6 -0
  216. package/_bmad/bmm/workflows/4-implementation/bmad-dev-story/bmad-skill-manifest.yaml +1 -0
  217. package/_bmad/bmm/workflows/4-implementation/bmad-dev-story/checklist.md +80 -0
  218. package/_bmad/bmm/workflows/4-implementation/bmad-dev-story/workflow.md +450 -0
  219. package/_bmad/bmm/workflows/4-implementation/bmad-retrospective/SKILL.md +6 -0
  220. package/_bmad/bmm/workflows/4-implementation/bmad-retrospective/bmad-skill-manifest.yaml +1 -0
  221. package/_bmad/bmm/workflows/4-implementation/bmad-retrospective/workflow.md +1479 -0
  222. package/_bmad/bmm/workflows/4-implementation/bmad-sprint-planning/SKILL.md +6 -0
  223. package/_bmad/bmm/workflows/4-implementation/bmad-sprint-planning/bmad-skill-manifest.yaml +1 -0
  224. package/_bmad/bmm/workflows/4-implementation/bmad-sprint-planning/checklist.md +33 -0
  225. package/_bmad/bmm/workflows/4-implementation/bmad-sprint-planning/sprint-status-template.yaml +56 -0
  226. package/_bmad/bmm/workflows/4-implementation/bmad-sprint-planning/workflow.md +263 -0
  227. package/_bmad/bmm/workflows/4-implementation/bmad-sprint-status/SKILL.md +6 -0
  228. package/_bmad/bmm/workflows/4-implementation/bmad-sprint-status/bmad-skill-manifest.yaml +1 -0
  229. package/_bmad/bmm/workflows/4-implementation/bmad-sprint-status/workflow.md +261 -0
  230. package/_bmad/bmm/workflows/bmad-document-project/SKILL.md +6 -0
  231. package/_bmad/bmm/workflows/bmad-document-project/bmad-skill-manifest.yaml +1 -0
  232. package/_bmad/bmm/workflows/bmad-document-project/checklist.md +245 -0
  233. package/_bmad/bmm/workflows/bmad-document-project/documentation-requirements.csv +12 -0
  234. package/_bmad/bmm/workflows/bmad-document-project/instructions.md +128 -0
  235. package/_bmad/bmm/workflows/bmad-document-project/templates/deep-dive-template.md +345 -0
  236. package/_bmad/bmm/workflows/bmad-document-project/templates/index-template.md +169 -0
  237. package/_bmad/bmm/workflows/bmad-document-project/templates/project-overview-template.md +103 -0
  238. package/_bmad/bmm/workflows/bmad-document-project/templates/project-scan-report-schema.json +160 -0
  239. package/_bmad/bmm/workflows/bmad-document-project/templates/source-tree-template.md +135 -0
  240. package/_bmad/bmm/workflows/bmad-document-project/workflow.md +27 -0
  241. package/_bmad/bmm/workflows/bmad-document-project/workflows/deep-dive-instructions.md +299 -0
  242. package/_bmad/bmm/workflows/bmad-document-project/workflows/deep-dive-workflow.md +34 -0
  243. package/_bmad/bmm/workflows/bmad-document-project/workflows/full-scan-instructions.md +1107 -0
  244. package/_bmad/bmm/workflows/bmad-document-project/workflows/full-scan-workflow.md +34 -0
  245. package/_bmad/bmm/workflows/bmad-generate-project-context/SKILL.md +6 -0
  246. package/_bmad/bmm/workflows/bmad-generate-project-context/bmad-skill-manifest.yaml +1 -0
  247. package/_bmad/bmm/workflows/bmad-generate-project-context/project-context-template.md +21 -0
  248. package/_bmad/bmm/workflows/bmad-generate-project-context/steps/step-01-discover.md +186 -0
  249. package/_bmad/bmm/workflows/bmad-generate-project-context/steps/step-02-generate.md +321 -0
  250. package/_bmad/bmm/workflows/bmad-generate-project-context/steps/step-03-complete.md +278 -0
  251. package/_bmad/bmm/workflows/bmad-generate-project-context/workflow.md +43 -0
  252. package/_bmad/bmm/workflows/bmad-qa-generate-e2e-tests/SKILL.md +6 -0
  253. package/_bmad/bmm/workflows/bmad-qa-generate-e2e-tests/bmad-skill-manifest.yaml +1 -0
  254. package/_bmad/bmm/workflows/bmad-qa-generate-e2e-tests/checklist.md +33 -0
  255. package/_bmad/bmm/workflows/bmad-qa-generate-e2e-tests/workflow.md +136 -0
  256. package/_bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev/SKILL.md +6 -0
  257. package/_bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev/bmad-skill-manifest.yaml +1 -0
  258. package/_bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev/steps/step-01-mode-detection.md +169 -0
  259. package/_bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev/steps/step-02-context-gathering.md +114 -0
  260. package/_bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev/steps/step-03-execute.md +107 -0
  261. package/_bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev/steps/step-04-self-check.md +107 -0
  262. package/_bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev/steps/step-05-adversarial-review.md +94 -0
  263. package/_bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev/steps/step-06-resolve-findings.md +144 -0
  264. package/_bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev/workflow.md +38 -0
  265. package/_bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview/SKILL.md +6 -0
  266. package/_bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview/bmad-skill-manifest.yaml +1 -0
  267. package/_bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview/steps/step-01-clarify-and-route.md +51 -0
  268. package/_bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview/steps/step-02-plan.md +35 -0
  269. package/_bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview/steps/step-03-implement.md +33 -0
  270. package/_bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview/steps/step-04-review.md +50 -0
  271. package/_bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview/steps/step-05-present.md +17 -0
  272. package/_bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview/tech-spec-template.md +90 -0
  273. package/_bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview/workflow.md +79 -0
  274. package/_bmad/bmm/workflows/bmad-quick-flow/bmad-quick-spec/SKILL.md +6 -0
  275. package/_bmad/bmm/workflows/bmad-quick-flow/bmad-quick-spec/bmad-skill-manifest.yaml +1 -0
  276. package/_bmad/bmm/workflows/bmad-quick-flow/bmad-quick-spec/steps/step-01-understand.md +185 -0
  277. package/_bmad/bmm/workflows/bmad-quick-flow/bmad-quick-spec/steps/step-02-investigate.md +140 -0
  278. package/_bmad/bmm/workflows/bmad-quick-flow/bmad-quick-spec/steps/step-03-generate.md +123 -0
  279. package/_bmad/bmm/workflows/bmad-quick-flow/bmad-quick-spec/steps/step-04-review.md +195 -0
  280. package/_bmad/bmm/workflows/bmad-quick-flow/bmad-quick-spec/tech-spec-template.md +74 -0
  281. package/_bmad/bmm/workflows/bmad-quick-flow/bmad-quick-spec/workflow.md +73 -0
  282. package/_bmad/cis/config.yaml +12 -0
  283. package/_bmad/cis/module-help.csv +6 -0
  284. package/_bmad/cis/skills/bmad-cis-agent-brainstorming-coach/SKILL.md +51 -0
  285. package/_bmad/cis/skills/bmad-cis-agent-brainstorming-coach/bmad-skill-manifest.yaml +11 -0
  286. package/_bmad/cis/skills/bmad-cis-agent-creative-problem-solver/SKILL.md +51 -0
  287. package/_bmad/cis/skills/bmad-cis-agent-creative-problem-solver/bmad-skill-manifest.yaml +11 -0
  288. package/_bmad/cis/skills/bmad-cis-agent-design-thinking-coach/SKILL.md +52 -0
  289. package/_bmad/cis/skills/bmad-cis-agent-design-thinking-coach/bmad-skill-manifest.yaml +11 -0
  290. package/_bmad/cis/skills/bmad-cis-agent-innovation-strategist/SKILL.md +51 -0
  291. package/_bmad/cis/skills/bmad-cis-agent-innovation-strategist/bmad-skill-manifest.yaml +11 -0
  292. package/_bmad/cis/skills/bmad-cis-agent-presentation-master/SKILL.md +62 -0
  293. package/_bmad/cis/skills/bmad-cis-agent-presentation-master/bmad-skill-manifest.yaml +11 -0
  294. package/_bmad/cis/skills/bmad-cis-agent-storyteller/SKILL.md +56 -0
  295. package/_bmad/cis/skills/bmad-cis-agent-storyteller/bmad-skill-manifest.yaml +11 -0
  296. package/_bmad/cis/skills/bmad-cis-agent-storyteller/stories-told.md +7 -0
  297. package/_bmad/cis/skills/bmad-cis-agent-storyteller/story-preferences.md +7 -0
  298. package/_bmad/cis/skills/bmad-cis-design-thinking/SKILL.md +6 -0
  299. package/_bmad/cis/skills/bmad-cis-design-thinking/bmad-skill-manifest.yaml +1 -0
  300. package/_bmad/cis/skills/bmad-cis-design-thinking/design-methods.csv +31 -0
  301. package/_bmad/cis/skills/bmad-cis-design-thinking/template.md +111 -0
  302. package/_bmad/cis/skills/bmad-cis-design-thinking/workflow.md +242 -0
  303. package/_bmad/cis/skills/bmad-cis-innovation-strategy/SKILL.md +6 -0
  304. package/_bmad/cis/skills/bmad-cis-innovation-strategy/bmad-skill-manifest.yaml +1 -0
  305. package/_bmad/cis/skills/bmad-cis-innovation-strategy/innovation-frameworks.csv +31 -0
  306. package/_bmad/cis/skills/bmad-cis-innovation-strategy/template.md +189 -0
  307. package/_bmad/cis/skills/bmad-cis-innovation-strategy/workflow.md +315 -0
  308. package/_bmad/cis/skills/bmad-cis-problem-solving/SKILL.md +6 -0
  309. package/_bmad/cis/skills/bmad-cis-problem-solving/bmad-skill-manifest.yaml +1 -0
  310. package/_bmad/cis/skills/bmad-cis-problem-solving/solving-methods.csv +31 -0
  311. package/_bmad/cis/skills/bmad-cis-problem-solving/template.md +165 -0
  312. package/_bmad/cis/skills/bmad-cis-problem-solving/workflow.md +291 -0
  313. package/_bmad/cis/skills/bmad-cis-storytelling/SKILL.md +6 -0
  314. package/_bmad/cis/skills/bmad-cis-storytelling/bmad-skill-manifest.yaml +1 -0
  315. package/_bmad/cis/skills/bmad-cis-storytelling/story-types.csv +26 -0
  316. package/_bmad/cis/skills/bmad-cis-storytelling/template.md +113 -0
  317. package/_bmad/cis/skills/bmad-cis-storytelling/workflow.md +321 -0
  318. package/_bmad/core/config.yaml +9 -0
  319. package/_bmad/core/module-help.csv +11 -0
  320. package/_bmad/core/skills/bmad-advanced-elicitation/SKILL.md +6 -0
  321. package/_bmad/core/skills/bmad-advanced-elicitation/bmad-skill-manifest.yaml +1 -0
  322. package/_bmad/core/skills/bmad-advanced-elicitation/methods.csv +51 -0
  323. package/_bmad/core/skills/bmad-advanced-elicitation/workflow.md +135 -0
  324. package/_bmad/core/skills/bmad-brainstorming/SKILL.md +6 -0
  325. package/_bmad/core/skills/bmad-brainstorming/bmad-skill-manifest.yaml +1 -0
  326. package/_bmad/core/skills/bmad-brainstorming/brain-methods.csv +62 -0
  327. package/_bmad/core/skills/bmad-brainstorming/steps/step-01-session-setup.md +214 -0
  328. package/_bmad/core/skills/bmad-brainstorming/steps/step-01b-continue.md +124 -0
  329. package/_bmad/core/skills/bmad-brainstorming/steps/step-02a-user-selected.md +229 -0
  330. package/_bmad/core/skills/bmad-brainstorming/steps/step-02b-ai-recommended.md +239 -0
  331. package/_bmad/core/skills/bmad-brainstorming/steps/step-02c-random-selection.md +211 -0
  332. package/_bmad/core/skills/bmad-brainstorming/steps/step-02d-progressive-flow.md +266 -0
  333. package/_bmad/core/skills/bmad-brainstorming/steps/step-03-technique-execution.md +401 -0
  334. package/_bmad/core/skills/bmad-brainstorming/steps/step-04-idea-organization.md +305 -0
  335. package/_bmad/core/skills/bmad-brainstorming/template.md +15 -0
  336. package/_bmad/core/skills/bmad-brainstorming/workflow.md +53 -0
  337. package/_bmad/core/skills/bmad-distillator/SKILL.md +178 -0
  338. package/_bmad/core/skills/bmad-distillator/agents/distillate-compressor.md +116 -0
  339. package/_bmad/core/skills/bmad-distillator/agents/round-trip-reconstructor.md +68 -0
  340. package/_bmad/core/skills/bmad-distillator/bmad-skill-manifest.yaml +15 -0
  341. package/_bmad/core/skills/bmad-distillator/resources/compression-rules.md +51 -0
  342. package/_bmad/core/skills/bmad-distillator/resources/distillate-format-reference.md +227 -0
  343. package/_bmad/core/skills/bmad-distillator/resources/splitting-strategy.md +78 -0
  344. package/_bmad/core/skills/bmad-editorial-review-prose/SKILL.md +6 -0
  345. package/_bmad/core/skills/bmad-editorial-review-prose/bmad-skill-manifest.yaml +1 -0
  346. package/_bmad/core/skills/bmad-editorial-review-prose/workflow.md +81 -0
  347. package/_bmad/core/skills/bmad-editorial-review-structure/SKILL.md +6 -0
  348. package/_bmad/core/skills/bmad-editorial-review-structure/bmad-skill-manifest.yaml +1 -0
  349. package/_bmad/core/skills/bmad-editorial-review-structure/workflow.md +174 -0
  350. package/_bmad/core/skills/bmad-help/SKILL.md +6 -0
  351. package/_bmad/core/skills/bmad-help/bmad-skill-manifest.yaml +1 -0
  352. package/_bmad/core/skills/bmad-help/workflow.md +88 -0
  353. package/_bmad/core/skills/bmad-index-docs/SKILL.md +6 -0
  354. package/_bmad/core/skills/bmad-index-docs/bmad-skill-manifest.yaml +1 -0
  355. package/_bmad/core/skills/bmad-index-docs/workflow.md +61 -0
  356. package/_bmad/core/skills/bmad-party-mode/SKILL.md +6 -0
  357. package/_bmad/core/skills/bmad-party-mode/bmad-skill-manifest.yaml +1 -0
  358. package/_bmad/core/skills/bmad-party-mode/steps/step-01-agent-loading.md +138 -0
  359. package/_bmad/core/skills/bmad-party-mode/steps/step-02-discussion-orchestration.md +187 -0
  360. package/_bmad/core/skills/bmad-party-mode/steps/step-03-graceful-exit.md +167 -0
  361. package/_bmad/core/skills/bmad-party-mode/workflow.md +190 -0
  362. package/_bmad/core/skills/bmad-review-adversarial-general/SKILL.md +6 -0
  363. package/_bmad/core/skills/bmad-review-adversarial-general/bmad-skill-manifest.yaml +1 -0
  364. package/_bmad/core/skills/bmad-review-adversarial-general/workflow.md +32 -0
  365. package/_bmad/core/skills/bmad-review-edge-case-hunter/SKILL.md +6 -0
  366. package/_bmad/core/skills/bmad-review-edge-case-hunter/bmad-skill-manifest.yaml +1 -0
  367. package/_bmad/core/skills/bmad-review-edge-case-hunter/workflow.md +62 -0
  368. package/_bmad/core/skills/bmad-shard-doc/SKILL.md +6 -0
  369. package/_bmad/core/skills/bmad-shard-doc/bmad-skill-manifest.yaml +1 -0
  370. package/_bmad/core/skills/bmad-shard-doc/workflow.md +100 -0
  371. package/_bmad/core/tasks/bmad-create-prd/SKILL.md +6 -0
  372. package/_bmad/core/tasks/bmad-create-prd/bmad-skill-manifest.yaml +1 -0
  373. package/_bmad/core/tasks/bmad-create-prd/data/domain-complexity.csv +15 -0
  374. package/_bmad/core/tasks/bmad-create-prd/data/prd-purpose.md +197 -0
  375. package/_bmad/core/tasks/bmad-create-prd/data/project-types.csv +11 -0
  376. package/_bmad/core/tasks/bmad-create-prd/steps-c/step-01-init.md +178 -0
  377. package/_bmad/core/tasks/bmad-create-prd/steps-c/step-01b-continue.md +161 -0
  378. package/_bmad/core/tasks/bmad-create-prd/steps-c/step-02-discovery.md +208 -0
  379. package/_bmad/core/tasks/bmad-create-prd/steps-c/step-02b-vision.md +142 -0
  380. package/_bmad/core/tasks/bmad-create-prd/steps-c/step-02c-executive-summary.md +158 -0
  381. package/_bmad/core/tasks/bmad-create-prd/steps-c/step-03-success.md +214 -0
  382. package/_bmad/core/tasks/bmad-create-prd/steps-c/step-04-journeys.md +201 -0
  383. package/_bmad/core/tasks/bmad-create-prd/steps-c/step-05-domain.md +194 -0
  384. package/_bmad/core/tasks/bmad-create-prd/steps-c/step-06-innovation.md +211 -0
  385. package/_bmad/core/tasks/bmad-create-prd/steps-c/step-07-project-type.md +222 -0
  386. package/_bmad/core/tasks/bmad-create-prd/steps-c/step-08-scoping.md +216 -0
  387. package/_bmad/core/tasks/bmad-create-prd/steps-c/step-09-functional.md +219 -0
  388. package/_bmad/core/tasks/bmad-create-prd/steps-c/step-10-nonfunctional.md +230 -0
  389. package/_bmad/core/tasks/bmad-create-prd/steps-c/step-11-polish.md +221 -0
  390. package/_bmad/core/tasks/bmad-create-prd/steps-c/step-12-complete.md +115 -0
  391. package/_bmad/core/tasks/bmad-create-prd/templates/prd-template.md +10 -0
  392. package/_bmad/core/tasks/bmad-create-prd/workflow.md +62 -0
  393. package/config/allowed-commands.ts +39 -0
  394. package/config/defaults.ts +19 -0
  395. package/config/loader.ts +105 -0
  396. package/extensions/frappe-gates.ts +160 -0
  397. package/extensions/frappe-session.ts +324 -0
  398. package/extensions/frappe-state.ts +235 -0
  399. package/extensions/frappe-tools.ts +278 -0
  400. package/extensions/frappe-ui.ts +119 -0
  401. package/extensions/frappe-workflow.ts +85 -0
  402. package/gates/coverage-check.ts +37 -0
  403. package/gates/frappe-native-check.ts +65 -0
  404. package/gates/permission-check.ts +65 -0
  405. package/gates/query-check.ts +40 -0
  406. package/gates/server-side-check.ts +67 -0
  407. package/gates/style-check.ts +92 -0
  408. package/gates/types.ts +13 -0
  409. package/package.json +43 -0
  410. package/project-context.md +146 -0
  411. package/state/db.ts +85 -0
  412. package/state/fsm.ts +68 -0
  413. package/state/journal.ts +164 -0
  414. package/state/schema.ts +41 -0
  415. package/tools/agent-tools.ts +60 -0
  416. package/tools/bench-tools.ts +63 -0
  417. package/tools/context-sandbox.ts +31 -0
  418. package/tools/debug-tools.ts +12 -0
  419. package/tools/feature-tools.ts +126 -0
  420. package/tools/frappe-context7.ts +70 -0
  421. package/tools/frappe-query-tools.ts +47 -0
  422. package/tools/project-tools.ts +107 -0
  423. package/tsdown.config.ts +6 -0
@@ -0,0 +1,40 @@
1
+ /**
2
+ * gates/query-check.ts — Pure gate function, no side effects.
3
+ * No imports from state/, extensions/, or config/.
4
+ * No async, no db, no I/O. Same input always produces same output.
5
+ *
6
+ * Detects SQL string concatenation patterns (f-strings, +, %) that
7
+ * could lead to SQL injection. Requires parameterised queries. (FR27)
8
+ */
9
+ import type { GateContext, GateResult } from "./types.js";
10
+
11
+ const SQL_KEYWORD = /\b(SELECT|INSERT|UPDATE|DELETE|FROM|WHERE)\b/i;
12
+
13
+ const INJECTION_PATTERNS: Array<{ pattern: RegExp; label: string }> = [
14
+ { pattern: /f["'].*\{[^}]+\}.*["']/, label: "f-string interpolation" },
15
+ { pattern: /["']\s*\+\s*\w/, label: "string concatenation (+)" },
16
+ { pattern: /["']\s*%\s*\w/, label: "%-format interpolation" },
17
+ ];
18
+
19
+ const REASON = "SQL string concatenation detected — use parameterised queries";
20
+
21
+ export function queryCheck(code: string, context: GateContext): GateResult {
22
+ if (!context.file.endsWith(".py")) return { passed: true };
23
+
24
+ const lines = code.split("\n");
25
+ const violations: Array<{ line: number; pattern: string; reason: string }> = [];
26
+
27
+ for (let i = 0; i < lines.length; i++) {
28
+ const line = lines[i];
29
+ if (!SQL_KEYWORD.test(line)) continue;
30
+
31
+ for (const { pattern, label } of INJECTION_PATTERNS) {
32
+ if (pattern.test(line)) {
33
+ violations.push({ line: i + 1, pattern: label, reason: REASON });
34
+ break; // one violation per line — avoid duplicating the same line
35
+ }
36
+ }
37
+ }
38
+
39
+ return violations.length > 0 ? { passed: false, violations } : { passed: true };
40
+ }
@@ -0,0 +1,67 @@
1
+ /**
2
+ * gates/server-side-check.ts — Pure gate function, no side effects.
3
+ * No imports from state/, extensions/, or config/.
4
+ * No async, no db, no I/O. Same input always produces same output.
5
+ *
6
+ * Detects business logic patterns in client-side JavaScript/TypeScript that
7
+ * should live on the Python server instead. (FR28)
8
+ */
9
+ import type { GateContext, GateResult } from "./types.js";
10
+
11
+ const BUSINESS_LOGIC_PATTERNS: Array<{ pattern: RegExp; label: string }> = [
12
+ // Arithmetic on financial/quantity fields — price/total calculations
13
+ {
14
+ pattern: /frm\.doc\.\w+\s*=\s*frm\.doc\.\w+\s*[*\/+\-]\s*frm\.doc\.\w+/,
15
+ label: "client-side financial calculation",
16
+ },
17
+ // Direct permission decisions based on user identity
18
+ {
19
+ pattern: /frappe\.session\.user\s*[=!]={1,2}\s*["']/,
20
+ label: "client-side permission decision (user identity)",
21
+ },
22
+ // Role-based access control in JS
23
+ {
24
+ pattern: /frappe\.user\.has_role\s*\(/,
25
+ label: "client-side permission decision (role check)",
26
+ },
27
+ // Direct user_roles access
28
+ {
29
+ pattern: /frappe\.user_roles\b/,
30
+ label: "client-side permission decision (user_roles)",
31
+ },
32
+ // Direct DB access from client side — should go via frappe.call
33
+ {
34
+ pattern: /frappe\.db\.(get_value|get_list|set_value|insert|delete_doc)\s*\(/,
35
+ label: "direct DB access from client-side (use frappe.call instead)",
36
+ },
37
+ ];
38
+
39
+ const REASON = "business logic must be server-side";
40
+
41
+ function isTestFile(file: string): boolean {
42
+ return file.includes("/test/") || file.includes(".test.") || file.includes(".spec.");
43
+ }
44
+
45
+ export function serverSideCheck(code: string, context: GateContext): GateResult {
46
+ // Only scan JS/TS files
47
+ if (!context.file.endsWith(".js") && !context.file.endsWith(".ts")) {
48
+ return { passed: true };
49
+ }
50
+ // Exempt test files
51
+ if (isTestFile(context.file)) return { passed: true };
52
+
53
+ const lines = code.split("\n");
54
+ const violations: Array<{ line: number; pattern: string; reason: string }> = [];
55
+
56
+ for (let i = 0; i < lines.length; i++) {
57
+ const line = lines[i];
58
+ for (const { pattern, label } of BUSINESS_LOGIC_PATTERNS) {
59
+ if (pattern.test(line)) {
60
+ violations.push({ line: i + 1, pattern: label, reason: REASON });
61
+ break; // one violation per line
62
+ }
63
+ }
64
+ }
65
+
66
+ return violations.length > 0 ? { passed: false, violations } : { passed: true };
67
+ }
@@ -0,0 +1,92 @@
1
+ import path from 'node:path'
2
+ import type { GateContext, GateResult } from './types.js'
3
+
4
+ type Violation = { line?: number; reason: string; [key: string]: unknown }
5
+
6
+ const DEF_LINE = /^([^\S\n]*)def\s+(\w+)\s*\([^)]*\)\s*:/gm
7
+ const NON_DESCRIPTIVE = /^(\s*)(x|y|z|data|temp|tmp|val|var|foo|bar|test|obj|res|ret)\s*=/gm
8
+ const SQL_STRING = /frappe\.db\.sql\s*\(\s*["'`]{1,3}([\s\S]*?)["'`]{1,3}/g
9
+ const CAMEL_IDENTIFIER = /\b([a-z][a-zA-Z0-9]*[A-Z][a-zA-Z0-9]*)\b/g
10
+
11
+ const STUB_BODY = /^\s*(pass|return|return None|super\(\)\.__init__\(.*?\))\s*$/
12
+
13
+ function lineNumber(code: string, index: number): number {
14
+ return code.slice(0, index).split('\n').length
15
+ }
16
+
17
+ function hasDocstring(code: string, defStart: number): boolean {
18
+ const bodyStart = code.indexOf('\n', defStart) + 1
19
+ const bodyTrimmed = code.slice(bodyStart).trimStart()
20
+ return bodyTrimmed.startsWith('"""') || bodyTrimmed.startsWith("'''")
21
+ }
22
+
23
+ function isStubBody(code: string, defStart: number): boolean {
24
+ const newline = code.indexOf('\n', defStart)
25
+ if (newline === -1) return true
26
+ const nextNewline = code.indexOf('\n', newline + 1)
27
+ const bodyLine = nextNewline === -1
28
+ ? code.slice(newline + 1)
29
+ : code.slice(newline + 1, nextNewline)
30
+ return STUB_BODY.test(bodyLine)
31
+ }
32
+
33
+ function checkPython(code: string, violations: Array<Violation>): void {
34
+ // 1. Docstring check
35
+ let m: RegExpExecArray | null
36
+ DEF_LINE.lastIndex = 0
37
+ while ((m = DEF_LINE.exec(code)) !== null) {
38
+ const fnName = m[2]
39
+ const defStart = m.index
40
+ if (!hasDocstring(code, defStart) && !isStubBody(code, defStart)) {
41
+ violations.push({ function: fnName, line: lineNumber(code, defStart), reason: 'missing docstring' })
42
+ }
43
+ }
44
+
45
+ // 2. Non-descriptive variable check
46
+ NON_DESCRIPTIVE.lastIndex = 0
47
+ while ((m = NON_DESCRIPTIVE.exec(code)) !== null) {
48
+ const varName = m[2]
49
+ violations.push({ line: lineNumber(code, m.index), variable: varName, reason: 'non-descriptive variable name' })
50
+ }
51
+
52
+ // 3. SQL camelCase column check
53
+ SQL_STRING.lastIndex = 0
54
+ while ((m = SQL_STRING.exec(code)) !== null) {
55
+ const sqlContent = m[1]
56
+ const sqlStart = m.index
57
+ CAMEL_IDENTIFIER.lastIndex = 0
58
+ let cm: RegExpExecArray | null
59
+ while ((cm = CAMEL_IDENTIFIER.exec(sqlContent)) !== null) {
60
+ violations.push({
61
+ line: lineNumber(code, sqlStart),
62
+ column: cm[1],
63
+ reason: 'SQL column must be snake_case',
64
+ })
65
+ }
66
+ }
67
+ }
68
+
69
+ function checkFilename(context: GateContext, violations: Array<Violation>): void {
70
+ const basename = path.basename(context.file)
71
+ .replace(/\.(test|spec)\.(ts|js)$/, '')
72
+ .replace(/\.(ts|js)$/, '')
73
+ if (!/^[a-z0-9]+(-[a-z0-9]+)*$/.test(basename)) {
74
+ violations.push({ file: context.file, reason: 'TypeScript filename must be kebab-case' })
75
+ }
76
+ }
77
+
78
+ export function styleCheck(code: string, context: GateContext): GateResult {
79
+ const violations: Array<Violation> = []
80
+ const ext = path.extname(context.file)
81
+
82
+ if (ext === '.py') {
83
+ checkPython(code, violations)
84
+ } else if (ext === '.ts' || ext === '.js') {
85
+ checkFilename(context, violations)
86
+ }
87
+
88
+ if (violations.length > 0) {
89
+ return { passed: false, violations }
90
+ }
91
+ return { passed: true }
92
+ }
package/gates/types.ts ADDED
@@ -0,0 +1,13 @@
1
+ /** Shared gate types — all Story 6.x gate implementations must satisfy this contract. */
2
+
3
+ export interface GateContext {
4
+ file: string;
5
+ phase: string;
6
+ sessionId: string;
7
+ }
8
+
9
+ export type GateResult =
10
+ | { passed: true }
11
+ | { passed: false; violations: Array<{ line?: number; reason: string; [key: string]: unknown }> };
12
+
13
+ export type GateFn = (code: string, context: GateContext) => GateResult;
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "frappe-builder",
3
+ "version": "1.1.0-dev.8",
4
+ "description": "Frappe-native AI co-pilot for building and customising Frappe/ERPNext applications",
5
+ "type": "module",
6
+ "pi": {
7
+ "_note": "TODO: verify 'pi' field schema against @mariozechner/pi-agent-core docs — no schema found in installed package. Reference schema below is a best-guess pending confirmation.",
8
+ "extensions": [
9
+ "./extensions/frappe-session.ts",
10
+ "./extensions/frappe-state.ts",
11
+ "./extensions/frappe-workflow.ts",
12
+ "./extensions/frappe-tools.ts",
13
+ "./extensions/frappe-gates.ts",
14
+ "./extensions/frappe-ui.ts"
15
+ ],
16
+ "agents": "./AGENTS.md"
17
+ },
18
+ "scripts": {
19
+ "build": "bun build --compile --minify src/cli.ts --outfile frappe-builder",
20
+ "build:ts": "tsdown",
21
+ "test": "vitest run",
22
+ "dev": "pi -e ./extensions/frappe-state.ts",
23
+ "typecheck": "tsc --noEmit",
24
+ "release": "node scripts/bump-version.mjs"
25
+ },
26
+ "keywords": [],
27
+ "author": "",
28
+ "license": "ISC",
29
+ "devDependencies": {
30
+ "@types/node": "^25.5.0",
31
+ "tsdown": "^0.21.4",
32
+ "typescript": "^5.9.3",
33
+ "vitest": "^4.1.0"
34
+ },
35
+ "dependencies": {
36
+ "@mariozechner/pi-agent-core": "0.62.0",
37
+ "@mariozechner/pi-ai": "0.62.0",
38
+ "@types/better-sqlite3": "^7.6.13",
39
+ "better-sqlite3": "^12.8.0",
40
+ "execa": "^9.6.1",
41
+ "robot3": "^1.2.0"
42
+ }
43
+ }
@@ -0,0 +1,146 @@
1
+ # Project Context: frappe-builder
2
+
3
+ > AI agent rules and project context for consistent implementation across sessions.
4
+ > Generated: 2026-03-23 | Author: Riz
5
+
6
+ ---
7
+
8
+ ## What This Project Is
9
+
10
+ **frappe-builder** is a pi-package CLI tool — a Frappe-native AI co-pilot for building and customising Frappe/ERPNext applications. It upgrades the existing BMAD module by replacing all prompt-enforced state management with hook-based code enforcement.
11
+
12
+ **The core shift:** State is owned by code, not conversation. Prompts cannot enforce anything. Hooks can.
13
+
14
+ ---
15
+
16
+ ## Project Type & Context
17
+
18
+ - **Type:** Developer tool (CLI / AI agent extension for pi-mono)
19
+ - **Context:** Brownfield — upgrading an existing BMAD module, not building from scratch
20
+ - **Runtime:** TypeScript, Node.js 20+ LTS
21
+ - **Primary platform:** pi-mono agent framework (pi-ai)
22
+
23
+ ---
24
+
25
+ ## Architecture Rules for AI Agents
26
+
27
+ ### State Management
28
+
29
+ 1. **JSONL is the immutable source of truth.** Every tool call appends to `~/.frappe-builder/sessions/{id}.jsonl`. Never overwrite or delete entries.
30
+ 2. **SQLite (`state.db`) is derived state.** It is rebuilt from JSONL on demand. Never treat it as authoritative over JSONL.
31
+ 3. **`afterToolCall` writes state unconditionally.** No tool call completes without a state write. There is no optional path.
32
+ 4. **Every startup is a resume.** There is no "new session" vs "resume" split. Session start always reads JSONL, reconstructs SQLite, and injects state context.
33
+ 5. **State injection must complete in <500ms** before the first LLM prompt is sent (NFR1).
34
+
35
+ ### Workflow Enforcement
36
+
37
+ 6. **Robot3 FSM governs all workflow transitions.** Valid states: `idle → requirements → architecture → planning → implementation → testing → documentation → idle`.
38
+ 7. **`beforeToolCall` blocks out-of-phase tools.** When blocking, the explanation must name: (a) the blocked tool, (b) the current FSM phase, (c) the phase where the tool becomes valid.
39
+ 8. **`--mode quick` bypasses the FSM phase cycle** but never bypasses quality gates. Quality gates are always active.
40
+ 9. **`--override-workflow` is the only valid escape hatch.** It must be logged to JSONL with a reason. It does not disable quality gates.
41
+
42
+ ### Quality Gates
43
+
44
+ 10. **Quality gates run before any code is written to disk.** They are static analysis scans — deterministic, not LLM judgement. The same violation always produces the same block.
45
+ 11. **Six gates are mandatory:**
46
+ - Every `@frappe.whitelist()` method must include permission checks
47
+ - No SQL string concatenation — parameterised queries only
48
+ - Business logic in Python server-side — no client-side business logic
49
+ - Frappe-native solution required first — non-Frappe solutions need explicit developer justification
50
+ - Test coverage ≥70% critical-path before feature marked complete
51
+ - Docstrings and naming conventions (no `x`, `data`, `temp` variable names)
52
+ 12. **No feature is marked complete until all quality gates pass.** No exceptions.
53
+
54
+ ### Frappe Integration
55
+
56
+ 13. **All Frappe tool outputs go through mcp2cli + context-mode.** Raw Frappe API payloads must never enter the LLM context directly.
57
+ 14. **Bench commands run via subprocess — whitelisted only.** No raw shell access through the tool layer.
58
+ 15. **context7 for Frappe/ERPNext documentation.** Never raw web fetch for docs.
59
+ 16. **Bench subprocess calls are non-blocking.** Long-running operations (migrate, build) must not freeze the TUI or agent loop.
60
+
61
+ ### Context Budget
62
+
63
+ 17. **LLM context window is a hard constraint.** Across any 50-turn session, total context must stay ≤80% of the active model's window.
64
+ 18. **State injection at session start must consume ≤15% of context window.**
65
+ 19. **context-mode degradation is graceful** — falls back to truncated direct output, never crashes.
66
+
67
+ ### Security
68
+
69
+ 20. **LLM API keys live exclusively in `~/.frappe-builder/config.json`.** Never in project files. Never in git.
70
+ 21. **Frappe site credentials live in `{project}/.frappe-builder-config.json`** — must be gitignored. System refuses to proceed if not gitignored.
71
+ 22. **JSONL session logs are local only** (`~/.frappe-builder/sessions/`). Never transmitted externally.
72
+
73
+ ### Code Style
74
+
75
+ 23. **Generated code is lean and self-documenting.** Descriptive names, no abbreviations. No `x`, `data`, `result`, `temp` variables.
76
+ 24. **Every function/method gets a docstring.** No exceptions in generated code.
77
+ 25. **Frappe-native patterns first.** Before reaching for an external library or custom solution, verify Frappe's built-in capability is insufficient.
78
+
79
+ ---
80
+
81
+ ## Specialist Agent Map
82
+
83
+ | FSM Phase | Specialist Auto-Loaded |
84
+ |---|---|
85
+ | `requirements` | frappe-ba (Business Analyst) |
86
+ | `architecture` | frappe-architect |
87
+ | `planning` | frappe-planner |
88
+ | `implementation` | frappe-dev |
89
+ | `testing` | frappe-qa |
90
+ | `documentation` | frappe-docs |
91
+ | Any phase (manual) | frappe-debugger |
92
+ | Base identity (always) | frappe-nexus (via AGENTS.md) |
93
+
94
+ ---
95
+
96
+ ## Tool API Surface
97
+
98
+ | Tool | Phase Available | Purpose |
99
+ |---|---|---|
100
+ | `set_active_project` | Any | Switch active Frappe project/site |
101
+ | `start_feature` | idle | Begin feature workflow (`--mode quick` for fast path) |
102
+ | `complete_component` | implementation | Mark component done, trigger state cascade |
103
+ | `scaffold_doctype` | implementation | Generate DocType scaffold via bench |
104
+ | `run_tests` | testing | Execute Frappe test suite, record results |
105
+ | `get_project_status` | Any | Read project dashboard from state.db |
106
+ | `frappe_query` | Any | Query Frappe via mcp2cli (sandboxed) |
107
+ | `bench_execute` | Any | Run whitelisted bench commands |
108
+
109
+ ---
110
+
111
+ ## Build Phases
112
+
113
+ | Phase | Deliverable | Gate |
114
+ |---|---|---|
115
+ | 1 | Core State Infrastructure | start→tools→kill→restart→verify exact reconstruction |
116
+ | 2 | Frappe Tool Layer | All 8 tools functional with mcp2cli + context-mode |
117
+ | 3 | TUI & Visibility | Footer widget live; /status dashboard working |
118
+ | 4 | Quality Gates & Knowledge Base | All 6 gates enforced; 8 specialists converted to pi skills |
119
+ | 5 | Distribution | pi package + npm binary published |
120
+
121
+ **Phase 1 is the critical path. Everything depends on it.**
122
+
123
+ ---
124
+
125
+ ## What This Is Replacing
126
+
127
+ | Current (BMAD module) | Replacement |
128
+ |---|---|
129
+ | Prompt-enforced state | `afterToolCall` hook → JSONL + SQLite |
130
+ | Bi-modal New/Resume split | Every startup is a resume |
131
+ | `state/templates/*.yaml` | `state.db` (SQLite) |
132
+ | `standards/state-management.md` | Hook enforcement |
133
+ | `agents/*.agent.yaml` | AGENTS.md + pi skills |
134
+ | `workflows/` step files | Robot3 FSM transitions |
135
+ | STATE CASCADE in all 8 agents | Single `afterToolCall` hook |
136
+
137
+ ---
138
+
139
+ ## Measurable Success Criteria
140
+
141
+ - Zero state drift incidents in sessions ≥50 turns
142
+ - Agent orientation on resume: ≤1 turn to full context
143
+ - State injection context footprint: <15% of context window
144
+ - State injection latency: <500ms
145
+ - All generated code passes quality gates before written to disk
146
+ - No feature marked complete until all quality gates pass
package/state/db.ts ADDED
@@ -0,0 +1,85 @@
1
+ import Database from "better-sqlite3";
2
+ import type { Database as DatabaseType } from "better-sqlite3";
3
+ import { mkdirSync } from "node:fs";
4
+ import { initSchema } from "./schema.js";
5
+ import { appendEntry } from "./journal.js";
6
+
7
+ mkdirSync(".fb", { recursive: true });
8
+
9
+ /** Singleton SQLite connection — the only Database instance in the codebase. */
10
+ export let db: DatabaseType = new Database(".fb/state.db");
11
+
12
+ initSchema(db);
13
+
14
+ /**
15
+ * Replaces the db singleton — intended for test use only.
16
+ * Pass a real in-memory Database(":memory:") seeded with initSchema().
17
+ */
18
+ export function setDb(instance: DatabaseType): void {
19
+ db = instance;
20
+ }
21
+
22
+ /**
23
+ * Switches the active project: closes the current session atomically and opens
24
+ * a new session for newProjectId, restoring its last known phase if a prior
25
+ * session exists. Writes a "state_transition" JSONL entry before the close.
26
+ *
27
+ * sitePath is optional so existing callers without a site path continue to work.
28
+ */
29
+ export function switchProject(newProjectId: string, sitePath?: string): void {
30
+ db.transaction(() => {
31
+ // 1. Read current active session before closing
32
+ const current = db
33
+ .prepare(
34
+ "SELECT session_id, project_id, current_phase FROM sessions WHERE is_active = 1 LIMIT 1"
35
+ )
36
+ .get() as
37
+ | { session_id: string; project_id: string; current_phase: string }
38
+ | undefined;
39
+
40
+ const previousProjectId = current?.project_id ?? "unknown";
41
+ const previousSessionId = current?.session_id ?? crypto.randomUUID();
42
+
43
+ // 2. Write JSONL transition entry (appendFileSync — safe inside transaction)
44
+ appendEntry({
45
+ ts: new Date().toISOString(),
46
+ sessionId: previousSessionId,
47
+ type: "state_transition",
48
+ payload: { from: previousProjectId, to: newProjectId },
49
+ });
50
+
51
+ // 3. Close current session
52
+ db.prepare(
53
+ "UPDATE sessions SET is_active = 0, ended_at = ? WHERE is_active = 1"
54
+ ).run(new Date().toISOString());
55
+
56
+ // 4. Check for prior session on new project (for phase restoration)
57
+ const prior = db
58
+ .prepare(
59
+ "SELECT current_phase FROM sessions WHERE project_id = ? ORDER BY started_at DESC LIMIT 1"
60
+ )
61
+ .get(newProjectId) as { current_phase: string } | undefined;
62
+
63
+ // 5. Create new session, restoring prior phase if available; feature_id defaults to NULL
64
+ db.prepare(
65
+ "INSERT INTO sessions (session_id, project_id, current_phase, site_path, started_at, is_active) VALUES (?, ?, ?, ?, ?, 1)"
66
+ ).run(
67
+ crypto.randomUUID(),
68
+ newProjectId,
69
+ prior?.current_phase ?? "idle",
70
+ sitePath ?? null,
71
+ new Date().toISOString()
72
+ );
73
+ })();
74
+ }
75
+
76
+ /**
77
+ * Returns the current FSM phase from the active session row.
78
+ * Returns "idle" if no active session exists.
79
+ */
80
+ export function getCurrentPhase(): string {
81
+ const row = db
82
+ .prepare("SELECT current_phase FROM sessions WHERE is_active = 1 LIMIT 1")
83
+ .get() as { current_phase: string } | undefined;
84
+ return row?.current_phase ?? "idle";
85
+ }
package/state/fsm.ts ADDED
@@ -0,0 +1,68 @@
1
+ import { createMachine, state, transition } from "robot3";
2
+
3
+ export type Phase =
4
+ | "idle"
5
+ | "requirements"
6
+ | "architecture"
7
+ | "planning"
8
+ | "implementation"
9
+ | "testing"
10
+ | "documentation";
11
+
12
+ export const ALL_PHASES: Phase[] = [
13
+ "idle",
14
+ "requirements",
15
+ "architecture",
16
+ "planning",
17
+ "implementation",
18
+ "testing",
19
+ "documentation",
20
+ ];
21
+
22
+ function buildMachineStates() {
23
+ return {
24
+ idle: state(
25
+ transition("start_full", "requirements"),
26
+ transition("start_quick", "implementation") as never // quick mode bypass (Story 3.3)
27
+ ),
28
+ requirements: state(transition("approve", "architecture")),
29
+ architecture: state(transition("approve", "planning")),
30
+ planning: state(transition("approve", "implementation")),
31
+ implementation: state(transition("approve", "testing")),
32
+ testing: state(transition("approve", "documentation")),
33
+ documentation: state(transition("complete", "idle")),
34
+ };
35
+ }
36
+
37
+ /** Creates a Robot3 FSM starting at the given phase — fast-forward, no event replay. */
38
+ export function createFsmAtPhase(phase: Phase) {
39
+ return createMachine(phase, buildMachineStates());
40
+ }
41
+
42
+ /**
43
+ * Maps each tool to its valid phase (or 'any').
44
+ * Tools not listed here are allowed in any phase — do not block unregistered tools.
45
+ */
46
+ const TOOL_PHASE_MAP: Record<string, Phase | "any"> = {
47
+ set_active_project: "any",
48
+ start_feature: "idle",
49
+ complete_component: "implementation",
50
+ scaffold_doctype: "implementation",
51
+ run_tests: "testing",
52
+ get_project_status: "any",
53
+ frappe_query: "any",
54
+ bench_execute: "any", // allowed in all phases — includes testing (bench run-tests) and implementation (bench migrate)
55
+ };
56
+
57
+ /** Returns true if toolName is allowed to run in the given phase. Unknown tools are always allowed. */
58
+ export function isToolAllowedInPhase(toolName: string, phase: Phase): boolean {
59
+ const validPhase = TOOL_PHASE_MAP[toolName];
60
+ if (validPhase === undefined) return true; // unknown tool — do not block
61
+ if (validPhase === "any") return true;
62
+ return validPhase === phase;
63
+ }
64
+
65
+ /** Returns the phase where toolName is valid, or 'any' for unrestricted/unknown tools. */
66
+ export function getValidPhase(toolName: string): Phase | "any" {
67
+ return TOOL_PHASE_MAP[toolName] ?? "any";
68
+ }