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.
Files changed (44) hide show
  1. package/LICENSE +244 -0
  2. package/README.md +251 -0
  3. package/bin/forgedock.mjs +232 -0
  4. package/commands/analytics.md +777 -0
  5. package/commands/audit-agents.md +410 -0
  6. package/commands/audit.md +410 -0
  7. package/commands/autopilot.md +432 -0
  8. package/commands/cleanup.md +264 -0
  9. package/commands/deploy-info.md +292 -0
  10. package/commands/failure-recon.md +375 -0
  11. package/commands/forge-stats.md +183 -0
  12. package/commands/geo-audit.md +343 -0
  13. package/commands/incident-response.md +384 -0
  14. package/commands/issue.md +506 -0
  15. package/commands/milestone.md +599 -0
  16. package/commands/orchestrate.md +1044 -0
  17. package/commands/pipeline-health.md +2343 -0
  18. package/commands/qa-sweep.md +237 -0
  19. package/commands/quality-gate.md +777 -0
  20. package/commands/review-pr-agents.md +1711 -0
  21. package/commands/review-pr-staging.md +325 -0
  22. package/commands/review-pr.md +888 -0
  23. package/commands/rollback.md +253 -0
  24. package/commands/security-audit.md +529 -0
  25. package/commands/sync-ecosystem.md +527 -0
  26. package/commands/validate.md +131 -0
  27. package/commands/work-on/build/architect.md +291 -0
  28. package/commands/work-on/build/context.md +349 -0
  29. package/commands/work-on/build/implement.md +280 -0
  30. package/commands/work-on/build/validate.md +292 -0
  31. package/commands/work-on/build.md +262 -0
  32. package/commands/work-on/close.md +350 -0
  33. package/commands/work-on/decompose.md +254 -0
  34. package/commands/work-on/investigate.md +437 -0
  35. package/commands/work-on/review.md +245 -0
  36. package/commands/work-on-monolithic.md +298 -0
  37. package/commands/work-on.md +1089 -0
  38. package/docs/CODEX.md +92 -0
  39. package/docs/WORKFLOW.md +104 -0
  40. package/package.json +45 -0
  41. package/scripts/verify-env-vars.sh +201 -0
  42. package/scripts/verify-host-headers.sh +117 -0
  43. package/scripts/verify-route-registration.sh +118 -0
  44. 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