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,160 @@
1
+ /**
2
+ * extensions/frappe-gates.ts — Quality Gate Orchestrator (Story 6.1)
3
+ *
4
+ * Intercepts Write/Edit/NotebookEdit tool calls and runs all gates in gates/
5
+ * sequentially before the file write executes. Blocks on first failure.
6
+ *
7
+ * Extension load order (beforeToolCall chain):
8
+ * 1. frappe-ui.ts → announces "→ Calling {tool} [{phase}]"
9
+ * 2. frappe-workflow.ts → FSM phase guard (may block out-of-phase calls)
10
+ * 3. frappe-gates.ts → quality gate scan (this file — may block bad code)
11
+ * 4. [tool executes]
12
+ */
13
+ import { getCurrentPhase, db } from "../state/db.js";
14
+ import { appendEntry } from "../state/journal.js";
15
+ import { checkFrappeNative } from "../gates/frappe-native-check.js";
16
+ import type { GateFn, GateContext, GateResult } from "../gates/types.js";
17
+
18
+ // Adapt frappe-native-check's custom result type to the standard GateResult
19
+ function nativeAdapter(code: string, _context: GateContext): GateResult {
20
+ const r = checkFrappeNative(code);
21
+ if (r.passed) return { passed: true };
22
+ return {
23
+ passed: false,
24
+ violations: [
25
+ {
26
+ reason: (r as { message: string }).message,
27
+ detectedPatterns: (r as { detectedPatterns: string[] }).detectedPatterns,
28
+ },
29
+ ],
30
+ };
31
+ }
32
+
33
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
34
+ type AnyModule = Record<string, any>;
35
+
36
+ function tryLoadGate(mod: AnyModule, exportName: string, gateName: string): { name: string; fn: GateFn } | null {
37
+ const fn = mod[exportName];
38
+ if (typeof fn === "function") return { name: gateName, fn: fn as GateFn };
39
+ console.warn(`[GATE WARNING: ${gateName} gate not yet implemented — skipping]`);
40
+ return null;
41
+ }
42
+
43
+ import * as permCheckMod from "../gates/permission-check.js";
44
+ import * as queryCheckMod from "../gates/query-check.js";
45
+ import * as serverCheckMod from "../gates/server-side-check.js";
46
+ import * as coverageCheckMod from "../gates/coverage-check.js";
47
+ import * as styleCheckMod from "../gates/style-check.js";
48
+
49
+ // Gate registry — frappe_native always present (Story 4.5); others optional until 6.2–6.6
50
+ const GATE_REGISTRY: Array<{ name: string; fn: GateFn }> = [
51
+ { name: "frappe_native", fn: nativeAdapter },
52
+ ];
53
+
54
+ for (const [mod, exportName, gateName] of [
55
+ [permCheckMod, "permissionCheck", "permission_check"],
56
+ [queryCheckMod, "queryCheck", "query_check"],
57
+ [serverCheckMod, "serverSideCheck", "server_side_check"],
58
+ [coverageCheckMod, "coverageCheck", "coverage_check"],
59
+ [styleCheckMod, "styleCheck", "style_check"],
60
+ ] as [AnyModule, string, string][]) {
61
+ const entry = tryLoadGate(mod, exportName, gateName);
62
+ if (entry) GATE_REGISTRY.push(entry);
63
+ }
64
+
65
+ export const FILE_WRITE_TOOLS = new Set(["Write", "Edit", "NotebookEdit"]);
66
+
67
+ export interface BlockedGateResponse {
68
+ blocked: true;
69
+ tool: string;
70
+ gate: string;
71
+ file: string;
72
+ violations: Array<{ line?: number; reason: string; [key: string]: unknown }>;
73
+ message: string;
74
+ }
75
+
76
+ function getActiveSessionId(): string {
77
+ try {
78
+ const row = db
79
+ .prepare("SELECT session_id FROM sessions WHERE is_active = 1 LIMIT 1")
80
+ .get() as { session_id: string } | undefined;
81
+ return row?.session_id ?? "unknown";
82
+ } catch {
83
+ return "unknown";
84
+ }
85
+ }
86
+
87
+ /**
88
+ * Runs all registered gates against the code being written. Returns a block
89
+ * response on the first gate failure, or undefined to allow the write.
90
+ * Exported for unit testing.
91
+ */
92
+ export function runGates(
93
+ toolName: string,
94
+ args: Record<string, unknown>
95
+ ): BlockedGateResponse | undefined {
96
+ if (!FILE_WRITE_TOOLS.has(toolName)) return undefined;
97
+
98
+ const file = (args.file_path ?? args.notebook_path ?? args.path ?? "") as string;
99
+ const code = (args.content ?? args.new_string ?? "") as string;
100
+
101
+ let phase = "idle";
102
+ try { phase = getCurrentPhase(); } catch { /* swallow */ }
103
+
104
+ const sessionId = getActiveSessionId();
105
+ const context: GateContext = { file, phase, sessionId };
106
+
107
+ for (const gate of GATE_REGISTRY) {
108
+ let result: GateResult;
109
+
110
+ try {
111
+ result = gate.fn(code, context);
112
+ if (typeof result !== "object" || result === null || !("passed" in result)) {
113
+ console.warn(`[GATE WARNING: ${gate.name} returned unexpected shape]`);
114
+ appendEntry({
115
+ ts: new Date().toISOString(),
116
+ sessionId,
117
+ type: "quality_gate",
118
+ payload: { gate: gate.name, result: "error", file, error: "unexpected result shape" },
119
+ });
120
+ continue;
121
+ }
122
+ } catch (err) {
123
+ appendEntry({
124
+ ts: new Date().toISOString(),
125
+ sessionId,
126
+ type: "quality_gate",
127
+ payload: { gate: gate.name, result: "error", file, error: String(err) },
128
+ });
129
+ continue;
130
+ }
131
+
132
+ appendEntry({
133
+ ts: new Date().toISOString(),
134
+ sessionId,
135
+ type: "quality_gate",
136
+ payload: { gate: gate.name, result: result.passed ? "pass" : "blocked", file },
137
+ });
138
+
139
+ if (!result.passed) {
140
+ const violations = result.violations;
141
+ return {
142
+ blocked: true,
143
+ tool: toolName,
144
+ gate: gate.name,
145
+ file,
146
+ violations,
147
+ message: `${gate.name} gate blocked write to ${file}: ${violations[0]?.reason ?? "violation"}`,
148
+ };
149
+ }
150
+ }
151
+
152
+ return undefined;
153
+ }
154
+
155
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
156
+ export default function (pi: any) {
157
+ pi.on("tool_call", (event: { toolName?: string; input?: Record<string, unknown> }) => {
158
+ return runGates(event.toolName ?? "", event.input ?? {});
159
+ });
160
+ }
@@ -0,0 +1,324 @@
1
+ import { readFileSync, existsSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { homedir } from "node:os";
4
+ import { randomUUID } from "node:crypto";
5
+ import { db } from "../state/db.js";
6
+ import { createFsmAtPhase, type Phase } from "../state/fsm.js";
7
+
8
+ /** Maps FSM phases to their specialist names. frappe-debugger is manually invoked (Story 3.5). */
9
+ export const PHASE_TO_SPECIALIST: Record<string, string | null> = {
10
+ idle: null,
11
+ requirements: "frappe-ba",
12
+ architecture: "frappe-architect",
13
+ planning: "frappe-planner",
14
+ implementation: "frappe-dev",
15
+ testing: "frappe-qa",
16
+ documentation: "frappe-docs",
17
+ };
18
+
19
+ /** Context object injected into a specialist's activation block. */
20
+ export interface SpecialistContext {
21
+ activeProject: string;
22
+ featureName: string;
23
+ currentPhase: string;
24
+ progressDone: number;
25
+ progressTotal: number;
26
+ lastTool: string;
27
+ }
28
+
29
+ /**
30
+ * Builds specialist context by reading the active session and feature from state.db.
31
+ * Synchronous (better-sqlite3). Never throws — returns safe defaults on any failure.
32
+ */
33
+ export function buildStateContext(featureId: string | null, lastTool = ""): SpecialistContext {
34
+ const defaults: SpecialistContext = {
35
+ activeProject: "unknown",
36
+ featureName: "unknown",
37
+ currentPhase: "idle",
38
+ progressDone: 0,
39
+ progressTotal: 0,
40
+ lastTool: lastTool || "none",
41
+ };
42
+ try {
43
+ const session = db
44
+ .prepare(
45
+ "SELECT project_id, feature_id, current_phase, last_tool FROM sessions WHERE is_active = 1 LIMIT 1"
46
+ )
47
+ .get() as {
48
+ project_id: string;
49
+ feature_id: string | null;
50
+ current_phase: string;
51
+ last_tool: string | null;
52
+ } | undefined;
53
+
54
+ if (!session) return defaults;
55
+
56
+ const fid = featureId ?? session.feature_id ?? null;
57
+ const feature = fid
58
+ ? (db.prepare("SELECT name FROM features WHERE feature_id = ?").get(fid) as { name: string } | undefined)
59
+ : undefined;
60
+
61
+ const components = fid
62
+ ? (db.prepare("SELECT status FROM components WHERE feature_id = ?").all(fid) as { status: string }[])
63
+ : [];
64
+
65
+ const done = components.filter((c) => c.status === "complete").length;
66
+
67
+ return {
68
+ activeProject: session.project_id ?? "unknown",
69
+ featureName: feature?.name ?? "unknown",
70
+ currentPhase: session.current_phase ?? "idle",
71
+ progressDone: done,
72
+ progressTotal: components.length,
73
+ lastTool: lastTool || session.last_tool || "none",
74
+ };
75
+ } catch {
76
+ return defaults;
77
+ }
78
+ }
79
+
80
+ /**
81
+ * Returns a formatted specialist activation block for the given phase.
82
+ * Returns empty string for idle phase (no specialist) or unknown phases.
83
+ * Pure function — no DB access, no side effects.
84
+ */
85
+ export function loadSpecialist(phase: string, ctx: SpecialistContext): string {
86
+ const specialistName = PHASE_TO_SPECIALIST[phase] ?? null;
87
+ if (!specialistName) return "";
88
+ return [
89
+ `## Active Specialist: ${specialistName}`,
90
+ `Project: ${ctx.activeProject} | Feature: ${ctx.featureName} | Phase: ${ctx.currentPhase}`,
91
+ `Progress: ${ctx.progressDone}/${ctx.progressTotal} components | Last tool: ${ctx.lastTool}`,
92
+ ].join("\n");
93
+ }
94
+
95
+ /**
96
+ * Returns a formatted activation block for the frappe-debugger specialist.
97
+ * frappe-debugger is NOT phase-driven — it is invoked directly (Story 3.5).
98
+ * Never throws — pure function, no DB access.
99
+ */
100
+ export function loadDebuggerSpecialist(ctx: SpecialistContext): string {
101
+ return [
102
+ `## Active Specialist: frappe-debugger`,
103
+ `Project: ${ctx.activeProject} | Feature: ${ctx.featureName} | Phase: ${ctx.currentPhase}`,
104
+ `Progress: ${ctx.progressDone}/${ctx.progressTotal} components | Last tool: ${ctx.lastTool}`,
105
+ ].join("\n");
106
+ }
107
+
108
+ /** Row shapes returned from SQLite queries. */
109
+ interface SessionRow {
110
+ session_id: string;
111
+ project_id: string;
112
+ site_path: string | null;
113
+ feature_id: string | null;
114
+ current_phase: string;
115
+ last_tool: string | null;
116
+ is_active: number;
117
+ }
118
+
119
+ interface FeatureRow {
120
+ feature_id: string;
121
+ name: string;
122
+ current_phase: string;
123
+ }
124
+
125
+ interface ComponentRow {
126
+ component_id: string;
127
+ feature_id: string;
128
+ status: string;
129
+ }
130
+
131
+ /** Reconstructed session context used for prompt injection. */
132
+ export interface SessionContext {
133
+ projectId: string;
134
+ sitePath?: string | null;
135
+ featureName: string | null;
136
+ phase: string;
137
+ componentsDone: number;
138
+ componentsTotal: number;
139
+ lastTool: string | null;
140
+ }
141
+
142
+ /** Returns the sessions directory for JSONL files. */
143
+ function getSessionsDir(): string {
144
+ return join(homedir(), ".frappe-builder", "sessions");
145
+ }
146
+
147
+ /** Reads the last N non-empty lines from a JSONL file efficiently. */
148
+ function readLastLines(filePath: string, n: number): string[] {
149
+ if (!existsSync(filePath)) return [];
150
+ const content = readFileSync(filePath, "utf-8");
151
+ return content.split("\n").filter(Boolean).slice(-n);
152
+ }
153
+
154
+ /** Returns a blank session context for fresh/unknown starts. */
155
+ function freshSession(): SessionContext {
156
+ return {
157
+ projectId: "unknown",
158
+ sitePath: null,
159
+ featureName: null,
160
+ phase: "idle",
161
+ componentsDone: 0,
162
+ componentsTotal: 0,
163
+ lastTool: null,
164
+ };
165
+ }
166
+
167
+ /** Creates a fresh session row in the sessions table. */
168
+ function createFreshSession(projectId = "default"): void {
169
+ db.prepare(`
170
+ INSERT INTO sessions (session_id, project_id, current_phase, started_at, is_active)
171
+ VALUES (?, ?, 'idle', ?, 1)
172
+ `).run(randomUUID(), projectId, new Date().toISOString());
173
+ }
174
+
175
+ /**
176
+ * Reconstructs session context from SQLite state.
177
+ * On any error returns a fresh idle context and logs a warning — never throws.
178
+ */
179
+ export async function reconstructSession(): Promise<SessionContext> {
180
+ try {
181
+ const session = db
182
+ .prepare("SELECT * FROM sessions WHERE is_active = 1 LIMIT 1")
183
+ .get() as SessionRow | undefined;
184
+
185
+ if (!session) {
186
+ createFreshSession();
187
+ return freshSession();
188
+ }
189
+
190
+ const feature = session.feature_id
191
+ ? (db
192
+ .prepare("SELECT * FROM features WHERE feature_id = ?")
193
+ .get(session.feature_id) as FeatureRow | undefined)
194
+ : undefined;
195
+
196
+ const components = feature
197
+ ? (db
198
+ .prepare("SELECT * FROM components WHERE feature_id = ?")
199
+ .all(feature.feature_id) as ComponentRow[])
200
+ : [];
201
+
202
+ const done = components.filter((c) => c.status === "complete").length;
203
+
204
+ return {
205
+ projectId: session.project_id,
206
+ sitePath: session.site_path ?? null,
207
+ featureName: feature?.name ?? null,
208
+ phase: session.current_phase,
209
+ componentsDone: done,
210
+ componentsTotal: components.length,
211
+ lastTool: session.last_tool ?? null,
212
+ };
213
+ } catch (err) {
214
+ console.warn(
215
+ `[frappe-session] State reconstruction failed: ${err}. Starting fresh.`
216
+ );
217
+ return freshSession();
218
+ }
219
+ }
220
+
221
+ /**
222
+ * Builds the concise state injection string for the system prompt.
223
+ * Kept under 500 tokens to respect NFR2 (≤15% context window).
224
+ */
225
+ export function buildStateInjection(ctx: SessionContext): string {
226
+ const progress =
227
+ ctx.componentsTotal > 0
228
+ ? `${ctx.componentsDone}/${ctx.componentsTotal} components complete`
229
+ : "no components tracked";
230
+
231
+ const lines = [
232
+ "=== FRAPPE-BUILDER SESSION CONTEXT ===",
233
+ `Project: ${ctx.projectId}`,
234
+ ];
235
+ if (ctx.sitePath) lines.push(`Site: ${ctx.sitePath}`);
236
+ lines.push(
237
+ `Feature: ${ctx.featureName ?? "none"}`,
238
+ `Phase: ${ctx.phase}`,
239
+ `Progress: ${progress}`,
240
+ `Last action: ${ctx.lastTool ?? "none"}`,
241
+ "======================================"
242
+ );
243
+ return lines.join("\n");
244
+ }
245
+
246
+ /**
247
+ * Returns the current FSM phase from the active session, validated via the Robot3 FSM.
248
+ * Creates a fast-forward FSM instance to confirm the stored phase is a known state.
249
+ * Falls back to "idle" on any error.
250
+ */
251
+ export function getRestoredPhase(): Phase {
252
+ try {
253
+ const row = db
254
+ .prepare("SELECT current_phase FROM sessions WHERE is_active = 1 LIMIT 1")
255
+ .get() as { current_phase: string } | undefined;
256
+ const phase = (row?.current_phase ?? "idle") as Phase;
257
+ createFsmAtPhase(phase); // validates phase is a known FSM state
258
+ return phase;
259
+ } catch {
260
+ return "idle";
261
+ }
262
+ }
263
+
264
+ /**
265
+ * Session start handler — reconstructs state from SQLite and returns the
266
+ * system prompt injection string. Call this at agent startup before the
267
+ * first LLM prompt is sent (NFR1: must complete in <500ms).
268
+ *
269
+ * Includes specialist activation block when phase is not idle (Story 3.4).
270
+ * Never throws — on any failure returns a fresh idle context.
271
+ */
272
+ export async function handleSessionStart(): Promise<string> {
273
+ try {
274
+ const ctx = await reconstructSession();
275
+
276
+ // Read last 10 JSONL entries for additional context (last action detail)
277
+ const sessionRow = db
278
+ .prepare("SELECT session_id FROM sessions WHERE is_active = 1 LIMIT 1")
279
+ .get() as { session_id: string } | undefined;
280
+
281
+ if (sessionRow) {
282
+ const journalPath = join(
283
+ getSessionsDir(),
284
+ `${sessionRow.session_id}.jsonl`
285
+ );
286
+ readLastLines(journalPath, 10); // read for context; unused in prompt for now
287
+ }
288
+
289
+ const stateBlock = buildStateInjection(ctx);
290
+
291
+ // Specialist auto-load on session resume (Story 3.4)
292
+ // AGENTS.md base identity (Nexus) is loaded natively by pi from project root.
293
+ if (ctx.phase !== "idle") {
294
+ try {
295
+ const specCtx = buildStateContext(null, "session_start");
296
+ const specialistBlock = loadSpecialist(ctx.phase, specCtx);
297
+ if (specialistBlock) return `${stateBlock}\n\n${specialistBlock}`;
298
+ } catch (specialistErr) {
299
+ console.warn(`[frappe-session] specialist load failed at session start: ${specialistErr}`);
300
+ }
301
+ }
302
+
303
+ return stateBlock;
304
+ } catch (err) {
305
+ console.warn(`[frappe-session] handleSessionStart failed: ${err}. Using idle context.`);
306
+ return buildStateInjection(freshSession());
307
+ }
308
+ }
309
+
310
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
311
+ export default function (pi: any) {
312
+ pi.on("session_start", async () => {
313
+ await handleSessionStart();
314
+ });
315
+ }
316
+
317
+ /**
318
+ * Reloads session context after a project switch.
319
+ * Reconstructs state from SQLite and returns the updated prompt injection string.
320
+ * Called by setActiveProject() after switchProject() creates the new session.
321
+ */
322
+ export async function reloadSessionContext(): Promise<void> {
323
+ await handleSessionStart();
324
+ }