frappe-builder 1.1.0-dev.10

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 (425) 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/dist/cli.mjs +67 -0
  397. package/dist/init-BYJy3ztn.mjs +159 -0
  398. package/extensions/frappe-gates.ts +160 -0
  399. package/extensions/frappe-session.ts +324 -0
  400. package/extensions/frappe-state.ts +235 -0
  401. package/extensions/frappe-tools.ts +278 -0
  402. package/extensions/frappe-ui.ts +119 -0
  403. package/extensions/frappe-workflow.ts +85 -0
  404. package/gates/coverage-check.ts +37 -0
  405. package/gates/frappe-native-check.ts +65 -0
  406. package/gates/permission-check.ts +65 -0
  407. package/gates/query-check.ts +40 -0
  408. package/gates/server-side-check.ts +67 -0
  409. package/gates/style-check.ts +92 -0
  410. package/gates/types.ts +13 -0
  411. package/package.json +47 -0
  412. package/project-context.md +146 -0
  413. package/state/db.ts +85 -0
  414. package/state/fsm.ts +68 -0
  415. package/state/journal.ts +164 -0
  416. package/state/schema.ts +41 -0
  417. package/tools/agent-tools.ts +60 -0
  418. package/tools/bench-tools.ts +63 -0
  419. package/tools/context-sandbox.ts +31 -0
  420. package/tools/debug-tools.ts +12 -0
  421. package/tools/feature-tools.ts +126 -0
  422. package/tools/frappe-context7.ts +70 -0
  423. package/tools/frappe-query-tools.ts +47 -0
  424. package/tools/project-tools.ts +107 -0
  425. package/tsdown.config.ts +7 -0
@@ -0,0 +1,85 @@
1
+ import { getCurrentPhase, db } from "../state/db.js";
2
+ import { isToolAllowedInPhase, getValidPhase, type Phase } from "../state/fsm.js";
3
+ import { appendEntry } from "../state/journal.js";
4
+
5
+ interface BlockedResponse {
6
+ blocked: true;
7
+ tool: string;
8
+ current_phase: Phase;
9
+ valid_phase: Phase | "any";
10
+ message: string;
11
+ }
12
+
13
+ function buildBlockedResponse(
14
+ tool: string,
15
+ currentPhase: Phase,
16
+ validPhase: Phase | "any"
17
+ ): BlockedResponse {
18
+ return {
19
+ blocked: true,
20
+ tool,
21
+ current_phase: currentPhase,
22
+ valid_phase: validPhase,
23
+ message: `${tool} is not available in ${currentPhase} phase. Available in: ${validPhase}`,
24
+ };
25
+ }
26
+
27
+ /**
28
+ * Phase guard logic for beforeToolCall. Returns a blocked response if the tool
29
+ * is not valid in the current phase, undefined to allow.
30
+ *
31
+ * Override: if args.override === true, writes a JSONL entry and allows the tool
32
+ * regardless of phase. Does NOT disable quality gates (frappe-gates.ts).
33
+ *
34
+ * Never throws — always returns a value or undefined.
35
+ */
36
+ // Tools valid in all phases — never blocked by the phase guard (FR34)
37
+ const ALWAYS_ALLOWED_TOOLS = ["invoke_debugger", "end_debug", "spawn_agent", "get_frappe_docs", "get_audit_log"];
38
+
39
+ export function beforeToolCall(
40
+ toolName: string,
41
+ args: Record<string, unknown>
42
+ ): BlockedResponse | undefined {
43
+ // Always-allowed bypass — checked before everything else
44
+ if (ALWAYS_ALLOWED_TOOLS.includes(toolName)) return undefined;
45
+
46
+ const currentPhase = getCurrentPhase() as Phase;
47
+
48
+ // Override bypass — checked BEFORE phase guard (FR10 escape hatch)
49
+ if (args.override === true) {
50
+ const session = db
51
+ .prepare("SELECT session_id FROM sessions WHERE is_active = 1 LIMIT 1")
52
+ .get() as { session_id: string } | undefined;
53
+
54
+ appendEntry({
55
+ ts: new Date().toISOString(),
56
+ sessionId: session?.session_id ?? "unknown",
57
+ type: "tool_call",
58
+ payload: {
59
+ override: true,
60
+ reason: (args.reason as string) ?? "unspecified",
61
+ tool: toolName,
62
+ phase: currentPhase,
63
+ },
64
+ });
65
+ return undefined; // allow
66
+ }
67
+
68
+ // Phase guard
69
+ if (!isToolAllowedInPhase(toolName, currentPhase)) {
70
+ return buildBlockedResponse(toolName, currentPhase, getValidPhase(toolName));
71
+ }
72
+
73
+ return undefined; // allow
74
+ }
75
+
76
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
77
+ export default function (pi: any) {
78
+ pi.on("tool_call", (event: { toolName?: string; input?: Record<string, unknown> }) => {
79
+ const result = beforeToolCall(event.toolName ?? "", event.input ?? {});
80
+ if (result) {
81
+ return { block: true, reason: result.message };
82
+ }
83
+ return undefined;
84
+ });
85
+ }
@@ -0,0 +1,37 @@
1
+ /**
2
+ * gates/coverage-check.ts — Async coverage gate (NOT a pure function).
3
+ * Runs `bench run-tests --coverage` via execa and parses the result.
4
+ *
5
+ * NOT wired via frappe-gates.ts — integrated directly in completeComponent().
6
+ * Triggers when the final component is completed in `testing` phase. (FR29)
7
+ */
8
+ import { execa } from "execa";
9
+ import type { GateContext } from "./types.js";
10
+
11
+ export type CoverageResult =
12
+ | { passed: true; coverage: number }
13
+ | { passed: false; coverage: number; required: string; error?: string };
14
+
15
+ function parseCoverage(stdout: string): number {
16
+ const match = stdout.match(/^TOTAL\s+\d+\s+\d+\s+(\d+)%/m);
17
+ return match ? parseInt(match[1], 10) : 0;
18
+ }
19
+
20
+ export async function coverageCheck(_context: GateContext): Promise<CoverageResult> {
21
+ try {
22
+ const { stdout } = await execa("bench", ["run-tests", "--coverage"], {
23
+ cwd: process.env.FRAPPE_BENCH_PATH ?? process.cwd(),
24
+ reject: false, // don't throw on non-zero exit — coverage data may still be in stdout
25
+ timeout: 120_000, // 2 minute timeout
26
+ });
27
+
28
+ const coverage = parseCoverage(stdout ?? "");
29
+
30
+ if (coverage < 70) {
31
+ return { passed: false, coverage, required: "70%" };
32
+ }
33
+ return { passed: true, coverage };
34
+ } catch (err) {
35
+ return { passed: false, coverage: 0, required: "70%", error: (err as Error).message };
36
+ }
37
+ }
@@ -0,0 +1,65 @@
1
+ /**
2
+ * gates/frappe-native-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
+
7
+ export type NativeCheckResult =
8
+ | { passed: true }
9
+ | { passed: true; result: "override"; justification: string; detectedPatterns: string[] }
10
+ | { passed: false; requiresJustification: true; message: string; detectedPatterns: string[] };
11
+
12
+ export const NON_NATIVE_PATTERNS: { pattern: RegExp; label: string }[] = [
13
+ // HTTP clients — use frappe.call() or frappe.db instead
14
+ { pattern: /import\s+axios/, label: "axios (use frappe.call)" },
15
+ { pattern: /require\(['"]axios['"]\)/, label: "axios (use frappe.call)" },
16
+ { pattern: /import\s+requests/, label: "requests (use frappe.call)" },
17
+ { pattern: /from\s+requests\s+import/, label: "requests (use frappe.call)" },
18
+
19
+ // Raw database access — use Frappe ORM
20
+ { pattern: /cursor\.execute\s*\(/, label: "raw SQL cursor (use frappe.db.sql or ORM)" },
21
+ { pattern: /pymysql|psycopg2|sqlite3\.connect/, label: "direct DB driver (use Frappe ORM)" },
22
+ { pattern: /mongoose|sequelize|typeorm/i, label: "external ORM (use Frappe DocType)" },
23
+
24
+ // Custom auth — use frappe.whitelist()
25
+ { pattern: /jwt\.sign|jsonwebtoken/, label: "JWT auth (use frappe.whitelist + session)" },
26
+ { pattern: /passport\.authenticate/, label: "passport auth (use Frappe auth)" },
27
+
28
+ // External data processing — use Frappe reports/scripts
29
+ { pattern: /import\s+pandas/, label: "pandas (use Frappe Script Report)" },
30
+ { pattern: /import\s+numpy/, label: "numpy (use Frappe computation)" },
31
+
32
+ // File system — use Frappe file manager
33
+ { pattern: /fs\.writeFileSync|fs\.readFileSync/, label: "raw fs (use frappe.get_file_url or File DocType)" },
34
+
35
+ // HTTP server — use Frappe whitelisted methods
36
+ { pattern: /express\(\)|fastapi|flask\.Flask/, label: "external web framework (use Frappe whitelist)" },
37
+ ];
38
+
39
+ /**
40
+ * Scans `content` for non-Frappe-native patterns.
41
+ *
42
+ * - No detected patterns → { passed: true }
43
+ * - Detected + no justification → { passed: false, requiresJustification: true, ... }
44
+ * - Detected + justification provided → { passed: true, result: "override", ... }
45
+ */
46
+ export function checkFrappeNative(content: string, justification?: string): NativeCheckResult {
47
+ const detectedPatterns = NON_NATIVE_PATTERNS
48
+ .filter(({ pattern }) => pattern.test(content))
49
+ .map(({ label }) => label);
50
+
51
+ if (detectedPatterns.length === 0) {
52
+ return { passed: true };
53
+ }
54
+
55
+ if (justification) {
56
+ return { passed: true, result: "override", justification, detectedPatterns };
57
+ }
58
+
59
+ return {
60
+ passed: false,
61
+ requiresJustification: true,
62
+ message: "This uses a non-Frappe-native approach. Justification required to proceed.",
63
+ detectedPatterns,
64
+ };
65
+ }
@@ -0,0 +1,65 @@
1
+ /**
2
+ * gates/permission-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
+ * Scans Python code for @frappe.whitelist() decorated methods that lack
7
+ * a permission check inside their function body. (FR26)
8
+ */
9
+ import type { GateContext, GateResult } from "./types.js";
10
+
11
+ const PERMISSION_PATTERNS = [
12
+ /frappe\.has_permission\s*\(/,
13
+ /frappe\.only_for\s*\(/,
14
+ /frappe\.check_permission\s*\(/,
15
+ /frappe\.has_role\s*\(/,
16
+ /frappe\.session\.user/,
17
+ ];
18
+
19
+ function getLineNumber(code: string, offset: number): number {
20
+ return code.slice(0, offset).split("\n").length;
21
+ }
22
+
23
+ function extractFunctionBody(code: string, defStart: number): string {
24
+ const bodyStart = code.indexOf("\n", defStart) + 1;
25
+ // Find next top-level def/class/decorator (at column 0)
26
+ const nextTopLevel = /\n(?=def |class |@)/g;
27
+ nextTopLevel.lastIndex = bodyStart;
28
+ const match = nextTopLevel.exec(code);
29
+ return match ? code.slice(bodyStart, match.index) : code.slice(bodyStart);
30
+ }
31
+
32
+ function hasPermissionCheck(body: string): boolean {
33
+ return PERMISSION_PATTERNS.some((p) => p.test(body));
34
+ }
35
+
36
+ export function permissionCheck(code: string, context: GateContext): GateResult {
37
+ // Only scan Python files
38
+ if (!context.file.endsWith(".py")) return { passed: true };
39
+
40
+ // Find all @frappe.whitelist(...) followed by a def
41
+ const WHITELIST_DECORATOR = /@frappe\.whitelist\([^)]*\)\s*\ndef\s+(\w+)/g;
42
+
43
+ const violations: Array<{ method: string; line: number; reason: string }> = [];
44
+ let match: RegExpExecArray | null;
45
+
46
+ while ((match = WHITELIST_DECORATOR.exec(code)) !== null) {
47
+ const decoratorOffset = match.index;
48
+ const methodName = match[1];
49
+ const line = getLineNumber(code, decoratorOffset);
50
+
51
+ // defStart: position of "def " within the full match
52
+ const defStart = code.indexOf("\ndef ", decoratorOffset) + 1;
53
+ const body = extractFunctionBody(code, defStart);
54
+
55
+ if (!hasPermissionCheck(body)) {
56
+ violations.push({ method: methodName, line, reason: "missing permission check" });
57
+ }
58
+ }
59
+
60
+ if (violations.length > 0) {
61
+ return { passed: false, violations };
62
+ }
63
+
64
+ return { passed: true };
65
+ }
@@ -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,47 @@
1
+ {
2
+ "name": "frappe-builder",
3
+ "version": "1.1.0-dev.10",
4
+ "description": "Frappe-native AI co-pilot for building and customising Frappe/ERPNext applications",
5
+ "type": "module",
6
+ "bin": {
7
+ "frappe-builder": "./dist/cli.mjs"
8
+ },
9
+ "pi": {
10
+ "_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.",
11
+ "extensions": [
12
+ "./extensions/frappe-session.ts",
13
+ "./extensions/frappe-state.ts",
14
+ "./extensions/frappe-workflow.ts",
15
+ "./extensions/frappe-tools.ts",
16
+ "./extensions/frappe-gates.ts",
17
+ "./extensions/frappe-ui.ts"
18
+ ],
19
+ "agents": "./AGENTS.md"
20
+ },
21
+ "scripts": {
22
+ "build": "bun build --compile --minify src/cli.ts --outfile frappe-builder",
23
+ "build:ts": "tsdown",
24
+ "test": "vitest run",
25
+ "dev": "pi -e ./extensions/frappe-state.ts",
26
+ "typecheck": "tsc --noEmit",
27
+ "release": "node scripts/bump-version.mjs"
28
+ },
29
+ "keywords": [],
30
+ "author": "",
31
+ "license": "ISC",
32
+ "devDependencies": {
33
+ "@types/node": "^25.5.0",
34
+ "tsdown": "^0.21.4",
35
+ "typescript": "^5.9.3",
36
+ "vitest": "^4.1.0"
37
+ },
38
+ "dependencies": {
39
+ "@mariozechner/pi-agent-core": "0.62.0",
40
+ "@mariozechner/pi-ai": "0.62.0",
41
+ "@mariozechner/pi-coding-agent": "^0.63.1",
42
+ "@types/better-sqlite3": "^7.6.13",
43
+ "better-sqlite3": "^12.8.0",
44
+ "execa": "^9.6.1",
45
+ "robot3": "^1.2.0"
46
+ }
47
+ }
@@ -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