mirror of
https://github.com/facebook/rocksdb.git
synced 2026-10-24 19:59:35 +03:00
Summary:
This commit fixes several potential issues introduced by cc8d9ea04 (CI: AI review workflow improvements) that broke the agent review jobs in GitHub CI.
1. Codex workflows fail when OPENAI_API_KEY is not configured:
- Added Codex review workflows fail with exit code 1 if the API key secret is missing
- Added script-level checks to skip Codex steps gracefully when OPENAI_API_KEY is unset, avoiding CI noise
2. Missing pull-requests: read permission in manual-review job:
- The manual-review job calls github.rest.pulls.get() but lacked the required permission
- Added 'pull-requests: read' to the manual-review job permissions
3. Potential crash when headSha is undefined:
- parse-claude-review.js and parse-codex-review.js accessed meta.headSha.substring() without null check
- Added defensive checks to handle undefined headSha gracefully
4. Claude model claude-opus-4-7 incompatible with thinking API:
- The commit upgraded default model to claude-opus-4-7, but this model doesn't support the 'thinking.type.enabled' API used by the Claude Code action
- Error: 'thinking.type.enabled' is not supported for this model. Use 'thinking.type.adaptive' and 'output_config.effort' to control thinking behavior
- Reverted default model to claude-opus-4-6 and removed claude-opus-4-7 from options
Pull Request resolved: https://github.com/facebook/rocksdb/pull/14696
Test Plan: Created a draft PR with this change and draft production code changes, including a branch on facebook/rocksdb. Go to https://github.com/facebook/rocksdb/actions/workflows/claude-review.yml and choose "Run workflow" with that branch and PR. (Changes in the PR do are not picked up for the agent code review workflows; the only way to test what is outside of main is with a branch on facebook/rocksdb)
Reviewed By: joshkang97
Differential Revision: D103453631
Pulled By: pdillinger
fbshipit-source-id: 15a82257b5762e9e0b1b393dc45c4b343c866f7a
99 lines
3.3 KiB
JavaScript
99 lines
3.3 KiB
JavaScript
// Parse Codex review artifacts and produce a markdown review comment.
|
|
//
|
|
// Usage from actions/github-script:
|
|
// const parse = require('./.github/scripts/parse-codex-review.js');
|
|
// const markdown = parse({ responseFile, recoveryFile, findingsFile, logFile,
|
|
// exitCode, meta });
|
|
//
|
|
// Parameters:
|
|
// responseFile - path to Codex final response output
|
|
// recoveryFile - path to recovery output formatted from review-findings.md
|
|
// findingsFile - path to incremental findings file written during review
|
|
// logFile - path to Codex stdout/stderr log
|
|
// exitCode - Codex process exit code
|
|
// meta - { trigger, autoMode, headSha, reviewer, isQuery, isPartial }
|
|
|
|
const fs = require('fs');
|
|
const buildComment = require('./build-ai-review-comment.js');
|
|
|
|
module.exports = function parseCodex(
|
|
{responseFile, recoveryFile, findingsFile, logFile, exitCode, meta}) {
|
|
function getTriggerLine() {
|
|
if (meta.trigger !== 'auto') {
|
|
return `*Requested by @${meta.reviewer}*`;
|
|
}
|
|
const shortSha = meta.headSha ? meta.headSha.substring(0, 7) : 'unknown';
|
|
if (meta.autoMode === 'early') {
|
|
return `*Auto-triggered after CI reached the early-review threshold — reviewing commit ${
|
|
shortSha}*`;
|
|
}
|
|
return `*Auto-triggered after CI passed — reviewing commit ${shortSha}*`;
|
|
}
|
|
|
|
function readIfPresent(path) {
|
|
if (!path || !fs.existsSync(path)) {
|
|
return '';
|
|
}
|
|
const text = fs.readFileSync(path, 'utf8').trim();
|
|
return text;
|
|
}
|
|
|
|
function tailFile(path, maxChars = 12000) {
|
|
const text = readIfPresent(path);
|
|
if (!text) {
|
|
return '';
|
|
}
|
|
if (text.length <= maxChars) {
|
|
return text;
|
|
}
|
|
return text.slice(text.length - maxChars);
|
|
}
|
|
|
|
let responseBody = '';
|
|
const recovered = readIfPresent(recoveryFile);
|
|
const direct = readIfPresent(responseFile);
|
|
const findings = readIfPresent(findingsFile);
|
|
|
|
if (recovered) {
|
|
responseBody = recovered;
|
|
} else if (direct) {
|
|
responseBody = direct;
|
|
} else if (findings) {
|
|
responseBody =
|
|
'⚠️ **Review incomplete — Codex did not produce a final response.**\n\n' +
|
|
'Below are the incremental findings recovered from `review-findings.md`.\n\n---\n\n' +
|
|
findings;
|
|
} else {
|
|
const logTail = tailFile(logFile);
|
|
responseBody = logTail ?
|
|
`❌ **Codex review failed before producing findings.**\n\n\`\`\`\n${
|
|
logTail}\n\`\`\`` :
|
|
'❌ Codex review failed before producing any output.';
|
|
}
|
|
|
|
const isPartial = !!meta.isPartial;
|
|
const code = Number.parseInt(exitCode || '1', 10);
|
|
const icon = isPartial ? '🟡' : (code === 0 ? '✅' : '⚠️');
|
|
const triggerLine = getTriggerLine();
|
|
|
|
return buildComment({
|
|
icon,
|
|
headerTitle: meta.isQuery ? 'Codex Response' : 'Codex Code Review',
|
|
triggerLine,
|
|
responseBody,
|
|
footerLines: [
|
|
'Generated by Codex CLI.',
|
|
'Review methodology: `claude_md/code_review.md`',
|
|
'',
|
|
'**Limitations:**',
|
|
'- Codex may miss context from files not in the diff',
|
|
'- Large PRs may be truncated',
|
|
'- Always apply human judgment to AI suggestions',
|
|
'',
|
|
'**Commands:**',
|
|
'- `/codex-review [context]` — Request a code review',
|
|
'- `/codex-query <question>` — Ask about the PR or codebase',
|
|
],
|
|
});
|
|
};
|