@aisdlc/core 2.2.3 → 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
  }
@@ -13062,6 +13335,7 @@ var LIFECYCLE_SKILL_TEMPLATES = [
13062
13335
  title: "Greenfield Project Inception & Delivery Playbook",
13063
13336
  description: "Orchestrate end-to-end AI-SDLC onboarding and Phase 0 Inception for brand-new (Greenfield) projects, from repository initialization (aisdlc init) and NAF v4 Vision (ARCH-INTRO-*) through ProductShape, STRIDE Threat Modeling, arc42 Architecture, and initial SDD increment delivery.",
13064
13337
  references: "[`process/02_product_definition.md`](../../process/02_product_definition.md), [`process/04b_data_protection_and_privacy.md`](../../process/04b_data_protection_and_privacy.md), [`process/05_architecture_arc42_nafv4.md`](../../process/05_architecture_arc42_nafv4.md), [`process/06_spec_driven_development.md`](../../process/06_spec_driven_development.md), and [`process/09_agent_protocols.md`](../../process/09_agent_protocols.md).",
13338
+ globs: "product/**, specs/product/**, architecture/**, templates/**",
13065
13339
  body: `## Purpose & Trigger
13066
13340
  Use this skill when starting a **brand-new software project from scratch (Greenfield)** or when \`specs/product/\` has no canonical baseline yet. It coordinates the sequential execution of AI-SDLC MCP/CLI tools and specialized role agents so no code is written before product vision, security enclaves, privacy-by-design controls, and architecture contracts exist.
13067
13341
 
@@ -13119,6 +13393,7 @@ Use this skill when starting a **brand-new software project from scratch (Greenf
13119
13393
  title: "Legacy / Brownfield Retro-Inception Playbook",
13120
13394
  description: "Orchestrate progressive AI-SDLC adoption and Brownfield retro-inception on existing or legacy repositories without breaking production code, reverse-engineering architecture (ARCH-INTRO-*, CMP-*) and establishing baseline quality, security, and license audits before new SDD increments.",
13121
13395
  references: "[`process/02_product_definition.md`](../../process/02_product_definition.md), [`process/04_open_source_license_compliance.md`](../../process/04_open_source_license_compliance.md), [`process/04b_data_protection_and_privacy.md`](../../process/04b_data_protection_and_privacy.md), [`process/05_architecture_arc42_nafv4.md`](../../process/05_architecture_arc42_nafv4.md), [`process/10_quality_management_and_release_gates.md`](../../process/10_quality_management_and_release_gates.md), and [`process/09_agent_protocols.md`](../../process/09_agent_protocols.md).",
13396
+ globs: "architecture/**, specs/**, src/**, packages/**",
13122
13397
  body: `## Purpose & Trigger
13123
13398
  Use this skill when **adopting AI-SDLC in an existing or legacy codebase (Brownfield)** that already has production source code (\`src/\`, \`packages/\`, etc.) but lacks canonical PDaC specifications, arc42 architecture views, or deterministic quality/license/privacy gates.
13124
13399
 
@@ -13160,6 +13435,7 @@ Once the target domain's baseline artifacts (\`ARCH-INTRO-*\`, \`UC-*\`, \`FR-*\
13160
13435
  title: "Bounded SDD Feature & Bugfix Delivery Playbook",
13161
13436
  description: "Orchestrate the complete Spec-Driven Development (SDD) lifecycle for bounded feature increments, enhancements, and bugfixes (CHG-* / TSK-*), from upstream requirement derivation and 4-tier Git branching through Red-Green-Refactor TDD, Pre-Merge Audit Triad, all 11 Quality Gates, and canonical baseline integration.",
13162
13437
  references: "[`process/06_spec_driven_development.md`](../../process/06_spec_driven_development.md), [`process/08_citation_contract_and_drift.md`](../../process/08_citation_contract_and_drift.md), [`process/10_quality_management_and_release_gates.md`](../../process/10_quality_management_and_release_gates.md), [`process/11_git_branching_and_lifecycle.md`](../../process/11_git_branching_and_lifecycle.md), and [`process/09_agent_protocols.md`](../../process/09_agent_protocols.md).",
13438
+ globs: "specs/changes/**, src/**, packages/**, tests/**",
13163
13439
  body: `## Purpose & Trigger
13164
13440
  Use this skill for **every evolutionary increment (new feature, enhancement, refactoring, or bugfix)** on a project that already has an AI-SDLC baseline. It enforces strict 360\xB0 traceability from upstream ProductShape (\`UC-*\`, \`FR-*\`) through SDD (\`CHG-*\`, \`HOF-*\`, \`TSK-*\`), TDD implementation, the 12 Quality Gates, and baseline promotion.
13165
13441
 
@@ -13233,6 +13509,47 @@ description: >-
13233
13509
 
13234
13510
  Canonical Reference: ${skill.references}
13235
13511
 
13512
+ ${skill.body}
13513
+ `;
13514
+ }
13515
+ function renderCursorSkillFile(skill) {
13516
+ const globs = skill.globs || "";
13517
+ return `---
13518
+ description: ${skill.id} (${skill.title}) - ${skill.description}
13519
+ globs: ${globs}
13520
+ alwaysApply: false
13521
+ ---
13522
+
13523
+ # ${skill.id} (${skill.title})
13524
+
13525
+ Canonical Reference: ${skill.references}
13526
+
13527
+ ${skill.body}
13528
+ `;
13529
+ }
13530
+ function renderClaudeSkillFile(skill) {
13531
+ return `---
13532
+ name: ${skill.id}
13533
+ description: ${skill.description}
13534
+ ---
13535
+
13536
+ # ${skill.id} (${skill.title})
13537
+
13538
+ Canonical Reference: ${skill.references}
13539
+
13540
+ ${skill.body}
13541
+ `;
13542
+ }
13543
+ function renderCopilotSkillFile(skill) {
13544
+ return `---
13545
+ name: ${skill.id}
13546
+ description: ${skill.description}
13547
+ ---
13548
+
13549
+ # ${skill.id} (${skill.title})
13550
+
13551
+ Canonical Reference: ${skill.references}
13552
+
13236
13553
  ${skill.body}
13237
13554
  `;
13238
13555
  }
@@ -15584,12 +15901,24 @@ function appendCursorFiles(dirs, files) {
15584
15901
  for (const agent of SPECIALIZED_AGENT_TEMPLATES) {
15585
15902
  files.push({ relPath: `.cursor/rules/${agent.id}.mdc`, content: renderCursorAgentFile(agent) });
15586
15903
  }
15904
+ for (const skill of LIFECYCLE_SKILL_TEMPLATES) {
15905
+ files.push({ relPath: `.cursor/rules/${skill.id}.mdc`, content: renderCursorSkillFile(skill) });
15906
+ }
15587
15907
  }
15588
15908
  function appendClaudeFiles(dirs, files) {
15589
- dirs.push(".claude/agents");
15909
+ dirs.push(".claude/agents", ".claude/skills");
15590
15910
  files.push({ relPath: "CLAUDE.md", content: STARTER_CLAUDE_RULES });
15591
15911
  for (const agent of SPECIALIZED_AGENT_TEMPLATES) {
15592
- files.push({ relPath: `.claude/agents/${agent.id}.md`, content: renderClaudeAgentFile(agent) });
15912
+ const content = renderClaudeAgentFile(agent);
15913
+ dirs.push(`.claude/skills/${agent.id}`);
15914
+ files.push(
15915
+ { relPath: `.claude/agents/${agent.id}.md`, content },
15916
+ { relPath: `.claude/skills/${agent.id}/SKILL.md`, content }
15917
+ );
15918
+ }
15919
+ for (const skill of LIFECYCLE_SKILL_TEMPLATES) {
15920
+ dirs.push(`.claude/skills/${skill.id}`);
15921
+ files.push({ relPath: `.claude/skills/${skill.id}/SKILL.md`, content: renderClaudeSkillFile(skill) });
15593
15922
  }
15594
15923
  }
15595
15924
  function appendCopilotFiles(dirs, files) {
@@ -15598,6 +15927,9 @@ function appendCopilotFiles(dirs, files) {
15598
15927
  for (const agent of SPECIALIZED_AGENT_TEMPLATES) {
15599
15928
  files.push({ relPath: `.github/agents/${agent.id}.agent.md`, content: renderCopilotAgentFile(agent) });
15600
15929
  }
15930
+ for (const skill of LIFECYCLE_SKILL_TEMPLATES) {
15931
+ files.push({ relPath: `.github/agents/${skill.id}.agent.md`, content: renderCopilotSkillFile(skill) });
15932
+ }
15601
15933
  }
15602
15934
  function isTargetIncluded(targets, name) {
15603
15935
  return targets.has("all") || targets.has(name);
@@ -15847,7 +16179,145 @@ function initProject(options = {}) {
15847
16179
  tryInstallGitHook(destDir, options.dryRun)
15848
16180
  );
15849
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
+ }
15850
16320
 
15851
- 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, renderCopilotAgentFile, renderCursorAgentFile, 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 };
15852
16322
  //# sourceMappingURL=index.js.map
15853
16323
  //# sourceMappingURL=index.js.map