@aisdlc/core 2.2.4 → 2.3.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
@@ -5657,6 +5657,214 @@ function scanPnpmStore(pnpmDir, directNames, seen) {
5657
5657
  }
5658
5658
  }
5659
5659
  }
5660
+ function readTextIfExists(filePath) {
5661
+ if (!fs7.existsSync(filePath)) return null;
5662
+ try {
5663
+ return fs7.readFileSync(filePath, "utf-8");
5664
+ } catch {
5665
+ return null;
5666
+ }
5667
+ }
5668
+ function extractTomlField(block, key) {
5669
+ const m = block.match(new RegExp(`^\\s*${key}\\s*=\\s*["']([^"']+)["']`, "m"));
5670
+ return m ? m[1].trim() : void 0;
5671
+ }
5672
+ function extractPyprojectDirectDeps(content) {
5673
+ const direct = /* @__PURE__ */ new Set();
5674
+ const matches = content.matchAll(/^([a-zA-Z0-9_.-]+)\s*=\s*(?:["'{]|true)/gm);
5675
+ for (const m of matches) {
5676
+ const key = m[1].toLowerCase();
5677
+ if (!["name", "version", "description", "license", "python", "readme"].includes(key)) {
5678
+ direct.add(key);
5679
+ }
5680
+ }
5681
+ return direct;
5682
+ }
5683
+ function parseSingleTomlBlock(block, lockPath, directNames) {
5684
+ const name = extractTomlField(block, "name");
5685
+ const version = extractTomlField(block, "version");
5686
+ if (!name || !version) return null;
5687
+ const spdx = normalizeSpdxLicense(extractTomlField(block, "license") || "UNKNOWN");
5688
+ return {
5689
+ name,
5690
+ version,
5691
+ spdxLicense: spdx,
5692
+ purl: `pkg:pypi/${name.toLowerCase()}@${version}`,
5693
+ path: lockPath,
5694
+ isDirect: directNames.size === 0 || directNames.has(name.toLowerCase())
5695
+ };
5696
+ }
5697
+ function parseTomlPackageBlocks(content, lockPath, directNames, seen) {
5698
+ for (const block of content.split(/\[\[package\]\]/g).slice(1)) {
5699
+ const dep = parseSingleTomlBlock(block, lockPath, directNames);
5700
+ if (dep && !seen.has(`pypi:${dep.name}@${dep.version}`)) {
5701
+ seen.set(`pypi:${dep.name}@${dep.version}`, dep);
5702
+ }
5703
+ }
5704
+ }
5705
+ function parsePipfileSection(pkgs, isDirect, lockPath, seen) {
5706
+ for (const [name, meta] of Object.entries(pkgs)) {
5707
+ const rawVer = String(meta.version || "").replace(/^==/, "") || "unknown";
5708
+ const spdx = normalizeSpdxLicense(meta.license || "UNKNOWN");
5709
+ const key = `pypi:${name}@${rawVer}`;
5710
+ if (!seen.has(key)) {
5711
+ seen.set(key, {
5712
+ name,
5713
+ version: rawVer,
5714
+ spdxLicense: spdx,
5715
+ purl: `pkg:pypi/${name.toLowerCase()}@${rawVer}`,
5716
+ path: lockPath,
5717
+ isDirect
5718
+ });
5719
+ }
5720
+ }
5721
+ }
5722
+ function scanPythonDependencies(rootDir, seen) {
5723
+ const pyproject = readTextIfExists(path4.join(rootDir, "pyproject.toml")) || "";
5724
+ const directNames = extractPyprojectDirectDeps(pyproject);
5725
+ for (const lockName of ["poetry.lock", "uv.lock"]) {
5726
+ const lockPath = path4.join(rootDir, lockName);
5727
+ const content = readTextIfExists(lockPath);
5728
+ if (content) parseTomlPackageBlocks(content, lockPath, directNames, seen);
5729
+ }
5730
+ const pipfileLockPath = path4.join(rootDir, "Pipfile.lock");
5731
+ const pipfileRaw = readTextIfExists(pipfileLockPath);
5732
+ if (!pipfileRaw) return;
5733
+ try {
5734
+ const data = JSON.parse(pipfileRaw);
5735
+ parsePipfileSection(data.default || {}, true, pipfileLockPath, seen);
5736
+ parsePipfileSection(data.develop || {}, false, pipfileLockPath, seen);
5737
+ } catch {
5738
+ }
5739
+ }
5740
+ function parseGoRequireLine(line, goModPath) {
5741
+ const cleaned = line.replace(/^require\s+/, "").trim();
5742
+ const commentIdx = cleaned.indexOf("//");
5743
+ const codePart = (commentIdx >= 0 ? cleaned.slice(0, commentIdx) : cleaned).trim();
5744
+ const commentPart = commentIdx >= 0 ? cleaned.slice(commentIdx + 2).trim() : "";
5745
+ const parts = codePart.split(/\s+/);
5746
+ if (parts.length < 2) return null;
5747
+ const modName = parts[0];
5748
+ const rawVer = parts[1].replace(/^v/, "");
5749
+ const isIndirect = /\bindirect\b/i.test(commentPart);
5750
+ const licenseMatch = commentPart.match(/(?:spdx|license)\s*:\s*([A-Za-z0-9.+-]+)/i);
5751
+ const spdx = licenseMatch ? normalizeSpdxLicense(licenseMatch[1]) : "UNKNOWN";
5752
+ return {
5753
+ name: modName,
5754
+ version: rawVer,
5755
+ spdxLicense: spdx,
5756
+ purl: `pkg:golang/${modName}@v${rawVer}`,
5757
+ path: goModPath,
5758
+ isDirect: !isIndirect
5759
+ };
5760
+ }
5761
+ function extractGoCandidateLines(content) {
5762
+ const out = [];
5763
+ let inBlock = false;
5764
+ for (const rawLine of content.split(/\r?\n/)) {
5765
+ const trimmed = rawLine.trim();
5766
+ if (/^require\s*\($/.test(trimmed)) inBlock = true;
5767
+ else if (inBlock && trimmed === ")") inBlock = false;
5768
+ else if (inBlock || trimmed.startsWith("require ")) out.push(trimmed);
5769
+ }
5770
+ return out;
5771
+ }
5772
+ function scanGoDependencies(rootDir, seen) {
5773
+ const goModPath = path4.join(rootDir, "go.mod");
5774
+ const content = readTextIfExists(goModPath);
5775
+ if (!content) return;
5776
+ for (const line of extractGoCandidateLines(content)) {
5777
+ const dep = parseGoRequireLine(line, goModPath);
5778
+ if (dep && !seen.has(`golang:${dep.name}@${dep.version}`)) {
5779
+ seen.set(`golang:${dep.name}@${dep.version}`, dep);
5780
+ }
5781
+ }
5782
+ }
5783
+ function extractCargoDirectDeps(cargoToml) {
5784
+ const map = /* @__PURE__ */ new Map();
5785
+ let inDeps = false;
5786
+ for (const line of cargoToml.split(/\r?\n/)) {
5787
+ const trimmed = line.trim();
5788
+ if (trimmed.startsWith("[")) {
5789
+ inDeps = /^\[(?:dev-|build-)?dependencies\]$/.test(trimmed);
5790
+ continue;
5791
+ }
5792
+ if (!inDeps || !trimmed || trimmed.startsWith("#")) continue;
5793
+ const m = trimmed.match(/^([a-zA-Z0-9_-]+)\s*=\s*(.+)$/);
5794
+ if (m) {
5795
+ const licMatch = m[2].match(/license\s*=\s*["']([^"']+)["']/);
5796
+ map.set(m[1], licMatch ? licMatch[1] : "UNKNOWN");
5797
+ }
5798
+ }
5799
+ return map;
5800
+ }
5801
+ function parseCargoLockBlock(block, rootName, directMeta, cargoLockPath) {
5802
+ const name = extractTomlField(block, "name");
5803
+ const version = extractTomlField(block, "version");
5804
+ if (!name || !version || name === rootName) return null;
5805
+ const blockLic = extractTomlField(block, "license") || directMeta.get(name) || "UNKNOWN";
5806
+ return {
5807
+ name,
5808
+ version,
5809
+ spdxLicense: normalizeSpdxLicense(blockLic),
5810
+ purl: `pkg:cargo/${name}@${version}`,
5811
+ path: cargoLockPath,
5812
+ isDirect: directMeta.size === 0 || directMeta.has(name)
5813
+ };
5814
+ }
5815
+ function scanRustDependencies(rootDir, seen) {
5816
+ const cargoLockPath = path4.join(rootDir, "Cargo.lock");
5817
+ const lockContent = readTextIfExists(cargoLockPath);
5818
+ if (!lockContent) return;
5819
+ const cargoToml = readTextIfExists(path4.join(rootDir, "Cargo.toml")) || "";
5820
+ const directMeta = extractCargoDirectDeps(cargoToml);
5821
+ const rootName = extractTomlField(cargoToml, "name");
5822
+ for (const block of lockContent.split(/\[\[package\]\]/g).slice(1)) {
5823
+ const dep = parseCargoLockBlock(block, rootName, directMeta, cargoLockPath);
5824
+ if (dep && !seen.has(`cargo:${dep.name}@${dep.version}`)) {
5825
+ seen.set(`cargo:${dep.name}@${dep.version}`, dep);
5826
+ }
5827
+ }
5828
+ }
5829
+ function extractXmlTag(xml, tag) {
5830
+ const m = xml.match(new RegExp(`<${tag}>([^<]+)</${tag}>`));
5831
+ return m ? m[1].trim() : void 0;
5832
+ }
5833
+ function resolveMavenBlockLicense(block, defaultLic) {
5834
+ const tagLic = extractXmlTag(block, "license");
5835
+ if (tagLic) return tagLic;
5836
+ const commentLic = block.match(/<!--\s*(?:spdx|license)\s*:\s*([A-Za-z0-9.+-]+)\s*-->/i)?.[1];
5837
+ return commentLic || defaultLic;
5838
+ }
5839
+ function parseMavenDepBlock(block, defaultLic, pomPath) {
5840
+ const groupId = extractXmlTag(block, "groupId");
5841
+ const artifactId = extractXmlTag(block, "artifactId");
5842
+ if (!groupId || !artifactId) return null;
5843
+ const version = extractXmlTag(block, "version") || "unknown";
5844
+ const inlineLic = resolveMavenBlockLicense(block, defaultLic);
5845
+ return {
5846
+ name: `${groupId}:${artifactId}`,
5847
+ version,
5848
+ spdxLicense: normalizeSpdxLicense(inlineLic),
5849
+ purl: `pkg:maven/${groupId}/${artifactId}@${version}`,
5850
+ path: pomPath,
5851
+ isDirect: true
5852
+ };
5853
+ }
5854
+ function scanMavenDependencies(rootDir, seen) {
5855
+ const pomPath = path4.join(rootDir, "pom.xml");
5856
+ const content = readTextIfExists(pomPath);
5857
+ if (!content) return;
5858
+ const projectLicBlock = content.match(/<licenses>([\s\S]*?)<\/licenses>/)?.[1] || "";
5859
+ const defaultLic = extractXmlTag(projectLicBlock, "name") || "UNKNOWN";
5860
+ const depBlocks = content.match(/<dependency>[\s\S]*?<\/dependency>/g) || [];
5861
+ for (const block of depBlocks) {
5862
+ const dep = parseMavenDepBlock(block, defaultLic, pomPath);
5863
+ if (dep && !seen.has(`maven:${dep.name}@${dep.version}`)) {
5864
+ seen.set(`maven:${dep.name}@${dep.version}`, dep);
5865
+ }
5866
+ }
5867
+ }
5660
5868
  function scanWithNativeFs(rootDir, options = {}) {
5661
5869
  const directNames = extractDirectDepNames(rootDir, options.productionOnly);
5662
5870
  const seen = /* @__PURE__ */ new Map();
@@ -5667,6 +5875,10 @@ function scanWithNativeFs(rootDir, options = {}) {
5667
5875
  scanPnpmStore(path4.join(nmDir, ".pnpm"), directNames, seen);
5668
5876
  }
5669
5877
  }
5878
+ scanPythonDependencies(rootDir, seen);
5879
+ scanGoDependencies(rootDir, seen);
5880
+ scanRustDependencies(rootDir, seen);
5881
+ scanMavenDependencies(rootDir, seen);
5670
5882
  const allDeps = Array.from(seen.values());
5671
5883
  if (options.depth === "direct") {
5672
5884
  return allDeps.filter((d) => d.isDirect);
@@ -5736,10 +5948,17 @@ var SEVERITY_RANK = {
5736
5948
  LOW: 1,
5737
5949
  UNKNOWN: 0
5738
5950
  };
5951
+ function isExemptByVex(v, vexStatements) {
5952
+ if (!vexStatements || vexStatements.length === 0) return false;
5953
+ return vexStatements.some(
5954
+ (stmt) => stmt.id === v.id && (stmt.state === "not_affected" || stmt.state === "fixed") && (!stmt.package || stmt.package === v.packageName)
5955
+ );
5956
+ }
5739
5957
  function evaluateVulnerabilityThresholds(vulnerabilities, options) {
5740
5958
  const minRank = options?.failOnSeverity ? SEVERITY_RANK[options.failOnSeverity] ?? 3 : void 0;
5741
5959
  const maxScore = options?.maxCvssScore;
5742
5960
  const failing = vulnerabilities.filter((v) => {
5961
+ if (isExemptByVex(v, options?.vexStatements)) return false;
5743
5962
  const rankMatch = minRank !== void 0 && SEVERITY_RANK[v.severity] >= minRank;
5744
5963
  const scoreMatch = maxScore !== void 0 && v.cvssV3Score !== void 0 && v.cvssV3Score >= maxScore;
5745
5964
  return rankMatch || scoreMatch;
@@ -5869,42 +6088,77 @@ function buildCycloneDxComponent(dep) {
5869
6088
  }
5870
6089
  return comp;
5871
6090
  }
5872
- function generateCycloneDxSbom(dependencies, options = {}) {
6091
+ function buildVexAnalysis(vex) {
6092
+ if (!vex) return void 0;
6093
+ return {
6094
+ state: vex.state,
6095
+ justification: vex.justification,
6096
+ detail: vex.detail,
6097
+ response: vex.response
6098
+ };
6099
+ }
6100
+ function mapScaVulnToCycloneDx(v, vexStatements) {
6101
+ const matchingVex = vexStatements.find(
6102
+ (stmt) => stmt.id === v.id && (!stmt.package || stmt.package === v.packageName)
6103
+ );
6104
+ return {
6105
+ id: v.id,
6106
+ source: v.primaryUrl ? { name: "NVD/GHSA", url: v.primaryUrl } : void 0,
6107
+ ratings: [{ score: v.cvssV3Score, severity: v.severity.toLowerCase(), method: "CVSSv3", vector: v.cvssV3Vector }],
6108
+ analysis: buildVexAnalysis(matchingVex),
6109
+ affects: [{ ref: `pkg:npm/${v.packageName}@${v.installedVersion}` }]
6110
+ };
6111
+ }
6112
+ function mapStandaloneVex(stmt) {
6113
+ return {
6114
+ id: stmt.id,
6115
+ analysis: buildVexAnalysis(stmt),
6116
+ affects: stmt.package ? [{ ref: stmt.package }] : void 0
6117
+ };
6118
+ }
6119
+ function buildCycloneDxVulnerabilities(vulnerabilities = [], vexStatements = []) {
6120
+ const out = vulnerabilities.map((v) => mapScaVulnToCycloneDx(v, vexStatements));
6121
+ const seenIds = new Set(out.map((item) => item.id));
6122
+ for (const stmt of vexStatements) {
6123
+ if (!seenIds.has(stmt.id)) {
6124
+ out.push(mapStandaloneVex(stmt));
6125
+ seenIds.add(stmt.id);
6126
+ }
6127
+ }
6128
+ return out;
6129
+ }
6130
+ function resolveProjectIdentity(options) {
5873
6131
  let name = options.projectName || "ai-sdlc-project";
5874
6132
  let version = options.projectVersion || "1.0.0";
5875
- if (options.rootDir) {
5876
- const pkgPath = path4.join(options.rootDir, "package.json");
5877
- if (fs7.existsSync(pkgPath)) {
5878
- try {
5879
- const pkg = JSON.parse(fs7.readFileSync(pkgPath, "utf-8"));
5880
- if (pkg.name) name = pkg.name;
5881
- if (pkg.version) version = pkg.version;
5882
- } catch {
5883
- }
5884
- }
6133
+ if (!options.rootDir) return { name, version };
6134
+ const pkgPath = path4.join(options.rootDir, "package.json");
6135
+ if (!fs7.existsSync(pkgPath)) return { name, version };
6136
+ try {
6137
+ const pkg = JSON.parse(fs7.readFileSync(pkgPath, "utf-8"));
6138
+ if (pkg.name) name = pkg.name;
6139
+ if (pkg.version) version = pkg.version;
6140
+ } catch {
5885
6141
  }
5886
- const components = dependencies.map(buildCycloneDxComponent);
6142
+ return { name, version };
6143
+ }
6144
+ function buildBomMetadata(name, version) {
6145
+ return {
6146
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
6147
+ tools: [{ vendor: "AI-SDLC", name: "@aisdlc/core", version: "2.3.0" }],
6148
+ component: { type: "application", name, version }
6149
+ };
6150
+ }
6151
+ function generateCycloneDxSbom(dependencies, options = {}) {
6152
+ const { name, version } = resolveProjectIdentity(options);
6153
+ const cdxVulns = buildCycloneDxVulnerabilities(options.vulnerabilities, options.vexStatements);
5887
6154
  return {
5888
6155
  bomFormat: "CycloneDX",
5889
6156
  specVersion: "1.5",
5890
6157
  version: 1,
5891
6158
  serialNumber: `urn:uuid:${crypto.randomUUID()}`,
5892
- metadata: {
5893
- timestamp: (/* @__PURE__ */ new Date()).toISOString(),
5894
- tools: [
5895
- {
5896
- vendor: "AI-SDLC",
5897
- name: "@aisdlc/core",
5898
- version: "1.0.0"
5899
- }
5900
- ],
5901
- component: {
5902
- type: "application",
5903
- name,
5904
- version
5905
- }
5906
- },
5907
- components
6159
+ metadata: buildBomMetadata(name, version),
6160
+ components: dependencies.map(buildCycloneDxComponent),
6161
+ ...cdxVulns.length > 0 ? { vulnerabilities: cdxVulns } : {}
5908
6162
  };
5909
6163
  }
5910
6164
  function tryAtomicWrite(filePath, content) {
@@ -6072,17 +6326,24 @@ function parseExceptions(exceptions) {
6072
6326
  }
6073
6327
  return map;
6074
6328
  }
6329
+ function parseVexStatements(doc) {
6330
+ const rawList = doc?.vex_statements || doc?.exceptions?.vex_statements || [];
6331
+ if (!Array.isArray(rawList)) return [];
6332
+ return rawList.filter((item) => Boolean(item && typeof item.id === "string" && typeof item.state === "string"));
6333
+ }
6075
6334
  function parseLicensePolicy(content) {
6076
6335
  try {
6077
6336
  const doc = yaml3.load(content);
6078
6337
  const { permitted, restricted, blocked } = classifyCategories(doc?.categories);
6079
6338
  const exception_packages = parseExceptions(doc?.exceptions);
6339
+ const vex_statements = parseVexStatements(doc);
6080
6340
  return {
6081
6341
  version: doc?.version || "1.0",
6082
6342
  permitted: permitted.length > 0 ? permitted : DEFAULT_PERMITTED,
6083
6343
  restricted: restricted.length > 0 ? restricted : DEFAULT_RESTRICTED,
6084
6344
  blocked: blocked.length > 0 ? blocked : DEFAULT_BLOCKED,
6085
6345
  exception_packages,
6346
+ vex_statements,
6086
6347
  rawPolicy: doc
6087
6348
  };
6088
6349
  } catch {
@@ -6091,7 +6352,8 @@ function parseLicensePolicy(content) {
6091
6352
  permitted: DEFAULT_PERMITTED,
6092
6353
  restricted: DEFAULT_RESTRICTED,
6093
6354
  blocked: DEFAULT_BLOCKED,
6094
- exception_packages: {}
6355
+ exception_packages: {},
6356
+ vex_statements: []
6095
6357
  };
6096
6358
  }
6097
6359
  }
@@ -6266,10 +6528,10 @@ function shouldGenerateSbom(options, rawPolicy) {
6266
6528
  if (options.generateSbom === false) return false;
6267
6529
  return Boolean(options.generateSbom || options.sbomPath || rawPolicy?.ci_gates?.generate_sbom);
6268
6530
  }
6269
- function maybeGenerateSbom(options, rootDir, rawPolicy, dependencies) {
6531
+ function maybeGenerateSbom(options, rootDir, rawPolicy, dependencies, vulnerabilities, vexStatements) {
6270
6532
  if (!shouldGenerateSbom(options, rawPolicy)) return void 0;
6271
6533
  const sbomPath = options.sbomPath || path4.join(rootDir, "reports", "sbom.cdx.json");
6272
- const sbom = generateCycloneDxSbom(dependencies, { rootDir });
6534
+ const sbom = generateCycloneDxSbom(dependencies, { rootDir, vulnerabilities, vexStatements });
6273
6535
  writeCycloneDxSbom(sbom, sbomPath);
6274
6536
  return sbomPath;
6275
6537
  }
@@ -6282,9 +6544,9 @@ function maybeGenerateNotices(options, rootDir, rawPolicy, dependencies) {
6282
6544
  writeThirdPartyNotices(noticesContent, noticesPath);
6283
6545
  return noticesPath;
6284
6546
  }
6285
- function handleDynamicScaArtifacts(options, rootDir, rawPolicy, dependencies) {
6547
+ function handleDynamicScaArtifacts(options, rootDir, rawPolicy, dependencies, vulnerabilities, vexStatements) {
6286
6548
  return {
6287
- sbomPath: maybeGenerateSbom(options, rootDir, rawPolicy, dependencies),
6549
+ sbomPath: maybeGenerateSbom(options, rootDir, rawPolicy, dependencies, vulnerabilities, vexStatements),
6288
6550
  noticesPath: maybeGenerateNotices(options, rootDir, rawPolicy, dependencies)
6289
6551
  };
6290
6552
  }
@@ -6313,7 +6575,7 @@ function buildSkippedVulnResult() {
6313
6575
  skipReason: "Trivy scanner is not installed on host environment. Vulnerability check gracefully skipped."
6314
6576
  };
6315
6577
  }
6316
- function checkVulnerabilities(rootDir, options) {
6578
+ function checkVulnerabilities(rootDir, options, vexStatements) {
6317
6579
  if (options.scanVulnerabilities === false) {
6318
6580
  return { vulnerabilities: [], blocked: false };
6319
6581
  }
@@ -6321,7 +6583,10 @@ function checkVulnerabilities(rootDir, options) {
6321
6583
  if (!res.executed) {
6322
6584
  return buildSkippedVulnResult();
6323
6585
  }
6324
- const evalResult = evaluateVulnerabilityThresholds(res.vulnerabilities, options.vulnerabilityThresholds);
6586
+ const evalResult = evaluateVulnerabilityThresholds(res.vulnerabilities, {
6587
+ ...options.vulnerabilityThresholds,
6588
+ vexStatements
6589
+ });
6325
6590
  return { vulnerabilities: res.vulnerabilities, blocked: evalResult.blocked };
6326
6591
  }
6327
6592
  function assembleDynamicLicenseResult(dependencies, permittedCount, violations, reportMarkdown, artifacts, vulnData) {
@@ -6345,7 +6610,8 @@ function toCleanPolicy(policyWithRaw) {
6345
6610
  permitted: policyWithRaw.permitted,
6346
6611
  restricted: policyWithRaw.restricted,
6347
6612
  blocked: policyWithRaw.blocked,
6348
- exception_packages: policyWithRaw.exception_packages
6613
+ exception_packages: policyWithRaw.exception_packages,
6614
+ vex_statements: policyWithRaw.vex_statements
6349
6615
  };
6350
6616
  }
6351
6617
  function scanDependenciesForVerification(options, rootDir, rawPolicy) {
@@ -6365,8 +6631,15 @@ function verifyLicenses(options = {}) {
6365
6631
  }
6366
6632
  const dependencies = scanDependenciesForVerification(options, rootDir, policyWithRaw.rawPolicy);
6367
6633
  const { violations, permittedCount } = evaluateDependencyList(dependencies, policy);
6368
- const artifacts = handleDynamicScaArtifacts(options, rootDir, policyWithRaw.rawPolicy, dependencies);
6369
- const vulnData = checkVulnerabilities(rootDir, options);
6634
+ const vulnData = checkVulnerabilities(rootDir, options, policy.vex_statements);
6635
+ const artifacts = handleDynamicScaArtifacts(
6636
+ options,
6637
+ rootDir,
6638
+ policyWithRaw.rawPolicy,
6639
+ dependencies,
6640
+ vulnData.vulnerabilities,
6641
+ policy.vex_statements
6642
+ );
6370
6643
  const reportMarkdown = generateLicenseReportMarkdown(dependencies, violations, policy, artifacts.sbomPath);
6371
6644
  return assembleDynamicLicenseResult(dependencies, permittedCount, violations, reportMarkdown, artifacts, vulnData);
6372
6645
  }
@@ -15906,7 +16179,145 @@ function initProject(options = {}) {
15906
16179
  tryInstallGitHook(destDir, options.dryRun)
15907
16180
  );
15908
16181
  }
16182
+ var DEFAULT_DLP_RULES = [
16183
+ {
16184
+ id: "DLP-001-PRIVATE-KEY",
16185
+ description: "PEM / RSA / EC / OPENSSH Private Key Block",
16186
+ pattern: "-----BEGIN (?:[A-Z0-9_-]+ )?PRIVATE KEY-----[\\s\\S]*?-----END (?:[A-Z0-9_-]+ )?PRIVATE KEY-----",
16187
+ replacement: "[REDACTED:PRIVATE_KEY]",
16188
+ enabled: true
16189
+ },
16190
+ {
16191
+ id: "DLP-002-API-TOKEN",
16192
+ description: "Cloud, GitHub, Slack, OpenAI, Stripe, and AWS Access Tokens",
16193
+ pattern: "\\b(?:gh[pousr]_[A-Za-z0-9_]{36,255}|github_pat_[0-9a-zA-Z_]{82}|sk-(?:proj-|live-)?[a-zA-Z0-9_-]{32,}|AKIA[0-9A-Z]{16}|xox[baprs]-[0-9]{10,13}-[0-9]{10,13}[a-zA-Z0-9-]*|(?:sk|rk)_(?:live|test)_[0-9a-zA-Z]{24,99})\\b",
16194
+ replacement: "[REDACTED:API_TOKEN]",
16195
+ enabled: true
16196
+ },
16197
+ {
16198
+ id: "DLP-003-JWT",
16199
+ description: "Plaintext JSON Web Token (JWT)",
16200
+ pattern: "\\beyJ[A-Za-z0-9_-]{10,}\\.eyJ[A-Za-z0-9_-]{10,}\\.[A-Za-z0-9_-]{10,}\\b",
16201
+ replacement: "[REDACTED:JWT_TOKEN]",
16202
+ enabled: true
16203
+ },
16204
+ {
16205
+ id: "DLP-004-CREDIT-CARD",
16206
+ description: "Payment Card Number (13-19 digits formatted)",
16207
+ pattern: "\\b(?:\\d{4}[- ]\\d{4}[- ]\\d{4}[- ]\\d{4}|\\d{16})\\b",
16208
+ replacement: "[REDACTED:CREDIT_CARD]",
16209
+ enabled: true
16210
+ },
16211
+ {
16212
+ id: "DLP-005-EMAIL",
16213
+ description: "Personal or Corporate Email Address",
16214
+ pattern: "\\b[A-Za-z0-9._%+-]+@(?!example\\.com|localhost|test\\.local)[A-Za-z0-9.-]+\\.[A-Za-z]{2,}\\b",
16215
+ replacement: "[REDACTED:EMAIL]",
16216
+ enabled: true
16217
+ },
16218
+ {
16219
+ id: "DLP-006-INTERNAL-URL",
16220
+ description: "Internal Intranet / Corp Service URL",
16221
+ pattern: "https?://(?:[A-Za-z0-9._-]+:[A-Za-z0-9._-]+@|[A-Za-z0-9.-]+\\.(?:internal|corp|intranet|local)\\b)[^\\s\"'`<>]*",
16222
+ replacement: "[REDACTED:INTERNAL_URL]",
16223
+ enabled: true
16224
+ }
16225
+ ];
16226
+ function createDefaultDlpPolicy() {
16227
+ return {
16228
+ version: "1.0",
16229
+ enabled: true,
16230
+ zero_data_retention_required: true,
16231
+ rules: [...DEFAULT_DLP_RULES]
16232
+ };
16233
+ }
16234
+ function normalizeParsedRule(raw, idx) {
16235
+ if (typeof raw.pattern !== "string" || !raw.pattern) return null;
16236
+ return {
16237
+ id: typeof raw.id === "string" ? raw.id : `DLP-CUSTOM-${idx + 1}`,
16238
+ description: typeof raw.description === "string" ? raw.description : "Custom DLP rule",
16239
+ pattern: raw.pattern,
16240
+ replacement: typeof raw.replacement === "string" ? raw.replacement : "[REDACTED]",
16241
+ enabled: raw.enabled !== false
16242
+ };
16243
+ }
16244
+ function parseDlpPolicy(yamlContent) {
16245
+ const fallback = createDefaultDlpPolicy();
16246
+ if (!yamlContent || !yamlContent.trim()) return fallback;
16247
+ try {
16248
+ const doc = yaml3.load(yamlContent);
16249
+ if (!doc || typeof doc !== "object") return fallback;
16250
+ const rawRules = Array.isArray(doc.rules) ? doc.rules : [];
16251
+ const parsedRules = rawRules.map((r, i) => normalizeParsedRule(r, i)).filter((r) => r !== null);
16252
+ return {
16253
+ version: typeof doc.version === "string" ? doc.version : "1.0",
16254
+ enabled: doc.enabled !== false,
16255
+ zero_data_retention_required: Boolean(doc.zero_data_retention_required ?? true),
16256
+ rules: parsedRules.length > 0 ? parsedRules : fallback.rules
16257
+ };
16258
+ } catch {
16259
+ return fallback;
16260
+ }
16261
+ }
16262
+ function loadDlpPolicy(rootDir, customPolicyPath) {
16263
+ const base = rootDir || process.cwd();
16264
+ const filePath = customPolicyPath ? path4.isAbsolute(customPolicyPath) ? customPolicyPath : path4.join(base, customPolicyPath) : path4.join(base, "dlp-policy.yaml");
16265
+ if (!fs7.existsSync(filePath)) return createDefaultDlpPolicy();
16266
+ try {
16267
+ return parseDlpPolicy(fs7.readFileSync(filePath, "utf-8"));
16268
+ } catch {
16269
+ return createDefaultDlpPolicy();
16270
+ }
16271
+ }
16272
+ function applySingleDlpRule(text, rule) {
16273
+ if (rule.enabled === false) return { output: text, matches: 0 };
16274
+ try {
16275
+ const regex = new RegExp(rule.pattern, "g");
16276
+ let matches = 0;
16277
+ const output = text.replace(regex, () => {
16278
+ matches++;
16279
+ return rule.replacement;
16280
+ });
16281
+ return { output, matches };
16282
+ } catch {
16283
+ return { output: text, matches: 0 };
16284
+ }
16285
+ }
16286
+ function sanitizeDlpText(text, policy = createDefaultDlpPolicy()) {
16287
+ if (!policy.enabled || !text) {
16288
+ return { sanitizedText: text, redactionCount: 0, triggeredRuleIds: [] };
16289
+ }
16290
+ let current = text;
16291
+ let totalRedactions = 0;
16292
+ const triggered = [];
16293
+ for (const rule of policy.rules) {
16294
+ const res = applySingleDlpRule(current, rule);
16295
+ if (res.matches > 0) {
16296
+ current = res.output;
16297
+ totalRedactions += res.matches;
16298
+ triggered.push(rule.id);
16299
+ }
16300
+ }
16301
+ return {
16302
+ sanitizedText: current,
16303
+ redactionCount: totalRedactions,
16304
+ triggeredRuleIds: triggered
16305
+ };
16306
+ }
16307
+ function sanitizeDlpPayload(payload, policy = createDefaultDlpPolicy()) {
16308
+ if (!policy.enabled || payload === null || payload === void 0) return payload;
16309
+ if (typeof payload === "string") {
16310
+ return sanitizeDlpText(payload, policy).sanitizedText;
16311
+ }
16312
+ const serialized = JSON.stringify(payload);
16313
+ const { sanitizedText } = sanitizeDlpText(serialized, policy);
16314
+ try {
16315
+ return JSON.parse(sanitizedText);
16316
+ } catch {
16317
+ return payload;
16318
+ }
16319
+ }
15909
16320
 
15910
- export { ALL_ARCHITECTURE_TEMPLATES, BRANCH_PATTERNS, 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, buildFeatureFileContent, buildGraphElements, calculateJaccardSimilarity, calculateMetrics, calculateRating, calculateShannonEntropy, checkGherkinInSync, checkoutTaskBranch, classifyBranch, classifyMetricFromMessage, collectAgentFiles, collectDashboardMetrics, collectHistoricalKpis, computeCanonicalSha256, computeSha256, computeViolationSignature, 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, loadPrivacyPolicy, loadProductHandoffSidecar, loadQualityBaseline, locateTaskInActiveChanges, mapSastSeverityToSarifLevel, maskSecret, normalizeSpdxLicense, normalizeUri, parseCommitTrailers, 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, scaffoldSddChange, scanAllProductHandoffs, scanAllTestArtifacts, scanContentForSecrets, scanFileForPrivacyViolations, scanFileForSast, scanInstalledLicenses, scanManualsInWorkspace, scanPnpmStore, 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 };
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 };
15911
16322
  //# sourceMappingURL=index.js.map
15912
16323
  //# sourceMappingURL=index.js.map