forgedock 1.0.5 → 1.0.6
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/README.md +7 -1
- package/bin/forgedock.mjs +429 -363
- package/bin/labels.json +152 -0
- package/commands/audit-agents.md +4 -2
- package/commands/autopilot.md +5 -5
- package/commands/incident-response.md +1 -1
- package/commands/orchestrate.md +1 -1
- package/commands/review-pr-staging.md +49 -3
- package/commands/review-pr.md +9 -7
- package/commands/rollback.md +1 -1
- package/commands/security-audit.md +27 -25
- package/commands/sync-ecosystem.md +2 -2
- package/commands/work-on/build/architect.md +154 -2
- package/commands/work-on/build/context.md +131 -3
- package/commands/work-on.md +1 -1
- package/docs/CONFIG.md +117 -0
- package/package.json +2 -1
- package/templates/devdocs/README.md +96 -0
- package/templates/devdocs/agent/using-forgedock.md +245 -0
- package/templates/devdocs/agent/using-github.md +325 -0
- package/templates/devdocs/project/architecture.md +122 -0
- package/templates/devdocs/project/conventions.md +158 -0
- package/templates/devdocs/project/custom-instructions.md +73 -0
- package/templates/devdocs/project/glossary.md +84 -0
- package/templates/devdocs/project/stack.md +80 -0
- package/templates/devdocs/templates/commit-convention.md +147 -0
- package/templates/devdocs/templates/issue.md +141 -0
- package/templates/devdocs/templates/pull-request.md +115 -0
- package/templates/devdocs/templates/review-finding.md +147 -0
- package/bin/github-app-manifest.json +0 -24
package/bin/labels.json
ADDED
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"name": "priority:P0",
|
|
4
|
+
"color": "B60205",
|
|
5
|
+
"description": "Critical priority — production broken, data loss, security breach. Managed by ForgeDock."
|
|
6
|
+
},
|
|
7
|
+
{
|
|
8
|
+
"name": "priority:P1",
|
|
9
|
+
"color": "D93F0B",
|
|
10
|
+
"description": "High priority — major feature broken, no workaround. Managed by ForgeDock."
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"name": "priority:P2",
|
|
14
|
+
"color": "FBCA04",
|
|
15
|
+
"description": "Medium priority — impaired functionality, workaround exists. Managed by ForgeDock."
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"name": "priority:P3",
|
|
19
|
+
"color": "C2E0C6",
|
|
20
|
+
"description": "Low priority — minor issue or polish. Managed by ForgeDock."
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"name": "workflow:investigating",
|
|
24
|
+
"color": "1D76DB",
|
|
25
|
+
"description": "Pipeline: investigation phase in progress. Managed by ForgeDock."
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"name": "workflow:ready-to-build",
|
|
29
|
+
"color": "0075CA",
|
|
30
|
+
"description": "Pipeline: investigation complete, ready for build. Managed by ForgeDock."
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"name": "workflow:building",
|
|
34
|
+
"color": "0052CC",
|
|
35
|
+
"description": "Pipeline: implementation in progress. Managed by ForgeDock."
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"name": "workflow:in-review",
|
|
39
|
+
"color": "5319E7",
|
|
40
|
+
"description": "Pipeline: PR created, under review. Managed by ForgeDock."
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"name": "workflow:merged",
|
|
44
|
+
"color": "0E8A16",
|
|
45
|
+
"description": "Pipeline: PR merged, issue closed. Managed by ForgeDock."
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"name": "workflow:decomposed",
|
|
49
|
+
"color": "BFD4F2",
|
|
50
|
+
"description": "Pipeline: decomposed into sub-issues. Managed by ForgeDock."
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"name": "workflow:invalid",
|
|
54
|
+
"color": "CCCCCC",
|
|
55
|
+
"description": "Pipeline: issue closed as invalid after investigation. Managed by ForgeDock."
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"name": "needs-human",
|
|
59
|
+
"color": "E4E669",
|
|
60
|
+
"description": "Pipeline stalled — requires human intervention. Managed by ForgeDock."
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"name": "review-finding",
|
|
64
|
+
"color": "D93F0B",
|
|
65
|
+
"description": "Defect or improvement found during automated PR review. Managed by ForgeDock."
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
"name": "needs-validation",
|
|
69
|
+
"color": "FBCA04",
|
|
70
|
+
"description": "Review finding awaiting human validation. Managed by ForgeDock."
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
"name": "validated",
|
|
74
|
+
"color": "0E8A16",
|
|
75
|
+
"description": "Review finding confirmed as a real issue. Managed by ForgeDock."
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
"name": "false-positive",
|
|
79
|
+
"color": "CCCCCC",
|
|
80
|
+
"description": "Review finding dismissed as a false positive. Managed by ForgeDock."
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
"name": "staging-review",
|
|
84
|
+
"color": "1D76DB",
|
|
85
|
+
"description": "Finding from a staging branch review before deploy to main. Managed by ForgeDock."
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
"name": "audit-finding",
|
|
89
|
+
"color": "D93F0B",
|
|
90
|
+
"description": "Security or compliance defect found during audit. Managed by ForgeDock."
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
"name": "orchestration-metrics",
|
|
94
|
+
"color": "5319E7",
|
|
95
|
+
"description": "Running log of persisted audit-agents efficiency summaries. Managed by ForgeDock."
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
"name": "health-report",
|
|
99
|
+
"color": "1D76DB",
|
|
100
|
+
"description": "Pipeline health report issue. Managed by ForgeDock."
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
"name": "bug",
|
|
104
|
+
"color": "D73A4A",
|
|
105
|
+
"description": "Something isn't working. Managed by ForgeDock."
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
"name": "enhancement",
|
|
109
|
+
"color": "A2EEEF",
|
|
110
|
+
"description": "New feature or request. Managed by ForgeDock."
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
"name": "feature",
|
|
114
|
+
"color": "0075CA",
|
|
115
|
+
"description": "New feature implementation. Managed by ForgeDock."
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
"name": "refactor",
|
|
119
|
+
"color": "FEF2C0",
|
|
120
|
+
"description": "Code restructuring without behavior change. Managed by ForgeDock."
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
"name": "dead-code",
|
|
124
|
+
"color": "E4E669",
|
|
125
|
+
"description": "Unused code to be removed. Managed by ForgeDock."
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
"name": "improvement",
|
|
129
|
+
"color": "C5DEF5",
|
|
130
|
+
"description": "Non-bug improvement to existing functionality. Managed by ForgeDock."
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
"name": "documentation",
|
|
134
|
+
"color": "0075CA",
|
|
135
|
+
"description": "Documentation addition or update. Managed by ForgeDock."
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
"name": "qa",
|
|
139
|
+
"color": "E99695",
|
|
140
|
+
"description": "Quality assurance or testing issue. Managed by ForgeDock."
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
"name": "security",
|
|
144
|
+
"color": "B60205",
|
|
145
|
+
"description": "Security vulnerability or hardening. Managed by ForgeDock."
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
"name": "performance",
|
|
149
|
+
"color": "F9D0C4",
|
|
150
|
+
"description": "Performance optimization or regression. Managed by ForgeDock."
|
|
151
|
+
}
|
|
152
|
+
]
|
package/commands/audit-agents.md
CHANGED
|
@@ -343,9 +343,11 @@ This step posts a structured `<!-- FORGE:AUDIT-AGENTS -->` summary comment to th
|
|
|
343
343
|
**Step 4E.1 — Locate or create the tracking issue**:
|
|
344
344
|
|
|
345
345
|
```bash
|
|
346
|
-
# Ensure the label exists before using it (gh issue create fails with GraphQL error if label is absent)
|
|
346
|
+
# Ensure the label exists before using it (gh issue create fails with GraphQL error if label is absent).
|
|
347
|
+
# Color and description match the canonical ForgeDock label manifest (bin/labels.json).
|
|
348
|
+
# Run `npx forgedock labels setup` to bootstrap all managed labels at once.
|
|
347
349
|
gh label create "orchestration-metrics" -R {FORGE_REPO} \
|
|
348
|
-
--color "5319E7" --description "Running log of persisted audit-agents efficiency summaries" \
|
|
350
|
+
--color "5319E7" --description "Running log of persisted audit-agents efficiency summaries. Managed by ForgeDock." \
|
|
349
351
|
--force 2>/dev/null || true
|
|
350
352
|
|
|
351
353
|
TRACKING_ISSUE=$(gh issue list -R {FORGE_REPO} \
|
package/commands/autopilot.md
CHANGED
|
@@ -56,9 +56,9 @@ gh issue list --state closed --json number,title,labels,closedAt \
|
|
|
56
56
|
--jq '[.[] | select(.closedAt > "'$(date -u -d '3 days ago' +%Y-%m-%dT%H:%M:%SZ)'")] | length' 2>/dev/null || echo "0"
|
|
57
57
|
|
|
58
58
|
# Open issue count by priority
|
|
59
|
-
gh issue list --state open --label P0 --json number --jq 'length'
|
|
60
|
-
gh issue list --state open --label P1 --json number --jq 'length'
|
|
61
|
-
gh issue list --state open --label P2 --json number --jq 'length'
|
|
59
|
+
gh issue list --state open --label "priority:P0" --json number --jq 'length'
|
|
60
|
+
gh issue list --state open --label "priority:P1" --json number --jq 'length'
|
|
61
|
+
gh issue list --state open --label "priority:P2" --json number --jq 'length'
|
|
62
62
|
|
|
63
63
|
# Stale issues (open, no workflow label, older than 7 days)
|
|
64
64
|
gh issue list --state open --limit 200 --json number,title,labels,createdAt \
|
|
@@ -77,7 +77,7 @@ Store these as `BASELINE` metrics for the cycle report.
|
|
|
77
77
|
### 0B: Check for open P0s
|
|
78
78
|
|
|
79
79
|
```bash
|
|
80
|
-
gh issue list --state open --label P0 --json number,title --jq '.[] | "#\(.number) \(.title)"'
|
|
80
|
+
gh issue list --state open --label "priority:P0" --json number,title --jq '.[] | "#\(.number) \(.title)"'
|
|
81
81
|
```
|
|
82
82
|
|
|
83
83
|
If any P0 issues exist:
|
|
@@ -334,7 +334,7 @@ Pick the top `FIX_LIMIT` issues by this priority:
|
|
|
334
334
|
```bash
|
|
335
335
|
# Get candidates
|
|
336
336
|
gh issue list --state open --label "bug" --limit 50 --json number,title,labels,createdAt \
|
|
337
|
-
--jq 'sort_by(.labels | map(select(.name | startswith("P"))) | .[0].name) | .[:{FIX_LIMIT}] | .[] | "#\(.number) \(.title)"'
|
|
337
|
+
--jq 'sort_by(.labels | map(select(.name | startswith("priority:P"))) | .[0].name) | .[:{FIX_LIMIT}] | .[] | "#\(.number) \(.title)"'
|
|
338
338
|
```
|
|
339
339
|
|
|
340
340
|
### 4B: Present fix plan to user
|
|
@@ -39,7 +39,7 @@ You are the pipeline's incident response coordinator. When production goes down
|
|
|
39
39
|
gh issue view {NUMBER} --json number,title,body,labels,state,comments,assignees,createdAt
|
|
40
40
|
|
|
41
41
|
# If "active" — find most recent open P0
|
|
42
|
-
gh issue list --state open --label "P0" --limit 5 --json number,title,createdAt,labels \
|
|
42
|
+
gh issue list --state open --label "priority:P0" --limit 5 --json number,title,createdAt,labels \
|
|
43
43
|
--jq 'sort_by(.createdAt) | reverse | .[0]'
|
|
44
44
|
```
|
|
45
45
|
|
package/commands/orchestrate.md
CHANGED
|
@@ -738,7 +738,7 @@ for FINDING_NUM in {spawned_finding_numbers}; do
|
|
|
738
738
|
FINDING_DATA=$(gh issue view $FINDING_NUM -R {GH_REPO} --json labels,title,body \
|
|
739
739
|
--jq '{labels: [.labels[].name], title: .title, body: .body}')
|
|
740
740
|
|
|
741
|
-
PRIORITY=$(echo "$FINDING_DATA" | jq -r '.labels[] | select(startswith("P")) |
|
|
741
|
+
PRIORITY=$(echo "$FINDING_DATA" | jq -r '.labels[] | select(startswith("priority:P")) | ltrimstr("priority:")' | head -1)
|
|
742
742
|
TITLE=$(echo "$FINDING_DATA" | jq -r '.title')
|
|
743
743
|
|
|
744
744
|
# Heuristic 1: Generation check — source issue has review-finding label (always defer, even for P1/P2)
|
|
@@ -290,9 +290,11 @@ Keep ALL findings (CONFIRMED/LIKELY/POSSIBLE). Deduplicate by file:line (keep hi
|
|
|
290
290
|
|
|
291
291
|
### 7C: Ensure Labels
|
|
292
292
|
```bash
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
gh label create "
|
|
293
|
+
# Colors match the canonical ForgeDock label manifest (bin/labels.json).
|
|
294
|
+
# Run `npx forgedock labels setup` to bootstrap all managed labels at once.
|
|
295
|
+
gh label create "review-finding" --color "D93F0B" --description "Defect or improvement found during automated PR review. Managed by ForgeDock." --force -R {GH_REPO} 2>/dev/null
|
|
296
|
+
gh label create "needs-validation" --color "FBCA04" --description "Review finding awaiting human validation. Managed by ForgeDock." --force -R {GH_REPO} 2>/dev/null
|
|
297
|
+
gh label create "staging-review" --color "1D76DB" --description "Finding from a staging branch review before deploy to main. Managed by ForgeDock." --force -R {GH_REPO} 2>/dev/null
|
|
296
298
|
```
|
|
297
299
|
|
|
298
300
|
### 7D: Milestone Detection
|
|
@@ -304,6 +306,50 @@ Check for open review-finding issues at same file:line → skip. Closed issues a
|
|
|
304
306
|
### 7F: Create Issues
|
|
305
307
|
Sequential creation. Title: `Staging Review: {summary} (staging → main)`. Labels: review-finding, needs-validation, staging-review, P1/P2/P3. Body includes: source branch context (`staging`), code context, evidence, validation checklist.
|
|
306
308
|
|
|
309
|
+
**For each finding** (that passes dedup), create issue:
|
|
310
|
+
```bash
|
|
311
|
+
ISSUE_NUM=$(gh issue create \
|
|
312
|
+
-R {GH_REPO} \
|
|
313
|
+
--title "chore: [summary] (staging review — PR #${PR_NUMBER})" \
|
|
314
|
+
--label "review-finding,needs-validation,staging-review,{priority}" \
|
|
315
|
+
--body "$(cat <<'ISSUE_EOF'
|
|
316
|
+
## Problem
|
|
317
|
+
|
|
318
|
+
[One sentence: what bug or issue was found. Where it occurs (`file:line`) and what it causes.]
|
|
319
|
+
|
|
320
|
+
**Source**: PR #[PR_NUMBER] — [TITLE]
|
|
321
|
+
**Confidence**: [CONFIRMED/LIKELY/POSSIBLE]
|
|
322
|
+
**Severity**: [CRITICAL/HIGH/MEDIUM/LOW]
|
|
323
|
+
**Review comment**: [permalink to agent comment]
|
|
324
|
+
|
|
325
|
+
## Affected Files
|
|
326
|
+
|
|
327
|
+
Files that need changes:
|
|
328
|
+
1. `[file:line]` — [what needs to change to fix this finding]
|
|
329
|
+
|
|
330
|
+
## Source Branch Context
|
|
331
|
+
|
|
332
|
+
**Code branch**: `staging`
|
|
333
|
+
**Worktree base**: `origin/staging`
|
|
334
|
+
|
|
335
|
+
> When fixing: `git worktree add ../fix-{slug} -b fix/{slug} origin/staging`
|
|
336
|
+
|
|
337
|
+
## Code Context
|
|
338
|
+
[10 lines around finding]
|
|
339
|
+
|
|
340
|
+
## Evidence
|
|
341
|
+
[From agent comment]
|
|
342
|
+
|
|
343
|
+
## Acceptance Criteria
|
|
344
|
+
|
|
345
|
+
- [ ] Finding validated: VALIDATED / FALSE_POSITIVE / INCONCLUSIVE
|
|
346
|
+
- [ ] If VALIDATED: fix implemented and tested on correct branch
|
|
347
|
+
ISSUE_EOF
|
|
348
|
+
)" --json number --jq '.number')
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
Labels: `review-finding` + `needs-validation` + `staging-review` + priority (`priority:P1` CONFIRMED, `priority:P2` LIKELY, `priority:P3` POSSIBLE).
|
|
352
|
+
|
|
307
353
|
**No pre-filtering**: Every finding becomes an issue. Validation agents sort out false positives downstream.
|
|
308
354
|
|
|
309
355
|
### 7G: Add to Project Board
|
package/commands/review-pr.md
CHANGED
|
@@ -616,10 +616,12 @@ If still 0: review is clean — skip to Phase 7.
|
|
|
616
616
|
### 6C: Create Issues
|
|
617
617
|
|
|
618
618
|
```bash
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
gh label create "
|
|
622
|
-
gh label create "
|
|
619
|
+
# Colors match the canonical ForgeDock label manifest (bin/labels.json).
|
|
620
|
+
# Run `npx forgedock labels setup` to bootstrap all managed labels at once.
|
|
621
|
+
gh label create "review-finding" --color "D93F0B" --description "Defect or improvement found during automated PR review. Managed by ForgeDock." --force -R {GH_REPO} 2>/dev/null
|
|
622
|
+
gh label create "needs-validation" --color "FBCA04" --description "Review finding awaiting human validation. Managed by ForgeDock." --force -R {GH_REPO} 2>/dev/null
|
|
623
|
+
gh label create "validated" --color "0E8A16" --description "Review finding confirmed as a real issue. Managed by ForgeDock." --force -R {GH_REPO} 2>/dev/null
|
|
624
|
+
gh label create "false-positive" --color "CCCCCC" --description "Review finding dismissed as a false positive. Managed by ForgeDock." --force -R {GH_REPO} 2>/dev/null
|
|
623
625
|
```
|
|
624
626
|
|
|
625
627
|
**Milestone detection:**
|
|
@@ -693,7 +695,7 @@ else
|
|
|
693
695
|
' 2>/dev/null | head -1)
|
|
694
696
|
if [ -n "$REGRESSION" ]; then
|
|
695
697
|
echo "REGRESSION: Previously fixed in #${REGRESSION} — elevating priority"
|
|
696
|
-
# Create with regression warning and P1
|
|
698
|
+
# Create with regression warning and priority:P1 label
|
|
697
699
|
fi
|
|
698
700
|
fi
|
|
699
701
|
```
|
|
@@ -701,7 +703,7 @@ fi
|
|
|
701
703
|
**Rules:**
|
|
702
704
|
- Open `review-finding` issue at same file within ±5 lines → **skip** (do not create duplicate)
|
|
703
705
|
- Open `review-finding` issue at same file with similar title (3+ shared keywords) → **skip** (likely same finding despite line drift)
|
|
704
|
-
- Closed `review-finding` at same file within ±5 lines → create with regression warning, elevate to P1
|
|
706
|
+
- Closed `review-finding` at same file within ±5 lines → create with regression warning, elevate to `priority:P1`
|
|
705
707
|
|
|
706
708
|
**For each finding** (that passes dedup), create issue:
|
|
707
709
|
```bash
|
|
@@ -757,7 +759,7 @@ ISSUE_EOF
|
|
|
757
759
|
)" --json number --jq '.number')
|
|
758
760
|
```
|
|
759
761
|
|
|
760
|
-
Labels: `review-finding` + `needs-validation` + priority (`P1` CONFIRMED, `P2` LIKELY, `P3` POSSIBLE).
|
|
762
|
+
Labels: `review-finding` + `needs-validation` + priority (`priority:P1` CONFIRMED, `priority:P2` LIKELY, `priority:P3` POSSIBLE).
|
|
761
763
|
|
|
762
764
|
**Add to project board:**
|
|
763
765
|
```bash
|
package/commands/rollback.md
CHANGED
|
@@ -7,7 +7,7 @@ argument-hint: [--repo <prefix>] [--phase 1|2|3|4|all] [--dry-run]
|
|
|
7
7
|
|
|
8
8
|
**Input**: $ARGUMENTS
|
|
9
9
|
|
|
10
|
-
You are the security posture auditor. Run a scripted 4-phase checklist against the **current state** of the target repository (not a PR diff). Each check uses bash/grep against repo files. Confirmed findings are posted as GitHub issues in the target repo, labeled `security,audit-finding,P1/P2/P3`.
|
|
10
|
+
You are the security posture auditor. Run a scripted 4-phase checklist against the **current state** of the target repository (not a PR diff). Each check uses bash/grep against repo files. Confirmed findings are posted as GitHub issues in the target repo, labeled `security,audit-finding,priority:P1/priority:P2/priority:P3`.
|
|
11
11
|
|
|
12
12
|
This command is designed to be run:
|
|
13
13
|
- **Manually** after a pen test engagement
|
|
@@ -119,7 +119,7 @@ done
|
|
|
119
119
|
|
|
120
120
|
**Confirm**: For each hit, verify the port is NOT a web-facing port (80, 443, 8080, 3000). Ports like 6432 (PgBouncer), 6379 (Redis), 5432 (Postgres), 27017 (MongoDB) bound to `0.0.0.0` are confirmed findings.
|
|
121
121
|
|
|
122
|
-
**Severity**: P1 if no external firewall documented; P2 otherwise.
|
|
122
|
+
**Severity**: `priority:P1` if no external firewall documented; `priority:P2` otherwise.
|
|
123
123
|
|
|
124
124
|
**Issue title**: `security: {SERVICE} port {PORT} bound to 0.0.0.0 — exposed beyond localhost`
|
|
125
125
|
|
|
@@ -142,7 +142,7 @@ done
|
|
|
142
142
|
|
|
143
143
|
**Confirm**: Check if the Dockerfile is for a long-running service (not a one-shot build image). If service container with no USER → confirmed finding.
|
|
144
144
|
|
|
145
|
-
**Severity**: P2 (standard finding; exploitability depends on runtime isolation).
|
|
145
|
+
**Severity**: `priority:P2` (standard finding; exploitability depends on runtime isolation).
|
|
146
146
|
|
|
147
147
|
**Issue title**: `security: {SERVICE} Dockerfile has no USER directive — runs as root`
|
|
148
148
|
|
|
@@ -167,7 +167,7 @@ done
|
|
|
167
167
|
|
|
168
168
|
**Manual review**: Check for `POSTGRES_PASSWORD` and `requirepass` in compose environment sections. Flag any service using a blank/trivial password as a documented value.
|
|
169
169
|
|
|
170
|
-
**Severity**: P3 for dev compose; P1 if the compose file is used in production.
|
|
170
|
+
**Severity**: `priority:P3` for dev compose; `priority:P1` if the compose file is used in production.
|
|
171
171
|
|
|
172
172
|
**Issue title**: `security: {SERVICE} in {FILE} has no authentication configured`
|
|
173
173
|
|
|
@@ -198,7 +198,7 @@ done
|
|
|
198
198
|
|
|
199
199
|
**Confirm**: Verify the flagged step is indeed a security scanner step (not a notification or deploy step). Confirmed if scanner produces failure exit codes that are being swallowed.
|
|
200
200
|
|
|
201
|
-
**Severity**: P2 (scanner present but findings are silently ignored).
|
|
201
|
+
**Severity**: `priority:P2` (scanner present but findings are silently ignored).
|
|
202
202
|
|
|
203
203
|
**Issue title**: `security: {SCANNER} step in {WORKFLOW} has continue-on-error: true — findings silently ignored`
|
|
204
204
|
|
|
@@ -219,7 +219,7 @@ done
|
|
|
219
219
|
|
|
220
220
|
**Confirm**: Distinguish intentional comments (documentation) from disabled access control rules. Confirmed if the commented line is a functional directive that would restrict access.
|
|
221
221
|
|
|
222
|
-
**Severity**: P1 if the endpoint is publicly accessible; P2 otherwise.
|
|
222
|
+
**Severity**: `priority:P1` if the endpoint is publicly accessible; `priority:P2` otherwise.
|
|
223
223
|
|
|
224
224
|
**Issue title**: `security: commented-out access control in {FILE} — {DIRECTIVE} disabled`
|
|
225
225
|
|
|
@@ -242,7 +242,7 @@ done
|
|
|
242
242
|
|
|
243
243
|
**Confirm**: Verify the CSP header applies to the production site (not just dev/storybook). Check if a nonce-based approach is already in use (nonce + unsafe-inline is still a finding but lower severity).
|
|
244
244
|
|
|
245
|
-
**Severity**: P2 (XSS protection materially weakened).
|
|
245
|
+
**Severity**: `priority:P2` (XSS protection materially weakened).
|
|
246
246
|
|
|
247
247
|
**Issue title**: `security: CSP script-src includes unsafe-inline in {FILE} — XSS protection bypassed`
|
|
248
248
|
|
|
@@ -261,9 +261,9 @@ for f in $HEADER_FILES; do
|
|
|
261
261
|
done
|
|
262
262
|
```
|
|
263
263
|
|
|
264
|
-
**Confirm**: Check if the header is set in a response (not just read). If set in outbound responses → confirmed finding. Internal-only APIs (not publicly routed) are P3
|
|
264
|
+
**Confirm**: Check if the header is set in a response (not just read). If set in outbound responses → confirmed finding. Internal-only APIs (not publicly routed) are `priority:P3`; public APIs are `priority:P2`.
|
|
265
265
|
|
|
266
|
-
**Severity**: P2 for public APIs; P3 for internal.
|
|
266
|
+
**Severity**: `priority:P2` for public APIs; `priority:P3` for internal.
|
|
267
267
|
|
|
268
268
|
**Issue title**: `security: {HEADER} response header leaks deployment/version information`
|
|
269
269
|
|
|
@@ -291,7 +291,7 @@ grep -rn '@router.get\("/health"\|@app.route("/health"\|@router.get\("/metrics"\
|
|
|
291
291
|
|
|
292
292
|
**Confirm**: Manually verify the route has no authentication dependency. Check if it's behind a network-level gate (traefik middleware, nginx ACL). Confirmed if publicly routable and returns system state.
|
|
293
293
|
|
|
294
|
-
**Severity**: P2 (information disclosure enables targeted attacks).
|
|
294
|
+
**Severity**: `priority:P2` (information disclosure enables targeted attacks).
|
|
295
295
|
|
|
296
296
|
**Issue title**: `security: unauthenticated {ROUTE} endpoint exposes system state`
|
|
297
297
|
|
|
@@ -326,7 +326,7 @@ grep -rn "new Map\(\)" "$REPO_PATH/web" --include="*.ts" --include="*.tsx" --inc
|
|
|
326
326
|
|
|
327
327
|
**Confirm**: Verify the rate limiter is not backed by Redis, a database, or a distributed cache. Confirmed if per-process store with no TTL-based external backend.
|
|
328
328
|
|
|
329
|
-
**Severity**: P2 (rate limit bypass possible in scaled deployments).
|
|
329
|
+
**Severity**: `priority:P2` (rate limit bypass possible in scaled deployments).
|
|
330
330
|
|
|
331
331
|
**Issue title**: `security: in-memory rate limiter in {FILE} has no cross-replica enforcement`
|
|
332
332
|
|
|
@@ -363,9 +363,9 @@ grep -rn "document\.cookie\s*=\|res\.cookie(" "$REPO_PATH/web" --include="*.ts"
|
|
|
363
363
|
done
|
|
364
364
|
```
|
|
365
365
|
|
|
366
|
-
**Confirm**: Verify the cookie stores user-controlled data or authentication state. Internal-only cookies (debug flags, feature flags with no sensitive data) are P3
|
|
366
|
+
**Confirm**: Verify the cookie stores user-controlled data or authentication state. Internal-only cookies (debug flags, feature flags with no sensitive data) are `priority:P3`. Auth/session cookies without flags are `priority:P1`.
|
|
367
367
|
|
|
368
|
-
**Severity**: P1 for auth/session tokens; P2 for user-controlled data; P3 for non-sensitive cookies.
|
|
368
|
+
**Severity**: `priority:P1` for auth/session tokens; `priority:P2` for user-controlled data; `priority:P3` for non-sensitive cookies.
|
|
369
369
|
|
|
370
370
|
**Issue title**: `security: {COOKIE_NAME} cookie missing {FLAGS} — vulnerable to XSS/CSRF/MITM`
|
|
371
371
|
|
|
@@ -395,7 +395,7 @@ grep -rn '||\s*["'"'"'][a-zA-Z0-9]\{4,\}["'"'"']\|default.*password\|default.*se
|
|
|
395
395
|
|
|
396
396
|
**Confirm**: Verify the fallback value is a real credential (not a placeholder like `""` or `"REPLACE_ME"` which would fail explicitly). Confirmed if a non-trivial value would silently succeed authentication.
|
|
397
397
|
|
|
398
|
-
**Severity**: P1 if the credential protects a production service; P2 otherwise.
|
|
398
|
+
**Severity**: `priority:P1` if the credential protects a production service; `priority:P2` otherwise.
|
|
399
399
|
|
|
400
400
|
**Issue title**: `security: credential placeholder fallback in {FILE} — {VAR} defaults to hardcoded value`
|
|
401
401
|
|
|
@@ -445,7 +445,7 @@ done
|
|
|
445
445
|
|
|
446
446
|
**Confirm**: Verify the event type appears in a handler dispatch (not just a comment). Confirmed if the event would change user entitlements or financial state but has no handler.
|
|
447
447
|
|
|
448
|
-
**Severity**: P1 for events that affect billing state (subscription.deleted, payment_failed, dispute); P2 for informational events.
|
|
448
|
+
**Severity**: `priority:P1` for events that affect billing state (subscription.deleted, payment_failed, dispute); `priority:P2` for informational events.
|
|
449
449
|
|
|
450
450
|
**Issue title**: `security: Stripe event {EVENT_TYPE} not handled in {FILE} — financial state may diverge`
|
|
451
451
|
|
|
@@ -466,7 +466,7 @@ grep -rn "pre_reserve\|prereserve\|reserve_credits\|MAX_COST\|max_cost\|PRE_RESE
|
|
|
466
466
|
|
|
467
467
|
**Manual review required**: Compare the pre-reserve amount against the maximum operation cost for the highest-tier model. If pre-reserve < max possible cost, users can overdraw.
|
|
468
468
|
|
|
469
|
-
**Severity**: P2 (financial loss; users can consume credits they don't have).
|
|
469
|
+
**Severity**: `priority:P2` (financial loss; users can consume credits they don't have).
|
|
470
470
|
|
|
471
471
|
**Issue title**: `security: pre-reservation credit cap {AMOUNT} is below maximum operation cost {MAX_COST}`
|
|
472
472
|
|
|
@@ -483,8 +483,8 @@ After all phases complete, produce a summary table:
|
|
|
483
483
|
|
|
484
484
|
| # | Phase | Finding | File | Severity | Status |
|
|
485
485
|
|---|-------|---------|------|----------|--------|
|
|
486
|
-
| 1 | 1A | Port binding | docker-compose.prod.yml:12 | P1 | CONFIRMED |
|
|
487
|
-
| 2 | 1B | No USER directive | services/worker/Dockerfile | P2 | CONFIRMED |
|
|
486
|
+
| 1 | 1A | Port binding | docker-compose.prod.yml:12 | priority:P1 | CONFIRMED |
|
|
487
|
+
| 2 | 1B | No USER directive | services/worker/Dockerfile | priority:P2 | CONFIRMED |
|
|
488
488
|
...
|
|
489
489
|
```
|
|
490
490
|
|
|
@@ -492,12 +492,14 @@ If `--dry-run` was passed, print the table and STOP. Do not create issues.
|
|
|
492
492
|
|
|
493
493
|
### 5B: Ensure labels exist in target repo
|
|
494
494
|
|
|
495
|
-
Before creating any issues, ensure all required labels exist
|
|
495
|
+
Before creating any issues, ensure all required labels exist. Colors match the canonical ForgeDock label manifest (`bin/labels.json`). Run `npx forgedock labels setup` to bootstrap all managed labels at once.
|
|
496
496
|
|
|
497
497
|
```bash
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
498
|
+
gh label create "security" --color "B60205" --description "Security vulnerability or hardening. Managed by ForgeDock." --force -R "{GH_REPO}" 2>/dev/null || true
|
|
499
|
+
gh label create "audit-finding" --color "D93F0B" --description "Security or compliance defect found during audit. Managed by ForgeDock." --force -R "{GH_REPO}" 2>/dev/null || true
|
|
500
|
+
gh label create "priority:P1" --color "D93F0B" --description "High priority — major feature broken, no workaround. Managed by ForgeDock." --force -R "{GH_REPO}" 2>/dev/null || true
|
|
501
|
+
gh label create "priority:P2" --color "FBCA04" --description "Medium priority — impaired functionality, workaround exists. Managed by ForgeDock." --force -R "{GH_REPO}" 2>/dev/null || true
|
|
502
|
+
gh label create "priority:P3" --color "C2E0C6" --description "Low priority — minor issue or polish. Managed by ForgeDock." --force -R "{GH_REPO}" 2>/dev/null || true
|
|
501
503
|
```
|
|
502
504
|
|
|
503
505
|
### 5C: Create GitHub issues for CONFIRMED findings
|
|
@@ -559,9 +561,9 @@ gh issue comment "{CALLER_ISSUE}" -R {FORGE_REPO} --body "$(cat <<'COMMENT_EOF'
|
|
|
559
561
|
|
|
560
562
|
| Severity | Count |
|
|
561
563
|
|----------|-------|
|
|
562
|
-
| P1 | {P1_COUNT} |
|
|
563
|
-
| P2 | {P2_COUNT} |
|
|
564
|
-
| P3 | {P3_COUNT} |
|
|
564
|
+
| priority:P1 | {P1_COUNT} |
|
|
565
|
+
| priority:P2 | {P2_COUNT} |
|
|
566
|
+
| priority:P3 | {P3_COUNT} |
|
|
565
567
|
|
|
566
568
|
### Issues Created
|
|
567
569
|
|
|
@@ -217,7 +217,7 @@ Create issues in the affected repos:
|
|
|
217
217
|
# For satellite repos (separate GitHub repos):
|
|
218
218
|
gh issue create -R {TARGET_REPO} \
|
|
219
219
|
--title "feat(sync): {description of what API change needs to be reflected}" \
|
|
220
|
-
--label "feature,P2" \
|
|
220
|
+
--label "feature,priority:P2" \
|
|
221
221
|
--body "$(cat <<'BODY_EOF'
|
|
222
222
|
## Problem
|
|
223
223
|
|
|
@@ -254,7 +254,7 @@ BODY_EOF
|
|
|
254
254
|
# For monorepo issues (SDKs, packages inside a single repo):
|
|
255
255
|
gh issue create \
|
|
256
256
|
--title "feat(sync): {description of what API change needs to be reflected}" \
|
|
257
|
-
--label "feature,P2" \
|
|
257
|
+
--label "feature,priority:P2" \
|
|
258
258
|
--body "$(cat <<'BODY_EOF'
|
|
259
259
|
## Problem
|
|
260
260
|
|