frappe-builder 1.1.0-dev.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.fb/state.db +0 -0
- package/AGENTS.md +167 -0
- package/README.md +89 -0
- package/_bmad/_config/agent-manifest.csv +10 -0
- package/_bmad/_config/agents/bmm-analyst.customize.yaml +41 -0
- package/_bmad/_config/agents/bmm-architect.customize.yaml +41 -0
- package/_bmad/_config/agents/bmm-dev.customize.yaml +41 -0
- package/_bmad/_config/agents/bmm-pm.customize.yaml +41 -0
- package/_bmad/_config/agents/bmm-qa.customize.yaml +41 -0
- package/_bmad/_config/agents/bmm-quick-flow-solo-dev.customize.yaml +41 -0
- package/_bmad/_config/agents/bmm-sm.customize.yaml +41 -0
- package/_bmad/_config/agents/bmm-tech-writer.customize.yaml +41 -0
- package/_bmad/_config/agents/bmm-ux-designer.customize.yaml +41 -0
- package/_bmad/_config/bmad-help.csv +47 -0
- package/_bmad/_config/files-manifest.csv +369 -0
- package/_bmad/_config/ides/claude-code.yaml +5 -0
- package/_bmad/_config/manifest.yaml +28 -0
- package/_bmad/_config/skill-manifest.csv +41 -0
- package/_bmad/_config/task-manifest.csv +1 -0
- package/_bmad/_config/tool-manifest.csv +1 -0
- package/_bmad/_config/workflow-manifest.csv +1 -0
- package/_bmad/_memory/config.yaml +11 -0
- package/_bmad/_memory/tech-writer-sidecar/documentation-standards.md +224 -0
- package/_bmad/bmm/agents/analyst.md +69 -0
- package/_bmad/bmm/agents/architect.md +59 -0
- package/_bmad/bmm/agents/bmad-skill-manifest.yaml +39 -0
- package/_bmad/bmm/agents/dev.md +66 -0
- package/_bmad/bmm/agents/pm.md +63 -0
- package/_bmad/bmm/agents/qa.md +89 -0
- package/_bmad/bmm/agents/quick-flow-solo-dev.md +61 -0
- package/_bmad/bmm/agents/sm.md +67 -0
- package/_bmad/bmm/agents/tech-writer/bmad-skill-manifest.yaml +3 -0
- package/_bmad/bmm/agents/tech-writer/tech-writer.md +67 -0
- package/_bmad/bmm/agents/ux-designer.md +58 -0
- package/_bmad/bmm/config.yaml +16 -0
- package/_bmad/bmm/data/project-context-template.md +26 -0
- package/_bmad/bmm/module-help.csv +32 -0
- package/_bmad/bmm/teams/default-party.csv +20 -0
- package/_bmad/bmm/teams/team-fullstack.yaml +12 -0
- package/_bmad/bmm/workflows/1-analysis/bmad-create-product-brief/SKILL.md +6 -0
- package/_bmad/bmm/workflows/1-analysis/bmad-create-product-brief/bmad-skill-manifest.yaml +1 -0
- package/_bmad/bmm/workflows/1-analysis/bmad-create-product-brief/product-brief.template.md +10 -0
- package/_bmad/bmm/workflows/1-analysis/bmad-create-product-brief/steps/step-01-init.md +170 -0
- package/_bmad/bmm/workflows/1-analysis/bmad-create-product-brief/steps/step-01b-continue.md +158 -0
- package/_bmad/bmm/workflows/1-analysis/bmad-create-product-brief/steps/step-02-vision.md +193 -0
- package/_bmad/bmm/workflows/1-analysis/bmad-create-product-brief/steps/step-03-users.md +196 -0
- package/_bmad/bmm/workflows/1-analysis/bmad-create-product-brief/steps/step-04-metrics.md +199 -0
- package/_bmad/bmm/workflows/1-analysis/bmad-create-product-brief/steps/step-05-scope.md +213 -0
- package/_bmad/bmm/workflows/1-analysis/bmad-create-product-brief/steps/step-06-complete.md +159 -0
- package/_bmad/bmm/workflows/1-analysis/bmad-create-product-brief/workflow.md +55 -0
- package/_bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/SKILL.md +88 -0
- package/_bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/agents/artifact-analyzer.md +60 -0
- package/_bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/agents/opportunity-reviewer.md +44 -0
- package/_bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/agents/skeptic-reviewer.md +44 -0
- package/_bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/agents/web-researcher.md +49 -0
- package/_bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/bmad-manifest.json +17 -0
- package/_bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/bmad-skill-manifest.yaml +1 -0
- package/_bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/prompts/contextual-discovery.md +57 -0
- package/_bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/prompts/draft-and-review.md +86 -0
- package/_bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/prompts/finalize.md +75 -0
- package/_bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/prompts/guided-elicitation.md +70 -0
- package/_bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/resources/brief-template.md +60 -0
- package/_bmad/bmm/workflows/1-analysis/research/bmad-domain-research/SKILL.md +6 -0
- package/_bmad/bmm/workflows/1-analysis/research/bmad-domain-research/bmad-skill-manifest.yaml +1 -0
- package/_bmad/bmm/workflows/1-analysis/research/bmad-domain-research/domain-steps/step-01-init.md +137 -0
- package/_bmad/bmm/workflows/1-analysis/research/bmad-domain-research/domain-steps/step-02-domain-analysis.md +229 -0
- package/_bmad/bmm/workflows/1-analysis/research/bmad-domain-research/domain-steps/step-03-competitive-landscape.md +238 -0
- package/_bmad/bmm/workflows/1-analysis/research/bmad-domain-research/domain-steps/step-04-regulatory-focus.md +206 -0
- package/_bmad/bmm/workflows/1-analysis/research/bmad-domain-research/domain-steps/step-05-technical-trends.md +234 -0
- package/_bmad/bmm/workflows/1-analysis/research/bmad-domain-research/domain-steps/step-06-research-synthesis.md +444 -0
- package/_bmad/bmm/workflows/1-analysis/research/bmad-domain-research/research.template.md +29 -0
- package/_bmad/bmm/workflows/1-analysis/research/bmad-domain-research/workflow.md +49 -0
- package/_bmad/bmm/workflows/1-analysis/research/bmad-market-research/SKILL.md +6 -0
- package/_bmad/bmm/workflows/1-analysis/research/bmad-market-research/bmad-skill-manifest.yaml +1 -0
- package/_bmad/bmm/workflows/1-analysis/research/bmad-market-research/research.template.md +29 -0
- package/_bmad/bmm/workflows/1-analysis/research/bmad-market-research/steps/step-01-init.md +184 -0
- package/_bmad/bmm/workflows/1-analysis/research/bmad-market-research/steps/step-02-customer-behavior.md +239 -0
- package/_bmad/bmm/workflows/1-analysis/research/bmad-market-research/steps/step-03-customer-pain-points.md +251 -0
- package/_bmad/bmm/workflows/1-analysis/research/bmad-market-research/steps/step-04-customer-decisions.md +261 -0
- package/_bmad/bmm/workflows/1-analysis/research/bmad-market-research/steps/step-05-competitive-analysis.md +173 -0
- package/_bmad/bmm/workflows/1-analysis/research/bmad-market-research/steps/step-06-research-completion.md +478 -0
- package/_bmad/bmm/workflows/1-analysis/research/bmad-market-research/workflow.md +49 -0
- package/_bmad/bmm/workflows/1-analysis/research/bmad-technical-research/SKILL.md +6 -0
- package/_bmad/bmm/workflows/1-analysis/research/bmad-technical-research/bmad-skill-manifest.yaml +1 -0
- package/_bmad/bmm/workflows/1-analysis/research/bmad-technical-research/research.template.md +29 -0
- package/_bmad/bmm/workflows/1-analysis/research/bmad-technical-research/technical-steps/step-01-init.md +137 -0
- package/_bmad/bmm/workflows/1-analysis/research/bmad-technical-research/technical-steps/step-02-technical-overview.md +239 -0
- package/_bmad/bmm/workflows/1-analysis/research/bmad-technical-research/technical-steps/step-03-integration-patterns.md +248 -0
- package/_bmad/bmm/workflows/1-analysis/research/bmad-technical-research/technical-steps/step-04-architectural-patterns.md +202 -0
- package/_bmad/bmm/workflows/1-analysis/research/bmad-technical-research/technical-steps/step-05-implementation-research.md +233 -0
- package/_bmad/bmm/workflows/1-analysis/research/bmad-technical-research/technical-steps/step-06-research-synthesis.md +487 -0
- package/_bmad/bmm/workflows/1-analysis/research/bmad-technical-research/workflow.md +50 -0
- package/_bmad/bmm/workflows/1-analysis/research/market-steps/step-01-init.md +182 -0
- package/_bmad/bmm/workflows/1-analysis/research/market-steps/step-02-customer-behavior.md +237 -0
- package/_bmad/bmm/workflows/1-analysis/research/market-steps/step-03-customer-pain-points.md +249 -0
- package/_bmad/bmm/workflows/1-analysis/research/market-steps/step-04-customer-decisions.md +259 -0
- package/_bmad/bmm/workflows/1-analysis/research/market-steps/step-05-competitive-analysis.md +177 -0
- package/_bmad/bmm/workflows/1-analysis/research/market-steps/step-06-research-completion.md +476 -0
- package/_bmad/bmm/workflows/1-analysis/research/research.template.md +29 -0
- package/_bmad/bmm/workflows/2-plan-workflows/bmad-create-ux-design/SKILL.md +6 -0
- package/_bmad/bmm/workflows/2-plan-workflows/bmad-create-ux-design/bmad-skill-manifest.yaml +1 -0
- package/_bmad/bmm/workflows/2-plan-workflows/bmad-create-ux-design/steps/step-01-init.md +135 -0
- package/_bmad/bmm/workflows/2-plan-workflows/bmad-create-ux-design/steps/step-01b-continue.md +127 -0
- package/_bmad/bmm/workflows/2-plan-workflows/bmad-create-ux-design/steps/step-02-discovery.md +190 -0
- package/_bmad/bmm/workflows/2-plan-workflows/bmad-create-ux-design/steps/step-03-core-experience.md +217 -0
- package/_bmad/bmm/workflows/2-plan-workflows/bmad-create-ux-design/steps/step-04-emotional-response.md +220 -0
- package/_bmad/bmm/workflows/2-plan-workflows/bmad-create-ux-design/steps/step-05-inspiration.md +235 -0
- package/_bmad/bmm/workflows/2-plan-workflows/bmad-create-ux-design/steps/step-06-design-system.md +253 -0
- package/_bmad/bmm/workflows/2-plan-workflows/bmad-create-ux-design/steps/step-07-defining-experience.md +255 -0
- package/_bmad/bmm/workflows/2-plan-workflows/bmad-create-ux-design/steps/step-08-visual-foundation.md +225 -0
- package/_bmad/bmm/workflows/2-plan-workflows/bmad-create-ux-design/steps/step-09-design-directions.md +225 -0
- package/_bmad/bmm/workflows/2-plan-workflows/bmad-create-ux-design/steps/step-10-user-journeys.md +242 -0
- package/_bmad/bmm/workflows/2-plan-workflows/bmad-create-ux-design/steps/step-11-component-strategy.md +249 -0
- package/_bmad/bmm/workflows/2-plan-workflows/bmad-create-ux-design/steps/step-12-ux-patterns.md +238 -0
- package/_bmad/bmm/workflows/2-plan-workflows/bmad-create-ux-design/steps/step-13-responsive-accessibility.md +265 -0
- package/_bmad/bmm/workflows/2-plan-workflows/bmad-create-ux-design/steps/step-14-complete.md +171 -0
- package/_bmad/bmm/workflows/2-plan-workflows/bmad-create-ux-design/ux-design-template.md +13 -0
- package/_bmad/bmm/workflows/2-plan-workflows/bmad-create-ux-design/workflow.md +36 -0
- package/_bmad/bmm/workflows/2-plan-workflows/bmad-edit-prd/SKILL.md +6 -0
- package/_bmad/bmm/workflows/2-plan-workflows/bmad-edit-prd/bmad-skill-manifest.yaml +1 -0
- package/_bmad/bmm/workflows/2-plan-workflows/bmad-edit-prd/steps-e/step-e-01-discovery.md +242 -0
- package/_bmad/bmm/workflows/2-plan-workflows/bmad-edit-prd/steps-e/step-e-01b-legacy-conversion.md +204 -0
- package/_bmad/bmm/workflows/2-plan-workflows/bmad-edit-prd/steps-e/step-e-02-review.md +245 -0
- package/_bmad/bmm/workflows/2-plan-workflows/bmad-edit-prd/steps-e/step-e-03-edit.md +250 -0
- package/_bmad/bmm/workflows/2-plan-workflows/bmad-edit-prd/steps-e/step-e-04-complete.md +165 -0
- package/_bmad/bmm/workflows/2-plan-workflows/bmad-edit-prd/workflow.md +63 -0
- package/_bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/SKILL.md +6 -0
- package/_bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/bmad-skill-manifest.yaml +1 -0
- package/_bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/data/domain-complexity.csv +15 -0
- package/_bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/data/prd-purpose.md +197 -0
- package/_bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/data/project-types.csv +11 -0
- package/_bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-01-discovery.md +221 -0
- package/_bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-02-format-detection.md +188 -0
- package/_bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-02b-parity-check.md +206 -0
- package/_bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-03-density-validation.md +171 -0
- package/_bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-04-brief-coverage-validation.md +211 -0
- package/_bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-05-measurability-validation.md +225 -0
- package/_bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-06-traceability-validation.md +214 -0
- package/_bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-07-implementation-leakage-validation.md +202 -0
- package/_bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-08-domain-compliance-validation.md +240 -0
- package/_bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-09-project-type-validation.md +260 -0
- package/_bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-10-smart-validation.md +206 -0
- package/_bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-11-holistic-quality-validation.md +261 -0
- package/_bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-12-completeness-validation.md +239 -0
- package/_bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-13-report-complete.md +229 -0
- package/_bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/workflow.md +62 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-prd/data/domain-complexity.csv +15 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-prd/data/prd-purpose.md +197 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-prd/data/project-types.csv +11 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-01-discovery.md +224 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-02-format-detection.md +191 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-02b-parity-check.md +209 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-03-density-validation.md +174 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-04-brief-coverage-validation.md +214 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-05-measurability-validation.md +228 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-06-traceability-validation.md +217 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-07-implementation-leakage-validation.md +205 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-08-domain-compliance-validation.md +243 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-09-project-type-validation.md +263 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-10-smart-validation.md +209 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-11-holistic-quality-validation.md +264 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-12-completeness-validation.md +242 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-13-report-complete.md +232 -0
- package/_bmad/bmm/workflows/2-plan-workflows/create-prd/workflow-validate-prd.md +65 -0
- package/_bmad/bmm/workflows/3-solutioning/bmad-check-implementation-readiness/SKILL.md +6 -0
- package/_bmad/bmm/workflows/3-solutioning/bmad-check-implementation-readiness/bmad-skill-manifest.yaml +1 -0
- package/_bmad/bmm/workflows/3-solutioning/bmad-check-implementation-readiness/steps/step-01-document-discovery.md +179 -0
- package/_bmad/bmm/workflows/3-solutioning/bmad-check-implementation-readiness/steps/step-02-prd-analysis.md +168 -0
- package/_bmad/bmm/workflows/3-solutioning/bmad-check-implementation-readiness/steps/step-03-epic-coverage-validation.md +169 -0
- package/_bmad/bmm/workflows/3-solutioning/bmad-check-implementation-readiness/steps/step-04-ux-alignment.md +129 -0
- package/_bmad/bmm/workflows/3-solutioning/bmad-check-implementation-readiness/steps/step-05-epic-quality-review.md +241 -0
- package/_bmad/bmm/workflows/3-solutioning/bmad-check-implementation-readiness/steps/step-06-final-assessment.md +126 -0
- package/_bmad/bmm/workflows/3-solutioning/bmad-check-implementation-readiness/templates/readiness-report-template.md +4 -0
- package/_bmad/bmm/workflows/3-solutioning/bmad-check-implementation-readiness/workflow.md +49 -0
- package/_bmad/bmm/workflows/3-solutioning/bmad-create-architecture/SKILL.md +6 -0
- package/_bmad/bmm/workflows/3-solutioning/bmad-create-architecture/architecture-decision-template.md +12 -0
- package/_bmad/bmm/workflows/3-solutioning/bmad-create-architecture/bmad-skill-manifest.yaml +1 -0
- package/_bmad/bmm/workflows/3-solutioning/bmad-create-architecture/data/domain-complexity.csv +13 -0
- package/_bmad/bmm/workflows/3-solutioning/bmad-create-architecture/data/project-types.csv +7 -0
- package/_bmad/bmm/workflows/3-solutioning/bmad-create-architecture/steps/step-01-init.md +153 -0
- package/_bmad/bmm/workflows/3-solutioning/bmad-create-architecture/steps/step-01b-continue.md +173 -0
- package/_bmad/bmm/workflows/3-solutioning/bmad-create-architecture/steps/step-02-context.md +224 -0
- package/_bmad/bmm/workflows/3-solutioning/bmad-create-architecture/steps/step-03-starter.md +329 -0
- package/_bmad/bmm/workflows/3-solutioning/bmad-create-architecture/steps/step-04-decisions.md +318 -0
- package/_bmad/bmm/workflows/3-solutioning/bmad-create-architecture/steps/step-05-patterns.md +359 -0
- package/_bmad/bmm/workflows/3-solutioning/bmad-create-architecture/steps/step-06-structure.md +379 -0
- package/_bmad/bmm/workflows/3-solutioning/bmad-create-architecture/steps/step-07-validation.md +359 -0
- package/_bmad/bmm/workflows/3-solutioning/bmad-create-architecture/steps/step-08-complete.md +76 -0
- package/_bmad/bmm/workflows/3-solutioning/bmad-create-architecture/workflow.md +38 -0
- package/_bmad/bmm/workflows/3-solutioning/bmad-create-epics-and-stories/SKILL.md +6 -0
- package/_bmad/bmm/workflows/3-solutioning/bmad-create-epics-and-stories/bmad-skill-manifest.yaml +1 -0
- package/_bmad/bmm/workflows/3-solutioning/bmad-create-epics-and-stories/steps/step-01-validate-prerequisites.md +255 -0
- package/_bmad/bmm/workflows/3-solutioning/bmad-create-epics-and-stories/steps/step-02-design-epics.md +212 -0
- package/_bmad/bmm/workflows/3-solutioning/bmad-create-epics-and-stories/steps/step-03-create-stories.md +255 -0
- package/_bmad/bmm/workflows/3-solutioning/bmad-create-epics-and-stories/steps/step-04-final-validation.md +131 -0
- package/_bmad/bmm/workflows/3-solutioning/bmad-create-epics-and-stories/templates/epics-template.md +61 -0
- package/_bmad/bmm/workflows/3-solutioning/bmad-create-epics-and-stories/workflow.md +53 -0
- package/_bmad/bmm/workflows/4-implementation/bmad-code-review/SKILL.md +6 -0
- package/_bmad/bmm/workflows/4-implementation/bmad-code-review/bmad-skill-manifest.yaml +1 -0
- package/_bmad/bmm/workflows/4-implementation/bmad-code-review/steps/step-01-gather-context.md +61 -0
- package/_bmad/bmm/workflows/4-implementation/bmad-code-review/steps/step-02-review.md +41 -0
- package/_bmad/bmm/workflows/4-implementation/bmad-code-review/steps/step-03-triage.md +50 -0
- package/_bmad/bmm/workflows/4-implementation/bmad-code-review/steps/step-04-present.md +38 -0
- package/_bmad/bmm/workflows/4-implementation/bmad-code-review/workflow.md +54 -0
- package/_bmad/bmm/workflows/4-implementation/bmad-correct-course/SKILL.md +6 -0
- package/_bmad/bmm/workflows/4-implementation/bmad-correct-course/bmad-skill-manifest.yaml +1 -0
- package/_bmad/bmm/workflows/4-implementation/bmad-correct-course/checklist.md +288 -0
- package/_bmad/bmm/workflows/4-implementation/bmad-correct-course/workflow.md +267 -0
- package/_bmad/bmm/workflows/4-implementation/bmad-create-story/SKILL.md +6 -0
- package/_bmad/bmm/workflows/4-implementation/bmad-create-story/bmad-skill-manifest.yaml +1 -0
- package/_bmad/bmm/workflows/4-implementation/bmad-create-story/checklist.md +357 -0
- package/_bmad/bmm/workflows/4-implementation/bmad-create-story/discover-inputs.md +88 -0
- package/_bmad/bmm/workflows/4-implementation/bmad-create-story/template.md +49 -0
- package/_bmad/bmm/workflows/4-implementation/bmad-create-story/workflow.md +380 -0
- package/_bmad/bmm/workflows/4-implementation/bmad-dev-story/SKILL.md +6 -0
- package/_bmad/bmm/workflows/4-implementation/bmad-dev-story/bmad-skill-manifest.yaml +1 -0
- package/_bmad/bmm/workflows/4-implementation/bmad-dev-story/checklist.md +80 -0
- package/_bmad/bmm/workflows/4-implementation/bmad-dev-story/workflow.md +450 -0
- package/_bmad/bmm/workflows/4-implementation/bmad-retrospective/SKILL.md +6 -0
- package/_bmad/bmm/workflows/4-implementation/bmad-retrospective/bmad-skill-manifest.yaml +1 -0
- package/_bmad/bmm/workflows/4-implementation/bmad-retrospective/workflow.md +1479 -0
- package/_bmad/bmm/workflows/4-implementation/bmad-sprint-planning/SKILL.md +6 -0
- package/_bmad/bmm/workflows/4-implementation/bmad-sprint-planning/bmad-skill-manifest.yaml +1 -0
- package/_bmad/bmm/workflows/4-implementation/bmad-sprint-planning/checklist.md +33 -0
- package/_bmad/bmm/workflows/4-implementation/bmad-sprint-planning/sprint-status-template.yaml +56 -0
- package/_bmad/bmm/workflows/4-implementation/bmad-sprint-planning/workflow.md +263 -0
- package/_bmad/bmm/workflows/4-implementation/bmad-sprint-status/SKILL.md +6 -0
- package/_bmad/bmm/workflows/4-implementation/bmad-sprint-status/bmad-skill-manifest.yaml +1 -0
- package/_bmad/bmm/workflows/4-implementation/bmad-sprint-status/workflow.md +261 -0
- package/_bmad/bmm/workflows/bmad-document-project/SKILL.md +6 -0
- package/_bmad/bmm/workflows/bmad-document-project/bmad-skill-manifest.yaml +1 -0
- package/_bmad/bmm/workflows/bmad-document-project/checklist.md +245 -0
- package/_bmad/bmm/workflows/bmad-document-project/documentation-requirements.csv +12 -0
- package/_bmad/bmm/workflows/bmad-document-project/instructions.md +128 -0
- package/_bmad/bmm/workflows/bmad-document-project/templates/deep-dive-template.md +345 -0
- package/_bmad/bmm/workflows/bmad-document-project/templates/index-template.md +169 -0
- package/_bmad/bmm/workflows/bmad-document-project/templates/project-overview-template.md +103 -0
- package/_bmad/bmm/workflows/bmad-document-project/templates/project-scan-report-schema.json +160 -0
- package/_bmad/bmm/workflows/bmad-document-project/templates/source-tree-template.md +135 -0
- package/_bmad/bmm/workflows/bmad-document-project/workflow.md +27 -0
- package/_bmad/bmm/workflows/bmad-document-project/workflows/deep-dive-instructions.md +299 -0
- package/_bmad/bmm/workflows/bmad-document-project/workflows/deep-dive-workflow.md +34 -0
- package/_bmad/bmm/workflows/bmad-document-project/workflows/full-scan-instructions.md +1107 -0
- package/_bmad/bmm/workflows/bmad-document-project/workflows/full-scan-workflow.md +34 -0
- package/_bmad/bmm/workflows/bmad-generate-project-context/SKILL.md +6 -0
- package/_bmad/bmm/workflows/bmad-generate-project-context/bmad-skill-manifest.yaml +1 -0
- package/_bmad/bmm/workflows/bmad-generate-project-context/project-context-template.md +21 -0
- package/_bmad/bmm/workflows/bmad-generate-project-context/steps/step-01-discover.md +186 -0
- package/_bmad/bmm/workflows/bmad-generate-project-context/steps/step-02-generate.md +321 -0
- package/_bmad/bmm/workflows/bmad-generate-project-context/steps/step-03-complete.md +278 -0
- package/_bmad/bmm/workflows/bmad-generate-project-context/workflow.md +43 -0
- package/_bmad/bmm/workflows/bmad-qa-generate-e2e-tests/SKILL.md +6 -0
- package/_bmad/bmm/workflows/bmad-qa-generate-e2e-tests/bmad-skill-manifest.yaml +1 -0
- package/_bmad/bmm/workflows/bmad-qa-generate-e2e-tests/checklist.md +33 -0
- package/_bmad/bmm/workflows/bmad-qa-generate-e2e-tests/workflow.md +136 -0
- package/_bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev/SKILL.md +6 -0
- package/_bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev/bmad-skill-manifest.yaml +1 -0
- package/_bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev/steps/step-01-mode-detection.md +169 -0
- package/_bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev/steps/step-02-context-gathering.md +114 -0
- package/_bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev/steps/step-03-execute.md +107 -0
- package/_bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev/steps/step-04-self-check.md +107 -0
- package/_bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev/steps/step-05-adversarial-review.md +94 -0
- package/_bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev/steps/step-06-resolve-findings.md +144 -0
- package/_bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev/workflow.md +38 -0
- package/_bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview/SKILL.md +6 -0
- package/_bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview/bmad-skill-manifest.yaml +1 -0
- package/_bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview/steps/step-01-clarify-and-route.md +51 -0
- package/_bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview/steps/step-02-plan.md +35 -0
- package/_bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview/steps/step-03-implement.md +33 -0
- package/_bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview/steps/step-04-review.md +50 -0
- package/_bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview/steps/step-05-present.md +17 -0
- package/_bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview/tech-spec-template.md +90 -0
- package/_bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview/workflow.md +79 -0
- package/_bmad/bmm/workflows/bmad-quick-flow/bmad-quick-spec/SKILL.md +6 -0
- package/_bmad/bmm/workflows/bmad-quick-flow/bmad-quick-spec/bmad-skill-manifest.yaml +1 -0
- package/_bmad/bmm/workflows/bmad-quick-flow/bmad-quick-spec/steps/step-01-understand.md +185 -0
- package/_bmad/bmm/workflows/bmad-quick-flow/bmad-quick-spec/steps/step-02-investigate.md +140 -0
- package/_bmad/bmm/workflows/bmad-quick-flow/bmad-quick-spec/steps/step-03-generate.md +123 -0
- package/_bmad/bmm/workflows/bmad-quick-flow/bmad-quick-spec/steps/step-04-review.md +195 -0
- package/_bmad/bmm/workflows/bmad-quick-flow/bmad-quick-spec/tech-spec-template.md +74 -0
- package/_bmad/bmm/workflows/bmad-quick-flow/bmad-quick-spec/workflow.md +73 -0
- package/_bmad/cis/config.yaml +12 -0
- package/_bmad/cis/module-help.csv +6 -0
- package/_bmad/cis/skills/bmad-cis-agent-brainstorming-coach/SKILL.md +51 -0
- package/_bmad/cis/skills/bmad-cis-agent-brainstorming-coach/bmad-skill-manifest.yaml +11 -0
- package/_bmad/cis/skills/bmad-cis-agent-creative-problem-solver/SKILL.md +51 -0
- package/_bmad/cis/skills/bmad-cis-agent-creative-problem-solver/bmad-skill-manifest.yaml +11 -0
- package/_bmad/cis/skills/bmad-cis-agent-design-thinking-coach/SKILL.md +52 -0
- package/_bmad/cis/skills/bmad-cis-agent-design-thinking-coach/bmad-skill-manifest.yaml +11 -0
- package/_bmad/cis/skills/bmad-cis-agent-innovation-strategist/SKILL.md +51 -0
- package/_bmad/cis/skills/bmad-cis-agent-innovation-strategist/bmad-skill-manifest.yaml +11 -0
- package/_bmad/cis/skills/bmad-cis-agent-presentation-master/SKILL.md +62 -0
- package/_bmad/cis/skills/bmad-cis-agent-presentation-master/bmad-skill-manifest.yaml +11 -0
- package/_bmad/cis/skills/bmad-cis-agent-storyteller/SKILL.md +56 -0
- package/_bmad/cis/skills/bmad-cis-agent-storyteller/bmad-skill-manifest.yaml +11 -0
- package/_bmad/cis/skills/bmad-cis-agent-storyteller/stories-told.md +7 -0
- package/_bmad/cis/skills/bmad-cis-agent-storyteller/story-preferences.md +7 -0
- package/_bmad/cis/skills/bmad-cis-design-thinking/SKILL.md +6 -0
- package/_bmad/cis/skills/bmad-cis-design-thinking/bmad-skill-manifest.yaml +1 -0
- package/_bmad/cis/skills/bmad-cis-design-thinking/design-methods.csv +31 -0
- package/_bmad/cis/skills/bmad-cis-design-thinking/template.md +111 -0
- package/_bmad/cis/skills/bmad-cis-design-thinking/workflow.md +242 -0
- package/_bmad/cis/skills/bmad-cis-innovation-strategy/SKILL.md +6 -0
- package/_bmad/cis/skills/bmad-cis-innovation-strategy/bmad-skill-manifest.yaml +1 -0
- package/_bmad/cis/skills/bmad-cis-innovation-strategy/innovation-frameworks.csv +31 -0
- package/_bmad/cis/skills/bmad-cis-innovation-strategy/template.md +189 -0
- package/_bmad/cis/skills/bmad-cis-innovation-strategy/workflow.md +315 -0
- package/_bmad/cis/skills/bmad-cis-problem-solving/SKILL.md +6 -0
- package/_bmad/cis/skills/bmad-cis-problem-solving/bmad-skill-manifest.yaml +1 -0
- package/_bmad/cis/skills/bmad-cis-problem-solving/solving-methods.csv +31 -0
- package/_bmad/cis/skills/bmad-cis-problem-solving/template.md +165 -0
- package/_bmad/cis/skills/bmad-cis-problem-solving/workflow.md +291 -0
- package/_bmad/cis/skills/bmad-cis-storytelling/SKILL.md +6 -0
- package/_bmad/cis/skills/bmad-cis-storytelling/bmad-skill-manifest.yaml +1 -0
- package/_bmad/cis/skills/bmad-cis-storytelling/story-types.csv +26 -0
- package/_bmad/cis/skills/bmad-cis-storytelling/template.md +113 -0
- package/_bmad/cis/skills/bmad-cis-storytelling/workflow.md +321 -0
- package/_bmad/core/config.yaml +9 -0
- package/_bmad/core/module-help.csv +11 -0
- package/_bmad/core/skills/bmad-advanced-elicitation/SKILL.md +6 -0
- package/_bmad/core/skills/bmad-advanced-elicitation/bmad-skill-manifest.yaml +1 -0
- package/_bmad/core/skills/bmad-advanced-elicitation/methods.csv +51 -0
- package/_bmad/core/skills/bmad-advanced-elicitation/workflow.md +135 -0
- package/_bmad/core/skills/bmad-brainstorming/SKILL.md +6 -0
- package/_bmad/core/skills/bmad-brainstorming/bmad-skill-manifest.yaml +1 -0
- package/_bmad/core/skills/bmad-brainstorming/brain-methods.csv +62 -0
- package/_bmad/core/skills/bmad-brainstorming/steps/step-01-session-setup.md +214 -0
- package/_bmad/core/skills/bmad-brainstorming/steps/step-01b-continue.md +124 -0
- package/_bmad/core/skills/bmad-brainstorming/steps/step-02a-user-selected.md +229 -0
- package/_bmad/core/skills/bmad-brainstorming/steps/step-02b-ai-recommended.md +239 -0
- package/_bmad/core/skills/bmad-brainstorming/steps/step-02c-random-selection.md +211 -0
- package/_bmad/core/skills/bmad-brainstorming/steps/step-02d-progressive-flow.md +266 -0
- package/_bmad/core/skills/bmad-brainstorming/steps/step-03-technique-execution.md +401 -0
- package/_bmad/core/skills/bmad-brainstorming/steps/step-04-idea-organization.md +305 -0
- package/_bmad/core/skills/bmad-brainstorming/template.md +15 -0
- package/_bmad/core/skills/bmad-brainstorming/workflow.md +53 -0
- package/_bmad/core/skills/bmad-distillator/SKILL.md +178 -0
- package/_bmad/core/skills/bmad-distillator/agents/distillate-compressor.md +116 -0
- package/_bmad/core/skills/bmad-distillator/agents/round-trip-reconstructor.md +68 -0
- package/_bmad/core/skills/bmad-distillator/bmad-skill-manifest.yaml +15 -0
- package/_bmad/core/skills/bmad-distillator/resources/compression-rules.md +51 -0
- package/_bmad/core/skills/bmad-distillator/resources/distillate-format-reference.md +227 -0
- package/_bmad/core/skills/bmad-distillator/resources/splitting-strategy.md +78 -0
- package/_bmad/core/skills/bmad-editorial-review-prose/SKILL.md +6 -0
- package/_bmad/core/skills/bmad-editorial-review-prose/bmad-skill-manifest.yaml +1 -0
- package/_bmad/core/skills/bmad-editorial-review-prose/workflow.md +81 -0
- package/_bmad/core/skills/bmad-editorial-review-structure/SKILL.md +6 -0
- package/_bmad/core/skills/bmad-editorial-review-structure/bmad-skill-manifest.yaml +1 -0
- package/_bmad/core/skills/bmad-editorial-review-structure/workflow.md +174 -0
- package/_bmad/core/skills/bmad-help/SKILL.md +6 -0
- package/_bmad/core/skills/bmad-help/bmad-skill-manifest.yaml +1 -0
- package/_bmad/core/skills/bmad-help/workflow.md +88 -0
- package/_bmad/core/skills/bmad-index-docs/SKILL.md +6 -0
- package/_bmad/core/skills/bmad-index-docs/bmad-skill-manifest.yaml +1 -0
- package/_bmad/core/skills/bmad-index-docs/workflow.md +61 -0
- package/_bmad/core/skills/bmad-party-mode/SKILL.md +6 -0
- package/_bmad/core/skills/bmad-party-mode/bmad-skill-manifest.yaml +1 -0
- package/_bmad/core/skills/bmad-party-mode/steps/step-01-agent-loading.md +138 -0
- package/_bmad/core/skills/bmad-party-mode/steps/step-02-discussion-orchestration.md +187 -0
- package/_bmad/core/skills/bmad-party-mode/steps/step-03-graceful-exit.md +167 -0
- package/_bmad/core/skills/bmad-party-mode/workflow.md +190 -0
- package/_bmad/core/skills/bmad-review-adversarial-general/SKILL.md +6 -0
- package/_bmad/core/skills/bmad-review-adversarial-general/bmad-skill-manifest.yaml +1 -0
- package/_bmad/core/skills/bmad-review-adversarial-general/workflow.md +32 -0
- package/_bmad/core/skills/bmad-review-edge-case-hunter/SKILL.md +6 -0
- package/_bmad/core/skills/bmad-review-edge-case-hunter/bmad-skill-manifest.yaml +1 -0
- package/_bmad/core/skills/bmad-review-edge-case-hunter/workflow.md +62 -0
- package/_bmad/core/skills/bmad-shard-doc/SKILL.md +6 -0
- package/_bmad/core/skills/bmad-shard-doc/bmad-skill-manifest.yaml +1 -0
- package/_bmad/core/skills/bmad-shard-doc/workflow.md +100 -0
- package/_bmad/core/tasks/bmad-create-prd/SKILL.md +6 -0
- package/_bmad/core/tasks/bmad-create-prd/bmad-skill-manifest.yaml +1 -0
- package/_bmad/core/tasks/bmad-create-prd/data/domain-complexity.csv +15 -0
- package/_bmad/core/tasks/bmad-create-prd/data/prd-purpose.md +197 -0
- package/_bmad/core/tasks/bmad-create-prd/data/project-types.csv +11 -0
- package/_bmad/core/tasks/bmad-create-prd/steps-c/step-01-init.md +178 -0
- package/_bmad/core/tasks/bmad-create-prd/steps-c/step-01b-continue.md +161 -0
- package/_bmad/core/tasks/bmad-create-prd/steps-c/step-02-discovery.md +208 -0
- package/_bmad/core/tasks/bmad-create-prd/steps-c/step-02b-vision.md +142 -0
- package/_bmad/core/tasks/bmad-create-prd/steps-c/step-02c-executive-summary.md +158 -0
- package/_bmad/core/tasks/bmad-create-prd/steps-c/step-03-success.md +214 -0
- package/_bmad/core/tasks/bmad-create-prd/steps-c/step-04-journeys.md +201 -0
- package/_bmad/core/tasks/bmad-create-prd/steps-c/step-05-domain.md +194 -0
- package/_bmad/core/tasks/bmad-create-prd/steps-c/step-06-innovation.md +211 -0
- package/_bmad/core/tasks/bmad-create-prd/steps-c/step-07-project-type.md +222 -0
- package/_bmad/core/tasks/bmad-create-prd/steps-c/step-08-scoping.md +216 -0
- package/_bmad/core/tasks/bmad-create-prd/steps-c/step-09-functional.md +219 -0
- package/_bmad/core/tasks/bmad-create-prd/steps-c/step-10-nonfunctional.md +230 -0
- package/_bmad/core/tasks/bmad-create-prd/steps-c/step-11-polish.md +221 -0
- package/_bmad/core/tasks/bmad-create-prd/steps-c/step-12-complete.md +115 -0
- package/_bmad/core/tasks/bmad-create-prd/templates/prd-template.md +10 -0
- package/_bmad/core/tasks/bmad-create-prd/workflow.md +62 -0
- package/config/allowed-commands.ts +39 -0
- package/config/defaults.ts +19 -0
- package/config/loader.ts +105 -0
- package/extensions/frappe-gates.ts +160 -0
- package/extensions/frappe-session.ts +324 -0
- package/extensions/frappe-state.ts +235 -0
- package/extensions/frappe-tools.ts +278 -0
- package/extensions/frappe-ui.ts +119 -0
- package/extensions/frappe-workflow.ts +85 -0
- package/gates/coverage-check.ts +37 -0
- package/gates/frappe-native-check.ts +65 -0
- package/gates/permission-check.ts +65 -0
- package/gates/query-check.ts +40 -0
- package/gates/server-side-check.ts +67 -0
- package/gates/style-check.ts +92 -0
- package/gates/types.ts +13 -0
- package/package.json +43 -0
- package/project-context.md +146 -0
- package/state/db.ts +85 -0
- package/state/fsm.ts +68 -0
- package/state/journal.ts +164 -0
- package/state/schema.ts +41 -0
- package/tools/agent-tools.ts +60 -0
- package/tools/bench-tools.ts +63 -0
- package/tools/context-sandbox.ts +31 -0
- package/tools/debug-tools.ts +12 -0
- package/tools/feature-tools.ts +126 -0
- package/tools/frappe-context7.ts +70 -0
- package/tools/frappe-query-tools.ts +47 -0
- package/tools/project-tools.ts +107 -0
- package/tsdown.config.ts +6 -0
|
@@ -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
|
+
}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import type { AfterToolCallContext, AfterToolCallResult } from "@mariozechner/pi-agent-core";
|
|
2
|
+
import type { TextContent } from "@mariozechner/pi-ai";
|
|
3
|
+
import { db, getCurrentPhase } from "../state/db.js";
|
|
4
|
+
import { appendEntry } from "../state/journal.js";
|
|
5
|
+
import { buildStateContext, loadSpecialist, loadDebuggerSpecialist } from "./frappe-session.js";
|
|
6
|
+
import { loadCredentials } from "../config/loader.js";
|
|
7
|
+
|
|
8
|
+
/** Reads current_phase and feature_id from the active session. */
|
|
9
|
+
function readSessionState(): { currentPhase: string; activeFeatureId: string | null } {
|
|
10
|
+
const row = db
|
|
11
|
+
.prepare("SELECT current_phase, feature_id FROM sessions WHERE is_active = 1 LIMIT 1")
|
|
12
|
+
.get() as { current_phase: string; feature_id: string | null } | undefined;
|
|
13
|
+
return {
|
|
14
|
+
currentPhase: row?.current_phase ?? "idle",
|
|
15
|
+
activeFeatureId: row?.feature_id ?? null,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/** Queries the active session_id from SQLite, or returns a fallback. */
|
|
20
|
+
function getActiveSessionId(): string {
|
|
21
|
+
const row = db
|
|
22
|
+
.prepare("SELECT session_id FROM sessions WHERE is_active = 1 LIMIT 1")
|
|
23
|
+
.get() as { session_id: string } | undefined;
|
|
24
|
+
return row?.session_id ?? "unknown";
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** Type guard for SpawnAgentResult from agent-tools.ts. */
|
|
28
|
+
function isSpawnAgentResult(value: unknown): value is { status: string; skill: string; trigger: string } {
|
|
29
|
+
return (
|
|
30
|
+
typeof value === "object" &&
|
|
31
|
+
value !== null &&
|
|
32
|
+
"status" in value &&
|
|
33
|
+
"skill" in value &&
|
|
34
|
+
"trigger" in value
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** Type guard for the return value of startFeature(). */
|
|
39
|
+
function isStartFeatureResult(value: unknown): value is { mode: string; feature_id: string } {
|
|
40
|
+
return (
|
|
41
|
+
typeof value === "object" &&
|
|
42
|
+
value !== null &&
|
|
43
|
+
"mode" in value &&
|
|
44
|
+
"feature_id" in value &&
|
|
45
|
+
typeof (value as Record<string, unknown>).mode === "string" &&
|
|
46
|
+
typeof (value as Record<string, unknown>).feature_id === "string"
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Atomically updates sessions.current_phase and features.current_phase in state.db.
|
|
52
|
+
* Throws on DB failure — caller (handleAfterToolCall) converts to banner.
|
|
53
|
+
*/
|
|
54
|
+
function applyPhaseTransition(featureId: string, newPhase: string): void {
|
|
55
|
+
db.transaction(() => {
|
|
56
|
+
db.prepare("UPDATE sessions SET current_phase = ? WHERE is_active = 1").run(newPhase);
|
|
57
|
+
db.prepare("UPDATE features SET current_phase = ? WHERE feature_id = ?").run(newPhase, featureId);
|
|
58
|
+
})();
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Session start hook — validates gitignore and loads credentials before any session setup.
|
|
63
|
+
* Throws with AC error message if .frappe-builder-config.json is not gitignored.
|
|
64
|
+
* Call this early in the session_start lifecycle; on throw, halt and surface the message.
|
|
65
|
+
* projectRoot defaults to process.cwd() when not supplied by the pi extension system.
|
|
66
|
+
*
|
|
67
|
+
* TODO: wire this into the pi extension system's session_start event once the
|
|
68
|
+
* session_start hook type is confirmed in @mariozechner/pi-agent-core.
|
|
69
|
+
*/
|
|
70
|
+
export function handleSessionStart(projectRoot: string = process.cwd()): void {
|
|
71
|
+
loadCredentials(projectRoot);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* afterToolCall hook — appends a JSONL journal entry and updates the sessions
|
|
76
|
+
* table in a single synchronous transaction after every tool call.
|
|
77
|
+
*
|
|
78
|
+
* Also handles FSM phase transition when start_feature fires (Story 3.3).
|
|
79
|
+
* Mode routing never touches gate execution — quality gates run independently
|
|
80
|
+
* in frappe-gates.ts regardless of mode (full or quick).
|
|
81
|
+
*
|
|
82
|
+
* Never throws. On write failure, appends a [STATE WRITE FAILED] banner to the
|
|
83
|
+
* tool result content instead of crashing the session.
|
|
84
|
+
*/
|
|
85
|
+
export async function handleAfterToolCall(
|
|
86
|
+
context: AfterToolCallContext,
|
|
87
|
+
_signal?: AbortSignal
|
|
88
|
+
): Promise<AfterToolCallResult | undefined> {
|
|
89
|
+
const toolName = context.toolCall.name;
|
|
90
|
+
const phase = getCurrentPhase();
|
|
91
|
+
const sessionId = getActiveSessionId();
|
|
92
|
+
|
|
93
|
+
try {
|
|
94
|
+
appendEntry({
|
|
95
|
+
ts: new Date().toISOString(),
|
|
96
|
+
sessionId,
|
|
97
|
+
type: "tool_call",
|
|
98
|
+
payload: {
|
|
99
|
+
tool: toolName,
|
|
100
|
+
phase,
|
|
101
|
+
result: (() => {
|
|
102
|
+
const first = context.result.content.find((c) => c.type === "text") as
|
|
103
|
+
| TextContent
|
|
104
|
+
| undefined;
|
|
105
|
+
return first?.text.slice(0, 200) ?? "";
|
|
106
|
+
})(),
|
|
107
|
+
},
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
db.transaction(() => {
|
|
111
|
+
db.prepare(
|
|
112
|
+
"UPDATE sessions SET last_tool = ? WHERE is_active = 1"
|
|
113
|
+
).run(toolName);
|
|
114
|
+
})();
|
|
115
|
+
|
|
116
|
+
// FSM phase transition for start_feature (Story 3.3)
|
|
117
|
+
if (toolName === "start_feature") {
|
|
118
|
+
const firstText = context.result.content.find((c) => c.type === "text") as
|
|
119
|
+
| TextContent
|
|
120
|
+
| undefined;
|
|
121
|
+
if (firstText) {
|
|
122
|
+
let parsed: unknown = null;
|
|
123
|
+
try {
|
|
124
|
+
parsed = JSON.parse(firstText.text);
|
|
125
|
+
} catch {
|
|
126
|
+
// non-JSON result — skip phase transition silently
|
|
127
|
+
}
|
|
128
|
+
if (isStartFeatureResult(parsed)) {
|
|
129
|
+
const newPhase = parsed.mode === "quick" ? "implementation" : "requirements";
|
|
130
|
+
applyPhaseTransition(parsed.feature_id, newPhase);
|
|
131
|
+
|
|
132
|
+
// Specialist auto-load after phase transition (Story 3.4) — non-fatal
|
|
133
|
+
try {
|
|
134
|
+
const specCtx = buildStateContext(parsed.feature_id, toolName);
|
|
135
|
+
const specialistBlock = loadSpecialist(newPhase, specCtx);
|
|
136
|
+
if (specialistBlock) {
|
|
137
|
+
const specialistContent: TextContent = {
|
|
138
|
+
type: "text",
|
|
139
|
+
text: `\n\n${specialistBlock}`,
|
|
140
|
+
};
|
|
141
|
+
return { content: [...context.result.content, specialistContent] };
|
|
142
|
+
}
|
|
143
|
+
} catch (specialistErr) {
|
|
144
|
+
console.error(`[frappe-state] specialist load failed: ${specialistErr}`);
|
|
145
|
+
// non-fatal — session continues without specialist block
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// Debugger specialist invocation (Story 3.5) — no phase transition
|
|
152
|
+
if (toolName === "invoke_debugger") {
|
|
153
|
+
const { currentPhase, activeFeatureId } = readSessionState();
|
|
154
|
+
appendEntry({
|
|
155
|
+
ts: new Date().toISOString(),
|
|
156
|
+
sessionId,
|
|
157
|
+
type: "tool_call",
|
|
158
|
+
payload: { tool: "invoke_debugger", phase_preserved: currentPhase },
|
|
159
|
+
});
|
|
160
|
+
try {
|
|
161
|
+
const specCtx = buildStateContext(activeFeatureId, toolName);
|
|
162
|
+
const debuggerBlock = loadDebuggerSpecialist(specCtx);
|
|
163
|
+
if (debuggerBlock) {
|
|
164
|
+
const content: TextContent = { type: "text", text: `\n\n${debuggerBlock}` };
|
|
165
|
+
return { content: [...context.result.content, content] };
|
|
166
|
+
}
|
|
167
|
+
} catch (debuggerErr) {
|
|
168
|
+
console.error(`[frappe-state] debugger specialist load failed: ${debuggerErr}`);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// Sub-agent spawn JSONL logging (Story 3.6) — no phase transition, no specialist change
|
|
173
|
+
if (toolName === "spawn_agent") {
|
|
174
|
+
const firstText = context.result.content.find((c) => c.type === "text") as TextContent | undefined;
|
|
175
|
+
if (firstText) {
|
|
176
|
+
let parsed: unknown = null;
|
|
177
|
+
try { parsed = JSON.parse(firstText.text); } catch { /* skip */ }
|
|
178
|
+
if (isSpawnAgentResult(parsed)) {
|
|
179
|
+
try {
|
|
180
|
+
const approved = parsed.status === "spawned";
|
|
181
|
+
const entry: Record<string, unknown> = {
|
|
182
|
+
type: "sub_agent",
|
|
183
|
+
skill: parsed.skill,
|
|
184
|
+
trigger: parsed.trigger,
|
|
185
|
+
approved,
|
|
186
|
+
};
|
|
187
|
+
if (parsed.status === "disabled") entry.reason = "disabled";
|
|
188
|
+
if (parsed.status === "requires_approval") entry.reason = "awaiting_approval";
|
|
189
|
+
appendEntry({
|
|
190
|
+
ts: new Date().toISOString(),
|
|
191
|
+
sessionId,
|
|
192
|
+
type: "tool_call",
|
|
193
|
+
payload: entry,
|
|
194
|
+
});
|
|
195
|
+
} catch (spawnErr) {
|
|
196
|
+
console.error(`[frappe-state] spawn_agent log failed: ${spawnErr}`);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// End debug — restore previous phase specialist (Story 3.5) — no phase transition
|
|
203
|
+
if (toolName === "end_debug") {
|
|
204
|
+
const { currentPhase, activeFeatureId } = readSessionState();
|
|
205
|
+
appendEntry({
|
|
206
|
+
ts: new Date().toISOString(),
|
|
207
|
+
sessionId,
|
|
208
|
+
type: "tool_call",
|
|
209
|
+
payload: { tool: "end_debug", phase_restored: currentPhase },
|
|
210
|
+
});
|
|
211
|
+
try {
|
|
212
|
+
const specCtx = buildStateContext(activeFeatureId, toolName);
|
|
213
|
+
const specialistBlock = loadSpecialist(currentPhase, specCtx);
|
|
214
|
+
if (specialistBlock) {
|
|
215
|
+
const content: TextContent = { type: "text", text: `\n\n${specialistBlock}` };
|
|
216
|
+
return { content: [...context.result.content, content] };
|
|
217
|
+
}
|
|
218
|
+
} catch (endDebugErr) {
|
|
219
|
+
console.error(`[frappe-state] end_debug specialist restore failed: ${endDebugErr}`);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
return undefined;
|
|
224
|
+
} catch (err) {
|
|
225
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
226
|
+
console.error(`[frappe-state] afterToolCall write failed: ${msg}`);
|
|
227
|
+
|
|
228
|
+
const banner: TextContent = {
|
|
229
|
+
type: "text",
|
|
230
|
+
text: `\n\n[STATE WRITE FAILED: ${msg}]`,
|
|
231
|
+
};
|
|
232
|
+
|
|
233
|
+
return { content: [...context.result.content, banner] };
|
|
234
|
+
}
|
|
235
|
+
}
|