@blundergoat/goat-flow
Version:
AI coding agent harness and local dashboard for Claude Code, OpenAI Codex, Google Antigravity, and GitHub Copilot - setup audits, guardrails, structured skills, deny hooks, and persistent learning loops.
63 lines • 2.25 kB
JavaScript
/** Build the slug for one finding file path. */
function slugFindingFile(file) {
if (file === null)
return "_";
const slug = file
.replace(/\\/g, "/")
.toLowerCase()
.replace(/[^a-z0-9]+/g, "-")
.replace(/^-+|-+$/g, "");
return slug || "_";
}
/** Build a compact slug for null-line finding text. */
function slugFindingText(text) {
const slug = text
.toLowerCase()
.replace(/[^a-z0-9]+/g, "-")
.replace(/^-+|-+$/g, "")
.slice(0, 60)
.replace(/-+$/g, "");
return slug || "_";
}
/** Build the legacy location ID for one finding. */
function buildLocationFindingId(finding) {
return `${finding.type}:${slugFindingFile(finding.file)}:${finding.line ?? "_"}`;
}
/** Build a disambiguated ID for repeated findings at the same location. */
function buildFindingId(finding, isAmbiguousLocation) {
const location = buildLocationFindingId(finding);
if (!isAmbiguousLocation && finding.line !== null)
return location;
return `${location}:${slugFindingText(finding.summary)}`;
}
/**
* Attach stable finding IDs while preserving duplicate findings at the same location.
*
* @param report - raw quality report whose findings need deterministic ids
* @returns saved-report shape, or a validation error when an id collision remains ambiguous
*/
export function attachFindingIds(report) {
const locationCounts = new Map();
for (const finding of report.findings) {
const locationId = buildLocationFindingId(finding);
locationCounts.set(locationId, (locationCounts.get(locationId) ?? 0) + 1);
}
const seen = new Map();
const findings = [];
for (const finding of report.findings) {
const locationId = buildLocationFindingId(finding);
const baseId = buildFindingId(finding, (locationCounts.get(locationId) ?? 0) > 1);
const occurrence = seen.get(baseId) ?? 0;
seen.set(baseId, occurrence + 1);
const id = occurrence === 0 ? baseId : `${baseId}:${occurrence + 1}`;
findings.push({ ...finding, id });
}
return {
ok: true,
report: {
...report,
findings,
},
};
}
//# sourceMappingURL=ids.js.map