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.
- package/.opencode/skills/.ma-agents.json +99 -99
- package/.roo/rules/00-ma-agents.md +13 -0
- package/.roo/skills/.ma-agents.json +241 -0
- package/.roo/skills/MANIFEST.yaml +254 -0
- package/.roo/skills/ai-audit-trail/SKILL.md +23 -0
- package/.roo/skills/auto-bug-detection/SKILL.md +169 -0
- package/.roo/skills/cmake-best-practices/SKILL.md +64 -0
- package/.roo/skills/cmake-best-practices/examples/cmake.md +59 -0
- package/.roo/skills/code-documentation/SKILL.md +57 -0
- package/.roo/skills/code-documentation/examples/cpp.md +29 -0
- package/.roo/skills/code-documentation/examples/csharp.md +28 -0
- package/.roo/skills/code-documentation/examples/javascript_typescript.md +28 -0
- package/.roo/skills/code-documentation/examples/python.md +57 -0
- package/.roo/skills/code-review/SKILL.md +43 -0
- package/.roo/skills/commit-message/SKILL.md +79 -0
- package/.roo/skills/cpp-best-practices/SKILL.md +234 -0
- package/.roo/skills/cpp-best-practices/examples/modern-idioms.md +189 -0
- package/.roo/skills/cpp-best-practices/examples/naming-and-organization.md +102 -0
- package/.roo/skills/cpp-concurrency-safety/SKILL.md +60 -0
- package/.roo/skills/cpp-concurrency-safety/examples/concurrency.md +73 -0
- package/.roo/skills/cpp-const-correctness/SKILL.md +63 -0
- package/.roo/skills/cpp-const-correctness/examples/const_correctness.md +54 -0
- package/.roo/skills/cpp-memory-handling/SKILL.md +42 -0
- package/.roo/skills/cpp-memory-handling/examples/modern-cpp.md +49 -0
- package/.roo/skills/cpp-memory-handling/examples/smart-pointers.md +46 -0
- package/.roo/skills/cpp-modern-composition/SKILL.md +64 -0
- package/.roo/skills/cpp-modern-composition/examples/composition.md +51 -0
- package/.roo/skills/cpp-robust-interfaces/SKILL.md +55 -0
- package/.roo/skills/cpp-robust-interfaces/examples/interfaces.md +56 -0
- package/.roo/skills/create-hardened-docker-skill/SKILL.md +637 -0
- package/.roo/skills/create-hardened-docker-skill/scripts/create-all.sh +489 -0
- package/.roo/skills/csharp-best-practices/SKILL.md +278 -0
- package/.roo/skills/docker-hardening-verification/SKILL.md +28 -0
- package/.roo/skills/docker-hardening-verification/scripts/verify-hardening.sh +39 -0
- package/.roo/skills/docker-image-signing/SKILL.md +28 -0
- package/.roo/skills/docker-image-signing/scripts/sign-image.sh +33 -0
- package/.roo/skills/document-revision-history/SKILL.md +104 -0
- package/.roo/skills/git-workflow-skill/SKILL.md +194 -0
- package/.roo/skills/git-workflow-skill/hooks/commit-msg +61 -0
- package/.roo/skills/git-workflow-skill/hooks/pre-commit +38 -0
- package/.roo/skills/git-workflow-skill/hooks/prepare-commit-msg +56 -0
- package/.roo/skills/git-workflow-skill/scripts/finish-feature.sh +192 -0
- package/.roo/skills/git-workflow-skill/scripts/install-hooks.sh +55 -0
- package/.roo/skills/git-workflow-skill/scripts/start-feature.sh +110 -0
- package/.roo/skills/git-workflow-skill/scripts/validate-workflow.sh +229 -0
- package/.roo/skills/js-ts-dependency-mgmt/SKILL.md +49 -0
- package/.roo/skills/js-ts-dependency-mgmt/examples/dependency_mgmt.md +60 -0
- package/.roo/skills/js-ts-security-skill/SKILL.md +64 -0
- package/.roo/skills/js-ts-security-skill/scripts/verify-security.sh +136 -0
- package/.roo/skills/logging-best-practices/SKILL.md +50 -0
- package/.roo/skills/logging-best-practices/examples/cpp.md +36 -0
- package/.roo/skills/logging-best-practices/examples/csharp.md +49 -0
- package/.roo/skills/logging-best-practices/examples/javascript.md +77 -0
- package/.roo/skills/logging-best-practices/examples/python.md +57 -0
- package/.roo/skills/logging-best-practices/references/logging-standards.md +29 -0
- package/.roo/skills/open-presentation/SKILL.md +35 -0
- package/.roo/skills/opentelemetry-best-practices/SKILL.md +34 -0
- package/.roo/skills/opentelemetry-best-practices/examples/go.md +32 -0
- package/.roo/skills/opentelemetry-best-practices/examples/javascript.md +58 -0
- package/.roo/skills/opentelemetry-best-practices/examples/python.md +37 -0
- package/.roo/skills/opentelemetry-best-practices/references/otel-standards.md +37 -0
- package/.roo/skills/python-best-practices/SKILL.md +385 -0
- package/.roo/skills/python-dependency-mgmt/SKILL.md +42 -0
- package/.roo/skills/python-dependency-mgmt/examples/dependency_mgmt.md +67 -0
- package/.roo/skills/python-security-skill/SKILL.md +56 -0
- package/.roo/skills/python-security-skill/examples/security.md +56 -0
- package/.roo/skills/self-signed-cert/SKILL.md +42 -0
- package/.roo/skills/self-signed-cert/scripts/generate-cert.ps1 +45 -0
- package/.roo/skills/self-signed-cert/scripts/generate-cert.sh +43 -0
- package/.roo/skills/skill-creator/SKILL.md +196 -0
- package/.roo/skills/skill-creator/references/output-patterns.md +82 -0
- package/.roo/skills/skill-creator/references/workflows.md +28 -0
- package/.roo/skills/skill-creator/scripts/init_skill.py +208 -0
- package/.roo/skills/skill-creator/scripts/package_skill.py +99 -0
- package/.roo/skills/skill-creator/scripts/quick_validate.py +113 -0
- package/.roo/skills/story-status-lookup/SKILL.md +78 -0
- package/.roo/skills/test-accompanied-development/SKILL.md +50 -0
- package/.roo/skills/test-generator/SKILL.md +65 -0
- package/.roo/skills/vercel-react-best-practices/SKILL.md +109 -0
- package/.roo/skills/verify-hardened-docker-skill/SKILL.md +442 -0
- package/.roo/skills/verify-hardened-docker-skill/scripts/verify-docker-hardening.sh +439 -0
- package/README.md +50 -3
- package/lib/agents.js +23 -0
- package/lib/bmad-extension/module-help.csv +8 -4
- package/lib/bmad-extension/skills/add-sprint/SKILL.md +126 -40
- package/lib/bmad-extension/skills/add-to-sprint/SKILL.md +116 -142
- package/lib/bmad-extension/skills/cleanup-done/.gitkeep +0 -0
- package/lib/bmad-extension/skills/cleanup-done/SKILL.md +159 -0
- package/lib/bmad-extension/skills/cleanup-done/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension/skills/create-bug-story/SKILL.md +75 -7
- package/lib/bmad-extension/skills/generate-backlog/SKILL.md +183 -0
- package/lib/bmad-extension/skills/generate-backlog/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension/skills/modify-sprint/SKILL.md +63 -0
- package/lib/bmad-extension/skills/prioritize-backlog/.gitkeep +0 -0
- package/lib/bmad-extension/skills/prioritize-backlog/SKILL.md +195 -0
- package/lib/bmad-extension/skills/prioritize-backlog/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension/skills/remove-from-sprint/.gitkeep +0 -0
- package/lib/bmad-extension/skills/remove-from-sprint/SKILL.md +163 -0
- package/lib/bmad-extension/skills/remove-from-sprint/bmad-skill-manifest.yaml +3 -0
- package/lib/bmad-extension/skills/sprint-status-view/SKILL.md +199 -138
- package/lib/bmad-extension/workflows/add-sprint/workflow.md +129 -39
- package/lib/bmad-extension/workflows/add-to-sprint/workflow.md +3 -205
- package/lib/bmad-extension/workflows/modify-sprint/workflow.md +5 -0
- package/lib/bmad-extension/workflows/sprint-status-view/workflow.md +3 -192
- package/package.json +4 -3
- package/test/roo-code-agent.test.js +166 -0
- 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
|
|
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 (
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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",
|