@prism-d1/cli 1.0.71 → 1.0.73
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/dist/assets/eval-harness/steering/code-review.md +61 -0
- package/dist/assets/github-workflows/prism-eval-gate-kiro.yml +379 -0
- package/dist/assets/github-workflows/prism-eval-gate.yml +59 -36
- package/dist/assets/infra/lib/metrics-pipeline-stack.ts +6 -0
- package/dist/src/commands/bootstrapper/install-eval-harness.d.ts +1 -0
- package/dist/src/commands/bootstrapper/install-eval-harness.d.ts.map +1 -1
- package/dist/src/commands/bootstrapper/install-eval-harness.js +126 -60
- package/dist/src/commands/bootstrapper/install-eval-harness.js.map +1 -1
- package/dist/src/commands/bootstrapper/setup-github-oidc.d.ts.map +1 -1
- package/dist/src/commands/bootstrapper/setup-github-oidc.js +20 -0
- package/dist/src/commands/bootstrapper/setup-github-oidc.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Code Review Rules
|
|
2
|
+
|
|
3
|
+
> This file configures what Kiro looks for when reviewing PR diffs in CI.
|
|
4
|
+
> Customize these rules for your team's standards and concerns.
|
|
5
|
+
> See: https://kiro.dev/docs/steering/
|
|
6
|
+
|
|
7
|
+
## Hard Failures (block merge if found)
|
|
8
|
+
|
|
9
|
+
- SQL injection or command injection via string concatenation or template literals with user input
|
|
10
|
+
- Hardcoded secrets, API keys, passwords, or connection strings in source code
|
|
11
|
+
- Missing error handling on async operations (unhandled promise rejections, missing try/catch)
|
|
12
|
+
- Unbounded database queries (no LIMIT, no pagination, no streaming for large result sets)
|
|
13
|
+
- Disabled security controls (authentication bypassed, authorization checks removed)
|
|
14
|
+
- Use of `eval()`, `Function()` constructor, or `child_process.exec()` with user input
|
|
15
|
+
|
|
16
|
+
## Warnings (comment but don't block)
|
|
17
|
+
|
|
18
|
+
- Functions exceeding 50 lines (suggest decomposition)
|
|
19
|
+
- TypeScript `any` type usage without a justifying comment
|
|
20
|
+
- `console.log` or `print()` in production code paths (use structured logger)
|
|
21
|
+
- Missing input validation on API endpoint parameters
|
|
22
|
+
- Catching errors without logging or re-throwing (`catch(e) {}`)
|
|
23
|
+
- TODO/FIXME/HACK comments introduced in new code
|
|
24
|
+
- Magic numbers without named constants
|
|
25
|
+
- Duplicated logic that could be extracted to a shared function
|
|
26
|
+
|
|
27
|
+
## What NOT to Flag
|
|
28
|
+
|
|
29
|
+
- Test files (*.test.ts, *.spec.ts, *_test.py, test_*.py)
|
|
30
|
+
- Generated code (files with "generated" or "auto-generated" in header comment)
|
|
31
|
+
- Configuration files (*.json, *.yml, *.toml) unless they contain secrets
|
|
32
|
+
- Lock files (package-lock.json, yarn.lock, poetry.lock)
|
|
33
|
+
- Markdown documentation changes
|
|
34
|
+
|
|
35
|
+
## Output Format
|
|
36
|
+
|
|
37
|
+
Always respond with ONLY valid JSON (no markdown, no explanation outside the JSON):
|
|
38
|
+
|
|
39
|
+
```json
|
|
40
|
+
{
|
|
41
|
+
"findings": [
|
|
42
|
+
{
|
|
43
|
+
"file": "relative/path/to/file.ts",
|
|
44
|
+
"line": 42,
|
|
45
|
+
"severity": "high|medium|low",
|
|
46
|
+
"category": "security|correctness|performance|maintainability|reliability",
|
|
47
|
+
"message": "Brief, actionable description of the issue"
|
|
48
|
+
}
|
|
49
|
+
],
|
|
50
|
+
"score": 0.85,
|
|
51
|
+
"summary": "One-line overall verdict"
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Scoring Guide
|
|
56
|
+
|
|
57
|
+
- **1.0**: No issues found
|
|
58
|
+
- **0.9-0.99**: Only low-severity style/maintainability suggestions
|
|
59
|
+
- **0.8-0.89**: Medium findings but no blocking issues
|
|
60
|
+
- **0.7-0.79**: Has issues that should be addressed but aren't critical
|
|
61
|
+
- **Below 0.7**: Has high-severity issues that should block merge
|
|
@@ -0,0 +1,379 @@
|
|
|
1
|
+
# prism-eval-gate.yml — AI code quality gate using kiro-cli headless mode.
|
|
2
|
+
#
|
|
3
|
+
# Copy this file to .github/workflows/prism-eval-gate.yml in your repo.
|
|
4
|
+
#
|
|
5
|
+
# Required setup:
|
|
6
|
+
# - Kiro API key stored as repository secret: KIRO_API_KEY
|
|
7
|
+
# - .kiro/steering/code-review.md in your repo (review rules)
|
|
8
|
+
# - (Optional) PRISM_METRICS_ROLE_ARN for EventBridge metrics emission
|
|
9
|
+
# - (Optional) AWS Continuum configured for security scanning
|
|
10
|
+
|
|
11
|
+
name: PRISM Eval Gate
|
|
12
|
+
|
|
13
|
+
on:
|
|
14
|
+
pull_request:
|
|
15
|
+
types: [opened, synchronize, reopened]
|
|
16
|
+
branches: [main, master]
|
|
17
|
+
|
|
18
|
+
permissions:
|
|
19
|
+
id-token: write
|
|
20
|
+
contents: read
|
|
21
|
+
pull-requests: write
|
|
22
|
+
|
|
23
|
+
jobs:
|
|
24
|
+
eval-gate:
|
|
25
|
+
runs-on: ubuntu-latest
|
|
26
|
+
env:
|
|
27
|
+
# Secrets mapped to env so steps can gate on them (secrets context not allowed in `if`)
|
|
28
|
+
METRICS_ROLE_ARN: ${{ secrets.PRISM_METRICS_ROLE_ARN }}
|
|
29
|
+
HAS_KIRO_KEY: ${{ secrets.KIRO_API_KEY != '' && 'true' || 'false' }}
|
|
30
|
+
steps:
|
|
31
|
+
- name: Checkout
|
|
32
|
+
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
|
33
|
+
with:
|
|
34
|
+
fetch-depth: 0
|
|
35
|
+
|
|
36
|
+
- name: Install Kiro CLI
|
|
37
|
+
run: curl -fsSL https://cli.kiro.dev/install | bash
|
|
38
|
+
|
|
39
|
+
- name: Read team ID
|
|
40
|
+
id: prism-config
|
|
41
|
+
run: |
|
|
42
|
+
TEAM_ID=$(jq -r '.team_id // "no_team"' .prism/config.json 2>/dev/null || echo "no_team")
|
|
43
|
+
echo "team_id=${TEAM_ID}" >> "$GITHUB_OUTPUT"
|
|
44
|
+
|
|
45
|
+
- name: Identify AI-generated changes
|
|
46
|
+
id: detect-ai
|
|
47
|
+
env:
|
|
48
|
+
BASE_SHA: ${{ github.event.pull_request.base.sha }}
|
|
49
|
+
HEAD_SHA: ${{ github.sha }}
|
|
50
|
+
run: |
|
|
51
|
+
AI_FILES=""
|
|
52
|
+
for SHA in $(git rev-list "${BASE_SHA}..${HEAD_SHA}"); do
|
|
53
|
+
if git log -1 --format='%B' "${SHA}" | grep -q 'AI-Origin: ai-generated\|AI-Origin: ai-assisted'; then
|
|
54
|
+
FILES=$(git diff-tree --no-commit-id --name-only -r "${SHA}" \
|
|
55
|
+
| grep -E '\.(ts|js|py|go|java|rs|tsx|jsx)$' \
|
|
56
|
+
| grep -vE '\.test\.|\.spec\.|__test__|_test\.' || true)
|
|
57
|
+
AI_FILES="${AI_FILES} ${FILES}"
|
|
58
|
+
fi
|
|
59
|
+
done
|
|
60
|
+
|
|
61
|
+
UNIQUE_FILES=$(echo "${AI_FILES}" | tr ' ' '\n' | sort -u | grep -v '^$' | head -30)
|
|
62
|
+
FILE_COUNT=$(echo "${UNIQUE_FILES}" | grep -c . || echo "0")
|
|
63
|
+
|
|
64
|
+
if [ "${FILE_COUNT}" -eq 0 ]; then
|
|
65
|
+
echo "has_ai_changes=false" >> "$GITHUB_OUTPUT"
|
|
66
|
+
else
|
|
67
|
+
echo "has_ai_changes=true" >> "$GITHUB_OUTPUT"
|
|
68
|
+
echo "file_count=${FILE_COUNT}" >> "$GITHUB_OUTPUT"
|
|
69
|
+
echo "${UNIQUE_FILES}" > /tmp/ai-changed-files.txt
|
|
70
|
+
fi
|
|
71
|
+
|
|
72
|
+
- name: Kiro code quality review
|
|
73
|
+
id: review
|
|
74
|
+
if: steps.detect-ai.outputs.has_ai_changes == 'true'
|
|
75
|
+
env:
|
|
76
|
+
KIRO_API_KEY: ${{ secrets.KIRO_API_KEY }}
|
|
77
|
+
BASE_SHA: ${{ github.event.pull_request.base.sha }}
|
|
78
|
+
HEAD_SHA: ${{ github.sha }}
|
|
79
|
+
run: |
|
|
80
|
+
# Fork PRs don't receive secrets — report neutral, never silently pass
|
|
81
|
+
if [ "${HAS_KIRO_KEY}" != "true" ]; then
|
|
82
|
+
echo "::warning::KIRO_API_KEY unavailable (fork PR or missing secret) — review skipped"
|
|
83
|
+
echo "result=SKIPPED" >> "$GITHUB_OUTPUT"
|
|
84
|
+
exit 0
|
|
85
|
+
fi
|
|
86
|
+
|
|
87
|
+
FILES=$(cat /tmp/ai-changed-files.txt | tr '\n' ' ')
|
|
88
|
+
DIFF=$(git diff "${BASE_SHA}..${HEAD_SHA}" -- ${FILES})
|
|
89
|
+
|
|
90
|
+
# Find spec reference from commit trailers
|
|
91
|
+
SPEC_REF=$(git log "${BASE_SHA}..${HEAD_SHA}" --format='%(trailers:key=Spec-Ref,valueonly)' | head -1 | tr -d '[:space:]' || true)
|
|
92
|
+
SPEC_CONTEXT=""
|
|
93
|
+
if [ -n "${SPEC_REF}" ] && [ -f "${SPEC_REF}" ]; then
|
|
94
|
+
SPEC_CONTEXT="The spec for this work is at ${SPEC_REF}. Read it and verify the code implements all acceptance criteria."
|
|
95
|
+
fi
|
|
96
|
+
|
|
97
|
+
# Run kiro-cli in headless mode
|
|
98
|
+
REVIEW_OUTPUT=$(echo "${DIFF}" | kiro-cli chat --no-interactive \
|
|
99
|
+
--trust-tools=read,grep \
|
|
100
|
+
--model claude-haiku-4.5 \
|
|
101
|
+
"You are a code reviewer running in CI. Review this PR diff for code quality issues.
|
|
102
|
+
|
|
103
|
+
Changed files: ${FILES}
|
|
104
|
+
|
|
105
|
+
${SPEC_CONTEXT}
|
|
106
|
+
|
|
107
|
+
Read the actual source files for full context (imports, related functions, tests).
|
|
108
|
+
Follow the review rules in .kiro/steering/code-review.md if it exists.
|
|
109
|
+
|
|
110
|
+
Focus on: correctness bugs, missing error handling, injection risks, performance anti-patterns, type safety violations, and hallucinated imports/APIs that don't exist.
|
|
111
|
+
|
|
112
|
+
Output ONLY valid JSON on a single line (no markdown fencing, no explanation):
|
|
113
|
+
{\"findings\":[{\"file\":\"path\",\"line\":1,\"severity\":\"high|medium|low\",\"category\":\"security|correctness|performance|maintainability|reliability\",\"message\":\"description\"}],\"score\":0.0,\"summary\":\"one line\"}" 2>/dev/null) || true
|
|
114
|
+
|
|
115
|
+
# Strip ANSI escapes, join lines, extract the last JSON object
|
|
116
|
+
CLEANED=$(echo "${REVIEW_OUTPUT}" | sed 's/\x1b\[[0-9;?]*[a-zA-Z]//g' | tr -d '\r')
|
|
117
|
+
REVIEW_JSON=$(echo "${CLEANED}" | tr '\n' ' ' | grep -o '{.*}' || true)
|
|
118
|
+
|
|
119
|
+
if [ -z "${REVIEW_JSON}" ] || ! echo "${REVIEW_JSON}" | jq -e '.score' > /dev/null 2>&1; then
|
|
120
|
+
# FAIL CLOSED: a gate that can't evaluate must not pass
|
|
121
|
+
echo "::error::Could not parse kiro-cli review output — failing closed"
|
|
122
|
+
echo "result=ERROR" >> "$GITHUB_OUTPUT"
|
|
123
|
+
exit 0
|
|
124
|
+
fi
|
|
125
|
+
|
|
126
|
+
SCORE=$(echo "${REVIEW_JSON}" | jq -r '.score')
|
|
127
|
+
FINDINGS=$(echo "${REVIEW_JSON}" | jq '.findings | length')
|
|
128
|
+
HIGH=$(echo "${REVIEW_JSON}" | jq '[.findings[] | select(.severity=="high")] | length')
|
|
129
|
+
MEDIUM=$(echo "${REVIEW_JSON}" | jq '[.findings[] | select(.severity=="medium")] | length')
|
|
130
|
+
# Single line, quotes stripped — safe for GITHUB_OUTPUT and downstream env use
|
|
131
|
+
SUMMARY=$(echo "${REVIEW_JSON}" | jq -r '.summary // "No summary"' | head -1 | tr -d '"`'"'" | cut -c1-200)
|
|
132
|
+
|
|
133
|
+
echo "score=${SCORE}" >> "$GITHUB_OUTPUT"
|
|
134
|
+
echo "findings=${FINDINGS}" >> "$GITHUB_OUTPUT"
|
|
135
|
+
echo "high=${HIGH}" >> "$GITHUB_OUTPUT"
|
|
136
|
+
echo "medium=${MEDIUM}" >> "$GITHUB_OUTPUT"
|
|
137
|
+
echo "summary=${SUMMARY}" >> "$GITHUB_OUTPUT"
|
|
138
|
+
echo "${REVIEW_JSON}" > /tmp/kiro-review.json
|
|
139
|
+
|
|
140
|
+
# Determine pass/fail (awk instead of bc — no extra package needed)
|
|
141
|
+
PASS=$(awk -v s="${SCORE}" 'BEGIN { print (s >= 0.82) ? "true" : "false" }')
|
|
142
|
+
if [ "${HIGH}" -gt 0 ] || [ "${PASS}" != "true" ]; then
|
|
143
|
+
echo "result=FAIL" >> "$GITHUB_OUTPUT"
|
|
144
|
+
else
|
|
145
|
+
echo "result=PASS" >> "$GITHUB_OUTPUT"
|
|
146
|
+
fi
|
|
147
|
+
|
|
148
|
+
- name: Post PR comment
|
|
149
|
+
if: always()
|
|
150
|
+
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
|
|
151
|
+
env:
|
|
152
|
+
HAS_AI: ${{ steps.detect-ai.outputs.has_ai_changes }}
|
|
153
|
+
REVIEW_SCORE: ${{ steps.review.outputs.score }}
|
|
154
|
+
REVIEW_FINDINGS: ${{ steps.review.outputs.findings }}
|
|
155
|
+
REVIEW_HIGH: ${{ steps.review.outputs.high }}
|
|
156
|
+
REVIEW_MEDIUM: ${{ steps.review.outputs.medium }}
|
|
157
|
+
REVIEW_RESULT: ${{ steps.review.outputs.result }}
|
|
158
|
+
REVIEW_SUMMARY: ${{ steps.review.outputs.summary }}
|
|
159
|
+
with:
|
|
160
|
+
script: |
|
|
161
|
+
const fs = require('fs');
|
|
162
|
+
// All values read from env — never interpolate ${{ }} into script source
|
|
163
|
+
// (LLM-generated text could contain quotes/backticks = script injection)
|
|
164
|
+
const hasAI = process.env.HAS_AI === 'true';
|
|
165
|
+
|
|
166
|
+
let body;
|
|
167
|
+
if (!hasAI) {
|
|
168
|
+
body = '✅ **PRISM Eval Gate** — No AI-generated code detected. Skipped.';
|
|
169
|
+
} else {
|
|
170
|
+
const result = process.env.REVIEW_RESULT || 'ERROR';
|
|
171
|
+
if (result === 'SKIPPED') {
|
|
172
|
+
body = '⚠️ **PRISM Eval Gate** — Review unavailable (no API key on fork PRs). A maintainer must review manually.';
|
|
173
|
+
} else if (result === 'ERROR') {
|
|
174
|
+
body = '❌ **PRISM Eval Gate** — Review output could not be parsed. Failing closed; re-run the workflow or review manually.';
|
|
175
|
+
} else {
|
|
176
|
+
const score = process.env.REVIEW_SCORE || '?';
|
|
177
|
+
const findings = process.env.REVIEW_FINDINGS || '0';
|
|
178
|
+
const high = process.env.REVIEW_HIGH || '0';
|
|
179
|
+
const medium = process.env.REVIEW_MEDIUM || '0';
|
|
180
|
+
// Sanitize LLM text before embedding in markdown
|
|
181
|
+
const summary = (process.env.REVIEW_SUMMARY || 'No summary').replace(/[<>|]/g, ' ');
|
|
182
|
+
const emoji = result === 'PASS' ? '✅' : '❌';
|
|
183
|
+
|
|
184
|
+
let table = '';
|
|
185
|
+
try {
|
|
186
|
+
const review = JSON.parse(fs.readFileSync('/tmp/kiro-review.json', 'utf8'));
|
|
187
|
+
if (review.findings && review.findings.length > 0) {
|
|
188
|
+
const clean = (s) => String(s ?? '-').replace(/[|<>`]/g, ' ').slice(0, 200);
|
|
189
|
+
table = review.findings
|
|
190
|
+
.map(f => `| \`${clean(f.file)}\` | ${Number(f.line) || '-'} | ${clean(f.severity)} | ${clean(f.category)} | ${clean(f.message)} |`)
|
|
191
|
+
.join('\n');
|
|
192
|
+
}
|
|
193
|
+
} catch(e) { /* no detail available */ }
|
|
194
|
+
|
|
195
|
+
body = `## ${emoji} PRISM Eval Gate — ${result}\n\n` +
|
|
196
|
+
`**Score**: ${score} | **Findings**: ${findings} (${high} high, ${medium} medium)\n\n` +
|
|
197
|
+
`**Summary**: ${summary}\n\n`;
|
|
198
|
+
|
|
199
|
+
if (table) {
|
|
200
|
+
body += `| File | Line | Severity | Category | Issue |\n|---|---|---|---|---|\n${table}\n\n`;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
body += `> Powered by kiro-cli headless • Model: claude-haiku-4.5 • Threshold: 0.82`;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
const { data: comments } = await github.rest.issues.listComments({
|
|
208
|
+
owner: context.repo.owner, repo: context.repo.repo,
|
|
209
|
+
issue_number: context.issue.number
|
|
210
|
+
});
|
|
211
|
+
const existing = comments.find(c => c.body.includes('PRISM Eval Gate'));
|
|
212
|
+
const params = { owner: context.repo.owner, repo: context.repo.repo, body };
|
|
213
|
+
|
|
214
|
+
if (existing) {
|
|
215
|
+
await github.rest.issues.updateComment({ ...params, comment_id: existing.id });
|
|
216
|
+
} else {
|
|
217
|
+
await github.rest.issues.createComment({ ...params, issue_number: context.issue.number });
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
- name: Configure AWS credentials (OIDC) — for metrics + security scan
|
|
221
|
+
id: aws-creds
|
|
222
|
+
if: steps.detect-ai.outputs.has_ai_changes == 'true' && env.METRICS_ROLE_ARN != ''
|
|
223
|
+
uses: aws-actions/configure-aws-credentials@b47578312673ae6fa5b5096b330d9fbac3d116df # v4.2.1
|
|
224
|
+
with:
|
|
225
|
+
role-to-assume: ${{ env.METRICS_ROLE_ARN }}
|
|
226
|
+
aws-region: us-west-2
|
|
227
|
+
continue-on-error: true
|
|
228
|
+
|
|
229
|
+
- name: Emit prism.d1.eval event
|
|
230
|
+
if: steps.detect-ai.outputs.has_ai_changes == 'true' && steps.aws-creds.outcome == 'success'
|
|
231
|
+
env:
|
|
232
|
+
AWS_REGION: us-west-2
|
|
233
|
+
TEAM_ID: ${{ steps.prism-config.outputs.team_id }}
|
|
234
|
+
REPO: ${{ github.repository }}
|
|
235
|
+
REVIEW_SCORE: ${{ steps.review.outputs.score }}
|
|
236
|
+
REVIEW_RESULT: ${{ steps.review.outputs.result }}
|
|
237
|
+
REVIEW_FINDINGS: ${{ steps.review.outputs.findings }}
|
|
238
|
+
REVIEW_HIGH: ${{ steps.review.outputs.high }}
|
|
239
|
+
PR_NUMBER: ${{ github.event.pull_request.number }}
|
|
240
|
+
run: |
|
|
241
|
+
# Only emit when we have a real score (not SKIPPED/ERROR)
|
|
242
|
+
if [ -z "${REVIEW_SCORE}" ]; then
|
|
243
|
+
echo "No score to emit (result: ${REVIEW_RESULT:-none})"
|
|
244
|
+
exit 0
|
|
245
|
+
fi
|
|
246
|
+
TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
|
|
247
|
+
DETAIL=$(jq -n -c \
|
|
248
|
+
--arg team_id "${TEAM_ID}" \
|
|
249
|
+
--arg repo "${REPO}" \
|
|
250
|
+
--arg timestamp "${TIMESTAMP}" \
|
|
251
|
+
--arg score "${REVIEW_SCORE}" \
|
|
252
|
+
--arg result "${REVIEW_RESULT}" \
|
|
253
|
+
--arg findings "${REVIEW_FINDINGS:-0}" \
|
|
254
|
+
--arg high "${REVIEW_HIGH:-0}" \
|
|
255
|
+
--arg pr_number "${PR_NUMBER}" \
|
|
256
|
+
'{team_id:$team_id,repo:$repo,timestamp:$timestamp,prism_level:2,
|
|
257
|
+
metric:{name:"eval_score",value:($score|tonumber),unit:"score"},
|
|
258
|
+
ai_context:{tool:"kiro-cli",model:"claude-haiku-4.5",origin:"ai-generated"},
|
|
259
|
+
eval:{score:($score|tonumber),result:$result,rubric:"kiro-headless",
|
|
260
|
+
findings:($findings|tonumber),high_findings:($high|tonumber),
|
|
261
|
+
pr_number:($pr_number|tonumber),method:"kiro-headless"}}')
|
|
262
|
+
aws events put-events --region us-west-2 --entries \
|
|
263
|
+
"[{\"Source\":\"prism.d1.velocity\",\"DetailType\":\"prism.d1.eval\",\"EventBusName\":\"prism-d1-metrics\",\"Detail\":$(echo "${DETAIL}" | jq -Rs '.')}]" || true
|
|
264
|
+
|
|
265
|
+
- name: AWS Continuum security scan (Tier 2 — deterministic)
|
|
266
|
+
id: security-gate
|
|
267
|
+
if: steps.detect-ai.outputs.has_ai_changes == 'true' && steps.aws-creds.outcome == 'success'
|
|
268
|
+
env:
|
|
269
|
+
AWS_REGION: us-west-2
|
|
270
|
+
BASE_SHA: ${{ github.event.pull_request.base.sha }}
|
|
271
|
+
HEAD_SHA: ${{ github.sha }}
|
|
272
|
+
REPO: ${{ github.repository }}
|
|
273
|
+
PR_NUMBER: ${{ github.event.pull_request.number }}
|
|
274
|
+
run: |
|
|
275
|
+
# Pre-flight: verify the specific subcommand exists (AWS CLI v2.36+)
|
|
276
|
+
if ! aws securityagent start-code-review-job help > /dev/null 2>&1; then
|
|
277
|
+
echo "::warning::AWS CLI lacks securityagent code review commands (need v2.36+). Skipping scan."
|
|
278
|
+
echo "findings=0" >> "$GITHUB_OUTPUT"
|
|
279
|
+
echo "skipped=true" >> "$GITHUB_OUTPUT"
|
|
280
|
+
exit 0
|
|
281
|
+
fi
|
|
282
|
+
|
|
283
|
+
AGENT_SPACE_ID=$(aws ssm get-parameter --name /prism/continuum/agent-space-id --query Parameter.Value --output text 2>/dev/null || echo "")
|
|
284
|
+
SCAN_BUCKET=$(aws ssm get-parameter --name /prism/continuum/scan-bucket --query Parameter.Value --output text 2>/dev/null || echo "")
|
|
285
|
+
|
|
286
|
+
if [ -z "$AGENT_SPACE_ID" ] || [ -z "$SCAN_BUCKET" ]; then
|
|
287
|
+
echo "AWS Continuum not configured (SSM params missing). Skipping security scan."
|
|
288
|
+
echo "findings=0" >> "$GITHUB_OUTPUT"
|
|
289
|
+
echo "skipped=true" >> "$GITHUB_OUTPUT"
|
|
290
|
+
exit 0
|
|
291
|
+
fi
|
|
292
|
+
|
|
293
|
+
REPO_SLUG=$(echo "${REPO}" | tr '/' '-')
|
|
294
|
+
CODE_REVIEW_ID=$(aws ssm get-parameter --name "/prism/continuum/code-review-id/${REPO_SLUG}" --query Parameter.Value --output text 2>/dev/null || echo "")
|
|
295
|
+
if [ -z "$CODE_REVIEW_ID" ]; then
|
|
296
|
+
echo "::warning::No Code Review resource for ${REPO_SLUG} — run 'prism-cli securityagent setup' first. Skipping."
|
|
297
|
+
echo "findings=0" >> "$GITHUB_OUTPUT"
|
|
298
|
+
echo "skipped=true" >> "$GITHUB_OUTPUT"
|
|
299
|
+
exit 0
|
|
300
|
+
fi
|
|
301
|
+
|
|
302
|
+
# Diff must be uploaded with .patch extension (API requirement)
|
|
303
|
+
git diff "${BASE_SHA}..${HEAD_SHA}" > /tmp/changes.patch
|
|
304
|
+
if [ ! -s /tmp/changes.patch ]; then
|
|
305
|
+
echo "findings=0" >> "$GITHUB_OUTPUT"
|
|
306
|
+
exit 0
|
|
307
|
+
fi
|
|
308
|
+
DIFF_KEY="diffs/${REPO_SLUG}/${PR_NUMBER}/${HEAD_SHA}.patch"
|
|
309
|
+
aws s3 cp /tmp/changes.patch "s3://${SCAN_BUCKET}/${DIFF_KEY}" --quiet
|
|
310
|
+
|
|
311
|
+
JOB_ID=$(aws securityagent start-code-review-job \
|
|
312
|
+
--agent-space-id "${AGENT_SPACE_ID}" \
|
|
313
|
+
--code-review-id "${CODE_REVIEW_ID}" \
|
|
314
|
+
--diff-source "{\"s3Uri\":\"s3://${SCAN_BUCKET}/${DIFF_KEY}\"}" \
|
|
315
|
+
--query 'codeReviewJobId' --output text)
|
|
316
|
+
echo "Continuum job started: ${JOB_ID}"
|
|
317
|
+
|
|
318
|
+
STATUS="UNKNOWN"
|
|
319
|
+
for i in $(seq 1 30); do
|
|
320
|
+
sleep 30
|
|
321
|
+
STATUS=$(aws securityagent batch-get-code-review-jobs \
|
|
322
|
+
--agent-space-id "${AGENT_SPACE_ID}" \
|
|
323
|
+
--code-review-job-ids "${JOB_ID}" \
|
|
324
|
+
--query 'codeReviewJobs[0].status' --output text 2>/dev/null || echo "UNKNOWN")
|
|
325
|
+
echo " Poll ${i}/30: ${STATUS}"
|
|
326
|
+
case "$STATUS" in COMPLETED|FAILED|STOPPED) break ;; esac
|
|
327
|
+
done
|
|
328
|
+
|
|
329
|
+
if [ "$STATUS" != "COMPLETED" ]; then
|
|
330
|
+
echo "::warning::Continuum scan did not complete (status: ${STATUS}) — treating as skipped"
|
|
331
|
+
echo "findings=0" >> "$GITHUB_OUTPUT"
|
|
332
|
+
echo "skipped=true" >> "$GITHUB_OUTPUT"
|
|
333
|
+
exit 0
|
|
334
|
+
fi
|
|
335
|
+
|
|
336
|
+
# NOTE: list-findings takes agent-space-id + code-review-job-id only.
|
|
337
|
+
# Response field is 'findingsSummaries', risk field is 'riskLevel'.
|
|
338
|
+
FINDINGS_JSON=$(aws securityagent list-findings \
|
|
339
|
+
--agent-space-id "${AGENT_SPACE_ID}" \
|
|
340
|
+
--code-review-job-id "${JOB_ID}" \
|
|
341
|
+
--output json 2>/dev/null || echo '{"findingsSummaries":[]}')
|
|
342
|
+
|
|
343
|
+
TOTAL=$(echo "$FINDINGS_JSON" | jq '.findingsSummaries | length')
|
|
344
|
+
CRITICAL=$(echo "$FINDINGS_JSON" | jq '[.findingsSummaries[] | select(.riskLevel == "CRITICAL")] | length')
|
|
345
|
+
HIGH=$(echo "$FINDINGS_JSON" | jq '[.findingsSummaries[] | select(.riskLevel == "HIGH")] | length')
|
|
346
|
+
|
|
347
|
+
echo "Continuum findings: ${TOTAL} total (${CRITICAL} critical, ${HIGH} high)"
|
|
348
|
+
echo "findings=${TOTAL}" >> "$GITHUB_OUTPUT"
|
|
349
|
+
echo "critical=${CRITICAL}" >> "$GITHUB_OUTPUT"
|
|
350
|
+
echo "high=${HIGH}" >> "$GITHUB_OUTPUT"
|
|
351
|
+
|
|
352
|
+
if [ "$TOTAL" -gt 0 ]; then
|
|
353
|
+
echo "$FINDINGS_JSON" | jq -r '.findingsSummaries[] | "::warning::[\(.riskLevel)] \(.name)"'
|
|
354
|
+
fi
|
|
355
|
+
|
|
356
|
+
- name: Fail on eval gate failure
|
|
357
|
+
if: >-
|
|
358
|
+
steps.review.outputs.result == 'FAIL' ||
|
|
359
|
+
steps.review.outputs.result == 'ERROR' ||
|
|
360
|
+
(steps.security-gate.outputs.skipped != 'true' &&
|
|
361
|
+
(steps.security-gate.outputs.critical > 0 || steps.security-gate.outputs.high > 0))
|
|
362
|
+
env:
|
|
363
|
+
REVIEW_RESULT: ${{ steps.review.outputs.result }}
|
|
364
|
+
REVIEW_HIGH: ${{ steps.review.outputs.high }}
|
|
365
|
+
REVIEW_SCORE: ${{ steps.review.outputs.score }}
|
|
366
|
+
REVIEW_SUMMARY: ${{ steps.review.outputs.summary }}
|
|
367
|
+
SEC_CRITICAL: ${{ steps.security-gate.outputs.critical }}
|
|
368
|
+
SEC_HIGH: ${{ steps.security-gate.outputs.high }}
|
|
369
|
+
run: |
|
|
370
|
+
if [ "${REVIEW_RESULT}" = "ERROR" ]; then
|
|
371
|
+
echo "❌ Eval gate failed closed: review output could not be parsed"
|
|
372
|
+
elif [ "${REVIEW_RESULT}" = "FAIL" ]; then
|
|
373
|
+
echo "❌ Kiro found ${REVIEW_HIGH:-?} high-severity issues (score: ${REVIEW_SCORE:-?})"
|
|
374
|
+
echo "Summary: ${REVIEW_SUMMARY}"
|
|
375
|
+
fi
|
|
376
|
+
if [ "${SEC_CRITICAL:-0}" -gt 0 ] || [ "${SEC_HIGH:-0}" -gt 0 ]; then
|
|
377
|
+
echo "❌ Continuum found ${SEC_CRITICAL:-0} critical, ${SEC_HIGH:-0} high security findings"
|
|
378
|
+
fi
|
|
379
|
+
exit 1
|
|
@@ -222,14 +222,27 @@ jobs:
|
|
|
222
222
|
\"EventBusName\":\"prism-d1-metrics\",
|
|
223
223
|
\"Detail\":$(echo "${EVAL_EVENT}" | jq -c '.' | jq -Rs '.')}]"
|
|
224
224
|
|
|
225
|
+
- name: Upgrade AWS CLI v2 (securityagent code review requires v2.35+)
|
|
226
|
+
run: |
|
|
227
|
+
curl -fsSL "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o /tmp/awscliv2.zip
|
|
228
|
+
curl -fsSL "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip.sha256" -o /tmp/awscliv2.zip.sha256
|
|
229
|
+
cd /tmp && sha256sum -c awscliv2.zip.sha256
|
|
230
|
+
unzip -qo /tmp/awscliv2.zip -d /tmp
|
|
231
|
+
sudo /tmp/aws/install --update --install-dir /usr/local/aws-cli --bin-dir /usr/local/bin 2>/dev/null || \
|
|
232
|
+
sudo /tmp/aws/install --install-dir /usr/local/aws-cli --bin-dir /usr/local/bin 2>/dev/null || true
|
|
233
|
+
rm -rf /tmp/aws /tmp/awscliv2.zip /tmp/awscliv2.zip.sha256
|
|
234
|
+
hash -r
|
|
235
|
+
echo "AWS CLI: $(aws --version)"
|
|
236
|
+
echo "Has create-code-review: $(aws securityagent create-code-review help 2>&1 | head -1)"
|
|
237
|
+
|
|
225
238
|
- name: AWS Continuum diff scan
|
|
226
239
|
id: security-gate
|
|
227
240
|
env:
|
|
228
241
|
AWS_REGION: us-west-2
|
|
229
242
|
run: |
|
|
230
243
|
# Pre-flight: verify AWS CLI has securityagent subcommand
|
|
231
|
-
if ! aws securityagent help > /dev/null 2>&1; then
|
|
232
|
-
echo "::warning::AWS CLI does not support 'securityagent' commands
|
|
244
|
+
if ! aws securityagent start-code-review-job help > /dev/null 2>&1; then
|
|
245
|
+
echo "::warning::AWS CLI does not support 'securityagent code review' commands after upgrade. Skipping scan."
|
|
233
246
|
echo "findings=0" >> "$GITHUB_OUTPUT"
|
|
234
247
|
echo "skipped=true" >> "$GITHUB_OUTPUT"
|
|
235
248
|
exit 0
|
|
@@ -259,47 +272,52 @@ jobs:
|
|
|
259
272
|
# Derive repo slug for per-repo SSM key (org/repo → org-repo)
|
|
260
273
|
REPO_SLUG=$(echo "${{ github.repository }}" | tr '/' '-')
|
|
261
274
|
|
|
262
|
-
echo "::group::Resolve
|
|
275
|
+
echo "::group::Resolve Code Review for ${REPO_SLUG}"
|
|
263
276
|
CODE_REVIEW_ID=$(aws ssm get-parameter --name "/prism/continuum/code-review-id/${REPO_SLUG}" --query Parameter.Value --output text 2>/dev/null || echo "")
|
|
264
277
|
|
|
265
278
|
if [[ -z "$CODE_REVIEW_ID" ]]; then
|
|
266
|
-
echo " No Code Review found for ${REPO_SLUG}
|
|
279
|
+
echo " No Code Review found for ${REPO_SLUG} -- bootstrapping..."
|
|
280
|
+
echo " CLI version: $(aws --version 2>&1 | head -1)"
|
|
281
|
+
echo " CLI path: $(which aws)"
|
|
267
282
|
|
|
268
|
-
# Upload repo ZIP as context for the
|
|
283
|
+
# Upload repo ZIP first (required as source context for the CodeReview)
|
|
269
284
|
git archive HEAD --format=zip -o /tmp/repo.zip
|
|
270
285
|
aws s3 cp /tmp/repo.zip "s3://${SCAN_BUCKET}/repo/${REPO_SLUG}/latest.zip" --quiet
|
|
271
286
|
|
|
272
|
-
# Create
|
|
273
|
-
|
|
274
|
-
--agent-space-id "$
|
|
287
|
+
# Create the CodeReview
|
|
288
|
+
CR_OUTPUT=$(aws securityagent create-code-review \
|
|
289
|
+
--agent-space-id "$AGENT_SPACE_ID" \
|
|
275
290
|
--title "${REPO_SLUG}-ci-diff-scan" \
|
|
276
|
-
--service-role "$
|
|
291
|
+
--service-role "$SERVICE_ROLE" \
|
|
277
292
|
--assets "{\"sourceCode\":[{\"s3Location\":\"s3://${SCAN_BUCKET}/repo/${REPO_SLUG}/latest.zip\"}]}" \
|
|
278
|
-
--output json 2>&1)
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
echo "
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
--name "/prism/continuum/code-review-id/${REPO_SLUG}" \
|
|
287
|
-
--value "${CODE_REVIEW_ID}" \
|
|
288
|
-
--type String --overwrite 2>/dev/null || true
|
|
289
|
-
else
|
|
290
|
-
echo " ⚠️ Failed to create Code Review: ${CR_RESPONSE}"
|
|
291
|
-
echo " Skipping scan (non-blocking)."
|
|
293
|
+
--output json 2>&1) || true
|
|
294
|
+
CODE_REVIEW_ID=$(echo "$CR_OUTPUT" | jq -r '.codeReviewId // empty' 2>/dev/null)
|
|
295
|
+
|
|
296
|
+
if [[ -z "$CODE_REVIEW_ID" ]]; then
|
|
297
|
+
echo " ⚠️ Bootstrap failed:"
|
|
298
|
+
echo " $CR_OUTPUT"
|
|
299
|
+
echo " Run 'sudo prism-cli securityagent setup' from your DevBox to create manually."
|
|
300
|
+
echo " Skipping security scan (non-blocking)."
|
|
292
301
|
echo "findings=0" >> "$GITHUB_OUTPUT"
|
|
293
302
|
echo "skipped=true" >> "$GITHUB_OUTPUT"
|
|
294
303
|
exit 0
|
|
295
304
|
fi
|
|
296
|
-
else
|
|
297
|
-
echo " Using existing Code Review: ${CODE_REVIEW_ID}"
|
|
298
305
|
|
|
299
|
-
#
|
|
300
|
-
|
|
301
|
-
|
|
306
|
+
# Persist for future runs
|
|
307
|
+
aws ssm put-parameter \
|
|
308
|
+
--name "/prism/continuum/code-review-id/${REPO_SLUG}" \
|
|
309
|
+
--value "$CODE_REVIEW_ID" \
|
|
310
|
+
--type String --overwrite > /dev/null
|
|
311
|
+
|
|
312
|
+
echo " [x] Code Review created: ${CODE_REVIEW_ID}"
|
|
313
|
+
echo " [x] Saved to SSM"
|
|
302
314
|
fi
|
|
315
|
+
|
|
316
|
+
echo " Using Code Review: ${CODE_REVIEW_ID}"
|
|
317
|
+
|
|
318
|
+
# Upload fresh repo ZIP (context for accurate cross-module analysis)
|
|
319
|
+
git archive HEAD --format=zip -o /tmp/repo.zip
|
|
320
|
+
aws s3 cp /tmp/repo.zip "s3://${SCAN_BUCKET}/repo/${REPO_SLUG}/latest.zip" --quiet
|
|
303
321
|
echo "::endgroup::"
|
|
304
322
|
|
|
305
323
|
echo "::group::Generate and upload diff"
|
|
@@ -329,15 +347,15 @@ jobs:
|
|
|
329
347
|
echo "Job started: ${JOB_ID}"
|
|
330
348
|
echo "::endgroup::"
|
|
331
349
|
|
|
332
|
-
echo "::group::Poll for completion (timeout:
|
|
333
|
-
for i in $(seq 1
|
|
350
|
+
echo "::group::Poll for completion (timeout: 30 min)"
|
|
351
|
+
for i in $(seq 1 60); do
|
|
334
352
|
sleep 30
|
|
335
353
|
STATUS=$(aws securityagent batch-get-code-review-jobs \
|
|
336
354
|
--agent-space-id "${AGENT_SPACE_ID}" \
|
|
337
355
|
--code-review-job-ids "${JOB_ID}" \
|
|
338
356
|
--query 'codeReviewJobs[0].status' --output text 2>/dev/null || echo "UNKNOWN")
|
|
339
357
|
|
|
340
|
-
echo " Poll ${i}/
|
|
358
|
+
echo " Poll ${i}/60: ${STATUS}"
|
|
341
359
|
if [[ "$STATUS" == "COMPLETED" || "$STATUS" == "FAILED" || "$STATUS" == "STOPPED" ]]; then
|
|
342
360
|
break
|
|
343
361
|
fi
|
|
@@ -345,14 +363,16 @@ jobs:
|
|
|
345
363
|
echo "::endgroup::"
|
|
346
364
|
|
|
347
365
|
if [[ "$STATUS" == "FAILED" ]]; then
|
|
348
|
-
echo "::warning::Continuum scan failed —
|
|
349
|
-
echo "
|
|
366
|
+
echo "::warning::Continuum scan failed — check Security Agent logs"
|
|
367
|
+
echo "scan_error=true" >> "$GITHUB_OUTPUT"
|
|
368
|
+
echo "findings=-1" >> "$GITHUB_OUTPUT"
|
|
350
369
|
exit 0
|
|
351
370
|
fi
|
|
352
371
|
|
|
353
372
|
if [[ "$STATUS" != "COMPLETED" ]]; then
|
|
354
|
-
echo "::warning::Continuum scan timed out (status: ${STATUS})
|
|
355
|
-
echo "
|
|
373
|
+
echo "::warning::Continuum scan timed out (status: ${STATUS})"
|
|
374
|
+
echo "scan_error=true" >> "$GITHUB_OUTPUT"
|
|
375
|
+
echo "findings=-1" >> "$GITHUB_OUTPUT"
|
|
356
376
|
exit 0
|
|
357
377
|
fi
|
|
358
378
|
|
|
@@ -424,7 +444,10 @@ jobs:
|
|
|
424
444
|
if: steps.eval.outputs.overall_result == 'FAIL' || (steps.security-gate.outputs.findings != '0' && steps.security-gate.outputs.skipped != 'true')
|
|
425
445
|
run: |
|
|
426
446
|
[[ "${{ steps.eval.outputs.overall_result }}" == "FAIL" ]] && echo "❌ Eval gate failed"
|
|
427
|
-
if [[ "${{ steps.security-gate.outputs.
|
|
447
|
+
if [[ "${{ steps.security-gate.outputs.scan_error }}" == "true" ]]; then
|
|
448
|
+
echo "⚠️ AWS Continuum scan encountered an error (did not complete successfully)"
|
|
449
|
+
echo " The security gate cannot verify this PR is safe. Re-run the workflow or check Security Agent logs."
|
|
450
|
+
elif [[ "${{ steps.security-gate.outputs.findings }}" != "0" && "${{ steps.security-gate.outputs.skipped }}" != "true" ]]; then
|
|
428
451
|
echo "❌ AWS Continuum found ${{ steps.security-gate.outputs.findings }} security issues (${{ steps.security-gate.outputs.critical }} critical, ${{ steps.security-gate.outputs.high }} high)"
|
|
429
452
|
fi
|
|
430
453
|
exit 1
|
|
@@ -486,6 +486,12 @@ export class MetricsPipelineStack extends cdk.Stack {
|
|
|
486
486
|
this.securityAgent.scanBucket.arnForObjects('*'),
|
|
487
487
|
],
|
|
488
488
|
}),
|
|
489
|
+
new iam.PolicyStatement({
|
|
490
|
+
sid: 'KMSForScanBucket',
|
|
491
|
+
effect: iam.Effect.ALLOW,
|
|
492
|
+
actions: ['kms:Encrypt', 'kms:Decrypt', 'kms:GenerateDataKey*', 'kms:DescribeKey'],
|
|
493
|
+
resources: [prismKmsKey.keyArn],
|
|
494
|
+
}),
|
|
489
495
|
new iam.PolicyStatement({
|
|
490
496
|
sid: 'SSMReadConfig',
|
|
491
497
|
effect: iam.Effect.ALLOW,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install-eval-harness.d.ts","sourceRoot":"","sources":["../../../../src/commands/bootstrapper/install-eval-harness.ts"],"names":[],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"install-eval-harness.d.ts","sourceRoot":"","sources":["../../../../src/commands/bootstrapper/install-eval-harness.ts"],"names":[],"mappings":";;;;;;iBAyBqB;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE;;AATtH,wBAmCE"}
|
|
@@ -14,10 +14,11 @@ function prompt(question, defaultValue) {
|
|
|
14
14
|
export default {
|
|
15
15
|
description: 'Install eval harness (script + config + optional rubrics)',
|
|
16
16
|
options: [
|
|
17
|
-
{ flags: '--
|
|
18
|
-
{ flags: '--
|
|
17
|
+
{ flags: '--mode <mode>', description: 'Eval mode: "kiro" (recommended, headless kiro-cli) or "bedrock" (legacy run-eval.sh)' },
|
|
18
|
+
{ flags: '--with-rubrics', description: 'Include production rubrics (bedrock mode only)' },
|
|
19
|
+
{ flags: '--model <id>', description: 'Bedrock model ID for evaluation (bedrock mode only)' },
|
|
19
20
|
{ flags: '--threshold <n>', description: 'Pass threshold (0-1)' },
|
|
20
|
-
{ flags: '--uninstall', description: 'Remove eval-harness directory' },
|
|
21
|
+
{ flags: '--uninstall', description: 'Remove eval-harness directory and steering files' },
|
|
21
22
|
],
|
|
22
23
|
async action(opts) {
|
|
23
24
|
const gitRoot = execSync('git rev-parse --show-toplevel', { encoding: 'utf8' }).trim();
|
|
@@ -27,74 +28,139 @@ export default {
|
|
|
27
28
|
execSync(`rm -rf "${targetDir}"`);
|
|
28
29
|
console.log('✓ Removed .prism/eval-harness/');
|
|
29
30
|
}
|
|
30
|
-
|
|
31
|
-
|
|
31
|
+
const steeringFile = resolve(gitRoot, '.kiro/steering/code-review.md');
|
|
32
|
+
if (existsSync(steeringFile)) {
|
|
33
|
+
execSync(`rm -f "${steeringFile}"`);
|
|
34
|
+
console.log('✓ Removed .kiro/steering/code-review.md');
|
|
32
35
|
}
|
|
33
36
|
return;
|
|
34
37
|
}
|
|
35
|
-
//
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
38
|
+
// Determine mode
|
|
39
|
+
const mode = opts.mode || await prompt('Eval mode (kiro = recommended, bedrock = legacy)', 'kiro');
|
|
40
|
+
if (mode === 'kiro') {
|
|
41
|
+
await installKiroMode(gitRoot, opts);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
await installBedrockMode(gitRoot, targetDir, opts);
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
async function installKiroMode(gitRoot, opts) {
|
|
49
|
+
// --- Install steering file ---
|
|
50
|
+
const steeringDir = resolve(gitRoot, '.kiro/steering');
|
|
51
|
+
mkdirSync(steeringDir, { recursive: true });
|
|
52
|
+
const steeringSrc = resolve(EVAL_SOURCE, 'steering/code-review.md');
|
|
53
|
+
const steeringDest = resolve(steeringDir, 'code-review.md');
|
|
54
|
+
if (existsSync(steeringDest)) {
|
|
55
|
+
const overwrite = await prompt('Steering file already exists. Overwrite? [y/N]', 'n');
|
|
56
|
+
if (overwrite.toLowerCase() !== 'y') {
|
|
57
|
+
console.log(' Kept existing .kiro/steering/code-review.md');
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
copyFileSync(steeringSrc, steeringDest);
|
|
61
|
+
console.log('✓ Updated .kiro/steering/code-review.md');
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
copyFileSync(steeringSrc, steeringDest);
|
|
66
|
+
console.log('✓ Installed .kiro/steering/code-review.md');
|
|
67
|
+
}
|
|
68
|
+
// --- Install workflow ---
|
|
69
|
+
const workflowsDir = resolve(gitRoot, '.github/workflows');
|
|
70
|
+
const workflowSrc = getAssetPath(import.meta.url, 'bootstrapper/github-workflows/prism-eval-gate-kiro.yml');
|
|
71
|
+
if (existsSync(workflowSrc)) {
|
|
72
|
+
mkdirSync(workflowsDir, { recursive: true });
|
|
73
|
+
const dest = resolve(workflowsDir, 'prism-eval-gate.yml');
|
|
74
|
+
if (existsSync(dest)) {
|
|
75
|
+
const overwrite = await prompt('Workflow already exists. Overwrite? [y/N]', 'n');
|
|
76
|
+
if (overwrite.toLowerCase() !== 'y') {
|
|
77
|
+
console.log(' Skipped workflow.');
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
copyFileSync(workflowSrc, dest);
|
|
81
|
+
console.log('✓ Updated .github/workflows/prism-eval-gate.yml');
|
|
60
82
|
}
|
|
61
|
-
console.log(`✓ Installed ${readdirSync(resolve(targetDir, 'rubrics')).length} production rubrics`);
|
|
62
83
|
}
|
|
63
84
|
else {
|
|
64
|
-
|
|
85
|
+
copyFileSync(workflowSrc, dest);
|
|
86
|
+
console.log('✓ Installed .github/workflows/prism-eval-gate.yml');
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
console.log('\n════════════════════════════════════════════════');
|
|
90
|
+
console.log(' ✅ Kiro eval gate installed!');
|
|
91
|
+
console.log('════════════════════════════════════════════════');
|
|
92
|
+
console.log('\n Mode: kiro-cli headless');
|
|
93
|
+
console.log(' Rules: .kiro/steering/code-review.md');
|
|
94
|
+
console.log(' Workflow: .github/workflows/prism-eval-gate.yml');
|
|
95
|
+
console.log('\n Required: Add KIRO_API_KEY as a GitHub repository secret');
|
|
96
|
+
console.log(' Generate at: https://app.kiro.dev → Settings → API Keys');
|
|
97
|
+
console.log('\n Optional: Add PRISM_METRICS_ROLE_ARN for EventBridge metrics');
|
|
98
|
+
console.log('');
|
|
99
|
+
}
|
|
100
|
+
async function installBedrockMode(gitRoot, targetDir, opts) {
|
|
101
|
+
// --- Config ---
|
|
102
|
+
const model = opts.model || await prompt('Eval model ID', 'us.anthropic.claude-haiku-4-5-20251001-v1:0');
|
|
103
|
+
const threshold = opts.threshold || await prompt('Pass threshold', '0.82');
|
|
104
|
+
const region = await prompt('AWS region', 'us-west-2');
|
|
105
|
+
// --- Install script + config ---
|
|
106
|
+
mkdirSync(resolve(targetDir, 'rubrics'), { recursive: true });
|
|
107
|
+
// Copy run-eval.sh
|
|
108
|
+
copyFileSync(resolve(EVAL_SOURCE, 'run-eval.sh'), resolve(targetDir, 'run-eval.sh'));
|
|
109
|
+
chmodSync(resolve(targetDir, 'run-eval.sh'), 0o755);
|
|
110
|
+
console.log('✓ Installed .prism/eval-harness/run-eval.sh');
|
|
111
|
+
// Write eval-config.json
|
|
112
|
+
const config = {
|
|
113
|
+
pass_threshold: parseFloat(threshold),
|
|
114
|
+
eval_model_id: model,
|
|
115
|
+
aws_region: region,
|
|
116
|
+
event_bus: 'prism-d1-metrics',
|
|
117
|
+
emit_to_eventbridge: true,
|
|
118
|
+
};
|
|
119
|
+
writeFileSync(resolve(targetDir, 'eval-config.json'), JSON.stringify(config, null, 2) + '\n');
|
|
120
|
+
console.log('✓ Created .prism/eval-harness/eval-config.json');
|
|
121
|
+
// --- Rubrics ---
|
|
122
|
+
if (opts.withRubrics) {
|
|
123
|
+
const rubricsSrc = resolve(EVAL_SOURCE, 'rubrics');
|
|
124
|
+
for (const file of readdirSync(rubricsSrc).filter(f => f.endsWith('.json'))) {
|
|
125
|
+
copyFileSync(resolve(rubricsSrc, file), resolve(targetDir, 'rubrics', file));
|
|
65
126
|
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
127
|
+
console.log(`✓ Installed ${readdirSync(resolve(targetDir, 'rubrics')).length} production rubrics`);
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
console.log('✓ rubrics/ directory created (empty — add your own rubric JSON files)');
|
|
131
|
+
}
|
|
132
|
+
// --- Workflow ---
|
|
133
|
+
const workflowsDir = resolve(gitRoot, '.github/workflows');
|
|
134
|
+
const workflowSrc = getAssetPath(import.meta.url, 'bootstrapper/github-workflows/prism-eval-gate.yml');
|
|
135
|
+
if (existsSync(workflowSrc)) {
|
|
136
|
+
mkdirSync(workflowsDir, { recursive: true });
|
|
137
|
+
const dest = resolve(workflowsDir, 'prism-eval-gate.yml');
|
|
138
|
+
if (existsSync(dest)) {
|
|
139
|
+
const overwrite = await prompt('Workflow already exists. Overwrite? [y/N]', 'n');
|
|
140
|
+
if (overwrite.toLowerCase() !== 'y') {
|
|
141
|
+
console.log(' Skipped workflow.');
|
|
81
142
|
}
|
|
82
143
|
else {
|
|
83
144
|
copyFileSync(workflowSrc, dest);
|
|
84
|
-
console.log('✓
|
|
145
|
+
console.log('✓ Updated .github/workflows/prism-eval-gate.yml');
|
|
85
146
|
}
|
|
86
147
|
}
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
console.log(`\n Model: ${model}`);
|
|
91
|
-
console.log(` Threshold: ${threshold}`);
|
|
92
|
-
console.log(` Rubrics: ${opts.withRubrics ? 'production set' : 'empty (add your own)'}`);
|
|
93
|
-
if (!opts.withRubrics) {
|
|
94
|
-
console.log('\n Next: Create a rubric at .prism/eval-harness/rubrics/my-rubric.json');
|
|
95
|
-
console.log(' See: bootstrapper/eval-harness/rubrics/ for examples');
|
|
148
|
+
else {
|
|
149
|
+
copyFileSync(workflowSrc, dest);
|
|
150
|
+
console.log('✓ Installed .github/workflows/prism-eval-gate.yml');
|
|
96
151
|
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
152
|
+
}
|
|
153
|
+
console.log('\n════════════════════════════════════════════════');
|
|
154
|
+
console.log(' ✅ Eval harness installed (legacy Bedrock mode)!');
|
|
155
|
+
console.log('════════════════════════════════════════════════');
|
|
156
|
+
console.log(`\n Model: ${model}`);
|
|
157
|
+
console.log(` Threshold: ${threshold}`);
|
|
158
|
+
console.log(` Rubrics: ${opts.withRubrics ? 'production set' : 'empty (add your own)'}`);
|
|
159
|
+
if (!opts.withRubrics) {
|
|
160
|
+
console.log('\n Next: Create a rubric at .prism/eval-harness/rubrics/my-rubric.json');
|
|
161
|
+
console.log(' See: bootstrapper/eval-harness/rubrics/ for examples');
|
|
162
|
+
}
|
|
163
|
+
console.log('\n 💡 Consider upgrading to kiro mode: prism-cli bootstrapper install-eval-harness --mode kiro');
|
|
164
|
+
console.log('');
|
|
165
|
+
}
|
|
100
166
|
//# sourceMappingURL=install-eval-harness.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install-eval-harness.js","sourceRoot":"","sources":["../../../../src/commands/bootstrapper/install-eval-harness.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAgB,aAAa,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACnH,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,WAAW,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,2BAA2B,CAAC,CAAC;AAE/E,SAAS,MAAM,CAAC,QAAgB,EAAE,YAAqB;IACrD,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7E,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,KAAK,YAAY,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACxD,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,QAAQ,GAAG,MAAM,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,YAAY,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9H,CAAC;AAED,eAAe;IACb,WAAW,EAAE,2DAA2D;IACxE,OAAO,EAAE;QACP,EAAE,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"install-eval-harness.js","sourceRoot":"","sources":["../../../../src/commands/bootstrapper/install-eval-harness.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup-github-oidc.d.ts","sourceRoot":"","sources":["../../../../src/commands/bootstrapper/setup-github-oidc.ts"],"names":[],"mappings":";;;;;;iBAqDqB;QAAE,MAAM,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE;;AAN3D,
|
|
1
|
+
{"version":3,"file":"setup-github-oidc.d.ts","sourceRoot":"","sources":["../../../../src/commands/bootstrapper/setup-github-oidc.ts"],"names":[],"mappings":";;;;;;iBAqDqB;QAAE,MAAM,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE;;AAN3D,wBA+OE"}
|
|
@@ -233,6 +233,26 @@ export default {
|
|
|
233
233
|
console.error(` ✗ Failed to attach policy: ${putPolicy.stderr}`);
|
|
234
234
|
process.exit(1);
|
|
235
235
|
}
|
|
236
|
+
// Step 4: Attach Continuum CI managed policy (if deployed)
|
|
237
|
+
console.log('\nStep 4: Attaching Continuum CI scan policy (if available)...');
|
|
238
|
+
const continuumPolicy = run(`aws iam list-policies --scope Local --query "Policies[?PolicyName=='prism-d1-continuum-ci-scan'].Arn" --output text`);
|
|
239
|
+
if (continuumPolicy.ok && continuumPolicy.stdout) {
|
|
240
|
+
const attachResult = run(`aws iam attach-role-policy --role-name ${roleName} --policy-arn ${continuumPolicy.stdout}`);
|
|
241
|
+
if (attachResult.ok) {
|
|
242
|
+
console.log(` ✓ Continuum CI policy attached (SSM + S3 + SecurityAgent access).`);
|
|
243
|
+
}
|
|
244
|
+
else if (attachResult.stderr.includes('already')) {
|
|
245
|
+
console.log(' ✓ Continuum CI policy already attached.');
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
console.log(` ⚠️ Could not attach Continuum policy: ${attachResult.stderr}`);
|
|
249
|
+
console.log(' The eval gate workflow will skip security scanning until this is resolved.');
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
else {
|
|
253
|
+
console.log(' ℹ️ Continuum CI policy not found (deploy with --context enableSecurityAgent=true to create it).');
|
|
254
|
+
console.log(' The eval gate workflow will gracefully skip security scanning.');
|
|
255
|
+
}
|
|
236
256
|
// Summary
|
|
237
257
|
const roleArn = `arn:aws:iam::${accountId}:role/${roleName}`;
|
|
238
258
|
console.log('\n════════════════════════════════════════════════');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup-github-oidc.js","sourceRoot":"","sources":["../../../../src/commands/bootstrapper/setup-github-oidc.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"setup-github-oidc.js","sourceRoot":"","sources":["../../../../src/commands/bootstrapper/setup-github-oidc.ts"],"names":[],"mappings":"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"}
|