@autobe/agent
Version:
AI backend server code generator
75 lines • 2.92 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.detectOversizedToc = exports.detectTechLockin = void 0;
// ─── A) Technology Lock-in Detection ───
/**
* Prohibited technology-specific keywords.
*
* Requirements documents must be technology-neutral. These patterns detect
* specific database, ORM, framework, infrastructure, and algorithm references
* that constitute implementation lock-in.
*/
const PROHIBITED_TECH_PATTERNS = [
// Algorithm specifics
{
regex: /\bbcrypt\s+(?:with\s+)?cost\s+factor/i,
label: "bcrypt cost factor",
},
// DB-specific syntax
{ regex: /\bRETURNING\s+clause\b/i, label: "RETURNING clause (DB-specific)" },
];
/**
* Detect technology lock-in in section content.
*
* Scans all section titles and content for prohibited technology-specific
* keywords. Used in the validate callback to force LLM retry.
*
* @returns Array of human-readable violation strings (empty = no violations)
*/
const detectTechLockin = (sections) => {
const violations = [];
for (let i = 0; i < sections.length; i++) {
const section = sections[i];
const combined = `${section.title}\n${section.content}`;
for (const { regex, label } of PROHIBITED_TECH_PATTERNS) {
// Reset lastIndex for safety (though these don't use /g flag)
regex.lastIndex = 0;
if (regex.test(combined)) {
violations.push(`Section "${section.title}": Technology lock-in "${label}" detected. ` +
`Requirements must be technology-neutral. Replace with a generic equivalent.`);
}
}
}
return violations;
};
exports.detectTechLockin = detectTechLockin;
// ─── B) Oversized Overview Detection ───
const OVERVIEW_MAX_LINES = 600;
/**
* Detect if the overview file's sections exceed the maximum line count.
*
* 00-toc.md should be a concise project summary and navigation aid, not a
* detailed requirements document. If the total line count across all sections
* exceeds `OVERVIEW_MAX_LINES`, returns a violation string.
*
* @returns Array of violation strings (empty = no violation)
*/
const detectOversizedToc = (sectionResults) => {
let totalLines = 0;
for (const sectionsForModule of sectionResults) {
for (const sectionEvent of sectionsForModule) {
for (const section of sectionEvent.sectionSections) {
totalLines += section.content.split("\n").length;
}
}
}
if (totalLines > OVERVIEW_MAX_LINES) {
return [
`Overview exceeds ${OVERVIEW_MAX_LINES} lines (actual: ${totalLines}). ` +
`Remove detailed requirements, keep only navigation tables and brief summaries.`,
];
}
return [];
};
exports.detectOversizedToc = detectOversizedToc;
//# sourceMappingURL=buildHardValidators.js.map