ma-agents 3.1.0 → 3.3.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.
Files changed (107) hide show
  1. package/.opencode/skills/.ma-agents.json +99 -99
  2. package/.roo/rules/00-ma-agents.md +13 -0
  3. package/.roo/skills/.ma-agents.json +241 -0
  4. package/.roo/skills/MANIFEST.yaml +254 -0
  5. package/.roo/skills/ai-audit-trail/SKILL.md +23 -0
  6. package/.roo/skills/auto-bug-detection/SKILL.md +169 -0
  7. package/.roo/skills/cmake-best-practices/SKILL.md +64 -0
  8. package/.roo/skills/cmake-best-practices/examples/cmake.md +59 -0
  9. package/.roo/skills/code-documentation/SKILL.md +57 -0
  10. package/.roo/skills/code-documentation/examples/cpp.md +29 -0
  11. package/.roo/skills/code-documentation/examples/csharp.md +28 -0
  12. package/.roo/skills/code-documentation/examples/javascript_typescript.md +28 -0
  13. package/.roo/skills/code-documentation/examples/python.md +57 -0
  14. package/.roo/skills/code-review/SKILL.md +43 -0
  15. package/.roo/skills/commit-message/SKILL.md +79 -0
  16. package/.roo/skills/cpp-best-practices/SKILL.md +234 -0
  17. package/.roo/skills/cpp-best-practices/examples/modern-idioms.md +189 -0
  18. package/.roo/skills/cpp-best-practices/examples/naming-and-organization.md +102 -0
  19. package/.roo/skills/cpp-concurrency-safety/SKILL.md +60 -0
  20. package/.roo/skills/cpp-concurrency-safety/examples/concurrency.md +73 -0
  21. package/.roo/skills/cpp-const-correctness/SKILL.md +63 -0
  22. package/.roo/skills/cpp-const-correctness/examples/const_correctness.md +54 -0
  23. package/.roo/skills/cpp-memory-handling/SKILL.md +42 -0
  24. package/.roo/skills/cpp-memory-handling/examples/modern-cpp.md +49 -0
  25. package/.roo/skills/cpp-memory-handling/examples/smart-pointers.md +46 -0
  26. package/.roo/skills/cpp-modern-composition/SKILL.md +64 -0
  27. package/.roo/skills/cpp-modern-composition/examples/composition.md +51 -0
  28. package/.roo/skills/cpp-robust-interfaces/SKILL.md +55 -0
  29. package/.roo/skills/cpp-robust-interfaces/examples/interfaces.md +56 -0
  30. package/.roo/skills/create-hardened-docker-skill/SKILL.md +637 -0
  31. package/.roo/skills/create-hardened-docker-skill/scripts/create-all.sh +489 -0
  32. package/.roo/skills/csharp-best-practices/SKILL.md +278 -0
  33. package/.roo/skills/docker-hardening-verification/SKILL.md +28 -0
  34. package/.roo/skills/docker-hardening-verification/scripts/verify-hardening.sh +39 -0
  35. package/.roo/skills/docker-image-signing/SKILL.md +28 -0
  36. package/.roo/skills/docker-image-signing/scripts/sign-image.sh +33 -0
  37. package/.roo/skills/document-revision-history/SKILL.md +104 -0
  38. package/.roo/skills/git-workflow-skill/SKILL.md +194 -0
  39. package/.roo/skills/git-workflow-skill/hooks/commit-msg +61 -0
  40. package/.roo/skills/git-workflow-skill/hooks/pre-commit +38 -0
  41. package/.roo/skills/git-workflow-skill/hooks/prepare-commit-msg +56 -0
  42. package/.roo/skills/git-workflow-skill/scripts/finish-feature.sh +192 -0
  43. package/.roo/skills/git-workflow-skill/scripts/install-hooks.sh +55 -0
  44. package/.roo/skills/git-workflow-skill/scripts/start-feature.sh +110 -0
  45. package/.roo/skills/git-workflow-skill/scripts/validate-workflow.sh +229 -0
  46. package/.roo/skills/js-ts-dependency-mgmt/SKILL.md +49 -0
  47. package/.roo/skills/js-ts-dependency-mgmt/examples/dependency_mgmt.md +60 -0
  48. package/.roo/skills/js-ts-security-skill/SKILL.md +64 -0
  49. package/.roo/skills/js-ts-security-skill/scripts/verify-security.sh +136 -0
  50. package/.roo/skills/logging-best-practices/SKILL.md +50 -0
  51. package/.roo/skills/logging-best-practices/examples/cpp.md +36 -0
  52. package/.roo/skills/logging-best-practices/examples/csharp.md +49 -0
  53. package/.roo/skills/logging-best-practices/examples/javascript.md +77 -0
  54. package/.roo/skills/logging-best-practices/examples/python.md +57 -0
  55. package/.roo/skills/logging-best-practices/references/logging-standards.md +29 -0
  56. package/.roo/skills/open-presentation/SKILL.md +35 -0
  57. package/.roo/skills/opentelemetry-best-practices/SKILL.md +34 -0
  58. package/.roo/skills/opentelemetry-best-practices/examples/go.md +32 -0
  59. package/.roo/skills/opentelemetry-best-practices/examples/javascript.md +58 -0
  60. package/.roo/skills/opentelemetry-best-practices/examples/python.md +37 -0
  61. package/.roo/skills/opentelemetry-best-practices/references/otel-standards.md +37 -0
  62. package/.roo/skills/python-best-practices/SKILL.md +385 -0
  63. package/.roo/skills/python-dependency-mgmt/SKILL.md +42 -0
  64. package/.roo/skills/python-dependency-mgmt/examples/dependency_mgmt.md +67 -0
  65. package/.roo/skills/python-security-skill/SKILL.md +56 -0
  66. package/.roo/skills/python-security-skill/examples/security.md +56 -0
  67. package/.roo/skills/self-signed-cert/SKILL.md +42 -0
  68. package/.roo/skills/self-signed-cert/scripts/generate-cert.ps1 +45 -0
  69. package/.roo/skills/self-signed-cert/scripts/generate-cert.sh +43 -0
  70. package/.roo/skills/skill-creator/SKILL.md +196 -0
  71. package/.roo/skills/skill-creator/references/output-patterns.md +82 -0
  72. package/.roo/skills/skill-creator/references/workflows.md +28 -0
  73. package/.roo/skills/skill-creator/scripts/init_skill.py +208 -0
  74. package/.roo/skills/skill-creator/scripts/package_skill.py +99 -0
  75. package/.roo/skills/skill-creator/scripts/quick_validate.py +113 -0
  76. package/.roo/skills/story-status-lookup/SKILL.md +78 -0
  77. package/.roo/skills/test-accompanied-development/SKILL.md +50 -0
  78. package/.roo/skills/test-generator/SKILL.md +65 -0
  79. package/.roo/skills/vercel-react-best-practices/SKILL.md +109 -0
  80. package/.roo/skills/verify-hardened-docker-skill/SKILL.md +442 -0
  81. package/.roo/skills/verify-hardened-docker-skill/scripts/verify-docker-hardening.sh +439 -0
  82. package/README.md +50 -3
  83. package/lib/agents.js +23 -0
  84. package/lib/bmad-extension/module-help.csv +8 -4
  85. package/lib/bmad-extension/skills/add-sprint/SKILL.md +126 -40
  86. package/lib/bmad-extension/skills/add-to-sprint/SKILL.md +116 -142
  87. package/lib/bmad-extension/skills/cleanup-done/.gitkeep +0 -0
  88. package/lib/bmad-extension/skills/cleanup-done/SKILL.md +159 -0
  89. package/lib/bmad-extension/skills/cleanup-done/bmad-skill-manifest.yaml +3 -0
  90. package/lib/bmad-extension/skills/create-bug-story/SKILL.md +75 -7
  91. package/lib/bmad-extension/skills/generate-backlog/SKILL.md +183 -0
  92. package/lib/bmad-extension/skills/generate-backlog/bmad-skill-manifest.yaml +3 -0
  93. package/lib/bmad-extension/skills/modify-sprint/SKILL.md +63 -0
  94. package/lib/bmad-extension/skills/prioritize-backlog/.gitkeep +0 -0
  95. package/lib/bmad-extension/skills/prioritize-backlog/SKILL.md +195 -0
  96. package/lib/bmad-extension/skills/prioritize-backlog/bmad-skill-manifest.yaml +3 -0
  97. package/lib/bmad-extension/skills/remove-from-sprint/.gitkeep +0 -0
  98. package/lib/bmad-extension/skills/remove-from-sprint/SKILL.md +163 -0
  99. package/lib/bmad-extension/skills/remove-from-sprint/bmad-skill-manifest.yaml +3 -0
  100. package/lib/bmad-extension/skills/sprint-status-view/SKILL.md +199 -138
  101. package/lib/bmad-extension/workflows/add-sprint/workflow.md +129 -39
  102. package/lib/bmad-extension/workflows/add-to-sprint/workflow.md +3 -205
  103. package/lib/bmad-extension/workflows/modify-sprint/workflow.md +5 -0
  104. package/lib/bmad-extension/workflows/sprint-status-view/workflow.md +3 -192
  105. package/package.json +4 -3
  106. package/test/roo-code-agent.test.js +166 -0
  107. package/test/roo-code-injection.test.js +172 -0
@@ -0,0 +1,439 @@
1
+ #!/bin/bash
2
+ #
3
+ # verify-docker-hardening.sh
4
+ # Comprehensive Docker security verification script
5
+ # Checks Dockerfile, docker-compose.yml, and running containers
6
+ # against CIS, OWASP, and NIST standards
7
+ #
8
+
9
+ set -e
10
+
11
+ # Colors for output
12
+ RED='\033[0;31m'
13
+ GREEN='\033[0;32m'
14
+ YELLOW='\033[1;33m'
15
+ BLUE='\033[0;34m'
16
+ NC='\033[0m' # No Color
17
+
18
+ # Configuration
19
+ IMAGE_NAME="${1:-contacts-app}"
20
+ CONTAINER_NAME="${2:-contacts-app}"
21
+ EXIT_CODE=0
22
+
23
+ # Counters
24
+ TOTAL_CHECKS=0
25
+ PASSED_CHECKS=0
26
+ FAILED_CHECKS=0
27
+ WARNING_CHECKS=0
28
+
29
+ # Helper functions
30
+ print_header() {
31
+ echo ""
32
+ echo -e "${BLUE}========================================${NC}"
33
+ echo -e "${BLUE}$1${NC}"
34
+ echo -e "${BLUE}========================================${NC}"
35
+ }
36
+
37
+ print_check() {
38
+ TOTAL_CHECKS=$((TOTAL_CHECKS + 1))
39
+ echo -ne " [$TOTAL_CHECKS] $1... "
40
+ }
41
+
42
+ pass() {
43
+ PASSED_CHECKS=$((PASSED_CHECKS + 1))
44
+ echo -e "${GREEN}✅ PASS${NC}"
45
+ }
46
+
47
+ fail() {
48
+ FAILED_CHECKS=$((FAILED_CHECKS + 1))
49
+ EXIT_CODE=2
50
+ echo -e "${RED}❌ FAIL${NC}"
51
+ [ -n "$1" ] && echo -e " ${RED}→ $1${NC}"
52
+ }
53
+
54
+ warn() {
55
+ WARNING_CHECKS=$((WARNING_CHECKS + 1))
56
+ echo -e "${YELLOW}⚠️ WARN${NC}"
57
+ [ -n "$1" ] && echo -e " ${YELLOW}→ $1${NC}"
58
+ }
59
+
60
+ critical() {
61
+ FAILED_CHECKS=$((FAILED_CHECKS + 1))
62
+ EXIT_CODE=1
63
+ echo -e "${RED}🚨 CRITICAL${NC}"
64
+ [ -n "$1" ] && echo -e " ${RED}→ $1${NC}"
65
+ }
66
+
67
+ # Start verification
68
+ echo -e "${BLUE}🔍 Docker Security Verification${NC}"
69
+ echo -e "${BLUE}================================${NC}"
70
+ echo "Image: $IMAGE_NAME"
71
+ echo "Container: $CONTAINER_NAME"
72
+
73
+ # ============================================================================
74
+ # 1. Dockerfile Verification
75
+ # ============================================================================
76
+ print_header "1. Dockerfile Security"
77
+
78
+ if [ ! -f "Dockerfile" ]; then
79
+ print_check "Dockerfile exists"
80
+ critical "Dockerfile not found in current directory"
81
+ EXIT_CODE=5
82
+ exit $EXIT_CODE
83
+ fi
84
+
85
+ # Check for specific version tags
86
+ print_check "Specific version tags (no :latest)"
87
+ if grep -qE "^FROM.*:(latest|alpine)$" Dockerfile; then
88
+ fail "Using :latest or unversioned :alpine tag"
89
+ else
90
+ pass
91
+ fi
92
+
93
+ # Check for non-root user
94
+ print_check "Non-root user configured"
95
+ if grep -qE "^USER (root|[0-9]+)" Dockerfile; then
96
+ if grep -qE "^USER root" Dockerfile; then
97
+ fail "Running as root user"
98
+ else
99
+ pass
100
+ fi
101
+ elif grep -qE "^USER [a-zA-Z]" Dockerfile; then
102
+ pass
103
+ else
104
+ fail "No USER directive found"
105
+ fi
106
+
107
+ # Check for HEALTHCHECK
108
+ print_check "HEALTHCHECK instruction"
109
+ if grep -q "^HEALTHCHECK" Dockerfile; then
110
+ pass
111
+ else
112
+ warn "Missing HEALTHCHECK instruction"
113
+ fi
114
+
115
+ # Check for hardcoded secrets
116
+ print_check "No hardcoded secrets in ENV/ARG"
117
+ if grep -iE "^(ENV|ARG).*(SECRET|PASSWORD|KEY|TOKEN|CLIENT_ID)=" Dockerfile | grep -v "REACT_APP_API_BASE_URL" > /dev/null; then
118
+ fail "Potential hardcoded secrets found"
119
+ else
120
+ pass
121
+ fi
122
+
123
+ # Check for multi-stage build
124
+ print_check "Multi-stage build pattern"
125
+ if [ $(grep -c "^FROM" Dockerfile) -ge 2 ]; then
126
+ pass
127
+ else
128
+ warn "Not using multi-stage build"
129
+ fi
130
+
131
+ # Check for Alpine base images
132
+ print_check "Minimal Alpine base images"
133
+ if grep -qE "^FROM.*alpine" Dockerfile; then
134
+ pass
135
+ else
136
+ warn "Not using Alpine base images"
137
+ fi
138
+
139
+ # ============================================================================
140
+ # 2. docker-compose.yml Verification
141
+ # ============================================================================
142
+ print_header "2. docker-compose.yml Security"
143
+
144
+ if [ ! -f "docker-compose.yml" ]; then
145
+ print_check "docker-compose.yml exists"
146
+ warn "docker-compose.yml not found (optional)"
147
+ else
148
+ # Check for read-only filesystem
149
+ print_check "Read-only root filesystem"
150
+ if grep -q "read_only: true" docker-compose.yml; then
151
+ pass
152
+ else
153
+ fail "Missing read_only: true"
154
+ fi
155
+
156
+ # Check for no-new-privileges
157
+ print_check "No new privileges"
158
+ if grep -q "no-new-privileges:true" docker-compose.yml; then
159
+ pass
160
+ else
161
+ fail "Missing security_opt: no-new-privileges:true"
162
+ fi
163
+
164
+ # Check for capability dropping
165
+ print_check "Capabilities dropped"
166
+ if grep -q "cap_drop:" docker-compose.yml; then
167
+ pass
168
+ else
169
+ fail "Missing cap_drop configuration"
170
+ fi
171
+
172
+ # Check for tmpfs mounts
173
+ print_check "Tmpfs mounts for writable dirs"
174
+ if grep -q "tmpfs:" docker-compose.yml; then
175
+ pass
176
+ else
177
+ fail "Missing tmpfs mounts"
178
+ fi
179
+
180
+ # Check for resource limits
181
+ print_check "Memory limits configured"
182
+ if grep -q "memory:" docker-compose.yml; then
183
+ pass
184
+ else
185
+ warn "Missing memory limits"
186
+ fi
187
+
188
+ print_check "CPU limits configured"
189
+ if grep -q "cpus:" docker-compose.yml; then
190
+ pass
191
+ else
192
+ warn "Missing CPU limits"
193
+ fi
194
+
195
+ # Check for health check
196
+ print_check "Healthcheck configured"
197
+ if grep -q "healthcheck:" docker-compose.yml; then
198
+ pass
199
+ else
200
+ warn "Missing healthcheck configuration"
201
+ fi
202
+
203
+ # Check for privileged mode
204
+ print_check "Not running in privileged mode"
205
+ if grep -q "privileged: true" docker-compose.yml; then
206
+ critical "Running in privileged mode"
207
+ else
208
+ pass
209
+ fi
210
+ fi
211
+
212
+ # ============================================================================
213
+ # 3. .dockerignore Verification
214
+ # ============================================================================
215
+ print_header "3. .dockerignore Configuration"
216
+
217
+ if [ ! -f ".dockerignore" ]; then
218
+ print_check ".dockerignore exists"
219
+ warn ".dockerignore not found"
220
+ else
221
+ print_check ".env excluded from Docker context"
222
+ if grep -qE "^\.env$" .dockerignore; then
223
+ pass
224
+ else
225
+ critical ".env not in .dockerignore - secret leakage risk!"
226
+ fi
227
+
228
+ print_check "node_modules excluded"
229
+ if grep -q "node_modules" .dockerignore; then
230
+ pass
231
+ else
232
+ warn "node_modules not excluded"
233
+ fi
234
+
235
+ print_check ".git excluded"
236
+ if grep -qE "^\.git" .dockerignore; then
237
+ pass
238
+ else
239
+ warn ".git not excluded"
240
+ fi
241
+ fi
242
+
243
+ # ============================================================================
244
+ # 4. Image Security Scanning
245
+ # ============================================================================
246
+ print_header "4. Image Vulnerability Scanning"
247
+
248
+ # Check if image exists
249
+ if ! docker images --format "{{.Repository}}" | grep -q "^${IMAGE_NAME}$"; then
250
+ print_check "Docker image exists"
251
+ warn "Image '$IMAGE_NAME' not found locally. Skipping image scans."
252
+ echo " Run 'docker build -t $IMAGE_NAME .' to build the image."
253
+ else
254
+ # Check if trivy is installed
255
+ if ! command -v trivy &> /dev/null; then
256
+ print_check "Trivy scanner installed"
257
+ warn "Trivy not installed. Skipping vulnerability scans."
258
+ echo " Install: brew install aquasecurity/trivy/trivy (macOS)"
259
+ echo " : apt-get install trivy (Linux)"
260
+ else
261
+ # Scan for CRITICAL vulnerabilities
262
+ print_check "No CRITICAL vulnerabilities"
263
+ if trivy image --quiet --severity CRITICAL --exit-code 1 "$IMAGE_NAME" > /dev/null 2>&1; then
264
+ pass
265
+ else
266
+ critical "CRITICAL vulnerabilities found. Run: trivy image --severity CRITICAL $IMAGE_NAME"
267
+ fi
268
+
269
+ # Scan for HIGH vulnerabilities
270
+ print_check "No HIGH vulnerabilities"
271
+ if trivy image --quiet --severity HIGH --exit-code 1 "$IMAGE_NAME" > /dev/null 2>&1; then
272
+ pass
273
+ else
274
+ fail "HIGH vulnerabilities found. Run: trivy image --severity HIGH $IMAGE_NAME"
275
+ fi
276
+
277
+ # Scan for leaked secrets
278
+ print_check "No leaked secrets in image"
279
+ if trivy image --quiet --scanners secret --exit-code 1 "$IMAGE_NAME" > /dev/null 2>&1; then
280
+ pass
281
+ else
282
+ critical "Secrets detected in image! Run: trivy image --scanners secret $IMAGE_NAME"
283
+ fi
284
+ fi
285
+
286
+ # Check image size
287
+ print_check "Optimized image size (< 100MB)"
288
+ IMAGE_SIZE=$(docker images --format "{{.Size}}" "$IMAGE_NAME" | head -1 | sed 's/MB//' | sed 's/GB/*1024/' | bc 2>/dev/null || echo "0")
289
+ if [ -n "$IMAGE_SIZE" ] && [ "$IMAGE_SIZE" != "0" ]; then
290
+ if (( $(echo "$IMAGE_SIZE < 100" | bc -l) )); then
291
+ pass
292
+ else
293
+ warn "Image size is ${IMAGE_SIZE}MB (recommended < 100MB)"
294
+ fi
295
+ else
296
+ warn "Could not determine image size"
297
+ fi
298
+
299
+ # Check for .env in image
300
+ print_check ".env file not baked into image"
301
+ if docker run --rm "$IMAGE_NAME" sh -c "ls -la / 2>/dev/null | grep -q .env"; then
302
+ critical ".env file found in image! Secrets leaked!"
303
+ else
304
+ pass
305
+ fi
306
+ fi
307
+
308
+ # ============================================================================
309
+ # 5. Runtime Security (if container is running)
310
+ # ============================================================================
311
+ print_header "5. Runtime Security Verification"
312
+
313
+ if ! docker ps --filter "name=$CONTAINER_NAME" --format "{{.Names}}" | grep -q "^$CONTAINER_NAME$"; then
314
+ echo -e "${YELLOW} Container '$CONTAINER_NAME' is not running.${NC}"
315
+ echo -e "${YELLOW} Run 'docker-compose up -d' to enable runtime checks.${NC}"
316
+ else
317
+ # Check container runs as non-root
318
+ print_check "Container runs as non-root"
319
+ CONTAINER_USER=$(docker exec "$CONTAINER_NAME" whoami 2>/dev/null || echo "root")
320
+ if [ "$CONTAINER_USER" != "root" ]; then
321
+ pass
322
+ else
323
+ critical "Container running as root user!"
324
+ fi
325
+
326
+ # Check user ID is not 0
327
+ print_check "User ID is not 0 (root)"
328
+ USER_ID=$(docker exec "$CONTAINER_NAME" id -u 2>/dev/null || echo "0")
329
+ if [ "$USER_ID" != "0" ]; then
330
+ pass
331
+ else
332
+ critical "Container running with UID 0 (root)!"
333
+ fi
334
+
335
+ # Check read-only filesystem
336
+ print_check "Root filesystem is read-only"
337
+ if docker exec "$CONTAINER_NAME" sh -c "touch /test 2>/dev/null"; then
338
+ fail "Root filesystem is writable"
339
+ docker exec "$CONTAINER_NAME" sh -c "rm /test 2>/dev/null" || true
340
+ else
341
+ pass
342
+ fi
343
+
344
+ # Check tmpfs is writable
345
+ print_check "Tmpfs mount is writable"
346
+ if docker exec "$CONTAINER_NAME" sh -c "touch /tmp/test 2>/dev/null && rm /tmp/test 2>/dev/null"; then
347
+ pass
348
+ else
349
+ warn "Tmpfs mount /tmp is not writable"
350
+ fi
351
+
352
+ # Check health status
353
+ print_check "Container is healthy"
354
+ HEALTH_STATUS=$(docker inspect --format='{{.State.Health.Status}}' "$CONTAINER_NAME" 2>/dev/null || echo "none")
355
+ if [ "$HEALTH_STATUS" = "healthy" ]; then
356
+ pass
357
+ elif [ "$HEALTH_STATUS" = "none" ]; then
358
+ warn "No health check configured"
359
+ else
360
+ fail "Container health status: $HEALTH_STATUS"
361
+ fi
362
+
363
+ # Check capabilities
364
+ print_check "Capabilities dropped"
365
+ CAPS_DROPPED=$(docker inspect --format='{{.HostConfig.CapDrop}}' "$CONTAINER_NAME" 2>/dev/null || echo "[]")
366
+ if echo "$CAPS_DROPPED" | grep -q "ALL"; then
367
+ pass
368
+ else
369
+ warn "Not all capabilities dropped"
370
+ fi
371
+
372
+ # Check memory limit
373
+ print_check "Memory limit enforced"
374
+ MEMORY_LIMIT=$(docker inspect --format='{{.HostConfig.Memory}}' "$CONTAINER_NAME" 2>/dev/null || echo "0")
375
+ if [ "$MEMORY_LIMIT" != "0" ]; then
376
+ pass
377
+ else
378
+ warn "No memory limit set"
379
+ fi
380
+ fi
381
+
382
+ # ============================================================================
383
+ # 6. Git Secret Protection
384
+ # ============================================================================
385
+ print_header "6. Git Secret Protection"
386
+
387
+ if [ -d ".git" ]; then
388
+ # Check .env in .gitignore
389
+ print_check ".env in .gitignore"
390
+ if [ -f ".gitignore" ] && grep -qE "^\.env$" .gitignore; then
391
+ pass
392
+ else
393
+ critical ".env not in .gitignore! Secrets may be committed!"
394
+ fi
395
+
396
+ # Check .env.example exists
397
+ print_check ".env.example exists (template)"
398
+ if [ -f ".env.example" ]; then
399
+ pass
400
+ else
401
+ warn ".env.example not found"
402
+ fi
403
+
404
+ # Check if .env is committed
405
+ print_check ".env not committed to git"
406
+ if git ls-files --error-unmatch .env > /dev/null 2>&1; then
407
+ critical ".env is tracked by git! Remove immediately!"
408
+ else
409
+ pass
410
+ fi
411
+ else
412
+ echo -e "${YELLOW} Not a git repository. Skipping git checks.${NC}"
413
+ fi
414
+
415
+ # ============================================================================
416
+ # Summary
417
+ # ============================================================================
418
+ print_header "Verification Summary"
419
+
420
+ echo ""
421
+ echo " Total checks: $TOTAL_CHECKS"
422
+ echo -e " ${GREEN}Passed: $PASSED_CHECKS${NC}"
423
+ echo -e " ${YELLOW}Warnings: $WARNING_CHECKS${NC}"
424
+ echo -e " ${RED}Failed: $FAILED_CHECKS${NC}"
425
+ echo ""
426
+
427
+ if [ $FAILED_CHECKS -eq 0 ]; then
428
+ echo -e "${GREEN}✅ All critical security checks passed!${NC}"
429
+ if [ $WARNING_CHECKS -gt 0 ]; then
430
+ echo -e "${YELLOW}⚠️ $WARNING_CHECKS warning(s) - consider addressing these.${NC}"
431
+ fi
432
+ else
433
+ echo -e "${RED}❌ $FAILED_CHECKS security check(s) failed!${NC}"
434
+ echo -e "${RED} Please fix the issues above before deploying.${NC}"
435
+ fi
436
+
437
+ echo ""
438
+
439
+ exit $EXIT_CODE
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # ma-agents
2
2
 
3
- A universal NPX tool to install AI coding agent skills. Write skills once, install them across Claude Code, Gemini, Copilot, Cline, Cursor, and Kilocode.
3
+ A universal NPX tool to install AI coding agent skills. Write skills once, install them across Claude Code, Gemini, Copilot, Cline, Cursor, Kilocode, and Roo Code.
4
4
 
5
5
  ## Installation & Usage
6
6
 
@@ -60,7 +60,11 @@ The `_bmad-output/` folder is **intentionally tracked in version control** as pr
60
60
  `_bmad-output/` holds all AI-generated planning artifacts produced by BMAD agents:
61
61
 
62
62
  - **`planning-artifacts/`** — PRDs, architecture documents, UX designs
63
- - **`implementation-artifacts/`** — Epics, user stories, sprint status
63
+ - **`implementation-artifacts/`** — Epics, user stories, sprint status, backlog
64
+ - **`sprints/`** — Sprint entity YAML files (`sprint-{id}.yaml`)
65
+ - **`done/`** — Archived completed stories and bugs
66
+ - **`backlog.yaml`** — Flat prioritized backlog (generated)
67
+ - **`sprint-status.yaml`** — Sprint status (derived, auto-regenerated)
64
68
  - **`methodology/`** — BMAD-METHOD training materials and onboarding presentation
65
69
 
66
70
  ### Why it is version-controlled
@@ -111,13 +115,14 @@ The file is version-controlled as part of `_bmad-output/` project knowledge. Com
111
115
  | Cursor | `.cursor/skills/` | `generic` | `.cursor/cursor.md` |
112
116
  | Kilocode | `.kilocode/skills/` | `generic` | `.kilocode/kilocode.md` |
113
117
  | Cline | `.cline/skills/` | `cline` | `.cline/clinerules.md` |
118
+ | Roo Code | `.roo/skills/` | `generic` | `.roo/rules/00-ma-agents.md` |
114
119
  | SRE Agent (Alex) | `_bmad/skills/` | `generic` | `_bmad/bmm/agents/sre.md` |
115
120
  | DevOps Agent (Amit) | `_bmad/skills/` | `generic` | `_bmad/bmm/agents/devops.md` |
116
121
  | Cyber Analyst (Yael) | `_bmad/skills/` | `generic` | `_bmad/bmm/agents/cyber.md` |
117
122
  | Joseph (MIL-STD-498) | `_bmad/skills/` | `generic` | `_bmad/bmm/agents/mil498.md` |
118
123
  | Antigravity | `_bmad/skills/` | `generic` | `_bmad/bmm/agents/antigravity.md` |
119
124
 
120
- ## Available Skills (28)
125
+ ## Available Skills (34)
121
126
 
122
127
  | Skill ID | Domain | Description |
123
128
  | :--- | :--- | :--- |
@@ -154,6 +159,13 @@ The file is version-controlled as part of `_bmad-output/` project knowledge. Com
154
159
  | `self-signed-cert` | Security | Automated Root CA and self-signed certificate generation |
155
160
  | `docker-image-signing` | Security | Automated cryptographic signing for Docker images |
156
161
  | `docker-hardening-verification` | Security | Audits images for least-privilege and OpenShift compatibility |
162
+ | **Sprint Management** | | |
163
+ | `add-sprint` | Agile | Create sprint entities with capacity, ISO dates, and structured YAML schema |
164
+ | `generate-backlog` | Agile | Generate or refresh a flat prioritized backlog from epics and bug stories |
165
+ | `add-to-sprint` | Agile | Assign backlog items to a sprint with capacity enforcement |
166
+ | `remove-from-sprint` | Agile | Remove items from a sprint and return to unassigned backlog |
167
+ | `cleanup-done` | Agile | Archive done items to `done/` and remove from sprint/backlog tracking |
168
+ | `prioritize-backlog` | Agile | Reprioritize backlog using severity, value, dependencies, and type |
157
169
 
158
170
  ## Automated Skill Discovery
159
171
 
@@ -242,6 +254,36 @@ The integration includes a suite of specialized playbooks:
242
254
  - **Security & Trust**: Vault secrets, certificate generation, and vulnerability scanning.
243
255
  - **Diagnostics**: Advanced health checks across K8s, Docker, and Podman.
244
256
 
257
+ #### Sprint Management (v3.1+)
258
+
259
+ `ma-agents` includes a complete sprint management system built on first-class YAML entities:
260
+
261
+ **Data Model:**
262
+ - **Sprint entities** at `sprints/sprint-{id}.yaml` — capacity, dates, assigned items, status lifecycle (`planning` -> `active` -> `closed`)
263
+ - **Flat backlog** at `backlog.yaml` — prioritized list of stories and bugs, independent of epic grouping
264
+ - **Bug lifecycle** — bugs are first-class backlog items with severity, type classification, and the same lifecycle as stories
265
+ - **Derived sprint-status.yaml** — auto-regenerated from backlog + sprint files (no manual maintenance)
266
+
267
+ **Workflows:**
268
+
269
+ | Command | Description |
270
+ |---------|-------------|
271
+ | `/add-sprint` | Create a sprint with capacity limits and optional ISO dates |
272
+ | `/generate-backlog` | Build or refresh the flat backlog from epics and bug files |
273
+ | `/add-to-sprint` | Assign backlog items to a sprint (dual-write: backlog + sprint file) |
274
+ | `/remove-from-sprint` | Return items from sprint to backlog (status preserved) |
275
+ | `/cleanup-done` | Archive completed items to `done/`, auto-close empty sprints |
276
+ | `/prioritize-backlog` | Reorder backlog — full, quick-adjust, or AI-suggested modes |
277
+ | `/sprint-status-view` | View sprint capacity, items, backlog, and regenerate sprint-status.yaml |
278
+ | `/create-bug-story` | Create a structured bug with severity, type, and automatic backlog entry |
279
+
280
+ **Key Design Principles:**
281
+ - **Dual-write consistency**: assigning/removing items updates both `backlog.yaml` and the sprint file atomically
282
+ - **Single-active sprint**: only one sprint can be `active` at a time
283
+ - **Done item archival**: completed work moves to `done/` subfolder, freeing sprint capacity
284
+ - **Priority is independent of epics**: stories from different epics interleave by priority, not epic order
285
+ - **Concurrency guards**: sprint files use `last_modified` timestamps to detect external modifications
286
+
245
287
  ### Install Options (Direct)
246
288
  ```bash
247
289
  # Default: installs to project-level paths (current directory)
@@ -436,6 +478,11 @@ ma-agents/
436
478
  │ ├── bmad.js # BMAD-METHOD integration and injection logic
437
479
  │ ├── bmad-cache/ # Pre-bundled BMAD external modules (bmb, cis, gds, tea)
438
480
  │ ├── bmad-customizations/ # BMAD persona templates (.md) and YAML configs
481
+ │ ├── bmad-extension/ # Extension module: sprint management, bug tracking, agent skills
482
+ │ │ ├── skills/ # SKILL.md packages (add-sprint, generate-backlog, etc.)
483
+ │ │ ├── workflows/ # Legacy workflow copies (redirects to SKILL.md)
484
+ │ │ ├── module.yaml # Extension module definition
485
+ │ │ └── module-help.csv # Skill registry with descriptions and output paths
439
486
  │ ├── bmad-workflows/ # Specialized BMAD playbooks (SRE, Cyber, etc.)
440
487
  │ └── mil498-templates/ # MIL-STD-498 DID library (SRS, SSS, SSDD, etc.)
441
488
  ├── scripts/
package/lib/agents.js CHANGED
@@ -135,6 +135,29 @@ const agents = [
135
135
  instructionFiles: ['.cline/clinerules.md', '.clinerules'],
136
136
  injectionStrategy: { position: 'top', skipPatterns: ['---'] }
137
137
  },
138
+ {
139
+ id: 'roo-code',
140
+ name: 'Roo Code',
141
+ version: '1.0.0',
142
+ category: 'ide',
143
+ description: 'Roo Code AI Assistant (Enhanced Cline fork)',
144
+ skillsDir: '.roo/skills',
145
+ getProjectPath: () => path.join(process.cwd(), '.roo', 'skills'),
146
+ getGlobalPath: () => {
147
+ const platform = os.platform();
148
+ if (platform === 'win32') {
149
+ return path.join(os.homedir(), 'AppData', 'Roaming', 'Code', 'User', 'globalStorage', 'rooveterinaryinc.roo-cline', 'skills');
150
+ } else if (platform === 'darwin') {
151
+ return path.join(os.homedir(), 'Library', 'Application Support', 'Code', 'User', 'globalStorage', 'rooveterinaryinc.roo-cline', 'skills');
152
+ } else {
153
+ return path.join(os.homedir(), '.config', 'Code', 'User', 'globalStorage', 'rooveterinaryinc.roo-cline', 'skills');
154
+ }
155
+ },
156
+ fileExtension: '.md',
157
+ template: 'generic',
158
+ instructionFiles: ['.roo/rules/00-ma-agents.md'],
159
+ injectionStrategy: { position: 'top', skipPatterns: ['---'] }
160
+ },
138
161
  {
139
162
  id: 'cursor',
140
163
  name: 'Cursor',
@@ -29,9 +29,13 @@ ma-skills,4-implementation,Vault Secrets,cyber-vault-secrets,,skill:cyber-vault-
29
29
  ma-skills,4-implementation,Verify Docker Users,cyber-verify-docker-users,,skill:cyber-verify-docker-users,bmad-cyber-verify-docker-users,false,bmm-cyber,,"Verify Docker image user configurations and hardening compliance.",output_folder,"verification report",
30
30
  ma-skills,4-implementation,Verify Image Signature,cyber-verify-image-signature,,skill:cyber-verify-image-signature,bmad-cyber-verify-image-signature,false,bmm-cyber,,"Verify Docker image signatures for supply chain integrity.",output_folder,"verification report",
31
31
  ma-skills,4-implementation,Vulnerability Scan,cyber-vulnerability-scan,,skill:cyber-vulnerability-scan,bmad-cyber-vulnerability-scan,false,bmm-cyber,,"Orchestrate vulnerability scanning across project components.",output_folder,"scan report",
32
- ma-skills,4-implementation,Create Bug Story,create-bug-story,,skill:create-bug-story,create-bug-story,false,bmm-dev,,"Create a structured bug story from a detected defect and add to backlog.",_bmad-output/implementation-artifacts,"bug story",
33
- ma-skills,4-implementation,Add Sprint,add-sprint,,skill:add-sprint,add-sprint,false,bmm-sm,,"Create a new sprint with capacity limits and optional start/end context.",_bmad-output/implementation-artifacts,"sprint plan",
32
+ ma-skills,4-implementation,Create Bug Story,create-bug-story,,skill:create-bug-story,create-bug-story,false,bmm-dev,,"Create a structured bug story with severity and type classification, add to backlog.yaml.",_bmad-output/implementation-artifacts,"bug story",
33
+ ma-skills,4-implementation,Add Sprint,add-sprint,,skill:add-sprint,add-sprint,false,bmm-sm,,"Create a new sprint entity with capacity limits and optional ISO dates (YAML schema).",_bmad-output/implementation-artifacts/sprints,"sprint entity",
34
34
  ma-skills,4-implementation,Modify Sprint,modify-sprint,,skill:modify-sprint,modify-sprint,false,bmm-sm,,"Modify existing sprint — add/remove items, change capacity, update metadata.",_bmad-output/implementation-artifacts,"sprint plan",
35
- ma-skills,4-implementation,Add to Sprint,add-to-sprint,,skill:add-to-sprint,add-to-sprint,false,bmm-sm,,"Assign backlog items (stories + bugs) to a sprint using multi-criteria prioritization.",_bmad-output/implementation-artifacts,"sprint plan",
35
+ ma-skills,4-implementation,Add to Sprint,add-to-sprint,,skill:add-to-sprint,add-to-sprint,false,bmm-sm,,"Assign backlog items to a sprint from flat prioritized backlog.",_bmad-output/implementation-artifacts,"sprint plan",
36
36
  ma-skills,4-implementation,Project Context Expansion,project-context-expansion,,skill:project-context-expansion,project-context-expansion,false,bmm-sm,,"Post-retrospective companion to update project-context.md with new rules.",_bmad-output,"project context",
37
- ma-skills,4-implementation,Sprint Status View,sprint-status-view,,skill:sprint-status-view,sprint-status-view,false,bmm-sm,,"View sprint progress with assigned items and remaining capacity.",_bmad-output/implementation-artifacts,"status display",
37
+ ma-skills,4-implementation,Sprint Status View,sprint-status-view,,skill:sprint-status-view,sprint-status-view,false,bmm-sm,,"View sprint status with capacity, items, and backlog. Regenerates sprint-status.yaml.",_bmad-output/implementation-artifacts,"status display",
38
+ ma-skills,4-implementation,Generate Backlog,generate-backlog,,skill:generate-backlog,generate-backlog,false,bmm-sm,,"Generate or refresh flat backlog from epics and bug stories.",_bmad-output/implementation-artifacts,"backlog",
39
+ ma-skills,4-implementation,Remove from Sprint,remove-from-sprint,,skill:remove-from-sprint,remove-from-sprint,false,bmm-sm,,"Remove items from a sprint and return to unassigned backlog.",_bmad-output/implementation-artifacts,"sprint plan",
40
+ ma-skills,4-implementation,Cleanup Done,cleanup-done,,skill:cleanup-done,cleanup-done,false,bmm-sm,,"Archive done items — move files to done/ and remove from sprint/backlog.",_bmad-output/implementation-artifacts,"archived items",
41
+ ma-skills,4-implementation,Prioritize Backlog,prioritize-backlog,,skill:prioritize-backlog,prioritize-backlog,false,bmm-sm,,"Reprioritize backlog using multiple criteria — severity, value, dependencies.",_bmad-output/implementation-artifacts,"backlog",