@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.cjs +524 -40
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +81 -2
- package/dist/index.d.ts +81 -2
- package/dist/index.js +511 -41
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
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
|
|
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
|
-
|
|
5877
|
-
|
|
5878
|
-
|
|
5879
|
-
|
|
5880
|
-
|
|
5881
|
-
|
|
5882
|
-
|
|
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
|
-
|
|
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
|
-
|
|
5894
|
-
|
|
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,
|
|
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
|
|
6369
|
-
const
|
|
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
|
-
|
|
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
|