bmad-method-quarkus 1.0.0
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/.claude-plugin/marketplace.json +53 -0
- package/AGENTS.md +12 -0
- package/LICENSE +30 -0
- package/README.md +94 -0
- package/README_CN.md +108 -0
- package/README_VN.md +109 -0
- package/bmad-modules.yaml +133 -0
- package/package.json +123 -0
- package/removals.txt +87 -0
- package/src/bmm-skills/agents/bmad-agent-analyst/SKILL.md +76 -0
- package/src/bmm-skills/agents/bmad-agent-analyst/customize.toml +105 -0
- package/src/bmm-skills/agents/bmad-agent-architect/SKILL.md +76 -0
- package/src/bmm-skills/agents/bmad-agent-architect/customize.toml +65 -0
- package/src/bmm-skills/agents/bmad-agent-dev/SKILL.md +76 -0
- package/src/bmm-skills/agents/bmad-agent-dev/customize.toml +83 -0
- package/src/bmm-skills/agents/bmad-agent-pm/SKILL.md +76 -0
- package/src/bmm-skills/agents/bmad-agent-pm/customize.toml +75 -0
- package/src/bmm-skills/agents/bmad-agent-ux-designer/SKILL.md +76 -0
- package/src/bmm-skills/agents/bmad-agent-ux-designer/customize.toml +60 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/.memlog.md +12 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/.memlog.md:Zone.Identifier +0 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/SKILL.md +86 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/SKILL.md:Zone.Identifier +0 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/customize.toml +37 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/customize.toml:Zone.Identifier +0 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/references/enrich-stories.md +19 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/references/enrich-stories.md:Zone.Identifier +0 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/references/prompt-quality-canon.md +79 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/references/prompt-quality-canon.md:Zone.Identifier +0 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/skills/bqa-setup/SKILL.md +80 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/skills/bqa-setup/SKILL.md:Zone.Identifier +0 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/skills/bqa-setup/assets/module-help.csv +9 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/skills/bqa-setup/assets/module-help.csv:Zone.Identifier +0 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/skills/bqa-setup/assets/module.yaml +16 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/skills/bqa-setup/assets/module.yaml:Zone.Identifier +0 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/skills/bqa-setup/scripts/cleanup-legacy.py +287 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/skills/bqa-setup/scripts/cleanup-legacy.py:Zone.Identifier +0 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/skills/bqa-setup/scripts/merge-config.py +441 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/skills/bqa-setup/scripts/merge-config.py:Zone.Identifier +0 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/skills/bqa-setup/scripts/merge-help-csv.py +246 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/skills/bqa-setup/scripts/merge-help-csv.py:Zone.Identifier +0 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/skills/quarkus-error-handling-i18n/SKILL.md +181 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/skills/quarkus-error-handling-i18n/SKILL.md:Zone.Identifier +0 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/skills/quarkus-grpc-services/SKILL.md +141 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/skills/quarkus-grpc-services/SKILL.md:Zone.Identifier +0 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/skills/quarkus-hexagonal-core/SKILL.md +392 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/skills/quarkus-hexagonal-core/SKILL.md:Zone.Identifier +0 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/skills/quarkus-kafka-messaging/SKILL.md +148 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/skills/quarkus-kafka-messaging/SKILL.md:Zone.Identifier +0 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/skills/quarkus-observability-otel/SKILL.md +180 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/skills/quarkus-observability-otel/SKILL.md:Zone.Identifier +0 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/skills/quarkus-openapi-tmforum/SKILL.md +128 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/skills/quarkus-openapi-tmforum/SKILL.md:Zone.Identifier +0 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/skills/quarkus-sql-jdbc-agroal/SKILL.md +245 -0
- package/src/bmm-skills/agents/bmad-quarkus-architect/skills/quarkus-sql-jdbc-agroal/SKILL.md:Zone.Identifier +0 -0
- package/src/bmm-skills/module-help.csv +19 -0
- package/src/bmm-skills/module.yaml +92 -0
- package/src/bmm-skills/plan/bmad-architecture/SKILL.md +85 -0
- package/src/bmm-skills/plan/bmad-architecture/assets/spine-template.md +79 -0
- package/src/bmm-skills/plan/bmad-architecture/customize.toml +102 -0
- package/src/bmm-skills/plan/bmad-architecture/references/headless.md +26 -0
- package/src/bmm-skills/plan/bmad-architecture/references/reviewer-gate.md +13 -0
- package/src/bmm-skills/plan/bmad-architecture/scripts/lint_spine.py +257 -0
- package/src/bmm-skills/plan/bmad-architecture/scripts/tests/test_lint_spine.py +270 -0
- package/src/bmm-skills/plan/bmad-create-epics-and-stories/SKILL.md +93 -0
- package/src/bmm-skills/plan/bmad-create-epics-and-stories/customize.toml +41 -0
- package/src/bmm-skills/plan/bmad-create-epics-and-stories/steps/step-01-validate-prerequisites.md +263 -0
- package/src/bmm-skills/plan/bmad-create-epics-and-stories/steps/step-02-design-epics.md +242 -0
- package/src/bmm-skills/plan/bmad-create-epics-and-stories/steps/step-03-create-stories.md +255 -0
- package/src/bmm-skills/plan/bmad-create-epics-and-stories/steps/step-04-final-validation.md +143 -0
- package/src/bmm-skills/plan/bmad-create-epics-and-stories/templates/epics-template.md +61 -0
- package/src/bmm-skills/plan/bmad-generate-project-context/SKILL.md +10 -0
- package/src/bmm-skills/plan/bmad-prd/SKILL.md +94 -0
- package/src/bmm-skills/plan/bmad-prd/assets/headless-schemas.md +76 -0
- package/src/bmm-skills/plan/bmad-prd/assets/prd-template.md +165 -0
- package/src/bmm-skills/plan/bmad-prd/assets/prd-validation-checklist.md +135 -0
- package/src/bmm-skills/plan/bmad-prd/assets/validation-report-template.html +325 -0
- package/src/bmm-skills/plan/bmad-prd/customize.toml +149 -0
- package/src/bmm-skills/plan/bmad-prd/references/headless.md +39 -0
- package/src/bmm-skills/plan/bmad-prd/references/validate.md +97 -0
- package/src/bmm-skills/plan/bmad-prfaq/SKILL.md +135 -0
- package/src/bmm-skills/plan/bmad-prfaq/agents/artifact-analyzer.md +60 -0
- package/src/bmm-skills/plan/bmad-prfaq/agents/web-researcher.md +49 -0
- package/src/bmm-skills/plan/bmad-prfaq/assets/prfaq-template.md +62 -0
- package/src/bmm-skills/plan/bmad-prfaq/bmad-manifest.json +16 -0
- package/src/bmm-skills/plan/bmad-prfaq/customize.toml +41 -0
- package/src/bmm-skills/plan/bmad-prfaq/references/customer-faq.md +55 -0
- package/src/bmm-skills/plan/bmad-prfaq/references/internal-faq.md +51 -0
- package/src/bmm-skills/plan/bmad-prfaq/references/press-release.md +60 -0
- package/src/bmm-skills/plan/bmad-prfaq/references/verdict.md +83 -0
- package/src/bmm-skills/plan/bmad-product-brief/SKILL.md +91 -0
- package/src/bmm-skills/plan/bmad-product-brief/assets/brief-template.md +41 -0
- package/src/bmm-skills/plan/bmad-product-brief/customize.toml +101 -0
- package/src/bmm-skills/plan/bmad-project-context/SKILL.md +110 -0
- package/src/bmm-skills/plan/bmad-project-context/customize.toml +24 -0
- package/src/bmm-skills/plan/bmad-project-context/references/best-practices.md +65 -0
- package/src/bmm-skills/plan/bmad-project-context/references/template.md +55 -0
- package/src/bmm-skills/plan/bmad-spec/SKILL.md +160 -0
- package/src/bmm-skills/plan/bmad-spec/assets/headless-schemas.md +33 -0
- package/src/bmm-skills/plan/bmad-spec/assets/spec-template.md +49 -0
- package/src/bmm-skills/plan/bmad-spec/assets/stories-schema.md +44 -0
- package/src/bmm-skills/plan/bmad-spec/customize.toml +52 -0
- package/src/bmm-skills/plan/bmad-sprint-planning/SKILL.md +62 -0
- package/src/bmm-skills/plan/bmad-sprint-planning/customize.toml +41 -0
- package/src/bmm-skills/plan/bmad-sprint-planning/references/fix-sprint-status.md +30 -0
- package/src/bmm-skills/plan/bmad-sprint-planning/references/generate-tracking.md +25 -0
- package/src/bmm-skills/plan/bmad-sprint-planning/references/readiness-gate.md +20 -0
- package/src/bmm-skills/plan/bmad-sprint-planning/references/status-view.md +14 -0
- package/src/bmm-skills/plan/bmad-sprint-planning/references/validate.md +10 -0
- package/src/bmm-skills/plan/bmad-sprint-planning/scripts/__pycache__/sprint_plan.cpython-311.pyc +0 -0
- package/src/bmm-skills/plan/bmad-sprint-planning/scripts/sprint_plan.py +697 -0
- package/src/bmm-skills/plan/bmad-sprint-planning/scripts/tests/__pycache__/test_sprint_plan.cpython-311-pytest-9.1.1.pyc +0 -0
- package/src/bmm-skills/plan/bmad-sprint-planning/scripts/tests/test_sprint_plan.py +524 -0
- package/src/bmm-skills/plan/bmad-sprint-planning/sprint-status-template.yaml +71 -0
- package/src/bmm-skills/plan/bmad-ux/SKILL.md +90 -0
- package/src/bmm-skills/plan/bmad-ux/assets/color-themes.md +9 -0
- package/src/bmm-skills/plan/bmad-ux/assets/design-directions.md +9 -0
- package/src/bmm-skills/plan/bmad-ux/assets/design-example-editorial.md +158 -0
- package/src/bmm-skills/plan/bmad-ux/assets/design-example-mobile.md +93 -0
- package/src/bmm-skills/plan/bmad-ux/assets/design-example-shadcn.md +109 -0
- package/src/bmm-skills/plan/bmad-ux/assets/excalidraw-wireframe.md +19 -0
- package/src/bmm-skills/plan/bmad-ux/assets/experience-example-mobile.md +112 -0
- package/src/bmm-skills/plan/bmad-ux/assets/experience-example-shadcn.md +133 -0
- package/src/bmm-skills/plan/bmad-ux/assets/headless-schemas.md +84 -0
- package/src/bmm-skills/plan/bmad-ux/assets/key-screens.md +29 -0
- package/src/bmm-skills/plan/bmad-ux/assets/validation-report-template.html +319 -0
- package/src/bmm-skills/plan/bmad-ux/customize.toml +102 -0
- package/src/bmm-skills/plan/bmad-ux/references/creative-tools.md +19 -0
- package/src/bmm-skills/plan/bmad-ux/references/design-md-spec.md +50 -0
- package/src/bmm-skills/plan/bmad-ux/references/headless.md +37 -0
- package/src/bmm-skills/plan/bmad-ux/references/validate.md +115 -0
- package/src/bmm-skills/ship/bmad-build/SKILL.md +13 -0
- package/src/bmm-skills/ship/bmad-build/compile-epic-context.md +62 -0
- package/src/bmm-skills/ship/bmad-build/customize.toml +164 -0
- package/src/bmm-skills/ship/bmad-build/references/deletion-check.md +14 -0
- package/src/bmm-skills/ship/bmad-build/review-prompts/edge-case-hunter.md +88 -0
- package/src/bmm-skills/ship/bmad-build/review-prompts/verification-gap.md +113 -0
- package/src/bmm-skills/ship/bmad-build/spec-template.md +89 -0
- package/src/bmm-skills/ship/bmad-build/step-01-clarify-and-route.md +105 -0
- package/src/bmm-skills/ship/bmad-build/step-02-plan.md +47 -0
- package/src/bmm-skills/ship/bmad-build/step-03-implement.md +49 -0
- package/src/bmm-skills/ship/bmad-build/step-04-review.md +55 -0
- package/src/bmm-skills/ship/bmad-build/step-05-present.md +75 -0
- package/src/bmm-skills/ship/bmad-build/step-oneshot.md +77 -0
- package/src/bmm-skills/ship/bmad-build/sync-sprint-status.md +19 -0
- package/src/bmm-skills/ship/bmad-build/workflow.md +84 -0
- package/src/bmm-skills/ship/bmad-build-auto/SKILL.md +13 -0
- package/src/bmm-skills/ship/bmad-build-auto/compile-epic-context.md +62 -0
- package/src/bmm-skills/ship/bmad-build-auto/customize.toml +121 -0
- package/src/bmm-skills/ship/bmad-build-auto/references/deletion-check.md +14 -0
- package/src/bmm-skills/ship/bmad-build-auto/review-prompts/edge-case-hunter.md +88 -0
- package/src/bmm-skills/ship/bmad-build-auto/review-prompts/verification-gap.md +113 -0
- package/src/bmm-skills/ship/bmad-build-auto/spec-template.md +99 -0
- package/src/bmm-skills/ship/bmad-build-auto/step-01-clarify-and-route.md +83 -0
- package/src/bmm-skills/ship/bmad-build-auto/step-02-plan.md +27 -0
- package/src/bmm-skills/ship/bmad-build-auto/step-03-implement.md +44 -0
- package/src/bmm-skills/ship/bmad-build-auto/step-04-review.md +96 -0
- package/src/bmm-skills/ship/bmad-build-auto/workflow.md +104 -0
- package/src/bmm-skills/ship/bmad-checkpoint-preview/SKILL.md +68 -0
- package/src/bmm-skills/ship/bmad-checkpoint-preview/customize.toml +41 -0
- package/src/bmm-skills/ship/bmad-checkpoint-preview/generate-trail.md +38 -0
- package/src/bmm-skills/ship/bmad-checkpoint-preview/step-01-orientation.md +105 -0
- package/src/bmm-skills/ship/bmad-checkpoint-preview/step-02-walkthrough.md +89 -0
- package/src/bmm-skills/ship/bmad-checkpoint-preview/step-03-detail-pass.md +106 -0
- package/src/bmm-skills/ship/bmad-checkpoint-preview/step-04-testing.md +74 -0
- package/src/bmm-skills/ship/bmad-checkpoint-preview/step-05-wrapup.md +30 -0
- package/src/bmm-skills/ship/bmad-code-review/SKILL.md +90 -0
- package/src/bmm-skills/ship/bmad-code-review/customize.toml +113 -0
- package/src/bmm-skills/ship/bmad-code-review/references/deletion-check.md +14 -0
- package/src/bmm-skills/ship/bmad-code-review/review-prompts/edge-case-hunter.md +88 -0
- package/src/bmm-skills/ship/bmad-code-review/review-prompts/verification-gap.md +113 -0
- package/src/bmm-skills/ship/bmad-code-review/steps/step-01-gather-context.md +87 -0
- package/src/bmm-skills/ship/bmad-code-review/steps/step-02-review.md +32 -0
- package/src/bmm-skills/ship/bmad-code-review/steps/step-03-triage.md +50 -0
- package/src/bmm-skills/ship/bmad-code-review/steps/step-04-present.md +132 -0
- package/src/bmm-skills/ship/bmad-correct-course/SKILL.md +300 -0
- package/src/bmm-skills/ship/bmad-correct-course/checklist.md +288 -0
- package/src/bmm-skills/ship/bmad-correct-course/customize.toml +41 -0
- package/src/bmm-skills/ship/bmad-qa-generate-e2e-tests/SKILL.md +176 -0
- package/src/bmm-skills/ship/bmad-qa-generate-e2e-tests/checklist.md +33 -0
- package/src/bmm-skills/ship/bmad-qa-generate-e2e-tests/customize.toml +41 -0
- package/src/bmm-skills/ship/bmad-retrospective/SKILL.md +94 -0
- package/src/bmm-skills/ship/bmad-retrospective/customize.toml +41 -0
- package/src/bmm-skills/ship/bmad-retrospective/references/acceptance-verdict.md +55 -0
- package/src/bmm-skills/ship/bmad-retrospective/references/aggregate-views.md +17 -0
- package/src/bmm-skills/ship/bmad-retrospective/references/evidence-gathering.md +30 -0
- package/src/bmm-skills/ship/bmad-retrospective/references/retro-document.md +84 -0
- package/src/bmm-skills/ship/bmad-retrospective/references/team-discussion.md +22 -0
- package/src/bmm-skills/ship/bmad-retrospective/scripts/__pycache__/sprint_status.cpython-311.pyc +0 -0
- package/src/bmm-skills/ship/bmad-retrospective/scripts/git_evidence.py +304 -0
- package/src/bmm-skills/ship/bmad-retrospective/scripts/sprint_status.py +746 -0
- package/src/bmm-skills/ship/bmad-retrospective/scripts/tests/__pycache__/test_git_evidence.cpython-311-pytest-9.1.1.pyc +0 -0
- package/src/bmm-skills/ship/bmad-retrospective/scripts/tests/__pycache__/test_sprint_status.cpython-311-pytest-9.1.1.pyc +0 -0
- package/src/bmm-skills/ship/bmad-retrospective/scripts/tests/fixtures/sprint-status-template.yaml +71 -0
- package/src/bmm-skills/ship/bmad-retrospective/scripts/tests/test_git_evidence.py +750 -0
- package/src/bmm-skills/ship/bmad-retrospective/scripts/tests/test_sprint_status.py +1579 -0
- package/src/bmm-skills/v6-shims/README.md +28 -0
- package/src/bmm-skills/v6-shims/bmad-create-architecture/SKILL.md +30 -0
- package/src/bmm-skills/v6-shims/bmad-create-architecture/customize.toml +41 -0
- package/src/bmm-skills/v6-shims/bmad-create-prd/SKILL.md +30 -0
- package/src/bmm-skills/v6-shims/bmad-create-prd/customize.toml +41 -0
- package/src/bmm-skills/v6-shims/bmad-create-story/SKILL.md +434 -0
- package/src/bmm-skills/v6-shims/bmad-create-story/checklist.md +357 -0
- package/src/bmm-skills/v6-shims/bmad-create-story/customize.toml +41 -0
- package/src/bmm-skills/v6-shims/bmad-create-story/discover-inputs.md +88 -0
- package/src/bmm-skills/v6-shims/bmad-create-story/template.md +49 -0
- package/src/bmm-skills/v6-shims/bmad-dev-auto/SKILL.md +19 -0
- package/src/bmm-skills/v6-shims/bmad-dev-story/SKILL.md +502 -0
- package/src/bmm-skills/v6-shims/bmad-dev-story/checklist.md +80 -0
- package/src/bmm-skills/v6-shims/bmad-dev-story/customize.toml +44 -0
- package/src/bmm-skills/v6-shims/bmad-document-project/SKILL.md +14 -0
- package/src/bmm-skills/v6-shims/bmad-domain-research/SKILL.md +14 -0
- package/src/bmm-skills/v6-shims/bmad-edit-prd/SKILL.md +30 -0
- package/src/bmm-skills/v6-shims/bmad-edit-prd/customize.toml +42 -0
- package/src/bmm-skills/v6-shims/bmad-market-research/SKILL.md +14 -0
- package/src/bmm-skills/v6-shims/bmad-quick-dev/SKILL.md +19 -0
- package/src/bmm-skills/v6-shims/bmad-sprint-status/SKILL.md +26 -0
- package/src/bmm-skills/v6-shims/bmad-sprint-status/customize.toml +41 -0
- package/src/bmm-skills/v6-shims/bmad-technical-research/SKILL.md +14 -0
- package/src/bmm-skills/v6-shims/bmad-validate-prd/SKILL.md +30 -0
- package/src/bmm-skills/v6-shims/bmad-validate-prd/customize.toml +42 -0
- package/src/core-skills/bmad-advanced-elicitation/SKILL.md +65 -0
- package/src/core-skills/bmad-advanced-elicitation/assets/methods.csv +72 -0
- package/src/core-skills/bmad-advanced-elicitation/customize.toml +54 -0
- package/src/core-skills/bmad-advanced-elicitation/scripts/pick_methods.py +233 -0
- package/src/core-skills/bmad-advanced-elicitation/scripts/tests/test_pick_methods.py +228 -0
- package/src/core-skills/bmad-brainstorming/SKILL.md +80 -0
- package/src/core-skills/bmad-brainstorming/assets/brain-icons.json +166 -0
- package/src/core-skills/bmad-brainstorming/assets/brain-methods.csv +109 -0
- package/src/core-skills/bmad-brainstorming/assets/brain-selector.html +328 -0
- package/src/core-skills/bmad-brainstorming/customize.toml +84 -0
- package/src/core-skills/bmad-brainstorming/references/converge.md +24 -0
- package/src/core-skills/bmad-brainstorming/references/finalize.md +26 -0
- package/src/core-skills/bmad-brainstorming/references/headless.md +54 -0
- package/src/core-skills/bmad-brainstorming/references/in-chat-techniques.md +18 -0
- package/src/core-skills/bmad-brainstorming/references/mode-autonomous.md +10 -0
- package/src/core-skills/bmad-brainstorming/references/mode-facilitator.md +11 -0
- package/src/core-skills/bmad-brainstorming/references/mode-partner.md +16 -0
- package/src/core-skills/bmad-brainstorming/references/resume.md +5 -0
- package/src/core-skills/bmad-brainstorming/scripts/brain.py +770 -0
- package/src/core-skills/bmad-brainstorming/scripts/tests/test_brain.py +239 -0
- package/src/core-skills/bmad-customize/SKILL.md +111 -0
- package/src/core-skills/bmad-customize/scripts/list_customizable_skills.py +231 -0
- package/src/core-skills/bmad-customize/scripts/tests/test_list_customizable_skills.py +249 -0
- package/src/core-skills/bmad-deep-recon/SKILL.md +82 -0
- package/src/core-skills/bmad-deep-recon/assets/research.template.md +18 -0
- package/src/core-skills/bmad-deep-recon/customize.toml +212 -0
- package/src/core-skills/bmad-deep-recon/references/draft.md +8 -0
- package/src/core-skills/bmad-deep-recon/references/finalize.md +11 -0
- package/src/core-skills/bmad-deep-recon/references/html-briefing.md +16 -0
- package/src/core-skills/bmad-deep-recon/references/lifecycle.md +11 -0
- package/src/core-skills/bmad-deep-recon/references/process.md +10 -0
- package/src/core-skills/bmad-deep-recon/references/run.md +73 -0
- package/src/core-skills/bmad-deep-recon/references/selection.md +13 -0
- package/src/core-skills/bmad-deep-recon/references/synthesis.md +16 -0
- package/src/core-skills/bmad-deep-recon/references/verification.md +29 -0
- package/src/core-skills/bmad-deep-recon/scripts/recon_kit.py +322 -0
- package/src/core-skills/bmad-deep-recon/scripts/tests/test_recon_kit.py +144 -0
- package/src/core-skills/bmad-deep-recon/types/academic-lit.md +19 -0
- package/src/core-skills/bmad-deep-recon/types/competitive.md +19 -0
- package/src/core-skills/bmad-deep-recon/types/domain.md +19 -0
- package/src/core-skills/bmad-deep-recon/types/market.md +19 -0
- package/src/core-skills/bmad-deep-recon/types/technical.md +19 -0
- package/src/core-skills/bmad-deep-recon/types/user-voice.md +19 -0
- package/src/core-skills/bmad-forge-idea/SKILL.md +107 -0
- package/src/core-skills/bmad-forge-idea/customize.toml +42 -0
- package/src/core-skills/bmad-forge-idea/scripts/resolve_personas.py +275 -0
- package/src/core-skills/bmad-forge-idea/scripts/tests/test_resolve_personas.py +138 -0
- package/src/core-skills/bmad-help/SKILL.md +75 -0
- package/src/core-skills/bmad-party-mode/SKILL.md +60 -0
- package/src/core-skills/bmad-party-mode/customize.toml +211 -0
- package/src/core-skills/bmad-party-mode/references/create-party.md +70 -0
- package/src/core-skills/bmad-party-mode/references/mode-agent-team.md +13 -0
- package/src/core-skills/bmad-party-mode/references/mode-auto.md +13 -0
- package/src/core-skills/bmad-party-mode/references/mode-subagent.md +31 -0
- package/src/core-skills/bmad-party-mode/references/party-memory.md +51 -0
- package/src/core-skills/bmad-party-mode/scripts/resolve_party.py +282 -0
- package/src/core-skills/bmad-party-mode/scripts/tests/test_resolve_party.py +146 -0
- package/src/core-skills/bmad-review/SKILL.md +49 -0
- package/src/core-skills/bmad-review/customize.toml +141 -0
- package/src/core-skills/bmad-review/references/editorial-common.md +56 -0
- package/src/core-skills/bmad-review/references/lens-adversarial.md +19 -0
- package/src/core-skills/bmad-review/references/lens-edge-case-hunter.md +54 -0
- package/src/core-skills/bmad-review/references/lens-prose.md +7 -0
- package/src/core-skills/bmad-review/references/lens-structure.md +9 -0
- package/src/core-skills/bmad-review/references/lens-verification-gap.md +92 -0
- package/src/core-skills/bmad-review/references/structure-models.md +44 -0
- package/src/core-skills/bmad-review/scripts/tests/test_word_metrics.py +62 -0
- package/src/core-skills/bmad-review/scripts/word_metrics.py +102 -0
- package/src/core-skills/module-help.csv +10 -0
- package/src/core-skills/module.yaml +38 -0
- package/src/core-skills/v6-shims/README.md +25 -0
- package/src/core-skills/v6-shims/bmad-editorial-review/SKILL.md +6 -0
- package/src/core-skills/v6-shims/bmad-editorial-review/customize.toml +31 -0
- package/src/core-skills/v6-shims/bmad-editorial-review-prose/SKILL.md +6 -0
- package/src/core-skills/v6-shims/bmad-editorial-review-structure/SKILL.md +6 -0
- package/src/core-skills/v6-shims/bmad-review-adversarial-general/SKILL.md +6 -0
- package/src/core-skills/v6-shims/bmad-review-edge-case-hunter/SKILL.md +6 -0
- package/src/core-skills/v6-shims/bmad-review-verification-gap/SKILL.md +6 -0
- package/src/scripts/__pycache__/config_utils.cpython-311.pyc +0 -0
- package/src/scripts/config_utils.py +119 -0
- package/src/scripts/memlog.py +224 -0
- package/src/scripts/render_skill.py +401 -0
- package/src/scripts/resolve_config.py +74 -0
- package/src/scripts/resolve_customization.py +99 -0
- package/src/scripts/tests/__pycache__/test_config_utils.cpython-311.pyc +0 -0
- package/src/scripts/tests/__pycache__/test_resolve_config.cpython-311.pyc +0 -0
- package/src/scripts/tests/__pycache__/test_resolve_customization.cpython-311.pyc +0 -0
- package/src/scripts/tests/test_config_utils.py +85 -0
- package/src/scripts/tests/test_memlog.py +306 -0
- package/src/scripts/tests/test_resolve_config.py +89 -0
- package/src/scripts/tests/test_resolve_customization.py +77 -0
- package/tools/bundle-web-bundles.js +117 -0
- package/tools/format-workflow-md.js +263 -0
- package/tools/installer/README.md +60 -0
- package/tools/installer/bmad-cli.js +105 -0
- package/tools/installer/cli-utils.js +57 -0
- package/tools/installer/commands/install.js +149 -0
- package/tools/installer/commands/status.js +65 -0
- package/tools/installer/commands/uninstall.js +167 -0
- package/tools/installer/core/config.js +73 -0
- package/tools/installer/core/existing-install.js +121 -0
- package/tools/installer/core/install-paths.js +132 -0
- package/tools/installer/core/installer.js +1767 -0
- package/tools/installer/core/legacy-warnings.js +151 -0
- package/tools/installer/core/manifest-generator.js +859 -0
- package/tools/installer/core/manifest.js +433 -0
- package/tools/installer/core/uv-check.js +195 -0
- package/tools/installer/core/wsl-node-check.js +109 -0
- package/tools/installer/file-ops.js +204 -0
- package/tools/installer/fs-native.js +116 -0
- package/tools/installer/ide/_config-driven.js +972 -0
- package/tools/installer/ide/manager.js +324 -0
- package/tools/installer/ide/platform-codes.js +80 -0
- package/tools/installer/ide/platform-codes.yaml +343 -0
- package/tools/installer/ide/shared/installed-skills.js +50 -0
- package/tools/installer/ide/shared/path-utils.js +219 -0
- package/tools/installer/ide/shared/skill-manifest.js +57 -0
- package/tools/installer/install-messages.yaml +37 -0
- package/tools/installer/list-options.js +210 -0
- package/tools/installer/message-loader.js +83 -0
- package/tools/installer/modules/channel-plan.js +203 -0
- package/tools/installer/modules/channel-resolver.js +241 -0
- package/tools/installer/modules/custom-module-manager.js +924 -0
- package/tools/installer/modules/external-manager.js +671 -0
- package/tools/installer/modules/git-env.js +47 -0
- package/tools/installer/modules/module-help-schema.js +13 -0
- package/tools/installer/modules/official-modules.js +2257 -0
- package/tools/installer/modules/plugin-resolver.js +398 -0
- package/tools/installer/modules/version-resolver.js +336 -0
- package/tools/installer/project-root.js +224 -0
- package/tools/installer/prompts.js +791 -0
- package/tools/installer/set-overrides.js +330 -0
- package/tools/installer/ui.js +2167 -0
- package/tools/installer/yaml-format.js +245 -0
- package/tools/javascript-conventions.md +5 -0
- package/tools/migrate-custom-module-paths.js +124 -0
- package/tools/skill-validator.md +378 -0
- package/tools/validate-published-implementation-model.mjs +68 -0
- package/tools/validate-sidebar-order.js +388 -0
- package/tools/validate-skills.js +735 -0
- package/tools/validate-svg-changes.sh +356 -0
- package/web-bundles/README.md +46 -0
- package/web-bundles/brainstorming-coach/INSTRUCTIONS.md +86 -0
- package/web-bundles/brainstorming-coach/SKILL.md +83 -0
- package/web-bundles/brainstorming-coach/brain-methods.csv +62 -0
- package/web-bundles/bundles.json +139 -0
- package/web-bundles/market-and-industry-research/INSTRUCTIONS.md +88 -0
- package/web-bundles/market-and-industry-research/SKILL.md +59 -0
- package/web-bundles/prd-coach/INSTRUCTIONS.md +86 -0
- package/web-bundles/prd-coach/SKILL.md +101 -0
- package/web-bundles/prd-coach/prd-template.md +165 -0
- package/web-bundles/prd-coach/prd-validation-checklist.md +135 -0
- package/web-bundles/prfaq-coach/INSTRUCTIONS.md +86 -0
- package/web-bundles/prfaq-coach/SKILL.md +139 -0
- package/web-bundles/product-brief-coach/INSTRUCTIONS.md +86 -0
- package/web-bundles/product-brief-coach/SKILL.md +113 -0
- package/web-bundles/ux-coach/INSTRUCTIONS.md +92 -0
- package/web-bundles/ux-coach/SKILL.md +187 -0
- package/web-bundles/ux-coach/ux-validation.md +100 -0
package/src/bmm-skills/agents/bmad-quarkus-architect/skills/quarkus-error-handling-i18n/SKILL.md
ADDED
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: quarkus-error-handling-i18n
|
|
3
|
+
description: Unified (single) global exception handler and internationalized (i18n) API responses for Quarkus backend services, aligned to TM Forum error schema (TMF630). Use this skill whenever the user mentions exception handling, error responses, ExceptionMapper, error codes, Problem Details, localization, i18n, translations, Accept-Language, message bundles, or when creating/reviewing ANY REST endpoint that can fail — errors and locale handling must always go through this standard, never ad-hoc try/catch in resources. Also defines exception class naming and the English-identifiers/localized-messages rule.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Unified Exception Handler + i18n Responses (Quarkus, TMF-aligned)
|
|
7
|
+
|
|
8
|
+
One handler, one error contract, localized messages resolved from the `Accept-Language` header. No endpoint ever builds its own error response.
|
|
9
|
+
|
|
10
|
+
Applies to any Quarkus backend project. Defaults below (locale set, error-code format) are overridable by project directives (CLAUDE.md, ADRs, explicit instructions) — the single-handler and stable-code principles are the part to defend.
|
|
11
|
+
|
|
12
|
+
## Error contract (TM Forum TMF630 Error schema)
|
|
13
|
+
|
|
14
|
+
All error responses use `application/json` with the TMF Error structure (interoperable with TMF Open APIs; if the project is not TMF-facing, RFC 9457 `application/problem+json` is the fallback — same handler, different DTO):
|
|
15
|
+
|
|
16
|
+
```json
|
|
17
|
+
{
|
|
18
|
+
"code": "USR-404-001",
|
|
19
|
+
"reason": "Not Found",
|
|
20
|
+
"message": "User 8f14e45f does not exist.",
|
|
21
|
+
"status": "404",
|
|
22
|
+
"referenceError": "https://docs.company.com/errors/USR-404-001",
|
|
23
|
+
"@type": "Error"
|
|
24
|
+
}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
- `code`: stable, machine-readable, defined in the **domain exception**, format `<MOD>-<HTTP>-<seq>` where `<MOD>` is a short module/domain code (the BC code in DDD projects). Never reworded, never localized.
|
|
28
|
+
- `message`: human-readable, **localized** via bundles.
|
|
29
|
+
- `referenceError`: link to error catalog docs.
|
|
30
|
+
- Add `traceId` propagation via response header `X-Trace-Id` (see observability skill), not in the body.
|
|
31
|
+
|
|
32
|
+
## Exception hierarchy (domain layer, framework-free)
|
|
33
|
+
|
|
34
|
+
```java
|
|
35
|
+
// domain/exception
|
|
36
|
+
public abstract class DomainException extends RuntimeException {
|
|
37
|
+
private final String code; // "USR-404-001"
|
|
38
|
+
private final Object[] messageArgs; // interpolated into localized message
|
|
39
|
+
protected DomainException(String code, Object... args) {
|
|
40
|
+
super(code);
|
|
41
|
+
this.code = code;
|
|
42
|
+
this.messageArgs = args;
|
|
43
|
+
}
|
|
44
|
+
public String code() { return code; }
|
|
45
|
+
public Object[] messageArgs() { return messageArgs; }
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
public final class UserNotFoundException extends DomainException {
|
|
49
|
+
public UserNotFoundException(UserId id) { super("USR-404-001", id.value()); }
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
HTTP status is NOT known by the domain. The mapping code→status lives in the handler via a registry (an enum or properties-driven map in infrastructure).
|
|
54
|
+
|
|
55
|
+
### Naming
|
|
56
|
+
|
|
57
|
+
Canonical rules in the quarkus-hexagonal-core skill; the error/i18n specifics:
|
|
58
|
+
|
|
59
|
+
| Artifact | Convention | Example |
|
|
60
|
+
|---|---|---|
|
|
61
|
+
| Domain exception | `<Thing><Problem>Exception`, in `domain/exception` | `UserNotFoundException`, `DuplicateEmailException` |
|
|
62
|
+
| Base class | `DomainException` | |
|
|
63
|
+
| Technical exceptions | `PersistenceException`, `TransientPersistenceException`, `StaleVersionException` | |
|
|
64
|
+
| Single REST handler | `GlobalExceptionHandler` (the only sanctioned `*Handler`) | |
|
|
65
|
+
| gRPC counterpart | `GrpcExceptionInterceptor` | |
|
|
66
|
+
| i18n components | `MessageResolver`, `ErrorCatalog` | |
|
|
67
|
+
| Error DTO | `ErrorDto` | |
|
|
68
|
+
| Bundle files | `messages/errors[_<lang>].properties` | `errors_en.properties` |
|
|
69
|
+
| Bundle key | the error code itself, never a prose key | `USR-404-001` |
|
|
70
|
+
|
|
71
|
+
Never name an exception after the HTTP status (`NotFoundException`, `BadRequestException`) — the domain does not know about HTTP, and the status is resolved by `ErrorCatalog`. Never shadow a JDK type (`ConcurrentModificationException` → `StaleVersionException`).
|
|
72
|
+
|
|
73
|
+
**Language rule:** class, method and field names are English; the *messages* are localized per bundle, with **English as the default locale** and other languages (es, pt, ...) added per project need. `UserNotFoundException` with a Spanish translation `El usuario {0} no existe.` in `errors_es.properties` is correct — `UsuarioNoEncontradoException` is not.
|
|
74
|
+
|
|
75
|
+
## The single global handler (infrastructure/rest)
|
|
76
|
+
|
|
77
|
+
Exactly ONE class. Use `@ServerExceptionMapper` (Quarkus REST) — build-time wired, native-friendly:
|
|
78
|
+
|
|
79
|
+
```java
|
|
80
|
+
@ApplicationScoped // required for constructor injection into the mapper class
|
|
81
|
+
public class GlobalExceptionHandler {
|
|
82
|
+
|
|
83
|
+
private final MessageResolver messages; // i18n component below
|
|
84
|
+
private final ErrorCatalog catalog; // code -> HTTP status + reason
|
|
85
|
+
|
|
86
|
+
public GlobalExceptionHandler(MessageResolver messages, ErrorCatalog catalog) {
|
|
87
|
+
this.messages = messages;
|
|
88
|
+
this.catalog = catalog;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
@ServerExceptionMapper
|
|
92
|
+
public RestResponse<ErrorDto> map(DomainException e, HttpHeaders headers) {
|
|
93
|
+
var status = catalog.statusOf(e.code()); // e.g. 404
|
|
94
|
+
var msg = messages.resolve(e.code(), headers, e.messageArgs());
|
|
95
|
+
return RestResponse.status(status,
|
|
96
|
+
ErrorDto.of(e.code(), status, msg));
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
@ServerExceptionMapper
|
|
100
|
+
public RestResponse<ErrorDto> map(ConstraintViolationException e, HttpHeaders headers) {
|
|
101
|
+
// 400, code "GEN-400-001", join violations into localized detail
|
|
102
|
+
...
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
@ServerExceptionMapper
|
|
106
|
+
public RestResponse<ErrorDto> map(Exception e, HttpHeaders headers) {
|
|
107
|
+
Log.error("Unhandled exception", e); // full stack only in logs
|
|
108
|
+
var msg = messages.resolve("GEN-500-001", headers);
|
|
109
|
+
return RestResponse.status(500, ErrorDto.of("GEN-500-001", 500, msg));
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
Rules:
|
|
115
|
+
- Catch-all `Exception` mapper is mandatory: internal details/stack traces NEVER reach the client. Log with full context (trace_id lands in the log automatically via MDC).
|
|
116
|
+
- Validation errors (Bean Validation) map to 400 with one generic code + per-field details array.
|
|
117
|
+
- Resources and use cases must NOT catch-and-format errors themselves — throw domain exceptions and let the handler translate.
|
|
118
|
+
- `ErrorDto` is `@RegisterForReflection` (native).
|
|
119
|
+
|
|
120
|
+
## i18n resolution from Accept-Language
|
|
121
|
+
|
|
122
|
+
### Configuration
|
|
123
|
+
|
|
124
|
+
```properties
|
|
125
|
+
quarkus.locales=en,es,pt
|
|
126
|
+
quarkus.default-locale=en
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
`quarkus.locales` also tells the native image which locale data to embed — required for native builds.
|
|
130
|
+
|
|
131
|
+
### Message bundles
|
|
132
|
+
|
|
133
|
+
`src/main/resources/messages/errors.properties` (default = **en**), `errors_es.properties`, `errors_pt.properties`:
|
|
134
|
+
|
|
135
|
+
```properties
|
|
136
|
+
# errors.properties (en, default)
|
|
137
|
+
USR-404-001=User {0} does not exist.
|
|
138
|
+
GEN-400-001=The request contains invalid data.
|
|
139
|
+
GEN-500-001=Internal error. Contact support with the trace identifier.
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
```properties
|
|
143
|
+
# errors_es.properties
|
|
144
|
+
USR-404-001=El usuario {0} no existe.
|
|
145
|
+
GEN-400-001=La solicitud contiene datos inválidos.
|
|
146
|
+
GEN-500-001=Error interno. Contacte a soporte con el identificador de traza.
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
For native: `quarkus.native.resources.includes=messages/*.properties`.
|
|
150
|
+
|
|
151
|
+
### Resolver
|
|
152
|
+
|
|
153
|
+
```java
|
|
154
|
+
@ApplicationScoped
|
|
155
|
+
public class MessageResolver {
|
|
156
|
+
public String resolve(String code, HttpHeaders headers, Object... args) {
|
|
157
|
+
var locale = headers.getAcceptableLanguages().stream()
|
|
158
|
+
.findFirst().filter(l -> !"*".equals(l.getLanguage()))
|
|
159
|
+
.orElse(Locale.ENGLISH); // default locale = en
|
|
160
|
+
var bundle = ResourceBundle.getBundle("messages.errors", locale);
|
|
161
|
+
var pattern = bundle.containsKey(code) ? bundle.getString(code)
|
|
162
|
+
: bundle.getString("GEN-500-001");
|
|
163
|
+
return MessageFormat.format(pattern, args);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
`getAcceptableLanguages()` already returns the header parsed and sorted by q-value — take the first supported one. Unknown locales fall back to the default silently (never 406 for language).
|
|
169
|
+
|
|
170
|
+
Alternative: `quarkus-messages` / SmallRye localized message bundles (`@MessageBundle`) give compile-time checked bundles — prefer it in greenfield projects; the `ResourceBundle` approach above is the portable baseline.
|
|
171
|
+
|
|
172
|
+
## i18n beyond errors
|
|
173
|
+
|
|
174
|
+
Success-path localizable strings (notification texts, report labels) use the same resolver and bundles (`messages/app*.properties`). Data itself (entity fields) is NOT localized by this mechanism — that is a modeling concern.
|
|
175
|
+
|
|
176
|
+
## Checklist when adding a new error
|
|
177
|
+
|
|
178
|
+
1. Create domain exception extending `DomainException`, named `<Thing><Problem>Exception`, with new code `<MOD>-<HTTP>-<seq>`.
|
|
179
|
+
2. Register code → status/reason in `ErrorCatalog`.
|
|
180
|
+
3. Add the message key to ALL locale bundles (build fails a test if a code is missing in any bundle — write that test once: iterate catalog codes × locales).
|
|
181
|
+
4. Document in the error catalog page referenced by `referenceError`.
|
|
Binary file
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: quarkus-grpc-services
|
|
3
|
+
description: Standard for internal microservice-to-microservice communication using gRPC in Quarkus native services — proto conventions, Mutiny services, clients, deadlines, error mapping to domain exceptions, health checks, and native-image setup. Use this skill whenever the user mentions gRPC, protobuf, .proto files, internal service calls, synchronous inter-service communication, service clients, or "call service X from service Y" — internal synchronous calls are ALWAYS gRPC, never internal REST. Includes proto and gRPC adapter/client/mapper naming conventions.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# gRPC Standard for Inter-Service Communication (Quarkus)
|
|
7
|
+
|
|
8
|
+
Rule of the road: **external/north-bound = REST (TMF)**, **internal synchronous service-to-service = gRPC**, **internal asynchronous = Kafka**. If someone proposes an internal REST client, redirect to this skill. Applies to any Quarkus backend project; project directives (CLAUDE.md, ADRs, explicit instructions) override these defaults.
|
|
9
|
+
|
|
10
|
+
Extension: `quarkus-grpc` (fully native-compatible; code generation is build-time).
|
|
11
|
+
|
|
12
|
+
## Proto conventions
|
|
13
|
+
|
|
14
|
+
Location: `src/main/proto/`. One package per service/module + major version (the module segment is the BC code in DDD projects, the service name otherwise):
|
|
15
|
+
|
|
16
|
+
```protobuf
|
|
17
|
+
syntax = "proto3";
|
|
18
|
+
package alva.bc05.v1;
|
|
19
|
+
option java_package = "com.alva.bc05.grpc.v1";
|
|
20
|
+
option java_multiple_files = true;
|
|
21
|
+
|
|
22
|
+
service UserService {
|
|
23
|
+
rpc GetUser (GetUserRequest) returns (GetUserResponse);
|
|
24
|
+
rpc ValidateCredentials (ValidateCredentialsRequest) returns (ValidateCredentialsResponse);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
message GetUserRequest { string user_id = 1; }
|
|
28
|
+
message GetUserResponse { User user = 1; }
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Rules:
|
|
32
|
+
- Package version `v1`, `v2` — breaking change = new package version, run both during migration.
|
|
33
|
+
- `snake_case` fields, `PascalCase` messages/services, one `XxxRequest`/`XxxResponse` pair per RPC (never reuse messages across RPCs — they evolve independently).
|
|
34
|
+
- Never reuse/renumber field tags; use `reserved` for removed fields.
|
|
35
|
+
- Timestamps: `google.protobuf.Timestamp`; optional scalars needing presence: `optional` keyword or wrappers.
|
|
36
|
+
- Proto files are contracts: keep them in a shared `contracts/` module (or a dedicated repo) consumed by both sides; do NOT copy-paste protos between services.
|
|
37
|
+
- Streaming RPCs only with a justified use case (bulk export, watch); default is unary.
|
|
38
|
+
|
|
39
|
+
## Server (inbound adapter, `infrastructure/grpc`)
|
|
40
|
+
|
|
41
|
+
```java
|
|
42
|
+
@GrpcService
|
|
43
|
+
public class UserGrpcService implements UserService { // Mutiny-generated interface
|
|
44
|
+
|
|
45
|
+
private final GetUserUseCase getUser; // inbound port from application layer
|
|
46
|
+
|
|
47
|
+
public UserGrpcService(GetUserUseCase getUser) { this.getUser = getUser; }
|
|
48
|
+
|
|
49
|
+
@Override
|
|
50
|
+
public Uni<GetUserResponse> getUser(GetUserRequest req) {
|
|
51
|
+
return Uni.createFrom().item(() -> getUser.byId(new UserId(UUID.fromString(req.getUserId()))))
|
|
52
|
+
.runSubscriptionOn(Infrastructure.getDefaultWorkerPool()) // JDBC below → worker thread
|
|
53
|
+
.map(UserGrpcMapper::toResponse);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
- gRPC service = thin adapter: map proto ↔ command/result, delegate to the use case. No business logic.
|
|
59
|
+
- Blocking work (JDBC) either `@Blocking` on the method or explicit worker pool as above.
|
|
60
|
+
|
|
61
|
+
### Naming
|
|
62
|
+
|
|
63
|
+
Canonical rules in the quarkus-hexagonal-core skill; gRPC specifics:
|
|
64
|
+
|
|
65
|
+
| Artifact | Convention | Example |
|
|
66
|
+
|---|---|---|
|
|
67
|
+
| Proto service | `<Entity>Service` (PascalCase) | `UserService` |
|
|
68
|
+
| Proto RPC | `<Verb><Entity>` | `GetUser`, `ValidateCredentials` |
|
|
69
|
+
| Proto messages | `<Rpc>Request` / `<Rpc>Response`, one pair per RPC | `GetUserRequest` |
|
|
70
|
+
| Proto fields | `snake_case` | `user_id` |
|
|
71
|
+
| Server adapter | `<ProtoService>GrpcService` | `UserGrpcService` |
|
|
72
|
+
| Client adapter | `Grpc<Port>` — port name from `application/port/out` | `GrpcCredentialsValidator` |
|
|
73
|
+
| Proto ↔ domain mapper | `<Entity>GrpcMapper` | `UserGrpcMapper` |
|
|
74
|
+
| Global error interceptor | `GrpcExceptionInterceptor` | |
|
|
75
|
+
| Client config key | `<module>-<entity>` kebab-case, matching `@GrpcClient` | `bc05-users` |
|
|
76
|
+
|
|
77
|
+
`*GrpcService` is the one place outside `application/usecase` where the `*Service` suffix is allowed — it mirrors the proto service name, which is not ours to rename. The client adapter is never called `UserServiceClient`: it implements a domain-named port, and only the `Grpc` prefix reveals the transport.
|
|
78
|
+
- Separate gRPC server port (default `9000`) or unified with HTTP via `quarkus.grpc.server.use-separate-server=false` — pick one per platform and keep it consistent.
|
|
79
|
+
|
|
80
|
+
## Error mapping (domain exception → gRPC status)
|
|
81
|
+
|
|
82
|
+
One `ExceptionHandlerProvider`-style mapping, symmetric to the REST unified handler:
|
|
83
|
+
|
|
84
|
+
| Domain situation | gRPC status |
|
|
85
|
+
|---|---|
|
|
86
|
+
| Not found | `NOT_FOUND` |
|
|
87
|
+
| Validation / bad argument | `INVALID_ARGUMENT` |
|
|
88
|
+
| Business rule conflict | `FAILED_PRECONDITION` |
|
|
89
|
+
| Duplicate / concurrency | `ALREADY_EXISTS` / `ABORTED` |
|
|
90
|
+
| Auth | `UNAUTHENTICATED` / `PERMISSION_DENIED` |
|
|
91
|
+
| Anything unexpected | `INTERNAL` (no details leaked) |
|
|
92
|
+
|
|
93
|
+
Attach the stable error code in trailers metadata key `error-code` so callers can map back to their own domain exceptions. Implement once as a global gRPC exception interceptor (`GrpcExceptionInterceptor`, the counterpart of `GlobalExceptionHandler` — see quarkus-error-handling-i18n skill); individual services never build `StatusRuntimeException` by hand.
|
|
94
|
+
|
|
95
|
+
## Client (outbound adapter)
|
|
96
|
+
|
|
97
|
+
Define an outbound port in `application/port/out` (e.g., `CredentialsValidator`); the gRPC client is its adapter:
|
|
98
|
+
|
|
99
|
+
```java
|
|
100
|
+
@ApplicationScoped
|
|
101
|
+
public class GrpcCredentialsValidator implements CredentialsValidator {
|
|
102
|
+
|
|
103
|
+
@GrpcClient("bc05-users") UserService client; // Mutiny stub
|
|
104
|
+
|
|
105
|
+
@Override
|
|
106
|
+
public boolean validate(Credentials c) {
|
|
107
|
+
return client.validateCredentials(toRequest(c))
|
|
108
|
+
.map(ValidateCredentialsResponse::getValid)
|
|
109
|
+
.await().atMost(Duration.ofSeconds(2));
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
```properties
|
|
115
|
+
quarkus.grpc.clients.bc05-users.host=bc05-users.internal
|
|
116
|
+
quarkus.grpc.clients.bc05-users.port=9000
|
|
117
|
+
quarkus.grpc.clients.bc05-users.deadline=2s
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
Rules:
|
|
121
|
+
- **Deadline on every client** (config `deadline` or per-call). No unbounded internal calls, ever — cascading hangs kill native pods just as well.
|
|
122
|
+
- Retries only for idempotent RPCs and only `UNAVAILABLE`/`DEADLINE_EXCEEDED`, with budget — prefer platform/mesh retry policy over hand-rolled loops.
|
|
123
|
+
- TLS/mTLS per platform standard (`quarkus.grpc.clients.*.ssl.*` / mesh-provided).
|
|
124
|
+
- Translate `StatusRuntimeException` back into the caller's domain exceptions at the adapter — gRPC types never cross into application/domain.
|
|
125
|
+
|
|
126
|
+
## Health & reflection
|
|
127
|
+
|
|
128
|
+
- `quarkus-smallrye-health` + gRPC health service enabled (`quarkus.grpc.server.health.enabled=true`) → Kubernetes gRPC probes.
|
|
129
|
+
- Server reflection (`quarkus.grpc.server.enable-reflection-service=true`) in **dev/test only** (grpcurl debugging); off in prod, same policy as Swagger UI.
|
|
130
|
+
|
|
131
|
+
## Observability
|
|
132
|
+
|
|
133
|
+
Tracing is automatic when `quarkus-opentelemetry` is present — `traceparent` propagates via gRPC metadata on both server and client. No manual work; see quarkus-observability-otel skill.
|
|
134
|
+
|
|
135
|
+
## Checklist for a new RPC
|
|
136
|
+
|
|
137
|
+
1. Proto in shared contracts module, package `vN`, dedicated Request/Response.
|
|
138
|
+
2. Server adapter delegating to a use case; blocking handled explicitly.
|
|
139
|
+
3. Client behind an outbound port, deadline configured.
|
|
140
|
+
4. Error mapping covered by the global interceptor (add new code if needed).
|
|
141
|
+
5. Contract check in CI (buf breaking-change detection or equivalent).
|