实现示例type Component = { name: string; version: string } function semverLike(v: string): boolean { return /^(\d+\.\d+\.\d+)(?:[-A-Za-z0-9_.]+)?$/.test(v) } function diff(oldList: Component[], newList: Component[]): { added: string[]; removed: string[]; changed: string[] } { const o = new Map<string,string>() for (const c of oldList) if (c.name && semverLike(c.version)) o.set(c.name, c.version) const n = new Map<string,string>() for (const c of newList) if (c.name && semverLike(c.version)) n.set(c.name, c.version) const added: string[] = [] const removed: string[] = [] const changed: string[] = [] for (const [k,v] of n.entries()) { const ov = o.get(k); if (!ov) added.push(k); else if (ov !== v) changed.push(k) } for (const k of o.keys()) if (!n.has(k)) removed.push(k) return { added, removed, changed } } function gate(oldList: Component[], newList: Component[], thresholds: { added: number; removed: number; changed: number }): { ok: boolean; errors: string[] } { const d = diff(oldList, newList) const errors: string[] = [] if (d.added.length > thresholds.added) errors.push('added') if (d.removed.length > thresholds.removed) errors.push('removed') if (d.changed.length > thresholds.changed) errors.push('changed') return { ok: errors.length === 0, errors } } 审计与发布治理审计增量变更并与阈值策略对齐;异常阻断并输出修复清单。SBOM变更需审批与归档。

发表评论 取消回复