bmad-method-quarkus 1.0.3 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/package.json +1 -1
  2. package/removals.txt +10 -0
  3. package/src/bmm-skills/agents/bmad-quarkus-build/SKILL.md +19 -16
  4. package/src/bmm-skills/agents/bmad-quarkus-build/customize.toml +7 -5
  5. package/src/bmm-skills/agents/bmad-quarkus-build/skills/bqa-setup/assets/module-help.csv +0 -1
  6. package/src/bmm-skills/agents/bmad-quarkus-build/skills/bqa-setup/assets/module.yaml +2 -9
  7. package/src/bmm-skills/agents/bmad-quarkus-build/skills/quarkus-hexagonal-core/SKILL.md +30 -10
  8. package/src/bmm-skills/agents/bmad-quarkus-build/skills/quarkus-kafka-messaging/SKILL.md +163 -15
  9. package/src/bmm-skills/agents/bmad-quarkus-build/skills/quarkus-sql-jdbc-agroal/SKILL.md +37 -4
  10. package/src/bmm-skills/module.yaml +0 -7
  11. package/src/bmm-skills/agents/bmad-quarkus-build/skills/quarkus-architect/SKILL.md +0 -108
  12. package/src/bmm-skills/agents/bmad-quarkus-build/skills/quarkus-architect/customize.toml +0 -62
  13. package/src/bmm-skills/agents/bmad-quarkus-build/skills/quarkus-architect/references/architecture-review.md +0 -17
  14. package/src/bmm-skills/agents/bmad-quarkus-build/skills/quarkus-architect/references/prompt-quality-canon.md +0 -79
  15. package/src/bmm-skills/agents/bmad-quarkus-dev/.memlog.md +0 -12
  16. package/src/bmm-skills/agents/bmad-quarkus-dev/.memlog.md:Zone.Identifier +0 -0
  17. package/src/bmm-skills/agents/bmad-quarkus-dev/SKILL.md +0 -86
  18. package/src/bmm-skills/agents/bmad-quarkus-dev/SKILL.md:Zone.Identifier +0 -0
  19. package/src/bmm-skills/agents/bmad-quarkus-dev/customize.toml +0 -37
  20. package/src/bmm-skills/agents/bmad-quarkus-dev/customize.toml:Zone.Identifier +0 -0
  21. package/src/bmm-skills/agents/bmad-quarkus-dev/references/enrich-stories.md +0 -19
  22. package/src/bmm-skills/agents/bmad-quarkus-dev/references/enrich-stories.md:Zone.Identifier +0 -0
  23. package/src/bmm-skills/agents/bmad-quarkus-dev/references/prompt-quality-canon.md +0 -79
  24. package/src/bmm-skills/agents/bmad-quarkus-dev/references/prompt-quality-canon.md:Zone.Identifier +0 -0
  25. package/src/bmm-skills/agents/bmad-quarkus-dev/skills/bqa-setup/SKILL.md +0 -80
  26. package/src/bmm-skills/agents/bmad-quarkus-dev/skills/bqa-setup/SKILL.md:Zone.Identifier +0 -0
  27. package/src/bmm-skills/agents/bmad-quarkus-dev/skills/bqa-setup/assets/module-help.csv +0 -9
  28. package/src/bmm-skills/agents/bmad-quarkus-dev/skills/bqa-setup/assets/module-help.csv:Zone.Identifier +0 -0
  29. package/src/bmm-skills/agents/bmad-quarkus-dev/skills/bqa-setup/assets/module.yaml +0 -16
  30. package/src/bmm-skills/agents/bmad-quarkus-dev/skills/bqa-setup/assets/module.yaml:Zone.Identifier +0 -0
  31. package/src/bmm-skills/agents/bmad-quarkus-dev/skills/bqa-setup/scripts/cleanup-legacy.py +0 -287
  32. package/src/bmm-skills/agents/bmad-quarkus-dev/skills/bqa-setup/scripts/cleanup-legacy.py:Zone.Identifier +0 -0
  33. package/src/bmm-skills/agents/bmad-quarkus-dev/skills/bqa-setup/scripts/merge-config.py +0 -441
  34. package/src/bmm-skills/agents/bmad-quarkus-dev/skills/bqa-setup/scripts/merge-config.py:Zone.Identifier +0 -0
  35. package/src/bmm-skills/agents/bmad-quarkus-dev/skills/bqa-setup/scripts/merge-help-csv.py +0 -246
  36. package/src/bmm-skills/agents/bmad-quarkus-dev/skills/bqa-setup/scripts/merge-help-csv.py:Zone.Identifier +0 -0
  37. package/src/bmm-skills/agents/bmad-quarkus-dev/skills/quarkus-error-handling-i18n/SKILL.md +0 -215
  38. package/src/bmm-skills/agents/bmad-quarkus-dev/skills/quarkus-error-handling-i18n/SKILL.md:Zone.Identifier +0 -0
  39. package/src/bmm-skills/agents/bmad-quarkus-dev/skills/quarkus-grpc-services/SKILL.md +0 -160
  40. package/src/bmm-skills/agents/bmad-quarkus-dev/skills/quarkus-grpc-services/SKILL.md:Zone.Identifier +0 -0
  41. package/src/bmm-skills/agents/bmad-quarkus-dev/skills/quarkus-hexagonal-core/SKILL.md +0 -661
  42. package/src/bmm-skills/agents/bmad-quarkus-dev/skills/quarkus-hexagonal-core/SKILL.md:Zone.Identifier +0 -0
  43. package/src/bmm-skills/agents/bmad-quarkus-dev/skills/quarkus-kafka-messaging/SKILL.md +0 -165
  44. package/src/bmm-skills/agents/bmad-quarkus-dev/skills/quarkus-kafka-messaging/SKILL.md:Zone.Identifier +0 -0
  45. package/src/bmm-skills/agents/bmad-quarkus-dev/skills/quarkus-observability-otel/SKILL.md +0 -196
  46. package/src/bmm-skills/agents/bmad-quarkus-dev/skills/quarkus-observability-otel/SKILL.md:Zone.Identifier +0 -0
  47. package/src/bmm-skills/agents/bmad-quarkus-dev/skills/quarkus-openapi-tmforum/SKILL.md +0 -145
  48. package/src/bmm-skills/agents/bmad-quarkus-dev/skills/quarkus-openapi-tmforum/SKILL.md:Zone.Identifier +0 -0
  49. package/src/bmm-skills/agents/bmad-quarkus-dev/skills/quarkus-sql-jdbc-agroal/SKILL.md +0 -275
  50. package/src/bmm-skills/agents/bmad-quarkus-dev/skills/quarkus-sql-jdbc-agroal/SKILL.md:Zone.Identifier +0 -0
@@ -1,9 +0,0 @@
1
- module,skill,display-name,menu-code,description,action,args,phase,preceded-by,followed-by,required,output-location,outputs
2
- BMad Quarkus Architect,quarkus-hexagonal-core,Hexagonal Core Standard,HC,"Foundation hexagonal architecture, class naming conventions, monorepo layout, and ArchUnit rules for Quarkus/Java backend services. Auto-triggers whenever creating, scaffolding, or reviewing any service, endpoint, repository, use case, or domain class — the other standards below build on it.",,,anytime,,,false,,architecture guidance applied to code
3
- BMad Quarkus Architect,quarkus-error-handling-i18n,Error Handling & i18n,EH,"Unified global exception handler and internationalized (TMF630-aligned) API error responses. Auto-triggers on any exception handling, error response, or REST endpoint that can fail.",,,anytime,,,false,,architecture guidance applied to code
4
- BMad Quarkus Architect,quarkus-kafka-messaging,Kafka Messaging,KM,"CloudEvents envelope, topic naming, transactional outbox, idempotent consumers, and DLQ standard for asynchronous Kafka messaging. Auto-triggers on events, producers, consumers, or async integration between services.",,,anytime,,,false,,architecture guidance applied to code
5
- BMad Quarkus Architect,quarkus-grpc-services,gRPC Services,GS,"Standard for internal service-to-service gRPC calls — proto conventions, Mutiny services/clients, deadlines, error mapping. Auto-triggers on gRPC, protobuf, or internal synchronous service call mentions.",,,anytime,,,false,,architecture guidance applied to code
6
- BMad Quarkus Architect,quarkus-openapi-tmforum,OpenAPI / TM Forum,OT,"REST API design and documentation standard aligned to TM Forum Open API specs — pagination, filtering, JSON Merge Patch, Swagger dev/test-only. Auto-triggers on any REST resource creation or API design mention.",,,anytime,,,false,,architecture guidance applied to code
7
- BMad Quarkus Architect,quarkus-observability-otel,Observability (OTel),OB,"OpenTelemetry tracing, trace/span-id log correlation, OTLP export, and Micrometer metrics standard across REST/gRPC/Kafka. Auto-triggers on tracing, logging, or metrics mentions.",,,anytime,,,false,,architecture guidance applied to code
8
- BMad Quarkus Architect,quarkus-sql-jdbc-agroal,SQL/JDBC (Agroal),SJ,"Plain JDBC persistence standard via Agroal — no ORM, no Panache. Covers pooling, transactions, batches, jsonb, pagination. Auto-triggers on any repository, DAO, or SQL statement work.",,,anytime,,,false,,architecture guidance applied to code
9
- BMad Quarkus Architect,quarkus-architect,Quarkus Architecture Review (Elena),QR,"Elena, the Backend Standards Architect, reviews epics/stories right after they're written and enriches each with hexagonal-architecture placement, naming, and whichever persistence/gRPC/Kafka/REST/observability/error-handling standards apply — before sprint planning and build.",,,plan,bmad-create-epics-and-stories,bmad-sprint-planning,false,planning_artifacts,epics/stories enriched with a Quarkus Architecture Notes section
@@ -1,16 +0,0 @@
1
- code: bqa
2
- name: "BMad Quarkus Architect"
3
- description: "Java/Quarkus hexagonal-architecture standards suite — persistence, messaging, gRPC, REST/TM Forum, observability, and error-handling conventions for native-compiled backend services, plus Elena, an agent that gates epics/stories with this guidance before implementation."
4
- module_version: 1.0.0
5
- default_selected: false
6
- module_greeting: >
7
- BMad Quarkus Architect is active — these skills auto-trigger whenever you scaffold, write, or review Quarkus backend code. Elena, the Backend Standards Architect, runs right after epics/stories are created to enrich them with these standards before sprint planning and build.
8
-
9
- Run this again at any time if you want to reconfigure a setting or have updated the module.
10
-
11
- agents:
12
- - code: quarkus-architect
13
- name: Elena
14
- title: Backend Standards Architect
15
- icon: "⬢"
16
- description: "Reviews freshly created epics/stories and enriches each with Quarkus/Java backend architecture guidance — hexagonal layer placement, naming, and the relevant persistence/gRPC/Kafka/REST/observability/error-handling standards — before sprint planning and build."
@@ -1,287 +0,0 @@
1
- #!/usr/bin/env python3
2
- # /// script
3
- # requires-python = ">=3.9"
4
- # dependencies = []
5
- # ///
6
- """Remove legacy module directories from _bmad/ after config migration.
7
-
8
- After merge-config.py and merge-help-csv.py have migrated config data and
9
- deleted individual legacy files, this script removes the now-redundant
10
- directory trees. These directories contain skill files that are already
11
- installed at .claude/skills/ (or equivalent) — only the config files at
12
- _bmad/ root need to persist.
13
-
14
- When --skills-dir is provided, the script verifies that every skill found
15
- in the legacy directories exists at the installed location before removing
16
- anything. Directories without skills (like _config/) are removed directly.
17
-
18
- Exit codes: 0=success (including nothing to remove), 1=validation error, 2=runtime error
19
- """
20
-
21
- import argparse
22
- import json
23
- import shutil
24
- import sys
25
- from pathlib import Path
26
-
27
-
28
- def parse_args():
29
- parser = argparse.ArgumentParser(
30
- description="Remove legacy module directories from _bmad/ after config migration."
31
- )
32
- parser.add_argument(
33
- "--bmad-dir",
34
- required=True,
35
- help="Path to the _bmad/ directory",
36
- )
37
- parser.add_argument(
38
- "--module-code",
39
- required=True,
40
- help="Module code being cleaned up (e.g. 'bmb')",
41
- )
42
- parser.add_argument(
43
- "--also-remove",
44
- action="append",
45
- default=[],
46
- help="Additional directory names under _bmad/ to remove (repeatable)",
47
- )
48
- parser.add_argument(
49
- "--skills-dir",
50
- help="Path to .claude/skills/ — enables safety verification that skills "
51
- "are installed before removing legacy copies",
52
- )
53
- parser.add_argument(
54
- "--verbose",
55
- action="store_true",
56
- help="Print detailed progress to stderr",
57
- )
58
- return parser.parse_args()
59
-
60
-
61
- def find_skill_dirs(base_path: str) -> list:
62
- """Find directories that contain a SKILL.md file.
63
-
64
- Walks the directory tree and returns the leaf directory name for each
65
- directory containing a SKILL.md. These are considered skill directories.
66
-
67
- Returns:
68
- List of skill directory names (e.g. ['bmad-agent-builder', 'bmad-builder-setup'])
69
- """
70
- skills = []
71
- root = Path(base_path)
72
- if not root.exists():
73
- return skills
74
- for skill_md in root.rglob("SKILL.md"):
75
- skills.append(skill_md.parent.name)
76
- return sorted(set(skills))
77
-
78
-
79
- def verify_skills_installed(
80
- bmad_dir: str, dirs_to_check: list, skills_dir: str, verbose: bool = False
81
- ) -> list:
82
- """Verify that skills in legacy directories exist at the installed location.
83
-
84
- Scans each directory in dirs_to_check for skill folders (containing SKILL.md),
85
- then checks that a matching directory exists under skills_dir. Directories
86
- that contain no skills (like _config/) are silently skipped.
87
-
88
- Returns:
89
- List of verified skill names.
90
-
91
- Raises SystemExit(1) if any skills are missing from skills_dir.
92
- """
93
- all_verified = []
94
- missing = []
95
-
96
- for dirname in dirs_to_check:
97
- legacy_path = Path(bmad_dir) / dirname
98
- if not legacy_path.exists():
99
- continue
100
-
101
- skill_names = find_skill_dirs(str(legacy_path))
102
- if not skill_names:
103
- if verbose:
104
- print(
105
- f"No skills found in {dirname}/ — skipping verification",
106
- file=sys.stderr,
107
- )
108
- continue
109
-
110
- for skill_name in skill_names:
111
- installed_path = Path(skills_dir) / skill_name
112
- if installed_path.is_dir():
113
- all_verified.append(skill_name)
114
- if verbose:
115
- print(
116
- f"Verified: {skill_name} exists at {installed_path}",
117
- file=sys.stderr,
118
- )
119
- else:
120
- missing.append(skill_name)
121
- if verbose:
122
- print(
123
- f"MISSING: {skill_name} not found at {installed_path}",
124
- file=sys.stderr,
125
- )
126
-
127
- if missing:
128
- error_result = {
129
- "status": "error",
130
- "error": "Skills not found at installed location",
131
- "missing_skills": missing,
132
- "skills_dir": str(Path(skills_dir).resolve()),
133
- }
134
- print(json.dumps(error_result, indent=2))
135
- sys.exit(1)
136
-
137
- return sorted(set(all_verified))
138
-
139
-
140
- def count_files(path: Path) -> int:
141
- """Count all files recursively in a directory."""
142
- count = 0
143
- for item in path.rglob("*"):
144
- if item.is_file():
145
- count += 1
146
- return count
147
-
148
-
149
- def cleanup_directories(
150
- bmad_dir: str, dirs_to_remove: list, verbose: bool = False
151
- ) -> tuple:
152
- """Remove specified directories under bmad_dir.
153
-
154
- Returns:
155
- (removed, not_found, total_files_removed) tuple
156
- """
157
- removed = []
158
- not_found = []
159
- total_files = 0
160
-
161
- for dirname in dirs_to_remove:
162
- target = Path(bmad_dir) / dirname
163
- if not target.exists():
164
- not_found.append(dirname)
165
- if verbose:
166
- print(f"Not found (skipping): {target}", file=sys.stderr)
167
- continue
168
-
169
- if not target.is_dir():
170
- if verbose:
171
- print(f"Not a directory (skipping): {target}", file=sys.stderr)
172
- not_found.append(dirname)
173
- continue
174
-
175
- file_count = count_files(target)
176
- if verbose:
177
- print(
178
- f"Removing {target} ({file_count} files)",
179
- file=sys.stderr,
180
- )
181
-
182
- try:
183
- shutil.rmtree(target)
184
- except OSError as e:
185
- error_result = {
186
- "status": "error",
187
- "error": f"Failed to remove {target}: {e}",
188
- "directories_removed": removed,
189
- "directories_failed": dirname,
190
- }
191
- print(json.dumps(error_result, indent=2))
192
- sys.exit(2)
193
-
194
- removed.append(dirname)
195
- total_files += file_count
196
-
197
- return removed, not_found, total_files
198
-
199
-
200
- def reject_unresolved_paths(named_paths: list[tuple[str, str]]) -> None:
201
- """Exit with a clear error if any path argument still contains the literal
202
- ``{project-root}`` token. That token is meaningful only inside config
203
- values; filesystem path arguments must be resolved by the caller. Failing
204
- loudly here prevents silently operating on a junk ``{project-root}/`` directory.
205
- """
206
- for name, value in named_paths:
207
- if value and "{project-root}" in value:
208
- print(
209
- json.dumps(
210
- {
211
- "status": "error",
212
- "error": (
213
- f"Unresolved '{{project-root}}' token in {name} path: {value!r}. "
214
- "Resolve '{project-root}' to the actual project root before running "
215
- "this script — it is a filesystem path, not a config value."
216
- ),
217
- },
218
- indent=2,
219
- )
220
- )
221
- sys.exit(1)
222
-
223
-
224
- def main():
225
- args = parse_args()
226
-
227
- reject_unresolved_paths(
228
- [("--bmad-dir", args.bmad_dir), ("--skills-dir", args.skills_dir)]
229
- )
230
-
231
- bmad_dir = args.bmad_dir
232
- module_code = args.module_code
233
-
234
- # Build the list of directories to remove
235
- dirs_to_remove = [module_code, "core"] + args.also_remove
236
- # Deduplicate while preserving order
237
- seen = set()
238
- unique_dirs = []
239
- for d in dirs_to_remove:
240
- if d not in seen:
241
- seen.add(d)
242
- unique_dirs.append(d)
243
- dirs_to_remove = unique_dirs
244
-
245
- if args.verbose:
246
- print(f"Directories to remove: {dirs_to_remove}", file=sys.stderr)
247
-
248
- # Safety check: verify skills are installed before removing
249
- verified_skills = None
250
- if args.skills_dir:
251
- if args.verbose:
252
- print(
253
- f"Verifying skills installed at {args.skills_dir}",
254
- file=sys.stderr,
255
- )
256
- verified_skills = verify_skills_installed(
257
- bmad_dir, dirs_to_remove, args.skills_dir, args.verbose
258
- )
259
-
260
- # Remove directories
261
- removed, not_found, total_files = cleanup_directories(
262
- bmad_dir, dirs_to_remove, args.verbose
263
- )
264
-
265
- # Build result
266
- result = {
267
- "status": "success",
268
- "bmad_dir": str(Path(bmad_dir).resolve()),
269
- "directories_removed": removed,
270
- "directories_not_found": not_found,
271
- "files_removed_count": total_files,
272
- }
273
-
274
- if args.skills_dir:
275
- result["safety_checks"] = {
276
- "skills_verified": True,
277
- "skills_dir": str(Path(args.skills_dir).resolve()),
278
- "verified_skills": verified_skills,
279
- }
280
- else:
281
- result["safety_checks"] = None
282
-
283
- print(json.dumps(result, indent=2))
284
-
285
-
286
- if __name__ == "__main__":
287
- main()