@aisdlc/core 2.3.0 → 2.4.0

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/index.js CHANGED
@@ -266,19 +266,26 @@ function extractPythonFunctions(content, filePath) {
266
266
  }
267
267
  return buildMetricsFromBlocks(blocks, content, filePath);
268
268
  }
269
- function processBraceLine(line, state, blocks, lineIndex, ext) {
270
- if (!state.currentFn) {
271
- const candidate = matchFunctionHeader(line, ext);
272
- if (!candidate) return;
269
+ function tryStartBraceFunction(line, state, ext) {
270
+ if (state.currentFn || state.inBlockComment || state.rawTerm) return;
271
+ const candidate = matchFunctionHeader(line, ext);
272
+ if (candidate) {
273
273
  state.currentFn = candidate;
274
274
  state.braceCount = 0;
275
275
  state.fnLines = [];
276
276
  }
277
- state.fnLines.push(line);
278
- const res = scanBracesInLine(line, state.inBlockComment, ext);
277
+ }
278
+ function updateBraceScanState(line, state, ext) {
279
+ const res = scanBracesInLine(line, state.inBlockComment, state.rawTerm, ext);
279
280
  state.inBlockComment = res.nowInBlock;
281
+ state.rawTerm = res.nowRawTerm;
280
282
  state.braceCount += res.delta;
281
- if (state.braceCount === 0 && state.fnLines.length > 1) {
283
+ }
284
+ function processBraceLine(line, state, blocks, lineIndex, ext) {
285
+ tryStartBraceFunction(line, state, ext);
286
+ if (state.currentFn) state.fnLines.push(line);
287
+ updateBraceScanState(line, state, ext);
288
+ if (state.currentFn && state.braceCount === 0 && state.fnLines.length > 1) {
282
289
  blocks.push({ name: state.currentFn, body: state.fnLines.join("\n"), startLine: lineIndex });
283
290
  state.currentFn = null;
284
291
  state.fnLines = [];
@@ -288,98 +295,153 @@ function extractBraceFunctions(content, filePath) {
288
295
  const ext = path4.extname(filePath).toLowerCase();
289
296
  const lines = content.split("\n");
290
297
  const blocks = [];
291
- const state = { currentFn: null, braceCount: 0, fnLines: [], inBlockComment: false };
298
+ const state = {
299
+ currentFn: null,
300
+ braceCount: 0,
301
+ fnLines: [],
302
+ inBlockComment: false,
303
+ rawTerm: null
304
+ };
292
305
  for (let i = 0; i < lines.length; i++) {
293
306
  processBraceLine(lines[i], state, blocks, i, ext);
294
307
  }
295
308
  return buildMetricsFromBlocks(blocks, content, filePath);
296
309
  }
310
+ var HEADER_EXCLUSIONS = /* @__PURE__ */ new Set([
311
+ "if",
312
+ "for",
313
+ "foreach",
314
+ "while",
315
+ "switch",
316
+ "catch",
317
+ "select",
318
+ "match",
319
+ "class",
320
+ "struct",
321
+ "interface",
322
+ "record",
323
+ "enum",
324
+ "namespace",
325
+ "using",
326
+ "lock",
327
+ "fixed",
328
+ "synchronized",
329
+ "try",
330
+ "else"
331
+ ]);
297
332
  function matchCStyleHeader(line) {
298
333
  const match = line.match(
299
- /(?:(?:public|private|protected|static|async|virtual|override|fn)\s+)*(?:function\s+([a-zA-Z0-9_$]+)|(?:[a-zA-Z0-9_<>[\]?]+\s+)+([a-zA-Z0-9_$]+)\s*\([^;{]*\)\s*(?:throws\s+[^{]+)?\{|([a-zA-Z0-9_$]+)\s*\([^;{]*\)\s*(?::\s*[^{]+\s*)?\{)/
334
+ /(?:(?:public|private|protected|internal|static|async|virtual|override|sealed|abstract|final|synchronized|default|fn)\s+)*(?:function\s+([a-zA-Z0-9_$]+)|(?:[a-zA-Z0-9_<>[\]?,.\s]+\s+)+([a-zA-Z0-9_$]+)\s*(?:<[^>]+>)?\s*\([^;{}]*\)\s*(?:where\s+[^{]+|throws\s+[^{]+)?\{|([a-zA-Z0-9_$]+)\s*\([^;{}]*\)\s*(?::\s*[^{]+\s*)?\{)/
300
335
  );
301
336
  if (!match) return null;
302
337
  const candidate = match[1] || match[2] || match[3];
303
- const exclusions = ["if", "for", "while", "switch", "catch", "select", "match", "class", "struct"];
304
- return candidate && !exclusions.includes(candidate) ? candidate : null;
338
+ return candidate && !HEADER_EXCLUSIONS.has(candidate) ? candidate : null;
305
339
  }
306
340
  function matchFunctionHeader(line, ext) {
307
341
  const trimmed = line.trim();
308
- if (trimmed.startsWith("//") || trimmed.startsWith("/*") || trimmed.startsWith("*")) return null;
342
+ if (trimmed.startsWith("//") || trimmed.startsWith("/*") || trimmed.startsWith("*") || trimmed.startsWith("#")) {
343
+ return null;
344
+ }
309
345
  if (ext === ".go") {
310
- const match = line.match(/func\s+(?:\([^)]*\)\s*)?([a-zA-Z0-9_$]+)\s*\(/);
346
+ const match = line.match(/func\s+(?:\([^)]*\)\s*)?([a-zA-Z0-9_$]+)\s*(?:\[[^\]]*\])?\s*\(/);
311
347
  return match ? match[1] : null;
312
348
  }
313
349
  if (ext === ".rs") {
314
- const match = line.match(/(?:pub\s+)?(?:async\s+)?(?:unsafe\s+)?fn\s+([a-zA-Z0-9_$]+)\s*\(/);
350
+ const match = line.match(/(?:pub(?:\([^)]*\))?\s+)?(?:async\s+)?(?:unsafe\s+)?(?:const\s+)?fn\s+([a-zA-Z0-9_$]+)\s*(?:<[^>]*>)?\s*\(/);
315
351
  return match ? match[1] : null;
316
352
  }
317
353
  return matchCStyleHeader(line);
318
354
  }
319
- function handleStringChar(char, inString) {
320
- if (char === inString) return { inString: null, skip: false };
321
- return { inString, skip: char === "\\" };
322
- }
323
- function handleBlockState(char, next, inBlock) {
324
- if (inBlock && char === "*" && next === "/") return { inBlock: false, skip: true };
325
- return { inBlock, skip: false };
326
- }
327
- function checkCommentOrQuote(char, next, ext) {
328
- if (char === "/" && next === "/") return { startBlock: false, quote: null, isLineComment: true };
329
- if (char === "/" && next === "*") return { startBlock: true, quote: null, isLineComment: false };
330
- const isQuote = char === '"' || char === "'" || char === "`" && ext === ".go";
331
- return { startBlock: false, quote: isQuote ? char : null, isLineComment: false };
332
- }
333
- function stepSkippedState(char, next, inBlock, inString) {
334
- if (inBlock) {
335
- const res = handleBlockState(char, next, inBlock);
336
- return { inBlock: res.inBlock, inString, skip: res.skip, handled: true };
337
- }
338
- if (inString) {
339
- const res = handleStringChar(char, inString);
340
- return { inBlock, inString: res.inString, skip: res.skip, handled: true };
341
- }
342
- return { inBlock, inString, skip: false, handled: false };
343
- }
344
- function checkCodeChar(char, next, ext) {
345
- const trigger = checkCommentOrQuote(char, next, ext);
346
- if (trigger.isLineComment) return { delta: 0, startBlock: false, quote: null, stop: true };
347
- if (trigger.startBlock) return { delta: 0, startBlock: true, quote: null, stop: false };
348
- if (trigger.quote) return { delta: 0, startBlock: false, quote: trigger.quote, stop: false };
349
- const delta = char === "{" ? 1 : char === "}" ? -1 : 0;
350
- return { delta, startBlock: false, quote: null, stop: false };
351
- }
352
- function applyCodeChar(res, state) {
353
- if (res.stop) return { advance: 0, stop: true };
354
- if (res.startBlock) {
355
+ function detectRustOrGoRawString(sub, ext) {
356
+ if (ext === ".rs") {
357
+ const m = sub.match(/^r(#*)"/);
358
+ return m ? { term: `"${m[1]}`, advance: m[0].length - 1 } : null;
359
+ }
360
+ if (ext === ".go" && sub.startsWith("`")) {
361
+ return { term: "`", advance: 0 };
362
+ }
363
+ return null;
364
+ }
365
+ function detectCsJavaOrCppRawString(sub, ext) {
366
+ if (ext === ".cs" || ext === ".java") {
367
+ const m = sub.match(/^\$*("{3,})/);
368
+ if (m) return { term: m[1], advance: m[0].length - 1 };
369
+ const v = ext === ".cs" ? sub.match(/^(@\$|\$@|@)"/) : null;
370
+ return v ? { term: '"', advance: v[0].length - 1 } : null;
371
+ }
372
+ const cpp = sub.match(/^R"([a-zA-Z0-9_]*)\(/);
373
+ return cpp ? { term: `)${cpp[1]}"`, advance: cpp[0].length - 1 } : null;
374
+ }
375
+ function detectRawStringOpen(line, index, ext) {
376
+ const sub = line.slice(index);
377
+ return detectRustOrGoRawString(sub, ext) || detectCsJavaOrCppRawString(sub, ext);
378
+ }
379
+ function consumeRawOrBlock(line, index, state) {
380
+ if (state.inBlock) {
381
+ if (line[index] === "*" && line[index + 1] === "/") {
382
+ state.inBlock = false;
383
+ return { advance: 1, handled: true };
384
+ }
385
+ return { advance: 0, handled: true };
386
+ }
387
+ if (state.rawTerm) {
388
+ if (line.startsWith(state.rawTerm, index)) {
389
+ const len = state.rawTerm.length - 1;
390
+ state.rawTerm = null;
391
+ return { advance: len, handled: true };
392
+ }
393
+ return { advance: 0, handled: true };
394
+ }
395
+ return { advance: 0, handled: false };
396
+ }
397
+ function consumeNormalQuote(line, index, state) {
398
+ if (!state.inString) return { advance: 0, handled: false };
399
+ const ch = line[index];
400
+ if (ch === "\\") return { advance: 1, handled: true };
401
+ if (ch === state.inString) state.inString = null;
402
+ return { advance: 0, handled: true };
403
+ }
404
+ function applyQuoteOrBrace(ch, state) {
405
+ if (ch === '"' || ch === "'") {
406
+ state.inString = ch;
407
+ return;
408
+ }
409
+ if (ch === "{") state.delta++;
410
+ if (ch === "}") state.delta--;
411
+ }
412
+ function stepActiveCodeToken(line, j, ext, state) {
413
+ const pair = line.slice(j, j + 2);
414
+ if (pair === "//") return { advance: 0, stop: true };
415
+ if (pair === "/*") {
355
416
  state.inBlock = true;
356
417
  return { advance: 1, stop: false };
357
418
  }
358
- if (res.quote) {
359
- state.inString = res.quote;
360
- return { advance: 0, stop: false };
419
+ const rawOpen = detectRawStringOpen(line, j, ext);
420
+ if (rawOpen) {
421
+ state.rawTerm = rawOpen.term;
422
+ return { advance: rawOpen.advance, stop: false };
361
423
  }
362
- state.delta += res.delta;
424
+ applyQuoteOrBrace(line[j], state);
363
425
  return { advance: 0, stop: false };
364
426
  }
365
- function scanBracesInLine(line, wasInBlock, ext) {
366
- const state = { delta: 0, inBlock: wasInBlock, inString: null };
427
+ function scanBracesInLine(line, wasInBlock, wasRawTerm, ext) {
428
+ const state = { delta: 0, inBlock: wasInBlock, rawTerm: wasRawTerm, inString: null };
367
429
  for (let j = 0; j < line.length; j++) {
368
- const char = line[j];
369
- const next = j + 1 < line.length ? line[j + 1] : "";
370
- const skipped = stepSkippedState(char, next, state.inBlock, state.inString);
371
- if (skipped.handled) {
372
- state.inBlock = skipped.inBlock;
373
- state.inString = skipped.inString;
374
- if (skipped.skip) j++;
430
+ const rawOrBlock = consumeRawOrBlock(line, j, state);
431
+ if (rawOrBlock.handled) {
432
+ j += rawOrBlock.advance;
375
433
  continue;
376
434
  }
377
- const res = checkCodeChar(char, next, ext);
378
- const step = applyCodeChar(res, state);
379
- if (step.stop) break;
380
- j += step.advance;
435
+ const quoteStep = consumeNormalQuote(line, j, state);
436
+ if (quoteStep.handled) {
437
+ j += quoteStep.advance;
438
+ continue;
439
+ }
440
+ const codeStep = stepActiveCodeToken(line, j, ext, state);
441
+ if (codeStep.stop) break;
442
+ j += codeStep.advance;
381
443
  }
382
- return { delta: state.delta, nowInBlock: state.inBlock };
444
+ return { delta: state.delta, nowInBlock: state.inBlock, nowRawTerm: state.rawTerm };
383
445
  }
384
446
  function buildMetricsFromBlocks(blocks, content, filePath) {
385
447
  if (blocks.length === 0) {
@@ -403,11 +465,20 @@ function buildMetricsFromBlocks(blocks, content, filePath) {
403
465
  }
404
466
  function detectPolyglotSmells(body) {
405
467
  const smells = [];
406
- if (/#\s*noqa|#\s*type:\s*ignore|@SuppressWarnings/.test(body)) {
468
+ if (/#\s*noqa|#\s*type:\s*ignore|@SuppressWarnings|#pragma\s+warning\s+disable/.test(body)) {
407
469
  smells.push("Supresi\xF3n no autorizada de linter");
408
470
  }
409
471
  return smells;
410
472
  }
473
+ function stripStringsAndComments(body, ext) {
474
+ let cleaned = body;
475
+ if (ext === ".py") {
476
+ cleaned = cleaned.replace(/"""[\s\S]*?"""|'''[\s\S]*?'''/g, '""').replace(/#.*/g, "");
477
+ } else {
478
+ cleaned = cleaned.replace(/\/\*[\s\S]*?\*\/|\/\/.*/g, "").replace(/r(#+)"[\s\S]*?"\1/g, '""').replace(/R"([a-zA-Z0-9_]*)\([\s\S]*?\)\1"/g, '""').replace(/\$*"{3,}[\s\S]*?"{3,}/g, '""').replace(/`[\s\S]*?`/g, '""');
479
+ }
480
+ return cleaned.replace(/"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*'/g, '""');
481
+ }
411
482
  function computeHalsteadMI(body, cyclomatic, loc, commentCount) {
412
483
  const cleanText = body.replace(/\/\*[\s\S]*?\*\/|\/\/.*|#.*/g, "");
413
484
  const tokens = cleanText.split(/[\s,;().{}[\]=+\-*/<>!&|:]+/).filter((t) => t.length > 0);
@@ -432,9 +503,11 @@ function countCommentsAndLoc(rawLines, isPy) {
432
503
  function calculatePolyglotMetrics(body, name, filePath, startLine) {
433
504
  const ext = path4.extname(filePath).toLowerCase();
434
505
  const rawLines = body.split(/\r?\n/).map((l) => l.trim()).filter((l) => l.length > 0);
435
- const { loc, commentCount, cleanLines } = countCommentsAndLoc(rawLines, ext === ".py");
436
- const cyclomatic = computePolyglotCyclomatic(body, ext);
437
- const cognitive = computePolyglotCognitive(cleanLines, ext === ".py");
506
+ const { loc, commentCount } = countCommentsAndLoc(rawLines, ext === ".py");
507
+ const strippedBody = stripStringsAndComments(body, ext);
508
+ const strippedLines = strippedBody.split(/\r?\n/).filter((l) => l.trim().length > 0);
509
+ const cyclomatic = computePolyglotCyclomatic(strippedBody, ext);
510
+ const cognitive = computePolyglotCognitive(strippedLines, ext === ".py");
438
511
  const maintainability = computeHalsteadMI(body, cyclomatic, loc, commentCount);
439
512
  return {
440
513
  functionName: name,
@@ -447,40 +520,60 @@ function calculatePolyglotMetrics(body, name, filePath, startLine) {
447
520
  line: startLine ? startLine + 1 : 1
448
521
  };
449
522
  }
450
- function computePolyglotCyclomatic(body, ext) {
451
- let regex;
523
+ function getCyclomaticPattern(ext) {
452
524
  if (ext === ".py") {
453
- regex = /\b(if|elif|for|while|except)\b|\b(and|or)\b/g;
454
- } else if (ext === ".go") {
455
- regex = /\b(if|for|case|select)\b|&&|\|\|/g;
456
- } else if (ext === ".rs") {
457
- regex = /\b(if|for|while|match)\b|&&|\|\||\?/g;
458
- } else {
459
- regex = /\b(if|else\s+if|for|while|catch|case)\b|\?|&&|\|\|/g;
525
+ return /\b(if|elif|for|while|except|case)\b|\b(and|or)\b/g;
526
+ }
527
+ if (ext === ".go") {
528
+ return /\b(if|for|case|select)\b|&&|\|\|/g;
529
+ }
530
+ if (ext === ".rs") {
531
+ return /\b(if|for|while|match)\b|&&|\|\||\?/g;
532
+ }
533
+ if (ext === ".cs") {
534
+ return /\b(if|else\s+if|for|foreach|while|catch|case|when)\b|\?\?|\?\.(?=[a-zA-Z_])|&&|\|\|/g;
460
535
  }
461
- const cleanBody = body.replace(/"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*'/g, "");
462
- const matches = cleanBody.match(regex);
536
+ if (ext === ".java") {
537
+ return /\b(if|else\s+if|for|while|catch|case|when)\b|&&|\|\|/g;
538
+ }
539
+ return /\b(if|else\s+if|for|while|catch|case)\b|\?|&&|\|\|/g;
540
+ }
541
+ function computePolyglotCyclomatic(strippedBody, ext) {
542
+ const regex = getCyclomaticPattern(ext);
543
+ const matches = strippedBody.match(regex);
463
544
  return 1 + (matches ? matches.length : 0);
464
545
  }
465
- function computePolyglotCognitive(lines, isPy) {
546
+ var PY_COGNITIVE_RE = /\b(if|elif|for|while|except|match)\b/;
547
+ var BRACE_COGNITIVE_RE = /\b(if|for|foreach|while|catch|match|select|switch)\b/;
548
+ function computePythonCognitive(lines) {
549
+ let cognitive = 0;
550
+ const baseIndent = lines.length > 0 ? lines[0].length - lines[0].trimStart().length : 0;
551
+ for (let i = 1; i < lines.length; i++) {
552
+ const line = lines[i];
553
+ if (PY_COGNITIVE_RE.test(line)) {
554
+ const relIndent = Math.max(0, line.length - line.trimStart().length - baseIndent - 4);
555
+ cognitive += 1 + Math.floor(relIndent / 4);
556
+ }
557
+ }
558
+ return cognitive;
559
+ }
560
+ function computeBraceCognitive(lines) {
466
561
  let cognitive = 0;
467
562
  let nesting = 0;
468
- for (const line of lines) {
469
- if (isPy) {
470
- const indent = line.length - line.trimStart().length;
471
- if (/\b(if|elif|for|while|except)\b/.test(line)) {
472
- cognitive += 1 + Math.floor(indent / 4);
473
- }
474
- } else {
475
- if (line.includes("{")) nesting++;
476
- if (line.includes("}")) nesting = Math.max(0, nesting - 1);
477
- if (/\b(if|for|while|catch|match|select)\b/.test(line)) {
478
- cognitive += 1 + nesting;
479
- }
563
+ for (let i = 1; i < lines.length; i++) {
564
+ const line = lines[i];
565
+ if (BRACE_COGNITIVE_RE.test(line)) {
566
+ cognitive += 1 + nesting;
480
567
  }
568
+ const opens = (line.match(/\{/g) || []).length;
569
+ const closes = (line.match(/\}/g) || []).length;
570
+ nesting = Math.max(0, nesting + opens - closes);
481
571
  }
482
572
  return cognitive;
483
573
  }
574
+ function computePolyglotCognitive(lines, isPy) {
575
+ return isPy ? computePythonCognitive(lines) : computeBraceCognitive(lines);
576
+ }
484
577
  function walkMdFiles(dir, fileList = [], excludeDirs = [
485
578
  "node_modules",
486
579
  ".git",
@@ -1064,9 +1157,54 @@ function collectTestCorpus(rootDir, allMdFiles) {
1064
1157
  }
1065
1158
  return { gherkinSources, combinedTests: testContents.join("\n") };
1066
1159
  }
1067
- function assembleCoverageResult(reqAudit, taskAudit, useCaseFlows, reqErrors, taskErrors, ucErrors) {
1160
+ function isCucumberScenarioPassed(element) {
1161
+ const steps = Array.isArray(element.steps) ? element.steps : [];
1162
+ if (steps.length === 0) return false;
1163
+ return steps.every((s) => {
1164
+ const res = s.result;
1165
+ return res && res.status === "passed";
1166
+ });
1167
+ }
1168
+ function countCucumberScenarios(raw) {
1169
+ let passed = 0;
1170
+ let failed = 0;
1171
+ for (const feat of raw) {
1172
+ const elements = Array.isArray(feat.elements) ? feat.elements : [];
1173
+ for (const el of elements) {
1174
+ if (isCucumberScenarioPassed(el)) passed++;
1175
+ else failed++;
1176
+ }
1177
+ }
1178
+ return { passed, failed };
1179
+ }
1180
+ function parseCucumberReportFile(reportPath) {
1181
+ if (!fs7.existsSync(reportPath)) return void 0;
1182
+ try {
1183
+ const raw = JSON.parse(fs7.readFileSync(reportPath, "utf-8"));
1184
+ if (!Array.isArray(raw)) return void 0;
1185
+ const { passed, failed } = countCucumberScenarios(raw);
1186
+ return {
1187
+ evaluatedFeatures: raw.length,
1188
+ passedScenarios: passed,
1189
+ failedScenarios: failed,
1190
+ passed: passed + failed > 0 && failed === 0
1191
+ };
1192
+ } catch {
1193
+ return void 0;
1194
+ }
1195
+ }
1196
+ function resolveCucumberReport(rootDir, options) {
1197
+ const candidate = options.cucumberReportPath ? path4.isAbsolute(options.cucumberReportPath) ? options.cucumberReportPath : path4.join(rootDir, options.cucumberReportPath) : path4.join(rootDir, "reports", "cucumber-report.json");
1198
+ const parsed = parseCucumberReportFile(candidate);
1199
+ if (parsed) return parsed;
1200
+ if (options.enforceCucumberExecution) {
1201
+ return { evaluatedFeatures: 0, passedScenarios: 0, failedScenarios: 1, passed: false };
1202
+ }
1203
+ return void 0;
1204
+ }
1205
+ function assembleCoverageResult(reqAudit, taskAudit, useCaseFlows, reqErrors, taskErrors, ucErrors, rootDir, options) {
1068
1206
  return {
1069
- success: reqErrors === 0 && taskErrors === 0 && ucErrors === 0,
1207
+ success: reqErrors === 0 && taskErrors === 0 && ucErrors === 0 && (!resolveCucumberReport(rootDir, options) || resolveCucumberReport(rootDir, options).passed),
1070
1208
  totalRequirements: reqAudit.length,
1071
1209
  passedRequirements: reqAudit.length - reqErrors,
1072
1210
  failedRequirements: reqErrors,
@@ -1077,6 +1215,7 @@ function assembleCoverageResult(reqAudit, taskAudit, useCaseFlows, reqErrors, ta
1077
1215
  tasks: taskAudit,
1078
1216
  useCaseFlows,
1079
1217
  failedUseCaseFlows: ucErrors,
1218
+ ...resolveCucumberReport(rootDir, options) ? { cucumberExecution: resolveCucumberReport(rootDir, options) } : {},
1080
1219
  reportMarkdown: generateTestingCoverageReportMarkdown(reqAudit, taskAudit, reqErrors, taskErrors)
1081
1220
  };
1082
1221
  }
@@ -1128,7 +1267,9 @@ function verifyTestingCoverage(options = {}) {
1128
1267
  state.useCaseFlows,
1129
1268
  state.reqErrors,
1130
1269
  state.taskErrors,
1131
- state.ucErrors
1270
+ state.ucErrors,
1271
+ rootDir,
1272
+ options
1132
1273
  );
1133
1274
  }
1134
1275
 
@@ -5504,6 +5645,277 @@ function verifyTasksGovernance(options = {}) {
5504
5645
  );
5505
5646
  return assembleGovernanceResult(data, reportMarkdown);
5506
5647
  }
5648
+ var BddStepRegistry = class {
5649
+ definitions = [];
5650
+ register(pattern, handler) {
5651
+ this.definitions.push({ pattern, handler });
5652
+ return this;
5653
+ }
5654
+ given(pattern, handler) {
5655
+ return this.register(pattern, handler);
5656
+ }
5657
+ when(pattern, handler) {
5658
+ return this.register(pattern, handler);
5659
+ }
5660
+ then(pattern, handler) {
5661
+ return this.register(pattern, handler);
5662
+ }
5663
+ getDefinitions() {
5664
+ return this.definitions;
5665
+ }
5666
+ };
5667
+ var STEP_PREFIX_RE = /^(Given|When|Then|And|But|Dado|Cuando|Entonces|Y|Pero)\s+(.+)$/i;
5668
+ var SCENARIO_HEADER_RE = /^(Scenario|Escenario|Scenario Outline|Esquema del escenario):\s*(.+)$/i;
5669
+ function parseTableRowCells(line) {
5670
+ return line.trim().replace(/^\|/, "").replace(/\|$/, "").split("|").map((c) => c.trim());
5671
+ }
5672
+ function attachStepTableRow(lastStep, cells) {
5673
+ if (!lastStep || cells.length < 2) return;
5674
+ if (!lastStep.table) lastStep.table = {};
5675
+ lastStep.table[cells[0]] = cells[1];
5676
+ }
5677
+ function attachExampleRow(scenario, headers, cells) {
5678
+ if (!scenario) return headers;
5679
+ if (headers.length === 0) return cells;
5680
+ const row = {};
5681
+ for (let i = 0; i < headers.length; i++) {
5682
+ row[headers[i]] = cells[i] ?? "";
5683
+ }
5684
+ scenario.examples.push(row);
5685
+ return headers;
5686
+ }
5687
+ function createInitialParseState() {
5688
+ return {
5689
+ featureName: "Unnamed Feature",
5690
+ featureTags: [],
5691
+ pendingTags: [],
5692
+ backgroundSteps: [],
5693
+ scenarios: [],
5694
+ currentScenario: null,
5695
+ inBackground: false,
5696
+ inExamples: false,
5697
+ exampleHeaders: []
5698
+ };
5699
+ }
5700
+ function handleStructuralHeaderLine(line, state) {
5701
+ if (/^(Feature|Caracter[ií]stica):/i.test(line)) {
5702
+ state.featureName = line.replace(/^(Feature|Caracter[ií]stica):\s*/i, "").trim();
5703
+ state.featureTags.push(...state.pendingTags);
5704
+ state.pendingTags = [];
5705
+ return true;
5706
+ }
5707
+ if (/^(Background|Antecedentes):/i.test(line)) {
5708
+ state.inBackground = true;
5709
+ state.inExamples = false;
5710
+ state.currentScenario = null;
5711
+ return true;
5712
+ }
5713
+ if (/^(Examples|Ejemplos):/i.test(line)) {
5714
+ state.inExamples = true;
5715
+ state.exampleHeaders = [];
5716
+ return true;
5717
+ }
5718
+ return false;
5719
+ }
5720
+ function startScenarioBlock(scenMatch, state) {
5721
+ state.inBackground = false;
5722
+ state.inExamples = false;
5723
+ const block = {
5724
+ name: scenMatch[2].trim(),
5725
+ tags: [...state.featureTags, ...state.pendingTags],
5726
+ isOutline: /outline|esquema/i.test(scenMatch[1]),
5727
+ steps: [],
5728
+ examples: []
5729
+ };
5730
+ state.pendingTags = [];
5731
+ state.scenarios.push(block);
5732
+ state.currentScenario = block;
5733
+ }
5734
+ function appendParsedStep(stepMatch, state) {
5735
+ const step = { keyword: stepMatch[1], text: stepMatch[2].trim() };
5736
+ if (state.inBackground) {
5737
+ state.backgroundSteps.push(step);
5738
+ } else if (state.currentScenario) {
5739
+ state.currentScenario.steps.push(step);
5740
+ }
5741
+ }
5742
+ function handleScenarioOrStepLine(line, state) {
5743
+ const scenMatch = line.match(SCENARIO_HEADER_RE);
5744
+ if (scenMatch) {
5745
+ startScenarioBlock(scenMatch, state);
5746
+ return;
5747
+ }
5748
+ const stepMatch = line.match(STEP_PREFIX_RE);
5749
+ if (stepMatch) {
5750
+ appendParsedStep(stepMatch, state);
5751
+ }
5752
+ }
5753
+ function processFeatureLine(rawLine, state) {
5754
+ const line = rawLine.trim();
5755
+ if (!line || line.startsWith("#")) return;
5756
+ if (line.startsWith("@")) {
5757
+ const tags = line.split(/\s+/).filter((t) => t.startsWith("@"));
5758
+ state.pendingTags.push(...tags);
5759
+ return;
5760
+ }
5761
+ if (line.startsWith("|")) {
5762
+ const cells = parseTableRowCells(line);
5763
+ if (state.inExamples) {
5764
+ state.exampleHeaders = attachExampleRow(state.currentScenario, state.exampleHeaders, cells);
5765
+ } else {
5766
+ const targetList = state.inBackground ? state.backgroundSteps : state.currentScenario?.steps || [];
5767
+ attachStepTableRow(targetList[targetList.length - 1], cells);
5768
+ }
5769
+ return;
5770
+ }
5771
+ if (!handleStructuralHeaderLine(line, state)) {
5772
+ handleScenarioOrStepLine(line, state);
5773
+ }
5774
+ }
5775
+ function parseFeatureDocument(content) {
5776
+ const state = createInitialParseState();
5777
+ for (const rawLine of content.split(/\r?\n/)) {
5778
+ processFeatureLine(rawLine, state);
5779
+ }
5780
+ return {
5781
+ featureName: state.featureName,
5782
+ tags: state.featureTags,
5783
+ backgroundSteps: state.backgroundSteps,
5784
+ scenarios: state.scenarios
5785
+ };
5786
+ }
5787
+ function interpolatePlaceholders(text, row) {
5788
+ let out = text;
5789
+ for (const [k, v] of Object.entries(row)) {
5790
+ out = out.replace(new RegExp(`<${k}>`, "g"), v);
5791
+ }
5792
+ return out;
5793
+ }
5794
+ function expandScenarioOutlines(scenarios) {
5795
+ const expanded = [];
5796
+ for (const sc of scenarios) {
5797
+ if (!sc.isOutline || sc.examples.length === 0) {
5798
+ expanded.push(sc);
5799
+ continue;
5800
+ }
5801
+ sc.examples.forEach((row, idx) => {
5802
+ expanded.push({
5803
+ name: `${sc.name} (Example #${idx + 1})`,
5804
+ tags: sc.tags,
5805
+ isOutline: false,
5806
+ steps: sc.steps.map((st) => ({
5807
+ keyword: st.keyword,
5808
+ text: interpolatePlaceholders(st.text, row),
5809
+ table: st.table
5810
+ })),
5811
+ examples: []
5812
+ });
5813
+ });
5814
+ }
5815
+ return expanded;
5816
+ }
5817
+ function matchStepDefinition(text, definitions) {
5818
+ for (const entry of definitions) {
5819
+ if (typeof entry.pattern === "string") {
5820
+ if (entry.pattern === text) return { entry, args: [] };
5821
+ } else {
5822
+ const m = text.match(entry.pattern);
5823
+ if (m) return { entry, args: m.slice(1) };
5824
+ }
5825
+ }
5826
+ return null;
5827
+ }
5828
+ async function executeSingleStep(step, definitions) {
5829
+ const matched = matchStepDefinition(step.text, definitions);
5830
+ if (!matched) {
5831
+ return { keyword: step.keyword, text: step.text, status: "undefined", durationMs: 0 };
5832
+ }
5833
+ const start = Date.now();
5834
+ try {
5835
+ await matched.entry.handler(matched.args, step.table);
5836
+ return { keyword: step.keyword, text: step.text, status: "passed", durationMs: Date.now() - start };
5837
+ } catch (err) {
5838
+ const msg = err instanceof Error ? err.message : String(err);
5839
+ return {
5840
+ keyword: step.keyword,
5841
+ text: step.text,
5842
+ status: "failed",
5843
+ durationMs: Date.now() - start,
5844
+ errorMessage: msg
5845
+ };
5846
+ }
5847
+ }
5848
+ async function executeScenarioSteps(allSteps, definitions) {
5849
+ const stepResults = [];
5850
+ let status = "passed";
5851
+ for (const step of allSteps) {
5852
+ if (status !== "passed") {
5853
+ stepResults.push({ keyword: step.keyword, text: step.text, status: "skipped", durationMs: 0 });
5854
+ continue;
5855
+ }
5856
+ const res = await executeSingleStep(step, definitions);
5857
+ stepResults.push(res);
5858
+ if (res.status === "failed" || res.status === "undefined") {
5859
+ status = res.status;
5860
+ }
5861
+ }
5862
+ return { stepResults, status };
5863
+ }
5864
+ async function runAllExpandedScenarios(parsed, definitions) {
5865
+ const expanded = expandScenarioOutlines(parsed.scenarios);
5866
+ const out = [];
5867
+ for (const sc of expanded) {
5868
+ const combinedSteps = [...parsed.backgroundSteps, ...sc.steps];
5869
+ const { stepResults, status } = await executeScenarioSteps(combinedSteps, definitions);
5870
+ out.push({ name: sc.name, tags: sc.tags, status, steps: stepResults });
5871
+ }
5872
+ return out;
5873
+ }
5874
+ async function executeBddFeature(featurePath, registry, options = {}) {
5875
+ const rootDir = options.rootDir || process.cwd();
5876
+ const fullPath = path4.isAbsolute(featurePath) ? featurePath : path4.join(rootDir, featurePath);
5877
+ const parsed = parseFeatureDocument(fs7.readFileSync(fullPath, "utf-8"));
5878
+ const scenarios = await runAllExpandedScenarios(parsed, registry.getDefinitions());
5879
+ const report = {
5880
+ uri: path4.relative(rootDir, fullPath).replace(/\\/g, "/"),
5881
+ featureName: parsed.featureName,
5882
+ tags: parsed.tags,
5883
+ scenarios,
5884
+ passed: scenarios.length > 0 && scenarios.every((s) => s.status === "passed")
5885
+ };
5886
+ if (options.writeReportPath) writeCucumberJsonReport([report], options.writeReportPath);
5887
+ return report;
5888
+ }
5889
+ function mapStepToCucumberJson(st) {
5890
+ return {
5891
+ keyword: `${st.keyword} `,
5892
+ name: st.text,
5893
+ result: {
5894
+ status: st.status,
5895
+ duration: st.durationMs * 1e6,
5896
+ ...st.errorMessage ? { error_message: st.errorMessage } : {}
5897
+ }
5898
+ };
5899
+ }
5900
+ function mapFeatureToCucumberJson(r) {
5901
+ return {
5902
+ uri: r.uri,
5903
+ name: r.featureName,
5904
+ tags: r.tags.map((t) => ({ name: t })),
5905
+ elements: r.scenarios.map((sc) => ({
5906
+ type: "scenario",
5907
+ name: sc.name,
5908
+ tags: sc.tags.map((t) => ({ name: t })),
5909
+ steps: sc.steps.map(mapStepToCucumberJson)
5910
+ }))
5911
+ };
5912
+ }
5913
+ function writeCucumberJsonReport(reports, outputPath) {
5914
+ const dir = path4.dirname(outputPath);
5915
+ if (!fs7.existsSync(dir)) fs7.mkdirSync(dir, { recursive: true });
5916
+ const payload = JSON.stringify(reports.map(mapFeatureToCucumberJson), null, 2);
5917
+ fs7.writeFileSync(outputPath, payload, "utf-8");
5918
+ }
5507
5919
  function isToolAvailable(toolName) {
5508
5920
  try {
5509
5921
  const cmd = process.platform === "win32" ? "where" : "which";
@@ -6144,7 +6556,7 @@ function resolveProjectIdentity(options) {
6144
6556
  function buildBomMetadata(name, version) {
6145
6557
  return {
6146
6558
  timestamp: (/* @__PURE__ */ new Date()).toISOString(),
6147
- tools: [{ vendor: "AI-SDLC", name: "@aisdlc/core", version: "2.3.0" }],
6559
+ tools: [{ vendor: "AI-SDLC", name: "@aisdlc/core", version: "2.4.0" }],
6148
6560
  component: { type: "application", name, version }
6149
6561
  };
6150
6562
  }
@@ -16318,6 +16730,6 @@ function sanitizeDlpPayload(payload, policy = createDefaultDlpPolicy()) {
16318
16730
  }
16319
16731
  }
16320
16732
 
16321
- export { ALL_ARCHITECTURE_TEMPLATES, BRANCH_PATTERNS, DEFAULT_DLP_RULES, DEFAULT_EXCLUDED_PATTERNS, DEFAULT_EXCLUDES, DEFAULT_EXTENSIONS, DEFAULT_PRIVACY_POLICY, DEFAULT_SAST_EXCLUDES, GENERAL_SOURCE_EXTENSIONS, KPI_SUMMARY_END_TAG, KPI_SUMMARY_START_TAG, LIFECYCLE_SKILL_TEMPLATES, OpenSpecAdapter, PII_SAST_RULES, PREPARE_COMMIT_MSG_SCRIPT, PROMPT_INJECTION_SIGNATURES, PROTECTED_BYPASS_PATTERNS, SARIF_SCHEMA_2_1_0, SARIF_VERSION, SAST_RULES, SCHEMA_SCHEMAS_ARCHITECTURE_ADR_SCHEMA_JSON, SCHEMA_SCHEMAS_ARCHITECTURE_COMPONENT_SCHEMA_JSON, SCHEMA_SCHEMAS_ARCHITECTURE_INTRODUCTION_AND_GOALS_SCHEMA_JSON, SCHEMA_SCHEMAS_COMPLIANCE_LICENSE_MANIFEST_SCHEMA_JSON, SCHEMA_SCHEMAS_COMPLIANCE_LICENSE_POLICY_SCHEMA_JSON, SCHEMA_SCHEMAS_COMPLIANCE_QUALITY_POLICY_SCHEMA_JSON, SCHEMA_SCHEMAS_IDE_MCP_CONFIG_SCHEMA_JSON, SCHEMA_SCHEMAS_MANUALS_PRODUCTION_MANUAL_SCHEMA_JSON, SCHEMA_SCHEMAS_MANUALS_USER_MANUAL_SCHEMA_JSON, SCHEMA_SCHEMAS_PRIVACY_DATA_ASSET_SCHEMA_JSON, SCHEMA_SCHEMAS_PRIVACY_PRIVACY_POLICY_SCHEMA_JSON, SCHEMA_SCHEMAS_PRIVACY_PRIVACY_REQ_SCHEMA_JSON, SCHEMA_SCHEMAS_PRIVACY_PRIVACY_ROPA_SCHEMA_JSON, SCHEMA_SCHEMAS_PRODUCT_ACTOR_SCHEMA_JSON, SCHEMA_SCHEMAS_PRODUCT_BOUNDED_CONTEXT_SCHEMA_JSON, SCHEMA_SCHEMAS_PRODUCT_BUSINESS_RULE_SCHEMA_JSON, SCHEMA_SCHEMAS_PRODUCT_JOURNEY_SCHEMA_JSON, SCHEMA_SCHEMAS_PRODUCT_REQUIREMENT_SCHEMA_JSON, SCHEMA_SCHEMAS_PRODUCT_TERM_SCHEMA_JSON, SCHEMA_SCHEMAS_PRODUCT_USE_CASE_SCHEMA_JSON, SCHEMA_SCHEMAS_SAFETY_HAZARD_SCHEMA_JSON, SCHEMA_SCHEMAS_SAFETY_SAFETY_REQ_SCHEMA_JSON, SCHEMA_SCHEMAS_SDD_DESIGN_SCHEMA_JSON, SCHEMA_SCHEMAS_SDD_HANDOFF_SCHEMA_JSON, SCHEMA_SCHEMAS_SDD_PROPOSAL_SCHEMA_JSON, SCHEMA_SCHEMAS_SDD_RELEASE_KPIS_SCHEMA_JSON, SCHEMA_SCHEMAS_SDD_SESSION_TELEMETRY_SCHEMA_JSON, SCHEMA_SCHEMAS_SDD_SPEC_SCHEMA_JSON, SCHEMA_SCHEMAS_SDD_TASKS_SCHEMA_JSON, SCHEMA_SCHEMAS_SECURITY_ABUSE_CASE_SCHEMA_JSON, SCHEMA_SCHEMAS_SECURITY_ENCLAVE_SCHEMA_JSON, SCHEMA_SCHEMAS_SECURITY_SECURITY_REQ_SCHEMA_JSON, SCHEMA_SCHEMAS_SECURITY_THREAT_ACTOR_SCHEMA_JSON, SCHEMA_SCHEMAS_WORKFLOW_AGENT_HANDOFF_SCHEMA_JSON, SECRET_RULES, SPECIALIZED_AGENT_TEMPLATES, STARTER_ANTIGRAVITY_MCP, STARTER_ANTIGRAVITY_RULES, STARTER_ARCH_ADR, STARTER_ARCH_ARCHITECTURE_CONSTRAINTS, STARTER_ARCH_COMPONENT, STARTER_ARCH_CONTEXT_AND_SCOPE, STARTER_ARCH_CROSS_CUTTING_CONCEPTS, STARTER_ARCH_DEPLOYMENT_VIEW, STARTER_ARCH_GLOSSARY, STARTER_ARCH_INTRODUCTION_AND_GOALS, STARTER_ARCH_LEVEL_1_WHITEBOX, STARTER_ARCH_QUALITY_REQUIREMENTS, STARTER_ARCH_RISKS_AND_TECHNICAL_DEBT, STARTER_ARCH_RUNTIME_VIEW, STARTER_ARCH_SOLUTION_STRATEGY, STARTER_AZURE_PIPELINES, STARTER_BASE_TEMPLATES, STARTER_BITBUCKET_PIPELINES, STARTER_CLAUDE_RULES, STARTER_COMPLIANCE_LICENSE_MANIFEST_YAML, STARTER_COPILOT_RULES, STARTER_CURSOR_CORE_RULES, STARTER_CURSOR_MCP, STARTER_CURSOR_PRODUCT_RULES, STARTER_CURSOR_QUALITY_RULES, STARTER_GITHUB_CI, STARTER_GITHUB_DEPLOY_DASHBOARD, STARTER_GITHUB_PR_KPI, STARTER_GITHUB_PULL_REQUEST_TEMPLATE, STARTER_GITHUB_SDD_INTEGRATE, STARTER_GITLAB_CI, STARTER_LICENSE_POLICY, STARTER_PRIVACY_POLICY, STARTER_PROCESS_README, STARTER_PULL_REQUEST_TEMPLATE, STARTER_QUALITY_POLICY, STARTER_REQUIREMENT_TEMPLATE, STARTER_SCHEMAS, STARTER_SCHEMAS_MAP, STARTER_TASK_TEMPLATE, STARTER_TEMPLATES_CI_AZURE_PIPELINES_YML, STARTER_TEMPLATES_CI_BITBUCKET_PIPELINES_YML, STARTER_TEMPLATES_CI_GITHUB_WORKFLOWS_CI_YML, STARTER_TEMPLATES_CI_GITHUB_WORKFLOWS_DEPLOY_DASHBOARD_YML, STARTER_TEMPLATES_CI_GITHUB_WORKFLOWS_PR_KPI_SUMMARY_YML, STARTER_TEMPLATES_CI_GITHUB_WORKFLOWS_SDD_INTEGRATE_ON_MERGE_YML, STARTER_TEMPLATES_CI__GITLAB_CI_YML, STARTER_TEMPLATES_COMPLIANCE_COMMERCIAL_ACQUISITION_REQUEST_TEMPLATE_MD, STARTER_TEMPLATES_MANUALS_PRODUCTION_MANUAL_TEMPLATE_MD, STARTER_TEMPLATES_MANUALS_USER_MANUAL_TEMPLATE_MD, STARTER_TEMPLATES_PRIVACY_DATA_ASSET_TEMPLATE_MD, STARTER_TEMPLATES_PRIVACY_DPIA_REQUEST_TEMPLATE_MD, STARTER_TEMPLATES_PRIVACY_PRIVACY_REQ_TEMPLATE_MD, STARTER_TEMPLATES_PRIVACY_PRIVACY_ROPA_TEMPLATE_MD, STARTER_TEMPLATES_PRODUCT_ACTOR_TEMPLATE_MD, STARTER_TEMPLATES_PRODUCT_BOUNDED_CONTEXT_TEMPLATE_MD, STARTER_TEMPLATES_PRODUCT_BUSINESS_RULE_TEMPLATE_MD, STARTER_TEMPLATES_PRODUCT_JOURNEY_TEMPLATE_MD, STARTER_TEMPLATES_PRODUCT_REQUIREMENT_TEMPLATE_MD, STARTER_TEMPLATES_PRODUCT_TERM_TEMPLATE_MD, STARTER_TEMPLATES_PRODUCT_USER_DESIGN_FEEDBACK_TEMPLATE_MD, STARTER_TEMPLATES_PRODUCT_USE_CASE_TEMPLATE_MD, STARTER_TEMPLATES_SAFETY_HAZARD_TEMPLATE_MD, STARTER_TEMPLATES_SAFETY_SAFETY_REQ_TEMPLATE_MD, STARTER_TEMPLATES_SDD_DESIGN_TEMPLATE_MD, STARTER_TEMPLATES_SDD_HANDOFF_TEMPLATE_YAML, STARTER_TEMPLATES_SDD_PROPOSAL_TEMPLATE_MD, STARTER_TEMPLATES_SDD_PULL_REQUEST_TEMPLATE_MD, STARTER_TEMPLATES_SDD_SPEC_TEMPLATE_MD, STARTER_TEMPLATES_SDD_TASKS_TEMPLATE_MD, STARTER_TEMPLATES_SECURITY_ABUSE_CASE_TEMPLATE_MD, STARTER_TEMPLATES_SECURITY_ENCLAVE_TEMPLATE_MD, STARTER_TEMPLATES_SECURITY_SECURITY_REQ_TEMPLATE_MD, STARTER_TEMPLATES_SECURITY_THREAT_ACTOR_TEMPLATE_MD, STARTER_TEMPLATES_WORKFLOW_AGENT_HANDOFF_TEMPLATE_MD, STARTER_VSCODE_MCP, STARTER_WORKFLOW_HANDOFF_TEMPLATE, STARTER__GITHUB_PULL_REQUEST_TEMPLATE_MD, SpecKitAdapter, TYPE_TO_SCHEMA_MAP, VALID_AGENT_TARGETS, VALID_ARCHITECTURE_GRANULARITIES, VALID_AUTONOMY_MODES, VALID_CHANGE_PROFILES, VALID_CI_PROVIDERS, aggregateCommitKpiRecords, aggregatePrKpis, aggregateReleaseKpis, analyzeBddVariantsForRequirement, appendRevisionHistoryRow, applyRatchetMode, buildCycloneDxComponent, buildCycloneDxVulnerabilities, buildFeatureFileContent, buildGraphElements, calculateJaccardSimilarity, calculateMetrics, calculateRating, calculateShannonEntropy, checkGherkinInSync, checkoutTaskBranch, classifyBranch, classifyMetricFromMessage, collectAgentFiles, collectDashboardMetrics, collectHistoricalKpis, computeCanonicalSha256, computeSha256, computeViolationSignature, createDefaultDlpPolicy, createDefaultQualityPolicy, depositProductHandoffSidecar, detectActiveChangeForIntegration, detectAuthorIdentity, detectLanguage, detectProfileFromChange, detectPromptInjection, emitCiOutput, evaluateCompoundLicense, evaluateSingleDependency, evaluateVulnerabilityThresholds, extractBaselineEntriesFromResults, extractCitations, extractCommitKpisFromRange, extractDirectDepNames, extractFeatureTags, extractFrontmatter, extractFunctions, extractFunctionsBraceLanguages, extractFunctionsPolyglot, extractFunctionsPython, extractFunctionsTypeScriptAst, extractGherkinBlock, extractGherkinFeatures, extractNormativeText, findChangeWorkspaceDir, findLicenseFile, formatCommitTrailers, formatPrKpiMarkdown, formatReleaseKpiMarkdown, generateBranchHierarchyPlan, generateCycloneDxSbom, generateDashboardReport, generateDuplicatesReportMarkdown, generateGovernanceReportMarkdown, generateLicenseReportMarkdown, generatePdacReportMarkdown, generatePrivacyReportMarkdown, generateQualityReport, generateRopaInventoryMarkdown, generateSastReportMarkdown, generateSecretsReportMarkdown, generateSecuritySarifReport, generateSuppressionsAuditReport, generateTestingCoverageReportMarkdown, generateThirdPartyNotices, generateTraceabilityReportMarkdown, getArchitectureTemplates, getCytoscapeScript, getGitDiffLines, getNextCorrelativeNumber, getSddAdapter, inferArtifactTypeFromId, inferMissingTrailers, initProject, injectKpisIntoPrBody, installGitHooks, integrateSddChange, isGitleaksInstalled, isMetricWorsened, isPathProtectedFromPatch, isPlaceholderOrIgnored, isRequirementArtifact2 as isRequirementArtifact, isSemgrepInstalled, isToolAvailable, loadDlpPolicy, loadPrivacyPolicy, loadProductHandoffSidecar, loadQualityBaseline, locateTaskInActiveChanges, mapSastSeverityToSarifLevel, maskSecret, normalizeSpdxLicense, normalizeUri, parseCommitTrailers, parseDlpPolicy, parseFrontmatter, parseFrontmatterId, parseGenericDoc, parseLicensePolicy, parseMarkdownFrontmatter, parseQualityPolicy, parseRequirementFile, parseSecuritySuppression, parseSpecCatalogScope, parseTasksDoc, parseTasksFromContent, parseTrivyVulnerabilities, processPackageDir, readCodeCoverageSummary, readPackageJson, renderAntigravityAgentFile, renderAntigravitySkillFile, renderAutonomyModeSection, renderClaudeAgentFile, renderClaudeSkillFile, renderCopilotAgentFile, renderCopilotSkillFile, renderCursorAgentFile, renderCursorSkillFile, renderDashboardHtml, renderManualsTab, resolveAgentTargets, resolveBranchHierarchy, resolveCiEnvironment, resolveCytoscapePath, resolveDefaultBranchBase, resolveFeatureFilePath, resolveGitRef, resolveLicenseFromFile, resolveReleaseBaseBranch, resolveSastCwe, resolveSastOwasp, resolveSchemaForArtifact, resolveTargetFiles, runGitleaksCli, runSemgrepCli, sanitizeDlpPayload, sanitizeDlpText, scaffoldSddChange, scanAllProductHandoffs, scanAllTestArtifacts, scanContentForSecrets, scanFileForPrivacyViolations, scanFileForSast, scanGoDependencies, scanInstalledLicenses, scanManualsInWorkspace, scanMavenDependencies, scanPnpmStore, scanPythonDependencies, scanRustDependencies, scanSubdirectories, scanWithNativeFs, scanWithSyft, scanWithTrivy, serializeSarifDocument, slugify, syncPdacDigests, tokenizeTitle, updateCitationsInContent, validateAgainstSchema, validateArtifactSchema, verifyArtifactDuplicates, verifyArtifactsSchemas, verifyLicenses, verifyManuals, verifyPdacGraph, verifyPrivacy, verifyProgressiveFriction, verifyQualityGate, verifySast, verifySddIntegration, verifySecrets, verifyTasksGovernance, verifyTestingCoverage, verifyTraceability, walkDir, walkMdFiles, walkProjectFiles, walkSourceFiles, walkTaskFiles, writeCycloneDxSbom, writeQualityBaseline, writeReleaseKpiReport, writeSecuritySarifReport, writeThirdPartyNotices };
16733
+ export { ALL_ARCHITECTURE_TEMPLATES, BRANCH_PATTERNS, BddStepRegistry, DEFAULT_DLP_RULES, DEFAULT_EXCLUDED_PATTERNS, DEFAULT_EXCLUDES, DEFAULT_EXTENSIONS, DEFAULT_PRIVACY_POLICY, DEFAULT_SAST_EXCLUDES, GENERAL_SOURCE_EXTENSIONS, KPI_SUMMARY_END_TAG, KPI_SUMMARY_START_TAG, LIFECYCLE_SKILL_TEMPLATES, OpenSpecAdapter, PII_SAST_RULES, PREPARE_COMMIT_MSG_SCRIPT, PROMPT_INJECTION_SIGNATURES, PROTECTED_BYPASS_PATTERNS, SARIF_SCHEMA_2_1_0, SARIF_VERSION, SAST_RULES, SCHEMA_SCHEMAS_ARCHITECTURE_ADR_SCHEMA_JSON, SCHEMA_SCHEMAS_ARCHITECTURE_COMPONENT_SCHEMA_JSON, SCHEMA_SCHEMAS_ARCHITECTURE_INTRODUCTION_AND_GOALS_SCHEMA_JSON, SCHEMA_SCHEMAS_COMPLIANCE_LICENSE_MANIFEST_SCHEMA_JSON, SCHEMA_SCHEMAS_COMPLIANCE_LICENSE_POLICY_SCHEMA_JSON, SCHEMA_SCHEMAS_COMPLIANCE_QUALITY_POLICY_SCHEMA_JSON, SCHEMA_SCHEMAS_IDE_MCP_CONFIG_SCHEMA_JSON, SCHEMA_SCHEMAS_MANUALS_PRODUCTION_MANUAL_SCHEMA_JSON, SCHEMA_SCHEMAS_MANUALS_USER_MANUAL_SCHEMA_JSON, SCHEMA_SCHEMAS_PRIVACY_DATA_ASSET_SCHEMA_JSON, SCHEMA_SCHEMAS_PRIVACY_PRIVACY_POLICY_SCHEMA_JSON, SCHEMA_SCHEMAS_PRIVACY_PRIVACY_REQ_SCHEMA_JSON, SCHEMA_SCHEMAS_PRIVACY_PRIVACY_ROPA_SCHEMA_JSON, SCHEMA_SCHEMAS_PRODUCT_ACTOR_SCHEMA_JSON, SCHEMA_SCHEMAS_PRODUCT_BOUNDED_CONTEXT_SCHEMA_JSON, SCHEMA_SCHEMAS_PRODUCT_BUSINESS_RULE_SCHEMA_JSON, SCHEMA_SCHEMAS_PRODUCT_JOURNEY_SCHEMA_JSON, SCHEMA_SCHEMAS_PRODUCT_REQUIREMENT_SCHEMA_JSON, SCHEMA_SCHEMAS_PRODUCT_TERM_SCHEMA_JSON, SCHEMA_SCHEMAS_PRODUCT_USE_CASE_SCHEMA_JSON, SCHEMA_SCHEMAS_SAFETY_HAZARD_SCHEMA_JSON, SCHEMA_SCHEMAS_SAFETY_SAFETY_REQ_SCHEMA_JSON, SCHEMA_SCHEMAS_SDD_DESIGN_SCHEMA_JSON, SCHEMA_SCHEMAS_SDD_HANDOFF_SCHEMA_JSON, SCHEMA_SCHEMAS_SDD_PROPOSAL_SCHEMA_JSON, SCHEMA_SCHEMAS_SDD_RELEASE_KPIS_SCHEMA_JSON, SCHEMA_SCHEMAS_SDD_SESSION_TELEMETRY_SCHEMA_JSON, SCHEMA_SCHEMAS_SDD_SPEC_SCHEMA_JSON, SCHEMA_SCHEMAS_SDD_TASKS_SCHEMA_JSON, SCHEMA_SCHEMAS_SECURITY_ABUSE_CASE_SCHEMA_JSON, SCHEMA_SCHEMAS_SECURITY_ENCLAVE_SCHEMA_JSON, SCHEMA_SCHEMAS_SECURITY_SECURITY_REQ_SCHEMA_JSON, SCHEMA_SCHEMAS_SECURITY_THREAT_ACTOR_SCHEMA_JSON, SCHEMA_SCHEMAS_WORKFLOW_AGENT_HANDOFF_SCHEMA_JSON, SECRET_RULES, SPECIALIZED_AGENT_TEMPLATES, STARTER_ANTIGRAVITY_MCP, STARTER_ANTIGRAVITY_RULES, STARTER_ARCH_ADR, STARTER_ARCH_ARCHITECTURE_CONSTRAINTS, STARTER_ARCH_COMPONENT, STARTER_ARCH_CONTEXT_AND_SCOPE, STARTER_ARCH_CROSS_CUTTING_CONCEPTS, STARTER_ARCH_DEPLOYMENT_VIEW, STARTER_ARCH_GLOSSARY, STARTER_ARCH_INTRODUCTION_AND_GOALS, STARTER_ARCH_LEVEL_1_WHITEBOX, STARTER_ARCH_QUALITY_REQUIREMENTS, STARTER_ARCH_RISKS_AND_TECHNICAL_DEBT, STARTER_ARCH_RUNTIME_VIEW, STARTER_ARCH_SOLUTION_STRATEGY, STARTER_AZURE_PIPELINES, STARTER_BASE_TEMPLATES, STARTER_BITBUCKET_PIPELINES, STARTER_CLAUDE_RULES, STARTER_COMPLIANCE_LICENSE_MANIFEST_YAML, STARTER_COPILOT_RULES, STARTER_CURSOR_CORE_RULES, STARTER_CURSOR_MCP, STARTER_CURSOR_PRODUCT_RULES, STARTER_CURSOR_QUALITY_RULES, STARTER_GITHUB_CI, STARTER_GITHUB_DEPLOY_DASHBOARD, STARTER_GITHUB_PR_KPI, STARTER_GITHUB_PULL_REQUEST_TEMPLATE, STARTER_GITHUB_SDD_INTEGRATE, STARTER_GITLAB_CI, STARTER_LICENSE_POLICY, STARTER_PRIVACY_POLICY, STARTER_PROCESS_README, STARTER_PULL_REQUEST_TEMPLATE, STARTER_QUALITY_POLICY, STARTER_REQUIREMENT_TEMPLATE, STARTER_SCHEMAS, STARTER_SCHEMAS_MAP, STARTER_TASK_TEMPLATE, STARTER_TEMPLATES_CI_AZURE_PIPELINES_YML, STARTER_TEMPLATES_CI_BITBUCKET_PIPELINES_YML, STARTER_TEMPLATES_CI_GITHUB_WORKFLOWS_CI_YML, STARTER_TEMPLATES_CI_GITHUB_WORKFLOWS_DEPLOY_DASHBOARD_YML, STARTER_TEMPLATES_CI_GITHUB_WORKFLOWS_PR_KPI_SUMMARY_YML, STARTER_TEMPLATES_CI_GITHUB_WORKFLOWS_SDD_INTEGRATE_ON_MERGE_YML, STARTER_TEMPLATES_CI__GITLAB_CI_YML, STARTER_TEMPLATES_COMPLIANCE_COMMERCIAL_ACQUISITION_REQUEST_TEMPLATE_MD, STARTER_TEMPLATES_MANUALS_PRODUCTION_MANUAL_TEMPLATE_MD, STARTER_TEMPLATES_MANUALS_USER_MANUAL_TEMPLATE_MD, STARTER_TEMPLATES_PRIVACY_DATA_ASSET_TEMPLATE_MD, STARTER_TEMPLATES_PRIVACY_DPIA_REQUEST_TEMPLATE_MD, STARTER_TEMPLATES_PRIVACY_PRIVACY_REQ_TEMPLATE_MD, STARTER_TEMPLATES_PRIVACY_PRIVACY_ROPA_TEMPLATE_MD, STARTER_TEMPLATES_PRODUCT_ACTOR_TEMPLATE_MD, STARTER_TEMPLATES_PRODUCT_BOUNDED_CONTEXT_TEMPLATE_MD, STARTER_TEMPLATES_PRODUCT_BUSINESS_RULE_TEMPLATE_MD, STARTER_TEMPLATES_PRODUCT_JOURNEY_TEMPLATE_MD, STARTER_TEMPLATES_PRODUCT_REQUIREMENT_TEMPLATE_MD, STARTER_TEMPLATES_PRODUCT_TERM_TEMPLATE_MD, STARTER_TEMPLATES_PRODUCT_USER_DESIGN_FEEDBACK_TEMPLATE_MD, STARTER_TEMPLATES_PRODUCT_USE_CASE_TEMPLATE_MD, STARTER_TEMPLATES_SAFETY_HAZARD_TEMPLATE_MD, STARTER_TEMPLATES_SAFETY_SAFETY_REQ_TEMPLATE_MD, STARTER_TEMPLATES_SDD_DESIGN_TEMPLATE_MD, STARTER_TEMPLATES_SDD_HANDOFF_TEMPLATE_YAML, STARTER_TEMPLATES_SDD_PROPOSAL_TEMPLATE_MD, STARTER_TEMPLATES_SDD_PULL_REQUEST_TEMPLATE_MD, STARTER_TEMPLATES_SDD_SPEC_TEMPLATE_MD, STARTER_TEMPLATES_SDD_TASKS_TEMPLATE_MD, STARTER_TEMPLATES_SECURITY_ABUSE_CASE_TEMPLATE_MD, STARTER_TEMPLATES_SECURITY_ENCLAVE_TEMPLATE_MD, STARTER_TEMPLATES_SECURITY_SECURITY_REQ_TEMPLATE_MD, STARTER_TEMPLATES_SECURITY_THREAT_ACTOR_TEMPLATE_MD, STARTER_TEMPLATES_WORKFLOW_AGENT_HANDOFF_TEMPLATE_MD, STARTER_VSCODE_MCP, STARTER_WORKFLOW_HANDOFF_TEMPLATE, STARTER__GITHUB_PULL_REQUEST_TEMPLATE_MD, SpecKitAdapter, TYPE_TO_SCHEMA_MAP, VALID_AGENT_TARGETS, VALID_ARCHITECTURE_GRANULARITIES, VALID_AUTONOMY_MODES, VALID_CHANGE_PROFILES, VALID_CI_PROVIDERS, aggregateCommitKpiRecords, aggregatePrKpis, aggregateReleaseKpis, analyzeBddVariantsForRequirement, appendRevisionHistoryRow, applyRatchetMode, buildCycloneDxComponent, buildCycloneDxVulnerabilities, buildFeatureFileContent, buildGraphElements, calculateJaccardSimilarity, calculateMetrics, calculateRating, calculateShannonEntropy, checkGherkinInSync, checkoutTaskBranch, classifyBranch, classifyMetricFromMessage, collectAgentFiles, collectDashboardMetrics, collectHistoricalKpis, computeCanonicalSha256, computeSha256, computeViolationSignature, createDefaultDlpPolicy, createDefaultQualityPolicy, depositProductHandoffSidecar, detectActiveChangeForIntegration, detectAuthorIdentity, detectLanguage, detectProfileFromChange, detectPromptInjection, emitCiOutput, evaluateCompoundLicense, evaluateSingleDependency, evaluateVulnerabilityThresholds, executeBddFeature, extractBaselineEntriesFromResults, extractCitations, extractCommitKpisFromRange, extractDirectDepNames, extractFeatureTags, extractFrontmatter, extractFunctions, extractFunctionsBraceLanguages, extractFunctionsPolyglot, extractFunctionsPython, extractFunctionsTypeScriptAst, extractGherkinBlock, extractGherkinFeatures, extractNormativeText, findChangeWorkspaceDir, findLicenseFile, formatCommitTrailers, formatPrKpiMarkdown, formatReleaseKpiMarkdown, generateBranchHierarchyPlan, generateCycloneDxSbom, generateDashboardReport, generateDuplicatesReportMarkdown, generateGovernanceReportMarkdown, generateLicenseReportMarkdown, generatePdacReportMarkdown, generatePrivacyReportMarkdown, generateQualityReport, generateRopaInventoryMarkdown, generateSastReportMarkdown, generateSecretsReportMarkdown, generateSecuritySarifReport, generateSuppressionsAuditReport, generateTestingCoverageReportMarkdown, generateThirdPartyNotices, generateTraceabilityReportMarkdown, getArchitectureTemplates, getCytoscapeScript, getGitDiffLines, getNextCorrelativeNumber, getSddAdapter, inferArtifactTypeFromId, inferMissingTrailers, initProject, injectKpisIntoPrBody, installGitHooks, integrateSddChange, isGitleaksInstalled, isMetricWorsened, isPathProtectedFromPatch, isPlaceholderOrIgnored, isRequirementArtifact2 as isRequirementArtifact, isSemgrepInstalled, isToolAvailable, loadDlpPolicy, loadPrivacyPolicy, loadProductHandoffSidecar, loadQualityBaseline, locateTaskInActiveChanges, mapSastSeverityToSarifLevel, maskSecret, normalizeSpdxLicense, normalizeUri, parseCommitTrailers, parseDlpPolicy, parseFeatureDocument, parseFrontmatter, parseFrontmatterId, parseGenericDoc, parseLicensePolicy, parseMarkdownFrontmatter, parseQualityPolicy, parseRequirementFile, parseSecuritySuppression, parseSpecCatalogScope, parseTasksDoc, parseTasksFromContent, parseTrivyVulnerabilities, processPackageDir, readCodeCoverageSummary, readPackageJson, renderAntigravityAgentFile, renderAntigravitySkillFile, renderAutonomyModeSection, renderClaudeAgentFile, renderClaudeSkillFile, renderCopilotAgentFile, renderCopilotSkillFile, renderCursorAgentFile, renderCursorSkillFile, renderDashboardHtml, renderManualsTab, resolveAgentTargets, resolveBranchHierarchy, resolveCiEnvironment, resolveCytoscapePath, resolveDefaultBranchBase, resolveFeatureFilePath, resolveGitRef, resolveLicenseFromFile, resolveReleaseBaseBranch, resolveSastCwe, resolveSastOwasp, resolveSchemaForArtifact, resolveTargetFiles, runGitleaksCli, runSemgrepCli, sanitizeDlpPayload, sanitizeDlpText, scaffoldSddChange, scanAllProductHandoffs, scanAllTestArtifacts, scanContentForSecrets, scanFileForPrivacyViolations, scanFileForSast, scanGoDependencies, scanInstalledLicenses, scanManualsInWorkspace, scanMavenDependencies, scanPnpmStore, scanPythonDependencies, scanRustDependencies, scanSubdirectories, scanWithNativeFs, scanWithSyft, scanWithTrivy, serializeSarifDocument, slugify, syncPdacDigests, tokenizeTitle, updateCitationsInContent, validateAgainstSchema, validateArtifactSchema, verifyArtifactDuplicates, verifyArtifactsSchemas, verifyLicenses, verifyManuals, verifyPdacGraph, verifyPrivacy, verifyProgressiveFriction, verifyQualityGate, verifySast, verifySddIntegration, verifySecrets, verifyTasksGovernance, verifyTestingCoverage, verifyTraceability, walkDir, walkMdFiles, walkProjectFiles, walkSourceFiles, walkTaskFiles, writeCucumberJsonReport, writeCycloneDxSbom, writeQualityBaseline, writeReleaseKpiReport, writeSecuritySarifReport, writeThirdPartyNotices };
16322
16734
  //# sourceMappingURL=index.js.map
16323
16735
  //# sourceMappingURL=index.js.map