forgedock 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +244 -0
- package/README.md +251 -0
- package/bin/forgedock.mjs +232 -0
- package/commands/analytics.md +777 -0
- package/commands/audit-agents.md +410 -0
- package/commands/audit.md +410 -0
- package/commands/autopilot.md +432 -0
- package/commands/cleanup.md +264 -0
- package/commands/deploy-info.md +292 -0
- package/commands/failure-recon.md +375 -0
- package/commands/forge-stats.md +183 -0
- package/commands/geo-audit.md +343 -0
- package/commands/incident-response.md +384 -0
- package/commands/issue.md +506 -0
- package/commands/milestone.md +599 -0
- package/commands/orchestrate.md +1044 -0
- package/commands/pipeline-health.md +2343 -0
- package/commands/qa-sweep.md +237 -0
- package/commands/quality-gate.md +777 -0
- package/commands/review-pr-agents.md +1711 -0
- package/commands/review-pr-staging.md +325 -0
- package/commands/review-pr.md +888 -0
- package/commands/rollback.md +253 -0
- package/commands/security-audit.md +529 -0
- package/commands/sync-ecosystem.md +527 -0
- package/commands/validate.md +131 -0
- package/commands/work-on/build/architect.md +291 -0
- package/commands/work-on/build/context.md +349 -0
- package/commands/work-on/build/implement.md +280 -0
- package/commands/work-on/build/validate.md +292 -0
- package/commands/work-on/build.md +262 -0
- package/commands/work-on/close.md +350 -0
- package/commands/work-on/decompose.md +254 -0
- package/commands/work-on/investigate.md +437 -0
- package/commands/work-on/review.md +245 -0
- package/commands/work-on-monolithic.md +298 -0
- package/commands/work-on.md +1089 -0
- package/docs/CODEX.md +92 -0
- package/docs/WORKFLOW.md +104 -0
- package/package.json +45 -0
- package/scripts/verify-env-vars.sh +201 -0
- package/scripts/verify-host-headers.sh +117 -0
- package/scripts/verify-route-registration.sh +118 -0
- package/scripts/verify-sops-chain.sh +163 -0
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# verify-sops-chain.sh — Trace SOPS secrets through the full deploy chain
|
|
3
|
+
#
|
|
4
|
+
# Usage: verify-sops-chain.sh <pr_diff_file> <changed_files_file> <repo_root>
|
|
5
|
+
# pr_diff_file: path to file containing unified diff output (or "-" for stdin on first arg)
|
|
6
|
+
# changed_files_file: path to file listing changed files (one per line)
|
|
7
|
+
# repo_root: path to the repository root
|
|
8
|
+
#
|
|
9
|
+
# Verifies:
|
|
10
|
+
# 1. ENV_MAPPING entries in decrypt-secrets.sh have matching SOPS keys
|
|
11
|
+
# 2. Deploy workflow SCP target and merge path are consistent
|
|
12
|
+
# 3. Hotfix workflow paths match main deploy workflow
|
|
13
|
+
#
|
|
14
|
+
# Output: Structured findings (one per line, prefixed with severity)
|
|
15
|
+
# BLOCKING: <message> — must fix before merge
|
|
16
|
+
# WARNING: <message> — likely issue, verify manually
|
|
17
|
+
# OK: <message> — check passed
|
|
18
|
+
#
|
|
19
|
+
# Exit codes: 0 = all checks passed, 1 = blocking findings, 2 = warnings only
|
|
20
|
+
|
|
21
|
+
set -euo pipefail
|
|
22
|
+
|
|
23
|
+
DIFF_INPUT="${1:--}"
|
|
24
|
+
CHANGED_FILES_INPUT="${2:--}"
|
|
25
|
+
REPO_ROOT="${3:-.}"
|
|
26
|
+
|
|
27
|
+
if [ "$DIFF_INPUT" = "-" ]; then
|
|
28
|
+
DIFF_CONTENT=$(cat)
|
|
29
|
+
else
|
|
30
|
+
DIFF_CONTENT=$(cat "$DIFF_INPUT")
|
|
31
|
+
fi
|
|
32
|
+
|
|
33
|
+
if [ "$CHANGED_FILES_INPUT" = "-" ]; then
|
|
34
|
+
CHANGED_FILES=""
|
|
35
|
+
else
|
|
36
|
+
CHANGED_FILES=$(cat "$CHANGED_FILES_INPUT")
|
|
37
|
+
fi
|
|
38
|
+
|
|
39
|
+
BLOCKING=0
|
|
40
|
+
WARNINGS=0
|
|
41
|
+
|
|
42
|
+
# Check if any SOPS/deploy chain files are in the changeset
|
|
43
|
+
SOPS_CHAIN_FILES=$(echo "$CHANGED_FILES" | grep -E "(decrypt-secrets\.sh|prod\.enc\.yaml|deploy-production\.yml|hotfix-deploy\.yml)" || true)
|
|
44
|
+
|
|
45
|
+
if [ -z "$SOPS_CHAIN_FILES" ]; then
|
|
46
|
+
echo "OK: No SOPS deploy chain files in changeset"
|
|
47
|
+
exit 0
|
|
48
|
+
fi
|
|
49
|
+
|
|
50
|
+
echo "=== SOPS Deploy Chain Verification ==="
|
|
51
|
+
echo "Changed files in deploy chain: $SOPS_CHAIN_FILES"
|
|
52
|
+
echo ""
|
|
53
|
+
|
|
54
|
+
# --- Check 1: ENV_MAPPING → SOPS key consistency ---
|
|
55
|
+
echo "--- Check 1: ENV_MAPPING → SOPS key consistency ---"
|
|
56
|
+
NEW_MAPPINGS=$(echo "$DIFF_CONTENT" | grep -E "^\+.*\": \(\"" | grep -oE '"[A-Z_]+": \("([a-z_]+)", "([a-z_]+)"\)' || true)
|
|
57
|
+
|
|
58
|
+
if [ -n "$NEW_MAPPINGS" ]; then
|
|
59
|
+
echo "New ENV_MAPPING entries found:"
|
|
60
|
+
echo "$NEW_MAPPINGS"
|
|
61
|
+
echo ""
|
|
62
|
+
|
|
63
|
+
# For each new mapping, verify the SOPS path structure exists
|
|
64
|
+
# (We can't decrypt SOPS to verify values, but we can check the mapping format is valid)
|
|
65
|
+
echo "$NEW_MAPPINGS" | while IFS= read -r mapping; do
|
|
66
|
+
VAR_NAME=$(echo "$mapping" | grep -oE '^"[A-Z_]+"' | tr -d '"')
|
|
67
|
+
SOPS_SECTION=$(echo "$mapping" | grep -oE '\("([a-z_]+)"' | head -1 | tr -d '("')
|
|
68
|
+
SOPS_KEY=$(echo "$mapping" | grep -oE ', "([a-z_]+)"\)' | tr -d ', ")')
|
|
69
|
+
|
|
70
|
+
if [ -n "$VAR_NAME" ] && [ -n "$SOPS_SECTION" ] && [ -n "$SOPS_KEY" ]; then
|
|
71
|
+
echo "OK: $VAR_NAME → sops[$SOPS_SECTION][$SOPS_KEY] — mapping format valid"
|
|
72
|
+
else
|
|
73
|
+
echo "WARNING: Malformed ENV_MAPPING entry: $mapping"
|
|
74
|
+
WARNINGS=$((WARNINGS + 1))
|
|
75
|
+
fi
|
|
76
|
+
done
|
|
77
|
+
else
|
|
78
|
+
echo "OK: No new ENV_MAPPING entries in diff"
|
|
79
|
+
fi
|
|
80
|
+
|
|
81
|
+
echo ""
|
|
82
|
+
|
|
83
|
+
# --- Check 2: Deploy workflow path consistency ---
|
|
84
|
+
echo "--- Check 2: Deploy workflow path consistency ---"
|
|
85
|
+
DEPLOY_WORKFLOW="$REPO_ROOT/.github/workflows/deploy-production.yml"
|
|
86
|
+
|
|
87
|
+
if [ -f "$DEPLOY_WORKFLOW" ]; then
|
|
88
|
+
SCP_TARGET=$(grep -oE "target:.*PRODUCTION_PROJECT_PATH[^\"]*" "$DEPLOY_WORKFLOW" 2>/dev/null | head -1 || true)
|
|
89
|
+
MERGE_PROJECT=$(grep -oE "PROJECT=.*PRODUCTION_PROJECT_PATH[^}]*}[^ ]*" "$DEPLOY_WORKFLOW" 2>/dev/null | head -1 || true)
|
|
90
|
+
|
|
91
|
+
echo "SCP target: ${SCP_TARGET:-<not found>}"
|
|
92
|
+
echo "Merge PROJECT: ${MERGE_PROJECT:-<not found>}"
|
|
93
|
+
|
|
94
|
+
# Check for double-path risk
|
|
95
|
+
if echo "$SCP_TARGET" | grep -qE "PRODUCTION_PROJECT_PATH.*\}/app" 2>/dev/null; then
|
|
96
|
+
echo "BLOCKING: SCP target appends /app to PRODUCTION_PROJECT_PATH — if the path already includes /app, secrets go to /app/app/"
|
|
97
|
+
BLOCKING=$((BLOCKING + 1))
|
|
98
|
+
fi
|
|
99
|
+
if echo "$MERGE_PROJECT" | grep -qE "PRODUCTION_PROJECT_PATH.*\}/app" 2>/dev/null; then
|
|
100
|
+
echo "BLOCKING: Merge PROJECT appends /app — same double-path risk"
|
|
101
|
+
BLOCKING=$((BLOCKING + 1))
|
|
102
|
+
fi
|
|
103
|
+
|
|
104
|
+
if [ "$BLOCKING" -eq 0 ]; then
|
|
105
|
+
echo "OK: No double-path risk detected in deploy workflow"
|
|
106
|
+
fi
|
|
107
|
+
else
|
|
108
|
+
echo "WARNING: Deploy workflow not found at $DEPLOY_WORKFLOW — cannot verify paths"
|
|
109
|
+
WARNINGS=$((WARNINGS + 1))
|
|
110
|
+
fi
|
|
111
|
+
|
|
112
|
+
echo ""
|
|
113
|
+
|
|
114
|
+
# --- Check 3: Hotfix workflow consistency ---
|
|
115
|
+
echo "--- Check 3: Hotfix workflow consistency ---"
|
|
116
|
+
HOTFIX_WORKFLOW="$REPO_ROOT/.github/workflows/hotfix-deploy.yml"
|
|
117
|
+
|
|
118
|
+
if [ -f "$HOTFIX_WORKFLOW" ] && [ -f "$DEPLOY_WORKFLOW" ]; then
|
|
119
|
+
HOTFIX_SCP=$(grep -oE "target:.*PRODUCTION_PROJECT_PATH[^\"]*" "$HOTFIX_WORKFLOW" 2>/dev/null | head -1 || true)
|
|
120
|
+
MAIN_SCP=$(grep -oE "target:.*PRODUCTION_PROJECT_PATH[^\"]*" "$DEPLOY_WORKFLOW" 2>/dev/null | head -1 || true)
|
|
121
|
+
|
|
122
|
+
echo "Main deploy SCP: ${MAIN_SCP:-<not found>}"
|
|
123
|
+
echo "Hotfix deploy SCP: ${HOTFIX_SCP:-<not found>}"
|
|
124
|
+
|
|
125
|
+
if [ -n "$MAIN_SCP" ] && [ -n "$HOTFIX_SCP" ] && [ "$MAIN_SCP" != "$HOTFIX_SCP" ]; then
|
|
126
|
+
echo "WARNING: Hotfix SCP target differs from main deploy — path drift risk"
|
|
127
|
+
WARNINGS=$((WARNINGS + 1))
|
|
128
|
+
elif [ -n "$MAIN_SCP" ] && [ -n "$HOTFIX_SCP" ]; then
|
|
129
|
+
echo "OK: Hotfix and main deploy SCP targets match"
|
|
130
|
+
fi
|
|
131
|
+
else
|
|
132
|
+
echo "OK: Hotfix workflow comparison skipped (file not found)"
|
|
133
|
+
fi
|
|
134
|
+
|
|
135
|
+
echo ""
|
|
136
|
+
|
|
137
|
+
# --- Check 4: docker-compose.prod.yml env_file consistency ---
|
|
138
|
+
echo "--- Check 4: Compose env_file path ---"
|
|
139
|
+
COMPOSE_PROD="$REPO_ROOT/docker-compose.prod.yml"
|
|
140
|
+
|
|
141
|
+
if [ -f "$COMPOSE_PROD" ]; then
|
|
142
|
+
COMPOSE_ENV=$(grep -A1 "env_file:" "$COMPOSE_PROD" 2>/dev/null | grep -oE '\.env[a-z.]*' | head -1 || true)
|
|
143
|
+
echo "Compose env_file: ${COMPOSE_ENV:-<not found>}"
|
|
144
|
+
|
|
145
|
+
if [ -n "$COMPOSE_ENV" ]; then
|
|
146
|
+
echo "OK: Production compose uses env_file: $COMPOSE_ENV"
|
|
147
|
+
fi
|
|
148
|
+
else
|
|
149
|
+
echo "OK: No docker-compose.prod.yml — skipping compose check"
|
|
150
|
+
fi
|
|
151
|
+
|
|
152
|
+
echo ""
|
|
153
|
+
echo "=== Summary ==="
|
|
154
|
+
echo "Blocking: $BLOCKING"
|
|
155
|
+
echo "Warnings: $WARNINGS"
|
|
156
|
+
|
|
157
|
+
# --- Exit code ---
|
|
158
|
+
if [ "$BLOCKING" -gt 0 ]; then
|
|
159
|
+
exit 1
|
|
160
|
+
elif [ "$WARNINGS" -gt 0 ]; then
|
|
161
|
+
exit 2
|
|
162
|
+
fi
|
|
163
|
+
exit 0
|