bmad-method-quarkus 1.0.2 → 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.
- package/package.json +1 -1
- package/removals.txt +10 -0
- package/src/bmm-skills/agents/bmad-quarkus-build/SKILL.md +19 -16
- package/src/bmm-skills/agents/bmad-quarkus-build/customize.toml +7 -5
- package/src/bmm-skills/agents/bmad-quarkus-build/skills/bqa-setup/assets/module-help.csv +0 -1
- package/src/bmm-skills/agents/bmad-quarkus-build/skills/bqa-setup/assets/module.yaml +2 -9
- package/src/bmm-skills/agents/bmad-quarkus-build/skills/quarkus-error-handling-i18n/SKILL.md +61 -27
- package/src/bmm-skills/agents/bmad-quarkus-build/skills/quarkus-grpc-services/SKILL.md +60 -41
- package/src/bmm-skills/agents/bmad-quarkus-build/skills/quarkus-hexagonal-core/SKILL.md +504 -215
- package/src/bmm-skills/agents/bmad-quarkus-build/skills/quarkus-kafka-messaging/SKILL.md +199 -34
- package/src/bmm-skills/agents/bmad-quarkus-build/skills/quarkus-observability-otel/SKILL.md +47 -31
- package/src/bmm-skills/agents/bmad-quarkus-build/skills/quarkus-openapi-tmforum/SKILL.md +42 -25
- package/src/bmm-skills/agents/bmad-quarkus-build/skills/quarkus-sql-jdbc-agroal/SKILL.md +150 -87
- package/src/bmm-skills/module.yaml +0 -7
- package/src/bmm-skills/agents/bmad-quarkus-build/skills/quarkus-architect/SKILL.md +0 -108
- package/src/bmm-skills/agents/bmad-quarkus-build/skills/quarkus-architect/customize.toml +0 -62
- package/src/bmm-skills/agents/bmad-quarkus-build/skills/quarkus-architect/references/architecture-review.md +0 -17
- package/src/bmm-skills/agents/bmad-quarkus-build/skills/quarkus-architect/references/prompt-quality-canon.md +0 -79
- package/src/bmm-skills/agents/bmad-quarkus-dev/.memlog.md +0 -12
- package/src/bmm-skills/agents/bmad-quarkus-dev/.memlog.md:Zone.Identifier +0 -0
- package/src/bmm-skills/agents/bmad-quarkus-dev/SKILL.md +0 -86
- package/src/bmm-skills/agents/bmad-quarkus-dev/SKILL.md:Zone.Identifier +0 -0
- package/src/bmm-skills/agents/bmad-quarkus-dev/customize.toml +0 -37
- package/src/bmm-skills/agents/bmad-quarkus-dev/customize.toml:Zone.Identifier +0 -0
- package/src/bmm-skills/agents/bmad-quarkus-dev/references/enrich-stories.md +0 -19
- package/src/bmm-skills/agents/bmad-quarkus-dev/references/enrich-stories.md:Zone.Identifier +0 -0
- package/src/bmm-skills/agents/bmad-quarkus-dev/references/prompt-quality-canon.md +0 -79
- package/src/bmm-skills/agents/bmad-quarkus-dev/references/prompt-quality-canon.md:Zone.Identifier +0 -0
- package/src/bmm-skills/agents/bmad-quarkus-dev/skills/bqa-setup/SKILL.md +0 -80
- package/src/bmm-skills/agents/bmad-quarkus-dev/skills/bqa-setup/SKILL.md:Zone.Identifier +0 -0
- package/src/bmm-skills/agents/bmad-quarkus-dev/skills/bqa-setup/assets/module-help.csv +0 -9
- package/src/bmm-skills/agents/bmad-quarkus-dev/skills/bqa-setup/assets/module-help.csv:Zone.Identifier +0 -0
- package/src/bmm-skills/agents/bmad-quarkus-dev/skills/bqa-setup/assets/module.yaml +0 -16
- package/src/bmm-skills/agents/bmad-quarkus-dev/skills/bqa-setup/assets/module.yaml:Zone.Identifier +0 -0
- package/src/bmm-skills/agents/bmad-quarkus-dev/skills/bqa-setup/scripts/cleanup-legacy.py +0 -287
- package/src/bmm-skills/agents/bmad-quarkus-dev/skills/bqa-setup/scripts/cleanup-legacy.py:Zone.Identifier +0 -0
- package/src/bmm-skills/agents/bmad-quarkus-dev/skills/bqa-setup/scripts/merge-config.py +0 -441
- package/src/bmm-skills/agents/bmad-quarkus-dev/skills/bqa-setup/scripts/merge-config.py:Zone.Identifier +0 -0
- package/src/bmm-skills/agents/bmad-quarkus-dev/skills/bqa-setup/scripts/merge-help-csv.py +0 -246
- package/src/bmm-skills/agents/bmad-quarkus-dev/skills/bqa-setup/scripts/merge-help-csv.py:Zone.Identifier +0 -0
- package/src/bmm-skills/agents/bmad-quarkus-dev/skills/quarkus-error-handling-i18n/SKILL.md +0 -181
- package/src/bmm-skills/agents/bmad-quarkus-dev/skills/quarkus-error-handling-i18n/SKILL.md:Zone.Identifier +0 -0
- package/src/bmm-skills/agents/bmad-quarkus-dev/skills/quarkus-grpc-services/SKILL.md +0 -141
- package/src/bmm-skills/agents/bmad-quarkus-dev/skills/quarkus-grpc-services/SKILL.md:Zone.Identifier +0 -0
- package/src/bmm-skills/agents/bmad-quarkus-dev/skills/quarkus-hexagonal-core/SKILL.md +0 -392
- package/src/bmm-skills/agents/bmad-quarkus-dev/skills/quarkus-hexagonal-core/SKILL.md:Zone.Identifier +0 -0
- package/src/bmm-skills/agents/bmad-quarkus-dev/skills/quarkus-kafka-messaging/SKILL.md +0 -148
- package/src/bmm-skills/agents/bmad-quarkus-dev/skills/quarkus-kafka-messaging/SKILL.md:Zone.Identifier +0 -0
- package/src/bmm-skills/agents/bmad-quarkus-dev/skills/quarkus-observability-otel/SKILL.md +0 -180
- package/src/bmm-skills/agents/bmad-quarkus-dev/skills/quarkus-observability-otel/SKILL.md:Zone.Identifier +0 -0
- package/src/bmm-skills/agents/bmad-quarkus-dev/skills/quarkus-openapi-tmforum/SKILL.md +0 -128
- package/src/bmm-skills/agents/bmad-quarkus-dev/skills/quarkus-openapi-tmforum/SKILL.md:Zone.Identifier +0 -0
- package/src/bmm-skills/agents/bmad-quarkus-dev/skills/quarkus-sql-jdbc-agroal/SKILL.md +0 -245
- package/src/bmm-skills/agents/bmad-quarkus-dev/skills/quarkus-sql-jdbc-agroal/SKILL.md:Zone.Identifier +0 -0
|
@@ -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()
|