mirror of
https://github.com/tiennm99/ccs.git
synced 2026-10-14 02:15:36 +00:00
hotfix(ci): restore reliable structured ai review comments
This commit is contained in:
1 parent
737462ac1a
commit
5b9427f8a0
11 files changed
+1148
-207
No files matched your search
@@ -22,9 +22,9 @@ const STATUS_LABELS = {
|
||||
};
|
||||
|
||||
const REVIEW_MODE_DETAILS = {
|
||||
fast: 'diff-focused bounded review',
|
||||
triage: 'hotspot-based bounded review (non-exhaustive)',
|
||||
deep: 'expanded surrounding-code review',
|
||||
fast: 'selected-file packaged review',
|
||||
triage: 'expanded packaged review with broader coverage',
|
||||
deep: 'maintainer-triggered expanded packet review',
|
||||
};
|
||||
|
||||
const RENDERER_OWNED_MARKUP_PATTERNS = [
|
||||
@@ -77,6 +77,9 @@ function normalizeRenderingMetadata(raw) {
|
||||
const reviewableFiles = parsePositiveInteger(raw.reviewableFiles);
|
||||
const selectedChanges = parsePositiveInteger(raw.selectedChanges);
|
||||
const reviewableChanges = parsePositiveInteger(raw.reviewableChanges);
|
||||
const packetIncludedFiles = parsePositiveInteger(raw.packetIncludedFiles);
|
||||
const packetTotalFiles = parsePositiveInteger(raw.packetTotalFiles);
|
||||
const packetOmittedFiles = parsePositiveInteger(raw.packetOmittedFiles);
|
||||
const scopeLabel = cleanText(raw.scopeLabel).toLowerCase();
|
||||
const metadata = {};
|
||||
|
||||
@@ -88,6 +91,9 @@ function normalizeRenderingMetadata(raw) {
|
||||
if (reviewableFiles) metadata.reviewableFiles = reviewableFiles;
|
||||
if (selectedChanges) metadata.selectedChanges = selectedChanges;
|
||||
if (reviewableChanges) metadata.reviewableChanges = reviewableChanges;
|
||||
if (packetIncludedFiles !== null) metadata.packetIncludedFiles = packetIncludedFiles;
|
||||
if (packetTotalFiles !== null) metadata.packetTotalFiles = packetTotalFiles;
|
||||
if (packetOmittedFiles !== null) metadata.packetOmittedFiles = packetOmittedFiles;
|
||||
if (scopeLabel === 'reviewable files' || scopeLabel === 'changed files') metadata.scopeLabel = scopeLabel;
|
||||
|
||||
return metadata;
|
||||
@@ -143,6 +149,22 @@ function formatScopeSummary(rendering) {
|
||||
return fileScope;
|
||||
}
|
||||
|
||||
function formatPacketCoverage(rendering) {
|
||||
if (
|
||||
typeof rendering.packetIncludedFiles !== 'number' ||
|
||||
typeof rendering.packetTotalFiles !== 'number'
|
||||
) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const packetSummary = `${rendering.packetIncludedFiles}/${rendering.packetTotalFiles} selected files included in the final review packet`;
|
||||
if (typeof rendering.packetOmittedFiles === 'number' && rendering.packetOmittedFiles > 0) {
|
||||
return `${packetSummary}; ${rendering.packetOmittedFiles} selected file${rendering.packetOmittedFiles === 1 ? '' : 's'} omitted for packet budget`;
|
||||
}
|
||||
|
||||
return packetSummary;
|
||||
}
|
||||
|
||||
function formatReviewContext(rendering) {
|
||||
const parts = [];
|
||||
|
||||
@@ -156,6 +178,11 @@ function formatReviewContext(rendering) {
|
||||
parts.push(`scope ${scopeSummary}`);
|
||||
}
|
||||
|
||||
const packetCoverage = formatPacketCoverage(rendering);
|
||||
if (packetCoverage) {
|
||||
parts.push(`packet ${packetCoverage}`);
|
||||
}
|
||||
|
||||
const turnBudget = formatTurnBudget(rendering);
|
||||
if (turnBudget) {
|
||||
parts.push(`turn budget ${turnBudget}`);
|
||||
@@ -317,14 +344,19 @@ function formatHotspotFiles(files) {
|
||||
|
||||
function formatRemainingCoverage(rendering) {
|
||||
if (
|
||||
typeof rendering.selectedFiles !== 'number' ||
|
||||
typeof rendering.reviewableFiles !== 'number'
|
||||
typeof rendering.reviewableFiles !== 'number' ||
|
||||
(typeof rendering.packetIncludedFiles !== 'number' && typeof rendering.selectedFiles !== 'number')
|
||||
) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const remainingFiles = Math.max(rendering.reviewableFiles - rendering.selectedFiles, 0);
|
||||
const coveredFiles = typeof rendering.packetIncludedFiles === 'number'
|
||||
? rendering.packetIncludedFiles
|
||||
: rendering.selectedFiles;
|
||||
const remainingFiles = Math.max(rendering.reviewableFiles - coveredFiles, 0);
|
||||
const packetOmittedFiles = typeof rendering.packetOmittedFiles === 'number' ? rendering.packetOmittedFiles : 0;
|
||||
const hasChangeCounts =
|
||||
packetOmittedFiles === 0 &&
|
||||
typeof rendering.selectedChanges === 'number' &&
|
||||
typeof rendering.reviewableChanges === 'number';
|
||||
const remainingChanges = hasChangeCounts
|
||||
@@ -344,7 +376,7 @@ function formatRemainingCoverage(rendering) {
|
||||
|
||||
function formatFallbackFollowUp(rendering) {
|
||||
if (rendering.mode === 'triage') {
|
||||
return 'Focus manual review on the hotspot files above, and use `/review` for a deeper pass when release, auth, config, or workflow paths changed.';
|
||||
return 'Focus manual review on the selected files above, and use `/review` for a deeper pass when release, auth, config, or workflow paths changed.';
|
||||
}
|
||||
|
||||
return 'Use `/review` when you need a deeper maintainer rerun with more surrounding context.';
|
||||
@@ -541,6 +573,10 @@ export function renderIncompleteReview({
|
||||
if (scopeSummary) {
|
||||
lines.push(`- Review scope: ${escapeMarkdownText(scopeSummary)}`);
|
||||
}
|
||||
const packetCoverage = formatPacketCoverage(rendering);
|
||||
if (packetCoverage) {
|
||||
lines.push(`- Packet coverage: ${escapeMarkdownText(packetCoverage)}`);
|
||||
}
|
||||
const runtimeBudget = formatCombinedBudget(rendering);
|
||||
if (runtimeBudget) {
|
||||
lines.push(`- Runtime budget: ${escapeMarkdownText(runtimeBudget)}`);
|
||||
@@ -579,6 +615,9 @@ export function writeReviewFromEnv(env = process.env) {
|
||||
reviewableFiles: env.AI_REVIEW_REVIEWABLE_FILES,
|
||||
selectedChanges: env.AI_REVIEW_SELECTED_CHANGES,
|
||||
reviewableChanges: env.AI_REVIEW_REVIEWABLE_CHANGES,
|
||||
packetIncludedFiles: env.AI_REVIEW_PACKET_INCLUDED_FILES,
|
||||
packetTotalFiles: env.AI_REVIEW_PACKET_TOTAL_FILES,
|
||||
packetOmittedFiles: env.AI_REVIEW_PACKET_OMITTED_FILES,
|
||||
scopeLabel: env.AI_REVIEW_SCOPE_LABEL,
|
||||
maxTurns: env.AI_REVIEW_MAX_TURNS,
|
||||
timeoutMinutes: env.AI_REVIEW_TIMEOUT_MINUTES ?? env.AI_REVIEW_TIMEOUT_MINUTES_BUDGET,
|
||||
|
||||
Reference in new issue
Block a user