@bridge-ds/core 0.13.0 → 0.15.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.
@@ -1 +0,0 @@
1
- {"version":3,"file":"prod-branch-6ftQWwdu.js","sources":["../src/values.ts","../src/layered.ts","../src/types.ts","../src/resolver.ts","../src/previews.ts","../src/teams.ts","../src/rights.ts","../src/products.ts","../src/config.ts","../src/json-ast.ts","../src/dtcg-codec.ts","../src/token-set.ts","../src/scopes.ts","../src/diff-engine.ts","../src/risk.ts","../src/wcag.ts","../src/pr-composer.ts","../src/prod-branch.ts"],"sourcesContent":["// Value helpers: aliases, colors, equality with tolerance, display formatting.\n\nexport interface Rgba {\n r: number;\n g: number;\n b: number;\n a: number;\n}\n\nconst ALIAS_RE = /^\\{([^{}]+)\\}$/;\n\nexport const isAlias = (v: unknown): v is string => typeof v === 'string' && ALIAS_RE.test(v);\nexport const aliasTarget = (v: string): string => ALIAS_RE.exec(v)?.[1] ?? v;\nexport const toAlias = (path: string): string => `{${path}}`;\n\n/** All alias references inside a value, including nested ones in composite values. */\nexport function collectRefs(value: unknown, out: string[] = []): string[] {\n if (isAlias(value)) out.push(aliasTarget(value));\n else if (Array.isArray(value)) value.forEach((v) => collectRefs(v, out));\n else if (value && typeof value === 'object') Object.values(value).forEach((v) => collectRefs(v, out));\n return out;\n}\n\nconst clamp01 = (n: number) => Math.min(1, Math.max(0, n));\nconst round = (n: number, digits: number) => {\n const f = 10 ** digits;\n return Math.round(n * f) / f;\n};\n\nexport function hexToRgba(hex: string): Rgba | undefined {\n const m = /^#?([0-9a-f]{3,8})$/i.exec(hex.trim());\n if (!m) return undefined;\n let h = m[1]!;\n if (h.length === 3 || h.length === 4) h = [...h].map((c) => c + c).join('');\n if (h.length !== 6 && h.length !== 8) return undefined;\n const n = (idx: number) => parseInt(h.slice(idx, idx + 2), 16) / 255;\n return { r: n(0), g: n(2), b: n(4), a: h.length === 8 ? n(6) : 1 };\n}\n\nconst to255 = (n: number) => Math.round(clamp01(n) * 255);\nexport const rgbaToHex = (c: Rgba): string =>\n '#' + [c.r, c.g, c.b].map((x) => to255(x).toString(16).padStart(2, '0')).join('');\n\n/** Parse a DTCG color value (2025.10 object form or legacy hex string). Undefined for unsupported color spaces. */\nexport function parseColor(value: unknown): Rgba | undefined {\n if (typeof value === 'string') return isAlias(value) ? undefined : hexToRgba(value);\n if (!value || typeof value !== 'object') return undefined;\n const v = value as { colorSpace?: unknown; components?: unknown; alpha?: unknown; hex?: unknown };\n const alpha = typeof v.alpha === 'number' ? v.alpha : 1;\n if (v.colorSpace === 'srgb' && Array.isArray(v.components) && v.components.length === 3) {\n const [r, g, b] = v.components as unknown[];\n if ([r, g, b].every((x) => typeof x === 'number')) return { r: r as number, g: g as number, b: b as number, a: alpha };\n }\n if (typeof v.hex === 'string') {\n const c = hexToRgba(v.hex);\n if (c) return { ...c, a: alpha };\n }\n return undefined;\n}\n\n/** DTCG 2025.10 color object from RGBA floats. Components are rounded to 3 decimals like the repo files. */\nexport function rgbaToDtcg(c: Rgba): Record<string, unknown> {\n const out: Record<string, unknown> = {\n colorSpace: 'srgb',\n components: [round(clamp01(c.r), 3), round(clamp01(c.g), 3), round(clamp01(c.b), 3)],\n };\n if (c.a < 0.9995) out.alpha = round(clamp01(c.a), 3);\n out.hex = rgbaToHex(c);\n return out;\n}\n\nexport function colorsEqual(a: Rgba, b: Rgba): boolean {\n return rgbaToHex(a) === rgbaToHex(b) && Math.abs(a.a - b.a) < 0.002;\n}\n\nexport interface Dimension {\n value: number;\n unit: string;\n}\n\nexport function parseDimension(value: unknown): Dimension | undefined {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n const v = value as { value?: unknown; unit?: unknown };\n if (typeof v.value === 'number' && typeof v.unit === 'string') return { value: v.value, unit: v.unit };\n }\n if (typeof value === 'string') {\n const m = /^(-?\\d+(?:\\.\\d+)?)(px|rem)$/.exec(value.trim());\n if (m) return { value: Number(m[1]), unit: m[2]! };\n }\n if (typeof value === 'number') return { value, unit: 'px' };\n return undefined;\n}\n\nconst numbersEqual = (a: number, b: number) => Math.abs(a - b) < 1e-4;\n\nfunction deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (typeof a === 'number' && typeof b === 'number') return numbersEqual(a, b);\n if (typeof a !== typeof b || !a || !b || typeof a !== 'object') return false;\n if (Array.isArray(a) !== Array.isArray(b)) return false;\n if (Array.isArray(a) && Array.isArray(b)) return a.length === b.length && a.every((v, idx) => deepEqual(v, b[idx]));\n const ka = Object.keys(a as object).filter((k) => (a as Record<string, unknown>)[k] !== undefined);\n const kb = Object.keys(b as object).filter((k) => (b as Record<string, unknown>)[k] !== undefined);\n if (ka.length !== kb.length) return false;\n return ka.every((k) => deepEqual((a as Record<string, unknown>)[k], (b as Record<string, unknown>)[k]));\n}\n\n/**\n * Semantic equality of two DTCG values of the same type. Tolerant to float noise coming back\n * from Figma (colors compare by 8-bit hex + alpha, numbers to 1e-4).\n */\nexport function valuesEqual(type: string, a: unknown, b: unknown): boolean {\n if (a === undefined || b === undefined) return a === b;\n if (isAlias(a) || isAlias(b)) return isAlias(a) && isAlias(b) && aliasTarget(a) === aliasTarget(b);\n if (type === 'color') {\n const ca = parseColor(a);\n const cb = parseColor(b);\n if (ca && cb) return colorsEqual(ca, cb);\n }\n if (type === 'dimension') {\n const da = parseDimension(a);\n const db = parseDimension(b);\n if (da && db) return da.unit === db.unit && numbersEqual(da.value, db.value);\n }\n return deepEqual(a, b);\n}\n\n/** Short human-readable form of a value for the UI and PR body. */\nexport function formatValue(type: string, value: unknown): string {\n if (value === undefined) return 'none';\n if (isAlias(value)) return aliasTarget(value);\n if (type === 'color') {\n const c = parseColor(value);\n // The file's hex is what tokens.css ships; components can round differently at 8 bits.\n const hex = value && typeof value === 'object' && typeof (value as { hex?: unknown }).hex === 'string' ? ((value as { hex: string }).hex.toLowerCase()) : undefined;\n if (c) return c.a < 0.9995 ? `${hex ?? rgbaToHex(c)} @ ${Math.round(c.a * 100)}%` : (hex ?? rgbaToHex(c));\n }\n if (type === 'dimension') {\n const d = parseDimension(value);\n if (d) return `${d.value}${d.unit}`;\n }\n if (Array.isArray(value)) return value.join(', ');\n if (typeof value === 'object' && value) return JSON.stringify(value);\n return String(value);\n}\n","// Layered token sets: any DTCG repo described by bridge.config.json \"tokens.layers\" and \"modes\".\n//\n// The tier model in token-set.ts maps the Bridge layout onto Figma collections (one collection per tier,\n// one Figma mode per brand, theme or density). Tools that only read and check tokens (the CLI and the MCP\n// server) need something more general: a repo with a core.json, a theme/ folder and no brands at all must\n// work too. A layered set resolves a token for a combination of mode values (\"combo\") by stacking the\n// layer files for that combo, lowest first, the last definition winning; aliases resolve inside the stack.\n//\n// Values are formatted for CSS exactly like packages/tokens/build.mjs, so a resolved value can be compared\n// with dist/resolved.json byte for byte.\n\nimport type { BridgeConfig } from './config';\nimport { isAlias, aliasTarget as targetOf } from './values';\n\nexport interface LayeredDef {\n path: string;\n type?: string;\n value: unknown;\n description?: string;\n extensions?: Record<string, unknown>;\n deprecated?: unknown;\n /** File relative to tokens.root. */\n file: string;\n}\n\nexport interface LayerIssue {\n level: 'error' | 'warning';\n code: string;\n message: string;\n path?: string;\n file?: string;\n /** Mode combinations the issue appears in; absent when it appears in all of them. */\n modes?: string[];\n}\n\n/** A value per mode name, e.g. { brand: \"ocean\", theme: \"dark\", density: \"compact\" }. */\nexport type Combo = Record<string, string>;\n\nexport interface LayeredResolution {\n path: string;\n type?: string;\n /** Raw DTCG value with every alias replaced. */\n value: unknown;\n /** CSS-ready string, the way the token build writes it. */\n css: string;\n /** Alias hops, starting with the token itself. */\n chain: string[];\n /** Files that define the token in this combo, highest layer last. */\n definedIn: string[];\n error?: string;\n}\n\nexport const DTCG_TYPES = new Set(['color', 'dimension', 'fontFamily', 'fontWeight', 'duration', 'cubicBezier', 'number', 'strokeStyle', 'border', 'transition', 'shadow', 'gradient', 'typography', 'fontStyle', 'string', 'boolean']);\n\n/** Alias target of a value, or null when it is not an alias. */\nexport const aliasOf = (v: unknown): string | null => (isAlias(v) ? targetOf(v) : null);\n\n/** `*` (one segment), `**` (any depth) and `?` globs, matched against the whole path. */\nexport function globToRegExp(glob: string): RegExp {\n let re = '';\n for (let i = 0; i < glob.length; i++) {\n const c = glob[i]!;\n if (c === '*' && glob[i + 1] === '*') {\n if (glob[i + 2] === '/') {\n re += '(?:.*/)?';\n i += 2;\n } else {\n re += '.*';\n i += 1;\n }\n } else if (c === '*') re += '[^/]*';\n else if (c === '?') re += '[^/]';\n else re += c.replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&');\n }\n return new RegExp(`^${re}$`);\n}\n\nexport const comboKey = (c: Combo) => Object.entries(c).map(([k, v]) => `${k}=${v}`).join(',') || 'default';\n\n/** Tokens of one parsed file, with $type inherited from groups. Names DTCG forbids are reported. */\nexport function flattenLayerFile(json: unknown, file: string, issues: LayerIssue[]): LayeredDef[] {\n const out: LayeredDef[] = [];\n const walk = (node: unknown, path: string[], inheritedType?: string) => {\n if (!node || typeof node !== 'object' || Array.isArray(node)) return;\n const n = node as Record<string, unknown>;\n const type = typeof n.$type === 'string' ? n.$type : inheritedType;\n if ('$value' in n) {\n out.push({\n path: path.join('.'),\n ...(type ? { type } : {}),\n value: n.$value,\n ...(typeof n.$description === 'string' ? { description: n.$description } : {}),\n ...(n.$extensions && typeof n.$extensions === 'object' ? { extensions: n.$extensions as Record<string, unknown> } : {}),\n ...(n.$deprecated !== undefined ? { deprecated: n.$deprecated } : {}),\n file,\n });\n return;\n }\n for (const [k, v] of Object.entries(n)) {\n if (k.startsWith('$')) continue;\n const p = [...path, k].join('.');\n if (/[{}.]/.test(k)) issues.push({ level: 'error', code: 'invalid-name', message: `Name \"${k}\" contains {, } or . which DTCG forbids.`, path: p, file });\n if (v && typeof v === 'object' && !Array.isArray(v)) walk(v, [...path, k], type);\n else issues.push({ level: 'error', code: 'not-a-token', message: `\"${p}\" is neither a token (no $value) nor a group.`, path: p, file });\n }\n };\n walk(json, []);\n return out;\n}\n\n// --- CSS formatting (matches packages/tokens/build.mjs) ---------------------------------------------------\n\nconst toHex2 = (n: number) => Math.round(Math.max(0, Math.min(1, n)) * 255).toString(16).padStart(2, '0');\n\n/** One-line JSON in the house style: `{ \"a\": 1, \"b\": [1, 2] }`. */\nexport function compactJson(v: unknown): string {\n if (Array.isArray(v)) return `[${v.map(compactJson).join(', ')}]`;\n if (v && typeof v === 'object') {\n const e = Object.entries(v);\n return e.length ? `{ ${e.map(([k, x]) => `${JSON.stringify(k)}: ${compactJson(x)}`).join(', ')} }` : '{}';\n }\n return JSON.stringify(v);\n}\n\nexport function colorToCss(c: unknown): string {\n if (typeof c === 'string') return c;\n if (!c || typeof c !== 'object') return String(c);\n const o = c as { components?: unknown[]; alpha?: number; hex?: string };\n const [r, g, b] = (o.components ?? []).map((x) => (typeof x === 'number' ? x : 0));\n const alpha = o.alpha ?? 1;\n if (alpha < 1) return `rgb(${[r, g, b].map((x) => Math.round((x ?? 0) * 255)).join(' ')} / ${alpha})`;\n return o.hex ?? `#${[r, g, b].map((x) => toHex2(x ?? 0)).join('')}`;\n}\nconst dimToCss = (d: unknown) => (d && typeof d === 'object' && 'value' in (d as object) ? `${(d as { value: number }).value}${(d as { unit: string }).unit}` : String(d));\n\nexport function valueToCss(type: string | undefined, v: unknown, ext?: Record<string, unknown>): string {\n if (v === undefined || v === null) return '';\n switch (type) {\n case 'color':\n return colorToCss(v);\n case 'dimension':\n case 'duration':\n return dimToCss(v);\n case 'cubicBezier':\n return Array.isArray(v) ? `cubic-bezier(${v.join(', ')})` : String(v);\n case 'fontFamily':\n return Array.isArray(v) ? v.map((n) => (/\\s/.test(String(n)) ? `\"${n}\"` : String(n))).join(', ') : String(v);\n case 'shadow': {\n if (typeof v === 'string') return v;\n const layers = (Array.isArray(v) ? v : [v]) as Record<string, unknown>[];\n return layers.map((l) => [l.inset ? 'inset' : '', dimToCss(l.offsetX), dimToCss(l.offsetY), dimToCss(l.blur), dimToCss(l.spread ?? { value: 0, unit: 'px' }), colorToCss(l.color)].filter(Boolean).join(' ')).join(', ');\n }\n default: {\n const unit = ext?.['dev.bridge.unit'];\n if (typeof v === 'number' && typeof unit === 'string') return `${v}${unit}`;\n return typeof v === 'object' ? compactJson(v) : String(v);\n }\n }\n}\n\n// --- the set ----------------------------------------------------------------------------------------------\n\nexport class LayeredTokenSet {\n readonly defs: LayeredDef[] = [];\n readonly issues: LayerIssue[] = [];\n readonly fileNames: string[];\n private readonly views = new Map<string, { map: Map<string, LayeredDef[]>; missing: string[] }>();\n\n /** `files`: token file path relative to tokens.root -> file text. */\n constructor(\n readonly config: BridgeConfig,\n readonly files: Map<string, string>,\n ) {\n this.fileNames = [...files.keys()].sort();\n for (const f of this.fileNames) {\n let json: unknown;\n try {\n json = JSON.parse(files.get(f)!);\n } catch (e) {\n this.issues.push({ level: 'error', code: 'invalid-json', message: `Invalid JSON: ${(e as Error).message}`, file: f });\n continue;\n }\n this.defs.push(...flattenLayerFile(json, f, this.issues));\n }\n }\n\n get modeNames() {\n return Object.keys(this.config.axes);\n }\n get defaultCombo(): Combo {\n return Object.fromEntries(Object.entries(this.config.axes).map(([k, m]) => [k, m.default]));\n }\n /** Every combination of the given modes (all modes when omitted); other modes stay at default. */\n combos(only?: string[]): Combo[] {\n let out: Combo[] = [this.defaultCombo];\n for (const [name, m] of Object.entries(this.config.axes)) {\n if (only && !only.includes(name)) continue;\n out = out.flatMap((c) => m.values.map((v) => ({ ...c, [name]: v })));\n }\n return out;\n }\n normalizeCombo(partial: Partial<Combo> = {}): Combo {\n const c = { ...this.defaultCombo };\n for (const [k, v] of Object.entries(partial)) {\n if (v === undefined) continue;\n const m = this.config.axes[k];\n if (!m) throw new Error(`Unknown mode \"${k}\". Modes: ${this.modeNames.join(', ') || 'none'}.`);\n if (!m.values.includes(v)) throw new Error(`Unknown ${k} \"${v}\". Values: ${m.values.join(', ')}.`);\n c[k] = v;\n }\n return c;\n }\n\n tierOfFile(file: string): string | undefined {\n for (const [tier, dirs] of Object.entries(this.config.tokens.tiers)) {\n if (dirs.some((d) => file === d || file.startsWith(`${d.replace(/\\/$/, '')}/`) || globToRegExp(d).test(file))) return tier;\n }\n return undefined;\n }\n\n /** Tier of a token: the lowest layer that defines it in the default mode (an override does not change its tier). */\n tierOf(path: string): string | undefined {\n const d = this.view(this.defaultCombo).get(path)?.[0] ?? this.defs.find((x) => x.path === path);\n return d ? this.tierOfFile(d.file) : undefined;\n }\n\n /** Files of each layer for a combo, in resolution order. */\n layerFiles(combo: Combo): { files: string[]; missing: string[] } {\n const files: string[] = [];\n const missing: string[] = [];\n for (const l of this.config.tokens.layers) {\n const pattern = l.files.replace(/\\{([^}]+)\\}/g, (_, k: string) => combo[k] ?? `{${k}}`);\n const re = globToRegExp(pattern);\n const hit = this.fileNames.filter((f) => re.test(f));\n if (!hit.length && !l.optional) missing.push(pattern);\n for (const f of hit) if (!files.includes(f)) files.push(f);\n }\n return { files, missing };\n }\n\n /** path -> definitions in layer order (last one wins) for a combo. */\n view(combo: Combo): Map<string, LayeredDef[]> {\n const key = comboKey(combo);\n let v = this.views.get(key);\n if (!v) {\n const { files, missing } = this.layerFiles(combo);\n const map = new Map<string, LayeredDef[]>();\n const byFile = new Map<string, LayeredDef[]>();\n for (const d of this.defs) (byFile.get(d.file) ?? byFile.set(d.file, []).get(d.file)!).push(d);\n for (const f of files) for (const d of byFile.get(f) ?? []) (map.get(d.path) ?? map.set(d.path, []).get(d.path)!).push(d);\n v = { map, missing };\n this.views.set(key, v);\n }\n return v.map;\n }\n missingLayers(combo: Combo): string[] {\n this.view(combo);\n return this.views.get(comboKey(combo))!.missing;\n }\n\n /** Every token path defined in any combo. */\n allPaths(): string[] {\n return [...new Set(this.defs.map((d) => d.path))].sort();\n }\n defsOf(path: string): LayeredDef[] {\n return this.defs.filter((d) => d.path === path);\n }\n\n /** First combo whose layers include `file`, preferring the default. */\n comboForFile(file: string): Combo {\n const all = [this.defaultCombo, ...this.combos()];\n return all.find((c) => this.layerFiles(c).files.includes(file)) ?? this.defaultCombo;\n }\n\n resolve(path: string, combo: Combo): LayeredResolution {\n const view = this.view(combo);\n const chain: string[] = [path];\n const top = view.get(path);\n if (!top) return { path, value: undefined, css: '', chain, definedIn: [], error: `\"${path}\" is not defined for ${comboKey(combo)}` };\n const def = top[top.length - 1]!;\n let type = def.type;\n let error: string | undefined;\n const deref = (target: string, stack: string[]): unknown => {\n if (stack.includes(target)) {\n error = `circular alias: ${[...stack, target].join(' -> ')}`;\n return undefined;\n }\n const t = view.get(target);\n if (!t) {\n error = `broken alias {${target}}`;\n return undefined;\n }\n const td = t[t.length - 1]!;\n type ??= td.type;\n return walk(td.value, [...stack, target]);\n };\n const walk = (v: unknown, stack: string[]): unknown => {\n const a = aliasOf(v);\n if (a) return deref(a, stack);\n if (Array.isArray(v)) return v.map((x) => walk(x, stack));\n if (v && typeof v === 'object') return Object.fromEntries(Object.entries(v).map(([k, x]) => [k, walk(x, stack)]));\n return v;\n };\n // Top-level alias chain, for designers: color.text.muted -> palette.neutral.600 -> color.steel.600.\n let cur = def.value;\n const seen = new Set([path]);\n for (let a = aliasOf(cur); a; a = aliasOf(cur)) {\n chain.push(a);\n if (seen.has(a)) break;\n seen.add(a);\n const t = view.get(a);\n if (!t) break;\n cur = t[t.length - 1]!.value;\n }\n const value = walk(def.value, [path]);\n return { path, ...(type ? { type } : {}), value, css: error ? '' : valueToCss(type, value, def.extensions), chain, definedIn: top.map((d) => d.file), ...(error ? { error } : {}) };\n }\n\n /** Tokens whose own value aliases `path` directly, across all files. */\n referencedBy(path: string): { path: string; file: string }[] {\n const needle = `{${path}}`;\n return this.defs.filter((d) => JSON.stringify(d.value).includes(needle)).map((d) => ({ path: d.path, file: d.file }));\n }\n\n cssVarName(path: string): string {\n return `${this.config.cssVar.prefix}${path.split('.').join(this.config.cssVar.separator)}`;\n }\n\n /** Repo-relative path of a token file. */\n repoPath(file: string): string {\n const root = this.config.tokens.root;\n return root === '.' || !root ? file : `${root.replace(/\\/$/, '')}/${file}`;\n }\n}\n\n/** Token files of a repo listing: under tokens.root, matching include and not exclude, minus the contrast file. Paths relative to root. */\nexport function selectTokenFiles(config: BridgeConfig, repoFiles: string[]): string[] {\n const root = config.tokens.root.replace(/\\/$/, '');\n const rel = (f: string) => (root === '.' || !root ? f : f.startsWith(`${root}/`) ? f.slice(root.length + 1) : null);\n const inc = config.tokens.include.map(globToRegExp);\n const exc = config.tokens.exclude.map(globToRegExp);\n return repoFiles\n .filter((f) => f !== config.contrast?.path)\n .map(rel)\n .filter((f): f is string => f !== null && inc.some((r) => r.test(f)) && !exc.some((r) => r.test(f)));\n}\n\n// --- validation -------------------------------------------------------------------------------------------\n\nfunction checkShape(type: string, v: unknown): string | null {\n if (aliasOf(v)) return null;\n const isObj = (x: unknown): x is Record<string, unknown> => Boolean(x) && typeof x === 'object' && !Array.isArray(x);\n switch (type) {\n case 'color':\n if (typeof v === 'string') return /^#([0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$/i.test(v) ? 'warn:color as a hex string: DTCG 2025.10 uses { colorSpace, components, hex }' : 'color must be { colorSpace, components } (or a hex string)';\n if (!isObj(v) || typeof v.colorSpace !== 'string' || !Array.isArray(v.components)) return 'color must be { colorSpace, components, alpha?, hex? }';\n if (v.components.length !== 3 || !v.components.every((c) => typeof c === 'number' || c === 'none' || aliasOf(c))) return 'color components must be 3 numbers';\n if (v.alpha !== undefined && (typeof v.alpha !== 'number' || v.alpha < 0 || v.alpha > 1)) return 'color alpha must be between 0 and 1';\n if (v.hex !== undefined && !/^#[0-9a-f]{6}$/i.test(String(v.hex))) return 'color hex must be #rrggbb';\n return null;\n case 'dimension':\n if (typeof v === 'string' || typeof v === 'number') return 'warn:dimension as a plain value: DTCG 2025.10 uses { value, unit }';\n return isObj(v) && typeof v.value === 'number' && ['px', 'rem'].includes(String(v.unit)) ? null : 'dimension must be { value: number, unit: \"px\" | \"rem\" }';\n case 'duration':\n if (typeof v === 'string') return 'warn:duration as a string: DTCG 2025.10 uses { value, unit }';\n return isObj(v) && typeof v.value === 'number' && ['ms', 's'].includes(String(v.unit)) ? null : 'duration must be { value: number, unit: \"ms\" | \"s\" }';\n case 'cubicBezier':\n return Array.isArray(v) && v.length === 4 && v.every((x) => typeof x === 'number') && (v[0] as number) >= 0 && (v[0] as number) <= 1 && (v[2] as number) >= 0 && (v[2] as number) <= 1 ? null : 'cubicBezier must be [x1, y1, x2, y2] with x in 0..1';\n case 'fontFamily':\n return typeof v === 'string' || (Array.isArray(v) && v.every((x) => typeof x === 'string')) ? null : 'fontFamily must be a string or an array of strings';\n case 'fontWeight':\n return (typeof v === 'number' && v >= 1 && v <= 1000) || typeof v === 'string' ? null : 'fontWeight must be 1..1000 or a keyword';\n case 'number':\n return typeof v === 'number' ? null : 'number must be a number';\n case 'shadow': {\n const layers = Array.isArray(v) ? v : [v];\n return layers.every((l) => isObj(l) && 'color' in l && 'offsetX' in l && 'offsetY' in l && 'blur' in l) ? null : 'shadow must be { color, offsetX, offsetY, blur, spread? } or an array of them';\n }\n default:\n return null;\n }\n}\n\n/** DTCG shapes, names, broken and circular aliases (in every mode combination), mode parity, missing layers. */\nexport function validateLayered(set: LayeredTokenSet): LayerIssue[] {\n const issues: LayerIssue[] = [...set.issues];\n for (const d of set.defs) {\n if (d.type && !DTCG_TYPES.has(d.type)) issues.push({ level: 'error', code: 'unknown-type', message: `Unknown $type \"${d.type}\".`, path: d.path, file: d.file });\n if (d.type) {\n const s = checkShape(d.type, d.value);\n if (s) issues.push({ level: s.startsWith('warn:') ? 'warning' : 'error', code: 'invalid-value', message: s.replace(/^warn:/, ''), path: d.path, file: d.file });\n }\n }\n // Aliases and types per combo, merged so one broken alias is reported once with the modes it breaks in.\n const merged = new Map<string, LayerIssue>();\n const add = (i: LayerIssue, combo: Combo) => {\n const k = `${i.code}|${i.path}|${i.message}`;\n const prev = merged.get(k);\n if (prev) prev.modes!.push(comboKey(combo));\n else merged.set(k, { ...i, modes: [comboKey(combo)] });\n };\n for (const combo of set.combos()) {\n for (const miss of set.missingLayers(combo)) add({ level: 'error', code: 'missing-layer', message: `No file matches layer \"${miss}\".` }, combo);\n for (const [path, defs] of set.view(combo)) {\n const r = set.resolve(path, combo);\n const def = defs[defs.length - 1]!;\n if (r.error) add({ level: 'error', code: r.error.startsWith('circular') ? 'circular-alias' : 'broken-alias', message: r.error, path, file: def.file }, combo);\n else if (!r.type) add({ level: 'error', code: 'missing-type', message: 'No $type on the token, its groups or its alias target.', path, file: def.file }, combo);\n else if (def.type && aliasOf(def.value)) {\n const target = set.view(combo).get(aliasOf(def.value)!);\n const tt = target?.[target.length - 1]?.type;\n if (tt && tt !== def.type) add({ level: 'error', code: 'type-mismatch', message: `$type ${def.type} aliases a ${tt} token (${String(def.value)}).`, path, file: def.file }, combo);\n }\n }\n }\n const total = set.combos().length;\n for (const i of merged.values()) {\n if (i.modes!.length === total) delete i.modes;\n issues.push(i);\n }\n issues.push(...layeredParityIssues(set));\n return issues;\n}\n\n/** For modes with parity, every layer file that varies by that mode must define the same token paths. */\nexport function layeredParityIssues(set: LayeredTokenSet): LayerIssue[] {\n const out: LayerIssue[] = [];\n const pathsOf = (file: string) => new Set(set.defs.filter((d) => d.file === file).map((d) => d.path));\n for (const [mode, m] of Object.entries(set.config.axes)) {\n if (!m.parity) continue;\n for (const layer of set.config.tokens.layers) {\n // Optional layers are partial overrides by design (a brand overriding a few light tokens only).\n if (!layer.files.includes(`{${mode}}`) || layer.optional) continue;\n // Hold the other placeholders fixed at each of their values.\n const others = (layer.files.match(/\\{([^}]+)\\}/g) ?? []).map((p) => p.slice(1, -1)).filter((k) => k !== mode);\n let fixed: Combo[] = [{}];\n for (const o of others) fixed = fixed.flatMap((c) => (set.config.axes[o]?.values ?? []).map((v) => ({ ...c, [o]: v })));\n for (const c of fixed) {\n const filesByValue = m.values.map((v) => {\n const re = globToRegExp(layer.files.replace(/\\{([^}]+)\\}/g, (_, k: string) => (k === mode ? v : c[k]!)));\n return { v, files: set.fileNames.filter((f) => re.test(f)) };\n });\n const present = filesByValue.filter((x) => x.files.length);\n if (!present.length) continue;\n for (const x of filesByValue) {\n if (!x.files.length) out.push({ level: 'error', code: 'mode-parity', message: `${mode} \"${x.v}\" has no file for layer \"${layer.files}\" while ${present.map((p) => p.v).join(', ')} do.` });\n }\n const sets = present.map((x) => ({ v: x.v, files: x.files, paths: new Set(x.files.flatMap((f) => [...pathsOf(f)])) }));\n const union = new Set(sets.flatMap((s) => [...s.paths]));\n for (const p of union) {\n const lacking = sets.filter((s) => !s.paths.has(p));\n if (lacking.length) {\n const having = sets.find((s) => s.paths.has(p))!;\n out.push({ level: 'error', code: 'mode-parity', message: `Defined for ${mode} ${sets.filter((s) => s.paths.has(p)).map((s) => s.v).join(', ')} but not ${lacking.map((s) => s.v).join(', ')} (${lacking.map((s) => s.files.join(', ')).join('; ')}).`, path: p, file: having.files[0]! });\n }\n }\n }\n }\n }\n return out;\n}\n","// Shared domain types for the token side of DS Bridge (no Figma or DOM dependency).\n\n/** Extension key holding a stable token id across renames. */\nexport const EXT_ID = 'com.dsbridge.id';\n/** Extension key holding Figma variable scopes. */\nexport const EXT_SCOPES = 'com.figma.scopes';\n\n/** Mode key of single-mode tiers (primitives, base semantic, component tokens). */\nexport const PRIMITIVE_MODE = 'value';\nexport const SINGLE_MODE = PRIMITIVE_MODE;\n\n/**\n * Token tiers, in dependency order (docs/ARCHITECTURE.md):\n * primitive primitives/*.tokens.json raw scales, one value\n * brand brands/<brand>.tokens.json palette, radius and font roles, one value per brand\n * base semantic/base.tokens.json theme-independent semantic (motion, layers, icons), one value\n * semantic semantic/<theme>.tokens.json purpose aliases of palette.*, one value per theme\n * density density/<density>.tokens.json control heights and paddings, one value per density\n * component components/*.tokens.json component hooks aliasing semantic tokens, one value\n */\nexport type Tier = 'primitive' | 'brand' | 'base' | 'semantic' | 'density' | 'component';\nexport const TIER_ORDER: Tier[] = ['primitive', 'brand', 'base', 'semantic', 'density', 'component'];\n\n/** The dimension a multi-mode tier varies along. */\nexport type Axis = 'brand' | 'theme' | 'density';\nexport const TIER_AXIS: Record<Tier, Axis | undefined> = {\n primitive: undefined,\n brand: 'brand',\n base: undefined,\n semantic: 'theme',\n density: 'density',\n component: undefined,\n};\nexport const isMultiMode = (tier: Tier) => TIER_AXIS[tier] !== undefined;\n\n/** Display name of each tier. The Figma plugin uses the same names for its collections. */\nexport const TIER_NAMES: Record<Tier, string> = {\n primitive: 'Primitives',\n brand: 'Brand',\n base: 'Base',\n semantic: 'Semantic',\n density: 'Density',\n component: 'Component',\n};\n\n/** \"light\" -> \"Light\". */\nexport const modeDisplayName = (mode: string) => mode.charAt(0).toUpperCase() + mode.slice(1);\n\n/** One token as written in one DTCG file. */\nexport interface FlatToken {\n path: string;\n /** Resolved `$type`, including the type inherited from parent groups. */\n type: string | undefined;\n /** `$type` written on the token itself (undefined when inherited). */\n ownType: string | undefined;\n value: unknown;\n description: string | undefined;\n extensions: Record<string, unknown> | undefined;\n file: string;\n}\n\nexport interface ModeFile {\n mode: string;\n file: string;\n}\n\n/** A brand's semantic override file for one theme: brands/<brand>.<theme>.tokens.json. */\nexport interface OverrideFile {\n brand: string;\n theme: string;\n file: string;\n}\n\n/** Which files hold which tier (relative to the tokens path). */\nexport interface RepoLayout {\n primitiveFiles: string[];\n brands: ModeFile[];\n baseFiles: string[];\n themes: ModeFile[];\n overrides: OverrideFile[];\n densities: ModeFile[];\n componentFiles: string[];\n}\n\n/**\n * A token as the user thinks about it: one name, one value per mode of its tier. Brand tokens\n * have one value per brand, semantic tokens one per theme, density tokens one per density;\n * the other tiers have a single value under SINGLE_MODE.\n */\nexport interface LogicalToken {\n id: string;\n path: string;\n type: string;\n tier: Tier;\n /** mode key -> DTCG `$value` (alias string like \"{palette.primary.600}\" or a literal). */\n values: Record<string, unknown>;\n description: string | undefined;\n /** Figma scopes from `$extensions[\"com.figma.scopes\"]`, undefined when not declared. */\n scopes: string[] | undefined;\n /** mode key -> file the value lives in. */\n files: Record<string, string>;\n}\n\n/** A brand's per-theme value for a semantic token (code-only: Figma has no brand x theme mode). */\nexport interface ThemeOverride {\n brand: string;\n theme: string;\n path: string;\n type: string | undefined;\n value: unknown;\n file: string;\n}\n\nexport type TokenMap = Map<string, LogicalToken>;\n","// Alias resolution: follows \"{a.b.c}\" chains across tiers, detects cycles and broken references.\n//\n// Each tier varies along its own axis (types.ts): brand tokens per brand, semantic tokens per\n// theme, density tokens per density. A context picks one mode on every axis, so\n// semantic -> palette -> primitive resolves to the value for, say, ocean x dark. A semantic token\n// that a brand overrides for a theme (brands/<brand>.<theme>.tokens.json) takes the override.\n\nimport { type Axis, type LogicalToken, SINGLE_MODE, TIER_AXIS } from './types';\nimport { aliasTarget, collectRefs, isAlias } from './values';\n\nexport interface ResolveContext {\n brand?: string | undefined;\n theme?: string | undefined;\n density?: string | undefined;\n /** overrideKey(brand, theme, path) -> value, from TokenSet.overrideIndex. */\n overrides?: Map<string, unknown> | undefined;\n}\n\nexport type StepSource = 'token' | 'override';\n\nexport interface Resolution {\n /** Final literal value, when resolution succeeded. */\n value?: unknown;\n /** Token paths visited, starting with the requested token. */\n chain: string[];\n /** Where each visited value came from (parallel to `chain`; shorter when resolution stopped). */\n via: StepSource[];\n error?: 'cycle' | 'broken' | 'missing-mode';\n /** Path that could not be found (broken) or that closes the loop (cycle). */\n at?: string;\n}\n\nexport type PathIndex = Map<string, LogicalToken>;\n\n/** Value of a token in a context, and whether a brand override supplied it. */\nexport function valueIn(t: LogicalToken, ctx: ResolveContext): { value: unknown; via: StepSource } {\n const axis = TIER_AXIS[t.tier];\n if (!axis) return { value: t.values[SINGLE_MODE], via: 'token' };\n if (t.tier === 'semantic' && ctx.overrides && ctx.brand && ctx.theme) {\n const o = ctx.overrides.get(`${ctx.brand}|${ctx.theme}|${t.path}`);\n if (o !== undefined) return { value: o, via: 'override' };\n }\n const mode = ctx[axis];\n return { value: mode === undefined ? undefined : t.values[mode], via: 'token' };\n}\n\n/** Resolve the value of `path` in a brand x theme x density context. */\nexport function resolve(index: PathIndex, path: string, ctx: ResolveContext): Resolution {\n const chain: string[] = [];\n const via: StepSource[] = [];\n const seen = new Set<string>();\n let current = path;\n for (;;) {\n if (seen.has(current)) return { chain: [...chain, current], via, error: 'cycle', at: current };\n seen.add(current);\n chain.push(current);\n const t = index.get(current);\n if (!t) return { chain, via, error: 'broken', at: current };\n const v = valueIn(t, ctx);\n if (v.value === undefined) return { chain, via, error: 'missing-mode', at: current };\n via.push(v.via);\n if (!isAlias(v.value)) return { value: v.value, chain, via };\n current = aliasTarget(v.value);\n }\n}\n\nexport interface ReferenceProblem {\n path: string;\n mode: string;\n kind: 'broken' | 'cycle';\n target: string;\n chain: string[];\n}\n\n/** Mode keys per axis (from the repo layout); the first one is the default. */\nexport type AxisModes = Partial<Record<Axis, string[]>>;\n\n/** Every broken reference and cycle in the set, one entry per token and mode of its tier. */\nexport function findReferenceProblems(index: PathIndex, axes: AxisModes): ReferenceProblem[] {\n const out: ReferenceProblem[] = [];\n const base: ResolveContext = { brand: axes.brand?.[0], theme: axes.theme?.[0], density: axes.density?.[0] };\n for (const t of index.values()) {\n const axis = TIER_AXIS[t.tier];\n const modes = axis ? (axes[axis] ?? Object.keys(t.values)).filter((m) => t.values[m] !== undefined) : [SINGLE_MODE];\n for (const mode of modes) {\n const v = t.values[mode];\n for (const ref of collectRefs(v)) {\n if (!index.has(ref)) out.push({ path: t.path, mode, kind: 'broken', target: ref, chain: [t.path, ref] });\n }\n if (isAlias(v)) {\n const r = resolve(index, t.path, axis ? { ...base, [axis]: mode } : base);\n if (r.error === 'cycle') out.push({ path: t.path, mode, kind: 'cycle', target: r.at ?? '', chain: r.chain });\n }\n }\n }\n return out;\n}\n","// Branch previews: where a design system branch can be tried before it merges. Pure URL and text building, shared\n// by the PR comment workflow (.github/workflows/preview-packages.yml) and the docs site Branches page, so both\n// print the same links. See docs/PREVIEWS.md.\n\n/** Apps deployed once per branch. Values are URL templates (see `previewUrl`). */\nexport interface PreviewApps {\n docs?: string | undefined;\n storybook?: string | undefined;\n admin?: string | undefined;\n}\n\nexport interface PreviewsConfig {\n /** Packages published as snapshots for every PR commit (pkg.pr.new). */\n packages: string[];\n /** Per-branch deploy URL templates. Missing entries mean \"not set up\". */\n apps: PreviewApps;\n /** Production URL of each app (the default branch's deploy), fixed URLs without placeholders. */\n production?: PreviewApps | undefined;\n}\n\nexport const PREVIEW_APP_LABELS: Record<keyof PreviewApps, string> = { docs: 'Docs', storybook: 'Storybook', admin: 'Admin demo' };\nexport const PREVIEW_PLACEHOLDERS = ['branch', 'rawBranch', 'pr', 'sha', 'sha7'] as const;\n\nexport interface PreviewContext {\n branch: string;\n pr?: number | undefined;\n sha?: string | undefined;\n}\n\n/**\n * Vercel's branch alias slug: lowercase, every run of characters outside [a-z0-9] becomes one dash, no dash at\n * either end. `feat/Branch_previews` -> `feat-branch-previews`.\n */\nexport function branchSlug(branch: string): string {\n return branch\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n}\n\n/**\n * Fills a URL template. Placeholders: `{branch}` (slug), `{rawBranch}` (URL-encoded), `{pr}`, `{sha}`, `{sha7}`.\n * Returns null when the template needs a value the context lacks, when the result is not an http(s) URL, or when\n * a host label exceeds 63 characters (Vercel then shortens the alias with a hash nobody can predict: read the\n * URL from the Vercel bot comment on the PR instead).\n */\nexport function previewUrl(template: string | undefined, ctx: PreviewContext): string | null {\n if (!template) return null;\n const values: Record<string, string | undefined> = {\n branch: branchSlug(ctx.branch),\n rawBranch: encodeURIComponent(ctx.branch),\n pr: ctx.pr === undefined ? undefined : String(ctx.pr),\n sha: ctx.sha,\n sha7: ctx.sha?.slice(0, 7),\n };\n let missing = false;\n const filled = template.replace(/\\{(\\w+)\\}/g, (_, key: string) => {\n const v = values[key];\n if (!v) missing = true;\n return v ?? '';\n });\n if (missing) return null;\n let url: URL;\n try {\n url = new URL(filled);\n } catch {\n return null;\n }\n if (url.protocol !== 'https:' && url.protocol !== 'http:') return null;\n if (url.hostname.split('.').some((label) => label.length > 63)) return null;\n return url.href;\n}\n\n/** All configured app previews for a branch, in a stable order. Unconfigured or unbuildable ones are left out. */\nexport function previewLinks(apps: PreviewApps, ctx: PreviewContext): { app: keyof PreviewApps; label: string; url: string }[] {\n const out: { app: keyof PreviewApps; label: string; url: string }[] = [];\n for (const app of Object.keys(PREVIEW_APP_LABELS) as (keyof PreviewApps)[]) {\n const url = previewUrl(apps[app], ctx);\n if (url) out.push({ app, label: PREVIEW_APP_LABELS[app], url });\n }\n return out;\n}\n\n/**\n * Where an app lives for a build: its branch preview on any branch other than the default one, its production URL\n * on the default branch or when the branch is unknown (local builds). Falls back to the other one when only one is\n * set up, and returns null when neither is. Trailing slash removed, for joining paths.\n */\nexport function appUrl(\n previews: Pick<PreviewsConfig, 'apps' | 'production'> | undefined,\n app: keyof PreviewApps,\n ctx: { branch?: string | undefined; defaultBranch?: string | undefined } = {},\n): string | null {\n const main = ctx.defaultBranch ?? 'main';\n const production = previewUrl(previews?.production?.[app], { branch: main });\n const onPreview = !!ctx.branch && ctx.branch !== main;\n const url = onPreview\n ? (previewUrl(previews?.apps[app], { branch: ctx.branch! }) ?? production)\n : (production ?? previewUrl(previews?.apps[app], { branch: main }));\n return url ? url.replace(/\\/$/, '') : null;\n}\n\n/**\n * pkg.pr.new snapshot URL for a package at a commit (or a PR number, which pkg.pr.new resolves to its latest\n * commit). Long form `https://pkg.pr.new/<owner>/<repo>/<package>@<ref>`, which works before the package is on npm.\n */\nexport function snapshotUrl(owner: string, repo: string, pkg: string, ref: string | number): string {\n return `https://pkg.pr.new/${owner}/${repo}/${pkg}@${ref}`;\n}\n\n/** One install command for several packages, so internal dependencies resolve to the same snapshot. */\nexport function installCommand(urls: string[], pm: 'npm' | 'pnpm' | 'yarn' = 'npm'): string {\n const verb = pm === 'npm' ? 'npm i' : pm === 'pnpm' ? 'pnpm add' : 'yarn add';\n return `${verb} ${urls.join(' ')}`;\n}\n\n/** Release asset name the fallback workflow uploads (`@bridge-ds/react` -> `bridge-ds-react-<sha7>.tgz`). */\nexport function tarballAssetName(pkg: string, sha: string): string {\n return `${pkg.replace(/^@/, '').replace(/\\//g, '-')}-${sha.slice(0, 7)}.tgz`;\n}\n\n/** Download URL of a fallback tarball attached to the `preview-pr-<n>` prerelease. */\nexport function tarballUrl(owner: string, repo: string, pr: number, pkg: string, sha: string): string {\n return `https://github.com/${owner}/${repo}/releases/download/preview-pr-${pr}/${tarballAssetName(pkg, sha)}`;\n}\n\nexport const PREVIEW_COMMENT_MARKER = '<!-- bridge-branch-preview -->';\n\nexport interface PreviewCommentInput {\n owner: string;\n repo: string;\n pr: number;\n branch: string;\n sha: string;\n /** Snapshot URLs by package, from pkg.pr.new or the tarball fallback. Empty when publishing failed. */\n packages: { name: string; url: string }[];\n /** Where the snapshots come from, for the note under the table. */\n source: 'pkg.pr.new' | 'release' | 'none';\n apps: PreviewApps;\n /** An exploration (`explore/*` branch or `exploration` label): staging only, never merged as is (docs/EXPLORATIONS.md). */\n exploration?: boolean | undefined;\n /**\n * The previews as Vercel reports them (`resolveBranchPreviews` over the deployments, statuses and the Vercel\n * comment). Without it, only template URLs Vercel cannot have shortened are written.\n */\n previews?: BranchPreview[] | undefined;\n}\n\n/** The sticky PR comment: install commands for each package, then the per-branch previews. Markdown, no HTML. */\nexport function previewComment(input: PreviewCommentInput): string {\n const sha7 = input.sha.slice(0, 7);\n const lines = [PREVIEW_COMMENT_MARKER, input.exploration ? '## Try this exploration in your product' : '## Try this DS branch in your product', ''];\n lines.push(`Snapshot of \\`${sha7}\\` on \\`${input.branch}\\`. Install it in a product branch that deploys to staging; production keeps the released version.`, '');\n if (input.exploration) lines.push('This is an exploration: it is never merged as is. Use it for a prototype, a user test, a demo or an A/B idea, then promote it to review or close it.', '');\n\n if (input.packages.length) {\n // Explorations install as `name@url`, so the product's package.json keeps the package names.\n lines.push('```sh', installCommand(input.packages.map((p) => (input.exploration ? `${p.name}@${p.url}` : p.url))), '```', '');\n lines.push('| Package | Install this package only |', '| --- | --- |');\n for (const p of input.packages) lines.push(`| \\`${p.name}\\` | \\`npm i ${p.url}\\` |`);\n lines.push('');\n lines.push(\n input.source === 'release'\n ? `Tarballs from the [\\`preview-pr-${input.pr}\\` prerelease](https://github.com/${input.owner}/${input.repo}/releases/tag/preview-pr-${input.pr}) (pkg.pr.new is not set up). Only the latest commit is kept.`\n : 'Snapshots on [pkg.pr.new](https://pkg.pr.new), one per commit. Swap the commit for the PR number to always get the latest.',\n );\n } else {\n lines.push('No package snapshot for this commit: the publish step failed. See the workflow run.');\n }\n lines.push('');\n\n const ctx = { branch: input.branch, pr: input.pr, sha: input.sha };\n const previews = input.previews ?? resolveBranchPreviews(input.apps, ctx);\n lines.push('### Previews', '');\n if (previews.length) {\n lines.push('| App | Preview |', '| --- | --- |');\n // A URL Vercel shortened is never guessed: its own comment on this pull request has the link.\n for (const p of previews) lines.push(`| ${p.label} | ${p.url ?? 'Link in the Vercel comment on this pull request'} |`);\n const docs = previews.find((p) => p.app === 'docs')?.url;\n if (docs) {\n lines.push('');\n lines.push(`Tokens only, no reinstall: open your staging with \\`?bridge-tokens=${new URL('tokens.css', docs).href}\\` (the staging app must allow this origin, see docs/PREVIEWS.md).`);\n }\n } else {\n lines.push('Preview deploys are not set up: add `previews.apps` to `bridge.config.json` (docs/PREVIEWS.md).');\n }\n return lines.join('\\n') + '\\n';\n}\n\n/** What the sticky comment says about installing a snapshot, read back by tools (plugin, Studio). */\nexport interface PreviewCommentInstall {\n /** The command of the first ```sh block, exactly as the workflow wrote it. Null when publishing failed. */\n command: string | null;\n /** The commit the snapshot was built from (`Snapshot of \\`1a2b3c4\\``), or null when the comment does not say. */\n sha7: string | null;\n /** Where the snapshots live, from the command's URLs. */\n source: 'pkg.pr.new' | 'release' | 'other' | 'none';\n}\n\n/**\n * The install command of a `<!-- bridge-branch-preview -->` comment: the first ```sh block, its lines joined (a\n * trailing `\\` continues a line). Null when the body is not that comment or has no command (the publish failed).\n * This is the command that works: pkg.pr.new when the workflow published there, the prerelease tarballs otherwise.\n */\nexport function installCommandFromPreviewComment(body: string | null | undefined): string | null {\n if (!body || !body.trimStart().startsWith(PREVIEW_COMMENT_MARKER)) return null;\n const m = /```(?:sh|bash|shell)[^\\n]*\\n([\\s\\S]*?)```/.exec(body);\n if (!m) return null;\n const command = m[1]!\n .split('\\n')\n .map((l) => l.trim())\n .filter((l) => l && !l.startsWith('#'))\n .join(' ')\n .replace(/\\s*\\\\\\s+/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim();\n return command || null;\n}\n\n/** Reads a sticky preview comment back: its command, the commit it was built from, where the snapshots live. */\nexport function readPreviewComment(body: string | null | undefined): PreviewCommentInstall | null {\n if (!body || !body.trimStart().startsWith(PREVIEW_COMMENT_MARKER)) return null;\n const command = installCommandFromPreviewComment(body);\n const sha7 = /Snapshot of `([0-9a-f]{7,40})`/.exec(body)?.[1]?.slice(0, 7) ?? null;\n const source = !command ? 'none' : command.includes('https://pkg.pr.new/') ? 'pkg.pr.new' : /\\/releases\\/download\\/preview-pr-\\d+\\//.test(command) ? 'release' : 'other';\n return { command, sha7, source };\n}\n\n/** The sticky preview comment among a pull request's comments (the last one, if a run ever posted twice). */\nexport function findPreviewComment<T extends { body?: string | null | undefined }>(comments: T[]): T | undefined {\n return [...comments].reverse().find((c) => !!c.body && c.body.trimStart().startsWith(PREVIEW_COMMENT_MARKER));\n}\n\n// ---------------------------------------------------------------------------------------------------------------\n// Real branch preview URLs. Vercel shortens a branch alias whose first host label would pass 63 characters\n// (`bridge-admin-git-explore-button-norm-0ed5ba-peterbonos-projects.vercel.app`), with a hash nobody can predict, so\n// tools read the URL Vercel reports instead of filling the template: GitHub deployments, then the Vercel commit\n// statuses, then the Vercel bot comment on the pull request, and the template only when its host labels fit.\n\n/** Where a preview URL comes from, most trusted first. */\nexport type PreviewUrlSource = 'deployment' | 'status' | 'vercel-comment' | 'template';\n/** Whether the preview of the latest commit can be opened. `unknown` when only the template says where it is. */\nexport type PreviewState = 'ready' | 'building' | 'failed' | 'unknown';\n\nexport interface BranchPreview {\n app: keyof PreviewApps;\n label: string;\n /** Null when nothing reports it yet and the template cannot be trusted (a host label over 63 characters). */\n url: string | null;\n state: PreviewState;\n source: PreviewUrlSource | null;\n}\n\n/** A GitHub deployment with its latest status, as `GitHubClient.listDeployments` returns it. */\nexport interface DeploymentLike {\n environment: string;\n state?: string | null | undefined;\n environmentUrl?: string | null | undefined;\n}\n\n/** A commit status (`GET /commits/{sha}/statuses`), newest first like GitHub returns them. */\nexport interface CommitStatusLike {\n context: string;\n state: string;\n target_url?: string | null | undefined;\n}\n\n/** One project of the Vercel bot comment. */\nexport interface VercelCommentProject {\n name: string;\n /** https URL of the branch alias, as Vercel built it (shortened when long). */\n previewUrl: string | null;\n /** `DEPLOYED`, `PENDING`, `BUILDING`, `IGNORED`, `FAILED`... as Vercel writes it. */\n status: string | null;\n}\n\nconst httpsUrl = (raw: string | null | undefined): string | null => {\n if (!raw || typeof raw !== 'string') return null;\n try {\n const u = new URL(/^https?:\\/\\//i.test(raw) ? raw : `https://${raw}`);\n return u.protocol === 'https:' || u.protocol === 'http:' ? u.href : null;\n } catch {\n return null;\n }\n};\n\nconst decodeBase64 = (b64: string): string => {\n const bin = atob(b64.replace(/\\s/g, ''));\n const bytes = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i);\n return new TextDecoder('utf-8').decode(bytes);\n};\n\n/** True for the comment the Vercel GitHub app posts (and edits) on a pull request. */\nexport const isVercelComment = (body: string | null | undefined): boolean => !!body && /^\\[vc\\]: #[^:\\s]*:[A-Za-z0-9+/=]+/m.test(body);\n\n/**\n * The projects of a Vercel bot comment, from its hidden header `[vc]: #<hash>:<base64 JSON>` (projects[].name and\n * previewUrl). Null when the body is not that comment or the header does not decode.\n */\nexport function parseVercelComment(body: string | null | undefined): VercelCommentProject[] | null {\n if (!body) return null;\n const m = /^\\[vc\\]: #[^:\\s]*:([A-Za-z0-9+/=]+)/m.exec(body);\n if (!m) return null;\n let data: { projects?: { name?: unknown; previewUrl?: unknown; nextCommitStatus?: unknown }[] };\n try {\n data = JSON.parse(decodeBase64(m[1]!));\n } catch {\n return null;\n }\n if (!data || !Array.isArray(data.projects)) return null;\n return data.projects\n .filter((p) => p && typeof p.name === 'string')\n .map((p) => ({ name: p.name as string, previewUrl: httpsUrl(typeof p.previewUrl === 'string' ? p.previewUrl : null), status: typeof p.nextCommitStatus === 'string' ? p.nextCommitStatus : null }));\n}\n\n/** The Vercel bot comment among a pull request's comments (the last one, if there were ever two). */\nexport function findVercelComment<T extends { body?: string | null | undefined }>(comments: T[]): T | undefined {\n return [...comments].reverse().find((c) => isVercelComment(c.body));\n}\n\n/** The first host label of a template, up to its first placeholder: `bridge-admin-git-` for the admin template. */\nfunction templateHostPrefix(template: string | undefined): string | null {\n if (!template) return null;\n const host = /^https?:\\/\\/([^/?#]+)/i.exec(template)?.[1];\n if (!host) return null;\n return host.split('.')[0]!.split('{')[0]!.toLowerCase();\n}\n\n/**\n * The app (`docs`, `storybook`, `admin`) a Vercel project serves, from the host its template starts with: project\n * `bridge-admin` serves the app whose template host starts with `bridge-admin-git-` (Vercel's branch alias shape),\n * else with `bridge-admin-` when only one template does. Null when no template names it.\n */\nexport function appForProject(project: string, apps: PreviewApps): keyof PreviewApps | null {\n const name = project.trim().toLowerCase();\n if (!name) return null;\n const keys = Object.keys(PREVIEW_APP_LABELS) as (keyof PreviewApps)[];\n const prefixes = keys.map((app) => [app, templateHostPrefix(apps[app])] as const);\n const exact = prefixes.find(([, p]) => p === `${name}-git-` || p === name);\n if (exact) return exact[0];\n // Otherwise one template must start with `<project>-`; several (a project name that prefixes others) name none.\n const loose = prefixes.filter(([, p]) => p !== null && p.startsWith(`${name}-`));\n return loose.length === 1 ? loose[0]![0] : null;\n}\n\n/** The project a deployment environment or a status context names: `Preview – bridge-admin` -> `bridge-admin`. */\nexport function projectOfLabel(label: string): string | null {\n const m = /^\\s*(?:preview|vercel)\\s*[\\u2013\\u2014-]\\s*(.+?)\\s*$/i.exec(label);\n return m ? m[1]! : null;\n}\n\nconst STATE_OF: Record<string, PreviewState> = {\n success: 'ready',\n inactive: 'ready',\n deployed: 'ready',\n ready: 'ready',\n ignored: 'ready', // Vercel skipped the build (nothing changed for this app): the branch alias serves the last one.\n pending: 'building',\n queued: 'building',\n in_progress: 'building',\n building: 'building',\n initializing: 'building',\n failure: 'failed',\n error: 'failed',\n failed: 'failed',\n canceled: 'failed',\n};\nconst stateOf = (s: string | null | undefined): PreviewState => STATE_OF[(s ?? '').toLowerCase()] ?? 'unknown';\nconst isInspectorUrl = (u: string) => /^https:\\/\\/(?:www\\.)?vercel\\.com\\//i.test(u);\n\nexport interface BranchPreviewSources {\n /** GitHub deployments of the head commit, each with its latest status. */\n deployments?: DeploymentLike[] | undefined;\n /** Commit statuses of the head commit, newest first. */\n statuses?: CommitStatusLike[] | undefined;\n /** The pull request's comments (the Vercel bot comment is read from them). */\n comments?: { body?: string | null | undefined }[] | undefined;\n}\n\n/**\n * The preview of each configured app, real URL first: a GitHub deployment's environment URL, then a Vercel commit\n * status pointing at the deployment (not at the inspector), then the Vercel bot comment, and the config template only\n * when its host labels fit in 63 characters (else Vercel shortened it: url null until a real source reports it).\n * The state comes from the freshest signal: commit status, then deployment, then the comment.\n */\nexport function resolveBranchPreviews(apps: PreviewApps, ctx: PreviewContext, sources: BranchPreviewSources = {}): BranchPreview[] {\n type Seen = { url?: string; urlSource?: PreviewUrlSource; state?: PreviewState; stateRank?: number };\n const seen = new Map<keyof PreviewApps, Seen>();\n const at = (app: keyof PreviewApps) => seen.get(app) ?? (seen.set(app, {}), seen.get(app)!);\n const offer = (app: keyof PreviewApps | null, url: string | null, urlSource: PreviewUrlSource, state: PreviewState, stateRank: number) => {\n if (!app) return;\n const s = at(app);\n if (url && !s.url) Object.assign(s, { url, urlSource });\n if (state !== 'unknown' && (s.stateRank === undefined || stateRank < s.stateRank)) Object.assign(s, { state, stateRank });\n };\n\n // 1. Commit statuses (Vercel – <project>): newest first, so the first one per context is current.\n const contexts = new Set<string>();\n for (const st of sources.statuses ?? []) {\n if (contexts.has(st.context)) continue;\n contexts.add(st.context);\n const project = projectOfLabel(st.context);\n if (!project) continue;\n const url = httpsUrl(st.target_url);\n offer(appForProject(project, apps), url && !isInspectorUrl(url) ? url : null, 'status', stateOf(st.state), 0);\n }\n // 2. Deployments (Preview – <project>): their URL beats the status's.\n for (const d of sources.deployments ?? []) {\n const project = projectOfLabel(d.environment);\n const app = project ? appForProject(project, apps) : null;\n if (!app) continue;\n const url = httpsUrl(d.environmentUrl);\n const s = at(app);\n if (url && s.urlSource !== 'deployment') Object.assign(s, { url, urlSource: 'deployment' as const });\n const state = stateOf(d.state);\n if (state !== 'unknown' && (s.stateRank === undefined || 1 < s.stateRank)) Object.assign(s, { state, stateRank: 1 });\n }\n // 3. The Vercel bot comment.\n for (const p of parseVercelComment(findVercelComment(sources.comments ?? [])?.body) ?? []) offer(appForProject(p.name, apps), p.previewUrl, 'vercel-comment', stateOf(p.status), 2);\n\n const out: BranchPreview[] = [];\n for (const app of Object.keys(PREVIEW_APP_LABELS) as (keyof PreviewApps)[]) {\n if (!apps[app]) continue;\n const s = seen.get(app) ?? {};\n // 4. The template, only when Vercel would not have shortened it (previewUrl returns null over 63 characters).\n const url = s.url ?? previewUrl(apps[app], ctx);\n const source: PreviewUrlSource | null = s.url ? s.urlSource! : url ? 'template' : null;\n out.push({ app, label: PREVIEW_APP_LABELS[app], url, state: s.state ?? 'unknown', source });\n }\n return out;\n}\n\n/** The previews that have a URL, as links (`{ app, label, url }`), in the stable app order. */\nexport const previewLinksOf = (previews: BranchPreview[]): { app: keyof PreviewApps; label: string; url: string }[] =>\n previews.filter((p): p is BranchPreview & { url: string } => !!p.url).map((p) => ({ app: p.app, label: p.label, url: p.url }));\n\n/** True when every configured app has its URL and a finished build (ready or failed): polling can stop. */\nexport const previewsSettled = (previews: BranchPreview[]): boolean => previews.every((p) => !!p.url && (p.state === 'ready' || p.state === 'failed'));\n","// Roles by team: an owner entry in `governance.owners` is a person (`peterbono`, `@peterbono`) or a GitHub team\n// (`@acme/design`). Membership is managed in GitHub; Bridge reads it, never stores it. Still no database.\n//\n// Parsing and the pure helpers below need no network. TeamDirectory expands teams to logins through any client\n// with the TeamReader methods (GitHubClient has them), with a cache. A team it cannot read is a typed\n// \"unreadable\" state with the reason and the fix, never an empty list: an empty owner list means \"any reviewer\n// counts\", so silently emptying a team would open the gate. An unreadable team keeps its \"@org/slug\" key in the\n// expanded lists instead: it holds the place, and no login ever matches it (logins have no \"/\").\n\nimport type { Owners } from './config';\n\nexport type OwnerEntry = { kind: 'person'; login: string } | { kind: 'team'; org: string; slug: string };\n\n// GitHub logins: letters, digits and single hyphens, no leading or trailing hyphen, 39 characters at most.\nconst LOGIN = /^[A-Za-z0-9](?:[A-Za-z0-9]|-(?=[A-Za-z0-9])){0,38}$/;\n// Team slugs: lowercase letters, digits, hyphens, underscores and dots as GitHub generates them; case-insensitive here.\nconst SLUG = /^[A-Za-z0-9][A-Za-z0-9._-]{0,99}$/;\n\n/** A person or a team, or null when `raw` is neither. Accepts a leading @ on both. */\nexport function parseOwnerEntry(raw: string): OwnerEntry | null {\n if (typeof raw !== 'string') return null;\n const s = raw.trim().replace(/^@/, '');\n const slash = s.indexOf('/');\n if (slash < 0) return LOGIN.test(s) ? { kind: 'person', login: s } : null;\n const org = s.slice(0, slash);\n const slug = s.slice(slash + 1);\n return LOGIN.test(org) && SLUG.test(slug) ? { kind: 'team', org, slug } : null;\n}\n\n/** \"@acme/design\" for a team, \"peterbono\" for a person: the form Bridge writes back to bridge.config.json. */\nexport function formatOwnerEntry(e: OwnerEntry): string {\n return e.kind === 'team' ? `@${e.org}/${e.slug}` : e.login;\n}\n\n/** Whether a raw entry names a team. */\nexport const isTeamEntry = (raw: string): boolean => parseOwnerEntry(raw)?.kind === 'team';\n\n/** Case-insensitive key of a team: \"@acme/design\". */\nexport const teamKey = (org: string, slug: string): string => `@${org.toLowerCase()}/${slug.toLowerCase()}`;\n\n/** Key of a raw team entry, undefined for a person or a malformed entry. */\nexport function teamKeyOf(raw: string): string | undefined {\n const e = parseOwnerEntry(raw);\n return e?.kind === 'team' ? teamKey(e.org, e.slug) : undefined;\n}\n\n/**\n * Problems in the raw owner lists, in the words loadConfig reports. Each malformed entry is named with the two\n * accepted forms, so the fix is in the message.\n */\nexport function ownerEntryProblems(raw: unknown): string[] {\n if (raw === undefined) return [];\n const isObj = (x: unknown): x is Record<string, unknown> => Boolean(x) && typeof x === 'object' && !Array.isArray(x);\n if (!isObj(raw)) return ['\"governance.owners\" must be { \"design\": [people or teams], \"tech\": [people or teams] }'];\n const out: string[] = [];\n for (const [k, v] of Object.entries(raw)) {\n if (k !== 'design' && k !== 'tech') {\n out.push(`\"governance.owners.${k}\" is not an owner group (design, tech)`);\n continue;\n }\n if (!Array.isArray(v)) {\n out.push(`\"governance.owners.${k}\" must be a list of people or teams`);\n continue;\n }\n v.forEach((x, i) => {\n if (typeof x !== 'string' || !parseOwnerEntry(x))\n out.push(`\"governance.owners.${k}[${i}]\" (${JSON.stringify(x)}) is not a GitHub login or team. Write a person as \"peterbono\" or \"@peterbono\", a team as \"@org/team-slug\".`);\n });\n }\n return out;\n}\n\n/** Why a team's members cannot be read, each with its own fix (teamUnreadableMessage). */\nexport type TeamUnreadableReason =\n /** The repository owner (or the org named) is a personal account: GitHub teams only exist in organizations. */\n | 'personal-account'\n /** The token works but may not read the organization's teams (classic: read:org; fine-grained: Members, read). */\n | 'missing-permission'\n /** No token, or GitHub refused it: GitHub never shows team members anonymously. */\n | 'no-token'\n /** GitHub says the team does not exist, or hides it from this token. */\n | 'not-found'\n /** GitHub did not answer (network, rate limit, server error). */\n | 'unreachable';\n\nexport interface TeamRef {\n /** \"@acme/design\", lowercase. */\n key: string;\n org: string;\n slug: string;\n}\n\nexport type TeamState =\n | (TeamRef & { status: 'ok'; members: string[] })\n | (TeamRef & { status: 'unreadable'; reason: TeamUnreadableReason; message: string });\n\n/** Team states by key (\"@acme/design\"). */\nexport type TeamStates = Record<string, TeamState>;\n\n/** The one sentence that says why a team cannot be read and how to fix it. */\nexport function teamUnreadableMessage(team: { org: string; slug: string }, reason: TeamUnreadableReason): string {\n const name = `@${team.org}/${team.slug}`;\n switch (reason) {\n case 'personal-account':\n return `${name} cannot be used: ${team.org} is a personal GitHub account, and teams only exist in organizations. List people instead, or move the repository to an organization.`;\n case 'missing-permission':\n return `The members of ${name} cannot be read: the GitHub token needs read:org (classic token) or Members: Read on the ${team.org} organization (fine-grained token).`;\n case 'no-token':\n return `The members of ${name} cannot be read without a working GitHub token. Connect GitHub with a token that has read:org.`;\n case 'not-found':\n return `${name} was not found. Check the team slug on GitHub, or give the token read:org so it can see the team.`;\n case 'unreachable':\n return `The members of ${name} cannot be read right now: GitHub did not answer. Try again in a moment.`;\n }\n}\n\n/** Distinct teams named in the owner lists, in order. */\nexport function teamsIn(owners: Partial<Owners> | readonly string[]): TeamRef[] {\n const all = Array.isArray(owners) ? (owners as string[]) : [...((owners as Partial<Owners>).design ?? []), ...((owners as Partial<Owners>).tech ?? [])];\n const out = new Map<string, TeamRef>();\n for (const raw of all) {\n const e = parseOwnerEntry(raw);\n if (e?.kind === 'team') out.set(teamKey(e.org, e.slug), { key: teamKey(e.org, e.slug), org: e.org, slug: e.slug });\n }\n return [...out.values()];\n}\n\nconst norm = (x: string) => x.trim().toLowerCase().replace(/^@/, '');\n\n/**\n * Logins of a list of entries: people as they are, a readable team as its members. An unreadable team, or one not\n * resolved yet, stays as its \"@org/slug\" key: never empty, never matching a login.\n */\nexport function expandEntries(entries: readonly string[], teams?: TeamStates | null): string[] {\n const out: string[] = [];\n const seen = new Set<string>();\n const add = (x: string) => {\n const k = norm(x);\n if (k && !seen.has(k)) {\n seen.add(k);\n out.push(x.replace(/^@(?=[^/]+$)/, ''));\n }\n };\n for (const raw of entries) {\n const e = parseOwnerEntry(raw);\n if (!e) continue;\n if (e.kind === 'person') add(e.login);\n else {\n const state = teams?.[teamKey(e.org, e.slug)];\n if (state?.status === 'ok') state.members.forEach(add);\n else add(teamKey(e.org, e.slug));\n }\n }\n return out;\n}\n\n/** Both owner lists expanded (expandEntries). */\nexport function expandOwners(owners: Owners, teams?: TeamStates | null): Owners {\n return { design: expandEntries(owners.design, teams), tech: expandEntries(owners.tech, teams) };\n}\n\nconst people = (n: number) => `${n} ${n === 1 ? 'person' : 'people'}`;\n\n/** How an entry reads in a sentence: \"@peterbono\", \"@acme/design (4 people)\", \"@acme/design\" while unknown. */\nexport function entryLabel(raw: string, teams?: TeamStates | null): string {\n const e = parseOwnerEntry(raw);\n if (!e) return raw;\n if (e.kind === 'person') return `@${e.login}`;\n const state = teams?.[teamKey(e.org, e.slug)];\n const name = `@${e.org}/${e.slug}`;\n return state?.status === 'ok' ? `${name} (${people(state.members.length)})` : name;\n}\n\n/**\n * The entries to name for a set of logins (someone who can still act): each person among them, each team with a\n * member among them, and each team whose members are unknown (it may hold one). Labels as entryLabel.\n */\nexport function entriesFor(entries: readonly string[], logins: readonly string[], teams?: TeamStates | null): string[] {\n const want = new Set(logins.map(norm));\n const out: string[] = [];\n for (const raw of entries) {\n const e = parseOwnerEntry(raw);\n if (!e) continue;\n if (e.kind === 'person') {\n if (want.has(norm(e.login))) out.push(entryLabel(raw, teams));\n continue;\n }\n const state = teams?.[teamKey(e.org, e.slug)];\n if (state?.status !== 'ok' || state.members.some((m) => want.has(norm(m)))) out.push(entryLabel(raw, teams));\n }\n return [...new Set(out)];\n}\n\n/** Teams that could not be read, in order. */\nexport function unreadableTeams(teams: TeamStates | null | undefined): Extract<TeamState, { status: 'unreadable' }>[] {\n return Object.values(teams ?? {}).filter((t): t is Extract<TeamState, { status: 'unreadable' }> => t.status === 'unreadable');\n}\n\n// ---------------------------------------------------------------------------------------------------------------\n// Reading teams from GitHub\n\n/** What TeamDirectory needs from a GitHub client. GitHubClient implements it. */\nexport interface TeamReader {\n /** Whether a token is sent: GitHub never lists team members anonymously. */\n readonly hasToken: boolean;\n /** Every member login of a team (GET /orgs/{org}/teams/{slug}/members, all pages). */\n listTeamMembers(org: string, slug: string): Promise<string[]>;\n /** A user's membership of a team (GET /orgs/{org}/teams/{slug}/memberships/{user}): \"active\", \"pending\", or null when not a member. */\n getTeamMembership(org: string, slug: string, login: string): Promise<'active' | 'pending' | null>;\n /** \"User\" or \"Organization\" (GET /users/{login}), null when unknown. */\n getAccountType(login: string): Promise<'User' | 'Organization' | null>;\n /** The organization's teams the token can see (GET /orgs/{org}/teams, all pages). */\n listOrgTeams(org: string): Promise<{ slug: string; name: string }[]>;\n}\n\n/** The parts of a GitHub error TeamDirectory reads (GitHubError has them). */\ninterface ErrorLike {\n status?: number;\n auth?: string;\n}\n\nexport interface TeamDirectoryOptions {\n /** How long a team read is kept, in ms. Default 5 minutes. */\n ttlMs?: number;\n now?: () => number;\n}\n\n/** Whether one person may act through a list of entries, and which teams could not be checked. */\nexport interface MembershipResult {\n member: boolean;\n /** Teams whose membership could not be read: when `member` is false, the answer may be wrong for them. */\n unreadable: Extract<TeamState, { status: 'unreadable' }>[];\n}\n\n/**\n * Expands teams to logins through a TeamReader, with a cache: each team is read once per `ttlMs`, concurrent reads\n * of one team share the request. Every failure becomes an \"unreadable\" state with its reason.\n */\nexport class TeamDirectory {\n private readonly teams = new Map<string, { at: number; value: Promise<TeamState> }>();\n private readonly accounts = new Map<string, Promise<'User' | 'Organization' | null>>();\n private readonly memberships = new Map<string, { at: number; value: Promise<boolean | TeamState> }>();\n private readonly ttl: number;\n private readonly now: () => number;\n\n constructor(\n private readonly reader: TeamReader,\n opts: TeamDirectoryOptions = {},\n ) {\n this.ttl = opts.ttlMs ?? 5 * 60_000;\n this.now = opts.now ?? Date.now;\n }\n\n private accountType(org: string): Promise<'User' | 'Organization' | null> {\n const k = org.toLowerCase();\n let p = this.accounts.get(k);\n if (!p) {\n p = this.reader.getAccountType(org).catch(() => null);\n this.accounts.set(k, p);\n }\n return p;\n }\n\n /** The reason a read of `org` failed, as a state. A 404 on a personal account says so; a 403 is a missing permission. */\n private async failure(ref: TeamRef, err: unknown): Promise<TeamState> {\n const e = (err ?? {}) as ErrorLike;\n let reason: TeamUnreadableReason;\n if (!this.reader.hasToken) reason = (await this.accountType(ref.org)) === 'User' ? 'personal-account' : 'no-token';\n else if (e.status === 401) reason = 'no-token';\n else if (e.status === 403 || e.auth === 'missing-permission') reason = 'missing-permission';\n else if (e.status === 404) reason = (await this.accountType(ref.org)) === 'User' ? 'personal-account' : 'not-found';\n else reason = 'unreachable';\n return { ...ref, status: 'unreadable', reason, message: teamUnreadableMessage(ref, reason) };\n }\n\n /** Members of one team, or why they cannot be read. Cached. */\n team(org: string, slug: string): Promise<TeamState> {\n const ref: TeamRef = { key: teamKey(org, slug), org, slug };\n const hit = this.teams.get(ref.key);\n if (hit && this.now() - hit.at < this.ttl) return hit.value;\n const value = (async (): Promise<TeamState> => {\n if (!this.reader.hasToken) return this.failure(ref, undefined);\n try {\n const members = await this.reader.listTeamMembers(org, slug);\n return { ...ref, status: 'ok', members };\n } catch (err) {\n return this.failure(ref, err);\n }\n })();\n this.teams.set(ref.key, { at: this.now(), value });\n // A failure GitHub may fix in a moment is not kept.\n void value.then((s) => {\n if (s.status === 'unreadable' && s.reason === 'unreachable') this.teams.delete(ref.key);\n });\n return value;\n }\n\n /** Every team named in the owner lists, read in parallel. Empty object when no team is named (no request). */\n async resolve(owners: Partial<Owners> | readonly string[]): Promise<TeamStates> {\n const refs = teamsIn(owners);\n const states = await Promise.all(refs.map((r) => this.team(r.org, r.slug)));\n return Object.fromEntries(states.map((s) => [s.key, s]));\n }\n\n /**\n * Whether `login` is an active member of one team: from the cached member list when there is one, else one\n * membership read (GET /orgs/{org}/teams/{slug}/memberships/{user}). An unreadable team returns its state.\n */\n async isMember(org: string, slug: string, login: string): Promise<boolean | TeamState> {\n const ref: TeamRef = { key: teamKey(org, slug), org, slug };\n const cached = this.teams.get(ref.key);\n if (cached && this.now() - cached.at < this.ttl) {\n const s = await cached.value;\n if (s.status === 'ok') return s.members.some((m) => norm(m) === norm(login));\n }\n const k = `${ref.key}#${norm(login)}`;\n const hit = this.memberships.get(k);\n if (hit && this.now() - hit.at < this.ttl) return hit.value;\n const value = (async (): Promise<boolean | TeamState> => {\n if (!this.reader.hasToken) return this.failure(ref, undefined);\n try {\n return (await this.reader.getTeamMembership(org, slug, login)) === 'active';\n } catch (err) {\n return this.failure(ref, err);\n }\n })();\n this.memberships.set(k, { at: this.now(), value });\n return value;\n }\n\n /**\n * Whether `login` holds a right given to `entries` (people and teams): a person entry matches directly, a team\n * through its membership. Teams are only read when no person entry matches.\n */\n async memberOfAny(entries: readonly string[], login: string): Promise<MembershipResult> {\n const unreadable: MembershipResult['unreadable'] = [];\n const parsed = entries.map(parseOwnerEntry).filter((e): e is OwnerEntry => Boolean(e));\n if (parsed.some((e) => e.kind === 'person' && norm(e.login) === norm(login))) return { member: true, unreadable };\n for (const e of parsed) {\n if (e.kind !== 'team') continue;\n const r = await this.isMember(e.org, e.slug, login);\n if (r === true) return { member: true, unreadable };\n if (typeof r === 'object' && r.status === 'unreadable') unreadable.push(r);\n }\n return { member: false, unreadable };\n }\n\n /** The organization's teams for a picker, or why they cannot be listed (a personal account has none). */\n async orgTeams(org: string): Promise<{ status: 'ok'; teams: { slug: string; name: string }[] } | { status: 'unreadable'; reason: TeamUnreadableReason }> {\n if ((await this.accountType(org)) === 'User') return { status: 'unreadable', reason: 'personal-account' };\n if (!this.reader.hasToken) return { status: 'unreadable', reason: 'no-token' };\n try {\n return { status: 'ok', teams: await this.reader.listOrgTeams(org) };\n } catch (err) {\n const s = await this.failure({ key: teamKey(org, '*'), org, slug: '*' }, err);\n return { status: 'unreadable', reason: s.status === 'unreadable' ? s.reason : 'unreachable' };\n }\n }\n\n /** Drops every cached read (after the token changes). */\n clear(): void {\n this.teams.clear();\n this.accounts.clear();\n this.memberships.clear();\n }\n}\n","// Roles and their rights: which owner group may approve the design side, approve the tech side and ship (merge a\n// pull request, which publishes the change to the products). `governance.rights` in bridge.config.json; each team\n// edits it in Studio Settings. Pure functions, shared by Studio Reviews, Settings, the CLI and the MCP server.\n//\n// Backward compatible: a config without `rights` behaves as before it existed. Approvals follow the owner lists,\n// and anyone with write access to the repo may ship. DEFAULT_RIGHTS is what Settings proposes and what new\n// configs get: design owners approve design, tech owners approve tech, tech owners ship.\n//\n// Owner entries may be GitHub teams (\"@acme/design\", teams.ts). Pass the team states (TeamDirectory.resolve) to the\n// functions below and teams count as their members; without them, or for a team that cannot be read, the team keeps\n// its \"@org/slug\" place in the lists so they never turn empty, and no login matches it.\n\nimport type { Owners } from './config';\nimport { entryLabel, expandEntries, expandOwners, unreadableTeams, type TeamState, type TeamStates } from './teams';\n\n/** An owner group from `governance.owners`. */\nexport type OwnerGroup = 'design' | 'tech';\n\nexport const OWNER_GROUPS: readonly OwnerGroup[] = ['design', 'tech'];\n\n/** The three rights, each held by one or more owner groups. */\nexport interface Rights {\n approveDesign: OwnerGroup[];\n approveTech: OwnerGroup[];\n ship: OwnerGroup[];\n}\n\nexport type Right = keyof Rights;\n\nexport const RIGHTS: readonly Right[] = ['approveDesign', 'approveTech', 'ship'];\n\n/** Plain names of each right, for Settings and the gate messages. \"Ship\" means publish to the products. */\nexport const RIGHT_LABEL: Record<Right, string> = {\n approveDesign: 'Approve design',\n approveTech: 'Approve tech',\n ship: 'Ship',\n};\n\nexport const DEFAULT_RIGHTS: Rights = { approveDesign: ['design'], approveTech: ['tech'], ship: ['tech'] };\n\nconst norm = (x: string) => x.trim().toLowerCase().replace(/^@/, '');\nconst uniq = <T>(xs: T[]) => [...new Set(xs)];\n\n/** Rights with every missing entry filled from DEFAULT_RIGHTS, groups deduplicated in design, tech order. */\nexport function normalizeRights(input: Partial<Record<Right, readonly string[]>> | null | undefined): Rights {\n const pick = (r: Right): OwnerGroup[] => {\n const v = input?.[r];\n if (!Array.isArray(v)) return [...DEFAULT_RIGHTS[r]];\n return OWNER_GROUPS.filter((g) => v.includes(g));\n };\n return { approveDesign: pick('approveDesign'), approveTech: pick('approveTech'), ship: pick('ship') };\n}\n\n/** Problems in a raw `governance.rights` value, in the words loadConfig reports. Empty: valid. */\nexport function rightsProblems(raw: unknown): string[] {\n if (raw === undefined) return [];\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return ['\"governance.rights\" must be { \"approveDesign\": [groups], \"approveTech\": [groups], \"ship\": [groups] }'];\n const out: string[] = [];\n for (const [k, v] of Object.entries(raw as Record<string, unknown>)) {\n if (!(RIGHTS as readonly string[]).includes(k)) out.push(`\"governance.rights.${k}\" is not a right (${RIGHTS.join(', ')})`);\n else if (!Array.isArray(v) || v.length === 0 || !v.every((g) => (OWNER_GROUPS as readonly unknown[]).includes(g)))\n out.push(`\"governance.rights.${k}\" must list one or more of \"design\", \"tech\"`);\n }\n return out;\n}\n\n/** The entries (people and teams) holding a right: the union of the owner lists of its groups. Empty when those lists are empty. */\nexport function holdersOf(right: Right, owners: Owners, rights: Rights | null | undefined): string[] {\n const groups = (rights ?? DEFAULT_RIGHTS)[right];\n return uniq(groups.flatMap((g) => owners[g] ?? []));\n}\n\n/**\n * Owner lists to count approvals against (summarizeApprovals): who may approve design, who may approve tech.\n * Without `rights`, the owner lists as they are.\n */\nexport function approverLists(owners: Owners, rights: Rights | null | undefined, teams?: TeamStates | null): Owners {\n const entries = approverEntries(owners, rights);\n return teams === undefined ? entries : expandOwners(entries, teams);\n}\n\n/** approverLists before team expansion: the entries as the config names them, for sentences. */\nexport function approverEntries(owners: Owners, rights: Rights | null | undefined): Owners {\n if (!rights) return { design: [...owners.design], tech: [...owners.tech] };\n return { design: holdersOf('approveDesign', owners, rights), tech: holdersOf('approveTech', owners, rights) };\n}\n\n/**\n * The one person who holds both approver places, or null: the design and tech lists (after rights, teams expanded)\n * name exactly one login between them, and it sits in both. A team, read or not, never counts as one person.\n */\nexport function soloApprover(owners: { design: string[]; tech: string[] }): string | null {\n const d = [...new Set(owners.design.map(norm))];\n const t = [...new Set(owners.tech.map(norm))];\n if (d.length !== 1 || t.length !== 1 || d[0] !== t[0] || !d[0] || d[0].includes('/')) return null;\n return d[0];\n}\n\n/**\n * The only owner whose approval covers design and tech, or null when the rule is off or does not apply:\n * `governance.soloOwnerCanApproveBoth` is true and the approver lists (after rights, teams expanded) name one person\n * in both places. Studio Settings, the review screens, the MCP server and the CLI word it from this.\n */\nexport function soloOwnerOf(\n gov: { owners: Owners; rights?: Rights | null | undefined; soloOwnerCanApproveBoth?: boolean | undefined },\n teams?: TeamStates | null,\n): string | null {\n if (!gov.soloOwnerCanApproveBoth) return null;\n return soloApprover(approverLists(gov.owners, gov.rights ?? null, teams));\n}\n\n/** The rule in one sentence, for Settings, the CLI and the MCP server. `you`: the viewer is that owner. */\nexport function soloOwnerSentence(login: string, you = false): string {\n return you ? 'As the only owner, your approval covers design and code.' : `As the only owner, @${norm(login)} approves design and code in one review.`;\n}\n\n/** Who may ship, or null when nobody is singled out (no `rights`, or its groups list no logins): anyone with write access. */\nexport interface ShipPolicy {\n /** Logins allowed to ship: people, and team members once read. A team not read keeps its \"@org/slug\" key. */\n logins: string[];\n /** Owner groups holding the right, for the sentence (\"the tech owner\", \"a design or tech owner\"). */\n groups: OwnerGroup[];\n /** The entries as the config names them (people and teams), for the sentence. Absent: `logins`. */\n entries?: string[];\n /** Team states known when the policy was built, for the sentence (\"@acme/design (4 people)\"). */\n teams?: TeamStates;\n}\n\n/**\n * Who may ship. With `teams` (TeamDirectory.resolve), team members count; a team that cannot be read still holds\n * the right, so the policy is never dropped to \"anyone with write access\" because a team was not read.\n */\nexport function shipPolicy(owners: Owners, rights: Rights | null | undefined, teams?: TeamStates | null): ShipPolicy | null {\n if (!rights) return null;\n const entries = holdersOf('ship', owners, rights);\n if (!entries.length) return null;\n const logins = expandEntries(entries, teams);\n return { logins, groups: [...rights.ship], entries, ...(teams ? { teams } : {}) };\n}\n\n/** Teams in a ship policy that could not be read: the gate names them with the fix. */\nexport function unreadableShipTeams(policy: ShipPolicy | null | undefined): TeamState[] {\n if (!policy?.teams) return [];\n const keys = new Set((policy.entries ?? []).map((e) => e.trim().toLowerCase().replace(/^@?/, '@')));\n return unreadableTeams(policy.teams).filter((t) => keys.has(t.key));\n}\n\n/** Whether `login` may ship. No policy: yes (GitHub write access still decides). */\nexport function canShip(login: string | null | undefined, policy: ShipPolicy | null | undefined): boolean {\n if (!policy) return true;\n // A login never holds a \"/\": the \"@org/slug\" place of a team not read cannot be matched.\n if (!login || login.includes('/')) return false;\n return policy.logins.map(norm).includes(norm(login));\n}\n\n/** \"the tech owner\", \"the design owner\", \"a design or tech owner\". */\nexport function groupsPhrase(groups: readonly OwnerGroup[]): string {\n const g = OWNER_GROUPS.filter((x) => groups.includes(x));\n if (g.length === 1) return `the ${g[0]} owner`;\n return `a ${g.join(' or ')} owner`;\n}\n\n/** The sentence a blocked viewer reads: \"Only the tech owner can merge this.\" */\n/** Teams are named as teams, with their size when known: \"Only the tech owner can merge this (@acme/web (4 people)).\" */\nexport function whoCanShipSentence(policy: ShipPolicy): string {\n const names = (policy.entries ?? policy.logins).map((l) => entryLabel(l, policy.teams)).join(', ');\n return `Only ${groupsPhrase(policy.groups)} can merge this${names ? ` (${names})` : ''}.`;\n}\n\n/** Visual before and after: on every pull request that touches tokens or components, or only when asked. */\nexport type VisualImpactMode = 'auto' | 'on-demand';\n\nexport interface VisualImpactConfig {\n mode: VisualImpactMode;\n}\n\nexport const DEFAULT_VISUAL_IMPACT: VisualImpactConfig = { mode: 'auto' };\n\n/** Label that asks the visual impact workflow to run in on-demand mode. */\nexport const VISUAL_CHECK_LABEL = 'visual-check';\n\nexport function visualImpactProblems(raw: unknown): string[] {\n if (raw === undefined) return [];\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return ['\"visualImpact\" must be { \"mode\": \"auto\" | \"on-demand\" }'];\n const out: string[] = [];\n for (const [k, v] of Object.entries(raw as Record<string, unknown>)) {\n if (k !== 'mode') out.push(`\"visualImpact.${k}\" is not a setting (mode)`);\n else if (v !== 'auto' && v !== 'on-demand') out.push('\"visualImpact.mode\" must be \"auto\" or \"on-demand\"');\n }\n return out;\n}\n","// Products: the apps that consume the design system, as bridge.config.json `products` lists them. Bridge Studio\n// groups branches by product, and the CLI and MCP server tell which product a folder or a repository is. A product\n// lives in a folder of the design system repo (`path`) or in another GitHub repository (`repo`); the default one is\n// the library itself, where a branch lands when nothing else matches. Pure: no Node API, it runs in the browser too.\n\nexport interface ProductConfig {\n /** Stable id: lowercase letters, digits and dashes (\"admin\"). The `product: <key>` label names it. */\n key: string;\n /** What people read (\"Admin demo\"). */\n name: string;\n /** \"owner/name\" when the product lives in another GitHub repository. */\n repo?: string;\n /** Folder of this repository, repo-relative (\"apps/admin\"). */\n path?: string;\n /** Preview URL pattern, same placeholders as previews.apps: {branch} {rawBranch} {pr} {sha} {sha7}. */\n preview?: string;\n /** react, vue, angular, svelte, astro, other. */\n framework?: string;\n /** The product a branch belongs to when nothing else matches: the library. */\n default?: boolean;\n}\n\n/** What a config without `products` means: the Admin demo first, then the library (the default). */\nexport const DEFAULT_PRODUCTS: ProductConfig[] = [\n { key: 'admin', name: 'Admin demo', path: 'apps/admin', framework: 'react' },\n { key: 'library', name: 'Library', default: true },\n];\n\n/** Pull request labels that pin a branch to a product (\"product: admin\"). */\nexport const PRODUCT_LABEL_PREFIX = 'product: ';\n\nexport const productLabel = (key: string): string => `${PRODUCT_LABEL_PREFIX}${key}`;\n\n/**\n * Labels and a body line for new work started for a product (a branch, an exploration, a request): the\n * `product: <key>` label and \"**Product:** <name>\". The default product adds nothing, since productOfBranch lands\n * an unlabeled branch there. Studio, the CLI and the MCP server all write these.\n */\nexport function productMarks(products: readonly ProductConfig[], p: ProductConfig): { labels: string[]; line: string } {\n if (p.key === defaultProduct(products).key) return { labels: [], line: '' };\n return { labels: [productLabel(p.key)], line: `**Product:** ${p.name}` };\n}\n\n/** The configured products, or DEFAULT_PRODUCTS when the config lists none. */\nexport function productsOf(config: { products?: ProductConfig[] | undefined } | null | undefined): ProductConfig[] {\n const list = config?.products;\n return Array.isArray(list) && list.length ? list : DEFAULT_PRODUCTS;\n}\n\n/** The product marked `default: true`, else the last one listed. */\nexport function defaultProduct(products: readonly ProductConfig[]): ProductConfig {\n const list = products.length ? products : DEFAULT_PRODUCTS;\n return list.find((p) => p.default) ?? list[list.length - 1]!;\n}\n\n/** A product by key or name, whatever the case. */\nexport function findProduct(products: readonly ProductConfig[], keyOrName: string | null | undefined): ProductConfig | undefined {\n const k = (keyOrName ?? '').trim().toLowerCase();\n if (!k) return undefined;\n return products.find((p) => p.key.toLowerCase() === k) ?? products.find((p) => p.name.toLowerCase() === k);\n}\n\nconst cleanPath = (p: string) => p.trim().replace(/^\\.?\\/+|\\/+$/g, '');\n\n/**\n * The product a branch belongs to: a `product: <key>` label naming a known product wins; else the first product\n * (other than the default) whose folder holds one of the changed files; else the default product. Files not read\n * yet (null) land on the default, since every branch of the repository starts from the library.\n */\nexport function productOfBranch(\n products: readonly ProductConfig[],\n branch: { files?: readonly string[] | null | undefined; labels?: readonly (string | { name: string })[] | null | undefined },\n): ProductConfig {\n const fallback = defaultProduct(products);\n for (const l of branch.labels ?? []) {\n const name = typeof l === 'string' ? l : l?.name;\n if (typeof name !== 'string' || !name.toLowerCase().startsWith(PRODUCT_LABEL_PREFIX)) continue;\n const hit = findProduct(products, name.slice(PRODUCT_LABEL_PREFIX.length));\n if (hit) return hit;\n }\n const files = branch.files ?? [];\n for (const p of products) {\n if (p === fallback || !p.path) continue;\n const prefix = `${cleanPath(p.path)}/`;\n if (prefix !== '/' && files.some((f) => f.startsWith(prefix))) return p;\n }\n return fallback;\n}\n\n/**\n * The product a place belongs to: a product whose `repo` is the current repository (when that is not the design\n * system repository itself); else the product whose folder holds `relPath` (the deepest one); else the default.\n */\nexport function productForPlace(\n products: readonly ProductConfig[],\n place: { relPath?: string | null | undefined; repo?: string | null | undefined; designSystemRepo?: string | null | undefined },\n): { product: ProductConfig; how: 'repo' | 'path' | 'default' } {\n const repo = place.repo?.trim().toLowerCase();\n if (repo && repo !== place.designSystemRepo?.trim().toLowerCase()) {\n const hit = products.find((p) => p.repo?.toLowerCase() === repo);\n if (hit) return { product: hit, how: 'repo' };\n }\n const rel = cleanPath(place.relPath ?? '');\n if (rel && rel !== '.') {\n let best: ProductConfig | undefined;\n for (const p of products) {\n if (!p.path) continue;\n const dir = cleanPath(p.path);\n if (dir && (rel === dir || rel.startsWith(`${dir}/`)) && (!best || dir.length > cleanPath(best.path!).length)) best = p;\n }\n if (best) return { product: best, how: 'path' };\n }\n return { product: defaultProduct(products), how: 'default' };\n}\n\nconst KEY = /^[a-z0-9][a-z0-9-]*$/;\nconst REPO = /^[\\w.-]+\\/[\\w.-]+$/;\nconst FIELDS = ['key', 'name', 'repo', 'path', 'preview', 'framework', 'default'];\n\n/** What is wrong with a `products` value, each problem saying how to fix it. Empty: valid (or absent). */\nexport function productProblems(raw: unknown): string[] {\n if (raw === undefined) return [];\n if (!Array.isArray(raw)) return ['\"products\" must be a list of { \"key\", \"name\" } objects'];\n if (!raw.length) return ['\"products\" must list at least one product, or be left out to use the defaults'];\n const problems: string[] = [];\n const seen = new Set<string>();\n let defaults = 0;\n raw.forEach((p: unknown, i) => {\n const at = `\"products[${i}]`;\n if (!p || typeof p !== 'object' || Array.isArray(p)) {\n problems.push(`${at}\" must be an object with a \"key\" and a \"name\"`);\n return;\n }\n const o = p as Record<string, unknown>;\n for (const k of Object.keys(o)) if (!FIELDS.includes(k)) problems.push(`${at}.${k}\" is not a known field (${FIELDS.join(', ')})`);\n if (typeof o.key !== 'string' || !KEY.test(o.key)) problems.push(`${at}.key\" must be lowercase letters, digits and dashes, such as \"admin\"`);\n else if (seen.has(o.key)) problems.push(`${at}.key\" (\"${o.key}\") is used twice: give each product its own key`);\n else seen.add(o.key);\n if (typeof o.name !== 'string' || !o.name.trim()) problems.push(`${at}.name\" must be the name people read, such as \"Admin demo\"`);\n if (o.repo !== undefined && (typeof o.repo !== 'string' || !REPO.test(o.repo))) problems.push(`${at}.repo\" must be \"owner/name\"`);\n if (o.path !== undefined) {\n const bad = typeof o.path !== 'string' || !o.path.trim() || o.path.startsWith('/') || o.path.split('/').includes('..');\n if (bad) problems.push(`${at}.path\" must be a folder relative to the repository root, without a leading \"/\" or \"..\", such as \"apps/admin\"`);\n }\n if (o.preview !== undefined && (typeof o.preview !== 'string' || !/^https?:\\/\\//.test(o.preview))) problems.push(`${at}.preview\" must be an http(s) URL template, such as \"https://app-git-{branch}.vercel.app\"`);\n if (o.framework !== undefined && (typeof o.framework !== 'string' || !o.framework.trim())) problems.push(`${at}.framework\" must be a name such as \"react\", \"vue\" or \"other\"`);\n if (o.default !== undefined && typeof o.default !== 'boolean') problems.push(`${at}.default\" must be true or false`);\n if (o.default === true) defaults++;\n });\n if (defaults > 1) problems.push('\"products\" marks more than one product as default: keep \"default\": true on the library only');\n return problems;\n}\n\n/** Whether two product lists say the same thing (toConfigJson leaves the default list out). */\nexport function sameProducts(a: readonly ProductConfig[], b: readonly ProductConfig[]): boolean {\n const norm = (l: readonly ProductConfig[]) => JSON.stringify(l.map((p) => FIELDS.map((f) => (p as unknown as Record<string, unknown>)[f] ?? null)));\n return norm(a) === norm(b);\n}\n","// bridge.config.json: where a design system repo keeps its tokens, which modes it has, and how Bridge may\n// propose changes to it. One file, one schema (packages/core/bridge.config.schema.json), read by\n// @bridge-ds/core, the DS Bridge Figma plugin, the docs site, the CLI and the MCP server.\n//\n// The canonical form names tiers, ordered layers and modes:\n//\n// tokens.root directory holding every token file (repo-relative)\n// tokens.include token file globs, relative to root (default **/*.tokens.json)\n// tokens.tiers tier -> directories or files, relative to root\n// tokens.layers resolution order, lowest first; {mode} placeholders pick the file per mode value\n// modes mode name -> { values, default, parity }\n// contrast.path contrast pairs: { \"pairs\": [[fg, bg, min], ...] } (repo-relative)\n//\n// The older flat form (tokens.primitives/brands/semantic/base/density/components/contrastChecks and\n// modes.brands/themes/densities/defaults) is still read, so commits from before the merge load too.\n// loadConfig normalizes both into one BridgeConfig.\n\nimport type { IntegrationsConfig } from './requests';\nimport { PREVIEW_APP_LABELS, type PreviewApps, type PreviewsConfig } from './previews';\nimport { normalizeRights, rightsProblems, visualImpactProblems, type Rights, type VisualImpactConfig } from './rights';\nimport { ownerEntryProblems } from './teams';\nimport { DEFAULT_PRODUCTS, productProblems, sameProducts, type ProductConfig } from './products';\n\n/** File name Bridge looks for at the repository root. */\nexport const CONFIG_FILE = 'bridge.config.json';\n\n/**\n * How Bridge sends a change to the code. \"suggest\": a GitHub issue that holds the exact change (suggestions.ts);\n * owners approve it and a developer applies it with their own access. \"direct\": Bridge opens branches and pull\n * requests itself. Absent from the file: \"suggest\".\n */\nexport type ChangesMode = 'suggest' | 'direct';\nexport const CHANGES_MODES: readonly ChangesMode[] = ['suggest', 'direct'];\nexport const DEFAULT_CHANGES_MODE: ChangesMode = 'suggest';\n\n/** The deployed Storybook Bridge reads the component list and previews from. */\nexport interface StorybookConfig {\n /** Root URL (where index.json and iframe.html are served), https only, no trailing slash. */\n url: string;\n}\n\nexport interface RepoRef {\n owner: string;\n name: string;\n /** Branch pull requests target and pulls read from. Bridge never writes to it. */\n defaultBranch: string;\n}\n\n/** Tier folders, relative to `root`. Derived from `tiers` when the canonical form is used. */\nexport interface TokenPaths {\n root: string;\n primitives: string;\n brands: string;\n semantic: string;\n /** Stem of the theme-independent semantic file inside `semantic` (\"base\" -> semantic/base.tokens.json). */\n base: string;\n density: string;\n components: string;\n /** Contrast checks file, relative to `root` (see `contrast.path` for the repo-relative path). */\n contrastChecks: string;\n}\n\nexport interface TokenLayer {\n /** Glob relative to tokens.root. `{mode}` placeholders pick the file for a mode value; `*` and `**` match many. */\n files: string;\n /** A missing file is fine (brand overrides only some brands have). */\n optional: boolean;\n}\n\nexport interface TokenConfig extends TokenPaths {\n include: string[];\n exclude: string[];\n /** Tier name -> directories or files relative to root. First match wins. */\n tiers: Record<string, string[]>;\n layers: TokenLayer[];\n}\n\nexport interface ModeAxis {\n values: string[];\n default: string;\n /** Every token defined for one value must exist for the others (light and dark). */\n parity: boolean;\n}\n\n/** Brand, theme and density lists (default first), as the tier model and the Figma plugin use them. */\nexport interface ModeConfig {\n brands: string[];\n themes: string[];\n densities: string[];\n defaults: { brand?: string | undefined; theme?: string | undefined; density?: string | undefined };\n}\n\nexport interface ComponentsConfig {\n /** Code components directory, repo-relative. */\n dir: string;\n docsSuffix: string;\n styleSuffix: string;\n /** Component whose docs.json keys new components copy. */\n reference?: string | undefined;\n /** Barrel file new components are exported from. */\n index?: string | undefined;\n /** Generated component specs the Figma plugin pulls (default packages/react/component-specs.json). */\n specs?: string | undefined;\n}\n\n/**\n * Design and tech owners. Each entry is a person (\"peterbono\" or \"@peterbono\") or a GitHub team (\"@acme/design\"),\n * whose members GitHub manages (teams.ts expands them).\n */\nexport interface Owners {\n design: string[];\n tech: string[];\n}\n\n/** Who may merge past missing approvals, from Bridge, with a written reason. Absent: nobody. */\nexport interface OverridePolicy {\n /** GitHub logins allowed to merge as owner override. */\n allowed: string[];\n /** Ask for a written reason, posted on the pull request before the merge. Default true. */\n requireReason: boolean;\n /** Shortest accepted reason, in characters. Default 20. */\n minReasonLength: number;\n}\n\nexport const DEFAULT_OVERRIDE: OverridePolicy = { allowed: [], requireReason: true, minReasonLength: 20 };\n\nexport interface GovernanceConfig {\n /** Branches no Bridge surface writes to (the default branch is always added). */\n protectedBranches: string[];\n /** Prefix of branches Bridge creates for proposals made by agents (MCP, CLI). */\n branchPrefix: string;\n /** Labels added to pull requests Bridge opens from an agent. */\n labels: string[];\n /** Files whose change is Tier 3 on its own, repo-relative; a trailing \"/\" matches a directory. */\n guardrails: string[];\n /** People and teams that count as design and tech owners. Empty: two distinct approvers stand in. */\n owners: Owners;\n /** Owner override for missing approvals only (never CI, changes requested or drafts). Absent: no override. */\n override?: OverridePolicy | undefined;\n /**\n * Which owner group may approve design, approve tech and ship (see rights.ts). Absent: approvals follow `owners`\n * and anyone with write access may ship, as before the field existed.\n */\n rights?: Rights | undefined;\n /**\n * A design system run by one person: when the owners resolve to exactly one person holding both roles, that\n * person's approval counts for design and tech. Default false: one person never covers both approvals alone.\n */\n soloOwnerCanApproveBoth?: boolean | undefined;\n}\n\n/** `bridge audit` settings: how product code that consumes the design system is measured. */\nexport interface AuditConfig {\n /** Packages the DS components are imported from. Default: the package that holds components.dir, plus @bridge-ds/react. */\n packages?: string[] | undefined;\n /** Extra import prefixes counted as foreign UI libraries (MUI, antd, Chakra, Radix... are built in). */\n foreignLibraries?: string[] | undefined;\n /** Native elements that should be DS components. Default: button, input, select, textarea, dialog, table, a (with href), img. */\n nativeElements?: string[] | undefined;\n /** Path globs (relative to the audited folder) to skip. */\n exclude?: string[] | undefined;\n}\n\nexport interface BridgeConfig {\n /** GitHub repository. Undefined only for a detected config of a repo with no known remote. */\n repo: RepoRef | undefined;\n tokens: TokenConfig;\n /** Named modes, in the order layers and contrast checks iterate them. */\n axes: Record<string, ModeAxis>;\n /** Brand, theme and density view of `axes`. */\n modes: ModeConfig;\n contrast: { path: string; modes?: string[] | undefined } | undefined;\n components?: ComponentsConfig | undefined;\n docs: { designLanguage?: string | undefined; guidelines?: string | undefined; governance?: string | undefined };\n /** Package a token changeset bumps and where changesets go; no changeset is written without it. */\n changesets: { dir: string; package: string } | undefined;\n /** Same package, under the older name. */\n changeset?: { package: string } | undefined;\n cssVar: { prefix: string; separator: string };\n governance: GovernanceConfig;\n audit?: AuditConfig | undefined;\n /** Branch previews: snapshot packages, per-branch deploy URL templates and production URLs (see previews.ts). */\n previews?: PreviewsConfig | undefined;\n /** Where component change requests go besides the GitHub issue (see requests.ts). */\n integrations?: IntegrationsConfig | undefined;\n /** Visual before and after on pull requests: automatic (default) or on demand (label `visual-check`). */\n visualImpact?: VisualImpactConfig | undefined;\n /** Apps that consume the design system, the default one being the library (see products.ts). Default DEFAULT_PRODUCTS. */\n products: ProductConfig[];\n /** How changes reach the code: suggestions (default) or branches and pull requests. See changesMode(). */\n changes: ChangesMode;\n /** The Storybook set in the file. Read it through storybookUrl(), which falls back to previews.production.storybook. */\n storybook?: StorybookConfig | undefined;\n}\n\ntype Partialish<T> = { [K in keyof T]?: T[K] | undefined };\n\n/** What a config file may contain (canonical or flat form). Everything is optional. */\nexport interface BridgeConfigInput {\n $schema?: string;\n version?: number;\n repo?: (Partial<RepoRef> & { owner: string; name: string }) | string;\n /** Flat form: base branch. */\n branch?: string;\n tokens?: Partialish<TokenPaths> & {\n include?: string[];\n exclude?: string[];\n tiers?: Record<string, string | string[]>;\n layers?: (string | { files: string; optional?: boolean })[];\n };\n modes?:\n | (Partial<Omit<ModeConfig, 'defaults'>> & { defaults?: ModeConfig['defaults'] })\n | Record<string, { values: string[]; default?: string; parity?: boolean }>;\n contrast?: { path: string; modes?: string[] };\n components?: Partial<ComponentsConfig> & { dir: string };\n docs?: BridgeConfig['docs'];\n changesets?: { dir?: string; package: string };\n changeset?: { package: string };\n cssVar?: Partial<BridgeConfig['cssVar']>;\n governance?: Partial<Omit<GovernanceConfig, 'owners' | 'override' | 'rights'>> & { owners?: Partial<Owners>; override?: Partial<OverridePolicy>; rights?: Partial<Rights> };\n audit?: AuditConfig;\n previews?: { packages?: string[]; apps?: PreviewApps; production?: PreviewApps };\n integrations?: IntegrationsConfig;\n visualImpact?: Partial<VisualImpactConfig>;\n products?: ProductConfig[];\n changes?: ChangesMode;\n storybook?: { url: string };\n}\n\nexport const DEFAULT_TOKEN_PATHS: TokenPaths = {\n root: 'tokens',\n primitives: 'primitives',\n brands: 'brands',\n semantic: 'semantic',\n base: 'base',\n density: 'density',\n components: 'components',\n contrastChecks: 'contrast.checks.json',\n};\n\nexport const DEFAULT_GOVERNANCE: GovernanceConfig = {\n protectedBranches: ['main', 'master'],\n branchPrefix: 'bridge/',\n labels: ['source: mcp'],\n guardrails: ['AGENTS.md', 'CLAUDE.md', 'docs/GOVERNANCE.md', '.stylelintrc.json', '.github/', CONFIG_FILE],\n owners: { design: [], tech: [] },\n};\n\nconst FLAT_TOKEN_KEYS = ['primitives', 'brands', 'semantic', 'base', 'density', 'components', 'contrastChecks'] as const;\nconst CANONICAL_TOKEN_KEYS = ['root', 'include', 'exclude', 'tiers', 'layers'];\nconst FLAT_MODE_KEYS = ['brands', 'themes', 'densities', 'defaults'];\nconst AXIS_OF: Record<string, 'brand' | 'theme' | 'density'> = { brands: 'brand', themes: 'theme', densities: 'density' };\n\nexport class ConfigError extends Error {\n constructor(readonly problems: string[]) {\n super(`${CONFIG_FILE} is invalid: ${problems.join('; ')}`);\n this.name = 'ConfigError';\n }\n}\n\nconst trimSlashes = (p: string) => p.trim().replace(/^\\.?\\/+|\\/+$/g, '');\nconst list = (v: string | string[] | undefined) => (v === undefined ? [] : Array.isArray(v) ? v : [v]);\nconst isFlatModes = (m: NonNullable<BridgeConfigInput['modes']>): m is Partial<ModeConfig> =>\n Object.keys(m).some((k) => FLAT_MODE_KEYS.includes(k)) || Object.keys(m).length === 0;\n\nfunction parseRepoInput(repo: BridgeConfigInput['repo'], branch: string | undefined): RepoRef | undefined {\n if (!repo) return undefined;\n if (typeof repo === 'string') {\n const [owner, name] = repo.split('/');\n return { owner: owner!, name: name!, defaultBranch: branch ?? 'main' };\n }\n return { owner: repo.owner, name: repo.name, defaultBranch: repo.defaultBranch ?? branch ?? 'main' };\n}\n\n/** Layers of the conventional layout, for flat configs that do not list them. */\nfunction conventionalLayers(p: TokenPaths): TokenLayer[] {\n return [\n { files: `${p.primitives}/*.tokens.json`, optional: false },\n { files: `${p.semantic}/${p.base}.tokens.json`, optional: true },\n { files: `${p.brands}/{brand}.tokens.json`, optional: false },\n { files: `${p.semantic}/{theme}.tokens.json`, optional: false },\n { files: `${p.brands}/{brand}.{theme}.tokens.json`, optional: true },\n { files: `${p.density}/{density}.tokens.json`, optional: false },\n { files: `${p.components}/*.tokens.json`, optional: false },\n ];\n}\n\n/** Fill defaults and normalize either form. Typed helper for configs written in code. */\nexport function defineConfig(input: BridgeConfigInput): BridgeConfig {\n const t = input.tokens ?? {};\n const root = trimSlashes(t.root ?? DEFAULT_TOKEN_PATHS.root) || '.';\n const tiersIn = t.tiers ? Object.fromEntries(Object.entries(t.tiers).map(([k, v]) => [k, list(v).map(trimSlashes)])) : undefined;\n const firstDir = (tier: string) => tiersIn?.[tier]?.find((d) => !d.endsWith('.json'));\n const baseFile = tiersIn?.base?.find((d) => d.endsWith('.json'));\n const contrastPath = input.contrast?.path ? trimSlashes(input.contrast.path) : undefined;\n const underRoot = (p: string) => (root === '.' ? p : p.startsWith(`${root}/`) ? p.slice(root.length + 1) : undefined);\n const paths: TokenPaths = {\n root,\n primitives: trimSlashes(t.primitives ?? firstDir('primitive') ?? DEFAULT_TOKEN_PATHS.primitives),\n brands: trimSlashes(t.brands ?? firstDir('brand') ?? DEFAULT_TOKEN_PATHS.brands),\n semantic: trimSlashes(t.semantic ?? firstDir('semantic') ?? DEFAULT_TOKEN_PATHS.semantic),\n base: trimSlashes(t.base ?? (baseFile ? baseFile.split('/').pop()!.replace(/(\\.tokens)?\\.json$/, '') : DEFAULT_TOKEN_PATHS.base)),\n density: trimSlashes(t.density ?? firstDir('density') ?? DEFAULT_TOKEN_PATHS.density),\n components: trimSlashes(t.components ?? firstDir('component') ?? DEFAULT_TOKEN_PATHS.components),\n contrastChecks: trimSlashes(t.contrastChecks ?? (contrastPath ? (underRoot(contrastPath) ?? contrastPath) : DEFAULT_TOKEN_PATHS.contrastChecks)),\n };\n const tiers = tiersIn ?? {\n primitive: [paths.primitives],\n brand: [paths.brands],\n base: [`${paths.semantic}/${paths.base}.tokens.json`],\n semantic: [paths.semantic],\n density: [paths.density],\n component: [paths.components],\n };\n const layers = t.layers?.length\n ? t.layers.map((l) => (typeof l === 'string' ? { files: l, optional: false } : { files: l.files, optional: l.optional ?? false }))\n : conventionalLayers(paths);\n\n // Modes: named axes (canonical) or brand/theme/density lists (flat).\n const axes: Record<string, ModeAxis> = {};\n const m = input.modes ?? {};\n if (isFlatModes(m)) {\n for (const key of ['brands', 'themes', 'densities'] as const) {\n const values = m[key] ?? [];\n if (!values.length) continue;\n const axis = AXIS_OF[key]!;\n const def = m.defaults?.[axis] ?? values[0]!;\n axes[axis] = { values, default: def, parity: axis === 'theme' };\n }\n } else {\n for (const [name, a] of Object.entries(m)) axes[name] = { values: a.values, default: a.default ?? a.values[0]!, parity: a.parity ?? false };\n }\n const ordered = (axis: string) => {\n const a = axes[axis];\n return a ? [a.default, ...a.values.filter((v) => v !== a.default)] : [];\n };\n const modes: ModeConfig = {\n brands: ordered('brand'),\n themes: ordered('theme'),\n densities: ordered('density'),\n defaults: { brand: axes.brand?.default, theme: axes.theme?.default, density: axes.density?.default },\n };\n\n const pkg = input.changesets?.package ?? input.changeset?.package;\n const g = input.governance ?? {};\n const contrastFile = contrastPath ?? [root === '.' ? '' : root, paths.contrastChecks].filter(Boolean).join('/');\n return {\n repo: parseRepoInput(input.repo, input.branch),\n tokens: { ...paths, include: input.tokens?.include ?? ['**/*.tokens.json'], exclude: input.tokens?.exclude ?? [], tiers, layers },\n axes,\n modes,\n contrast: { path: contrastFile, modes: input.contrast?.modes },\n components: input.components\n ? {\n dir: trimSlashes(input.components.dir),\n docsSuffix: input.components.docsSuffix ?? '.docs.json',\n styleSuffix: input.components.styleSuffix ?? '.module.css',\n reference: input.components.reference,\n index: input.components.index,\n specs: input.components.specs,\n }\n : undefined,\n docs: { ...input.docs },\n changesets: pkg ? { dir: trimSlashes(input.changesets?.dir ?? '.changeset'), package: pkg } : undefined,\n changeset: pkg ? { package: pkg } : undefined,\n cssVar: { prefix: input.cssVar?.prefix ?? '--', separator: input.cssVar?.separator ?? '-' },\n governance: {\n protectedBranches: g.protectedBranches ?? DEFAULT_GOVERNANCE.protectedBranches,\n branchPrefix: g.branchPrefix ?? DEFAULT_GOVERNANCE.branchPrefix,\n labels: g.labels ?? DEFAULT_GOVERNANCE.labels,\n guardrails: g.guardrails ?? [...DEFAULT_GOVERNANCE.guardrails, contrastFile],\n owners: { design: g.owners?.design ?? [], tech: g.owners?.tech ?? [] },\n ...(g.override\n ? {\n override: {\n allowed: g.override.allowed ?? DEFAULT_OVERRIDE.allowed,\n requireReason: g.override.requireReason ?? DEFAULT_OVERRIDE.requireReason,\n minReasonLength: g.override.minReasonLength ?? DEFAULT_OVERRIDE.minReasonLength,\n },\n }\n : {}),\n ...(g.rights ? { rights: normalizeRights(g.rights) } : {}),\n ...(g.soloOwnerCanApproveBoth === true ? { soloOwnerCanApproveBoth: true } : {}),\n },\n products: input.products?.length ? input.products.map((p) => ({ ...p })) : DEFAULT_PRODUCTS.map((p) => ({ ...p })),\n changes: input.changes === 'direct' ? 'direct' : DEFAULT_CHANGES_MODE,\n ...(input.storybook?.url ? { storybook: { url: input.storybook.url.trim().replace(/\\/+$/, '') } } : {}),\n ...(input.audit ? { audit: { ...input.audit } } : {}),\n ...(input.visualImpact ? { visualImpact: { mode: input.visualImpact.mode === 'on-demand' ? 'on-demand' : 'auto' } } : {}),\n ...(input.integrations ? { integrations: { ...input.integrations } } : {}),\n ...(input.previews\n ? {\n previews: {\n packages: input.previews.packages ?? [],\n apps: { ...input.previews.apps },\n ...(input.previews.production ? { production: { ...input.previews.production } } : {}),\n },\n }\n : {}),\n };\n}\n\nconst isStr = (x: unknown): x is string => typeof x === 'string' && x.trim().length > 0;\nconst isStrList = (x: unknown): x is string[] => Array.isArray(x) && x.every(isStr);\nconst isObj = (x: unknown): x is Record<string, unknown> => !!x && typeof x === 'object' && !Array.isArray(x);\n\n/** Parse and validate bridge.config.json (text or parsed object). Throws ConfigError listing every problem. */\nexport function loadConfig(source: string | unknown): BridgeConfig {\n let data: unknown = source;\n if (typeof source === 'string') {\n try {\n data = JSON.parse(source);\n } catch (err) {\n throw new ConfigError([`not valid JSON (${(err as Error).message})`]);\n }\n }\n if (!isObj(data)) throw new ConfigError(['top level must be an object']);\n const problems: string[] = [];\n const d = data;\n\n const repo = d.repo;\n if (typeof repo === 'string') {\n if (!/^[\\w.-]+\\/[\\w.-]+$/.test(repo)) problems.push('\"repo\" must be \"owner/name\" or { \"owner\", \"name\" }');\n } else if (repo !== undefined) {\n if (!isObj(repo)) problems.push('\"repo\" must be \"owner/name\" or { \"owner\", \"name\" }');\n else {\n if (!isStr(repo.owner)) problems.push('\"repo.owner\" must be a non-empty string');\n if (!isStr(repo.name)) problems.push('\"repo.name\" must be a non-empty string');\n if (repo.defaultBranch !== undefined && !isStr(repo.defaultBranch)) problems.push('\"repo.defaultBranch\" must be a non-empty string');\n }\n }\n if (d.branch !== undefined && !isStr(d.branch)) problems.push('\"branch\" must be a non-empty string');\n\n const tokens = d.tokens;\n if (tokens !== undefined) {\n if (!isObj(tokens)) problems.push('\"tokens\" must be an object');\n else\n for (const [k, v] of Object.entries(tokens)) {\n if ((FLAT_TOKEN_KEYS as readonly string[]).includes(k) || k === 'root') {\n if (!isStr(v)) problems.push(`\"tokens.${k}\" must be a non-empty string`);\n } else if (k === 'include' || k === 'exclude') {\n if (!isStrList(v)) problems.push(`\"tokens.${k}\" must be a list of globs`);\n } else if (k === 'tiers') {\n if (!isObj(v) || !Object.values(v).every((x) => isStr(x) || isStrList(x))) problems.push('\"tokens.tiers\" must map tier names to directories');\n } else if (k === 'layers') {\n if (!Array.isArray(v) || !v.length || !v.every((l) => isStr(l) || (isObj(l) && isStr(l.files) && (l.optional === undefined || typeof l.optional === 'boolean'))))\n problems.push('\"tokens.layers\" must be a non-empty list of { \"files\", \"optional\"? }');\n } else if (!CANONICAL_TOKEN_KEYS.includes(k)) problems.push(`\"tokens.${k}\" is not a known key`);\n }\n }\n\n const modes = d.modes;\n let axisNames: string[] = [];\n if (modes !== undefined) {\n if (!isObj(modes)) problems.push('\"modes\" must be an object');\n else if (isFlatModes(modes as never)) {\n for (const k of ['brands', 'themes', 'densities']) {\n if (modes[k] !== undefined && !isStrList(modes[k])) problems.push(`\"modes.${k}\" must be a list of names`);\n }\n const defs = modes.defaults as Record<string, unknown> | undefined;\n const lists: Record<string, string> = { brand: 'brands', theme: 'themes', density: 'densities' };\n for (const [k, l] of Object.entries(lists)) {\n const v = defs?.[k];\n if (v === undefined) continue;\n if (!isStr(v)) problems.push(`\"modes.defaults.${k}\" must be a string`);\n else if (isStrList(modes[l]) && !(modes[l] as string[]).includes(v)) problems.push(`\"modes.defaults.${k}\" (\"${v}\") is not in \"modes.${l}\"`);\n }\n axisNames = Object.entries(lists).filter(([, l]) => isStrList(modes[l]) && (modes[l] as string[]).length).map(([k]) => k);\n } else {\n for (const [name, a] of Object.entries(modes)) {\n if (!isObj(a) || !isStrList(a.values) || !a.values.length) {\n problems.push(`\"modes.${name}.values\" must be a non-empty list of names`);\n continue;\n }\n if (a.default !== undefined && (!isStr(a.default) || !a.values.includes(a.default))) problems.push(`\"modes.${name}.default\" (\"${String(a.default)}\") is not in \"modes.${name}.values\"`);\n if (a.parity !== undefined && typeof a.parity !== 'boolean') problems.push(`\"modes.${name}.parity\" must be true or false`);\n axisNames.push(name);\n }\n }\n }\n if (isObj(tokens) && Array.isArray(tokens.layers)) {\n for (const l of tokens.layers) {\n const files = typeof l === 'string' ? l : isObj(l) ? String(l.files) : '';\n for (const ph of files.match(/\\{([^}]+)\\}/g) ?? []) {\n if (!axisNames.includes(ph.slice(1, -1))) problems.push(`layer \"${files}\" uses ${ph} but \"modes.${ph.slice(1, -1)}\" is not defined`);\n }\n }\n }\n\n const contrast = d.contrast;\n if (contrast !== undefined && (!isObj(contrast) || !isStr(contrast.path) || (contrast.modes !== undefined && !isStrList(contrast.modes))))\n problems.push('\"contrast\" must be { \"path\", \"modes\"? }');\n const comps = d.components;\n if (comps !== undefined && (!isObj(comps) || !isStr(comps.dir))) problems.push('\"components.dir\" must be a non-empty string');\n const cs = d.changeset;\n if (cs !== undefined && (!isObj(cs) || !isStr(cs.package))) problems.push('\"changeset.package\" must be a non-empty string');\n const css = d.changesets;\n if (css !== undefined && (!isObj(css) || !isStr(css.package))) problems.push('\"changesets.package\" must be a non-empty string');\n const gov = d.governance;\n if (gov !== undefined) {\n if (!isObj(gov)) problems.push('\"governance\" must be an object');\n else {\n for (const k of ['protectedBranches', 'labels', 'guardrails']) if (gov[k] !== undefined && !(Array.isArray(gov[k]) && (gov[k] as unknown[]).every((x) => typeof x === 'string'))) problems.push(`\"governance.${k}\" must be a list of strings`);\n if (gov.branchPrefix !== undefined && !isStr(gov.branchPrefix)) problems.push('\"governance.branchPrefix\" must be a non-empty string');\n problems.push(...ownerEntryProblems(gov.owners));\n const ov = gov.override;\n if (ov !== undefined) {\n if (!isObj(ov)) problems.push('\"governance.override\" must be an object');\n else {\n if (ov.allowed !== undefined && !isStrList(ov.allowed)) problems.push('\"governance.override.allowed\" must be a list of GitHub logins');\n if (ov.requireReason !== undefined && typeof ov.requireReason !== 'boolean') problems.push('\"governance.override.requireReason\" must be true or false');\n if (ov.minReasonLength !== undefined && !(Number.isInteger(ov.minReasonLength) && (ov.minReasonLength as number) >= 0)) problems.push('\"governance.override.minReasonLength\" must be a whole number, 0 or more');\n }\n }\n problems.push(...rightsProblems(gov.rights));\n if (gov.soloOwnerCanApproveBoth !== undefined && typeof gov.soloOwnerCanApproveBoth !== 'boolean') problems.push('\"governance.soloOwnerCanApproveBoth\" must be true or false');\n }\n }\n problems.push(...visualImpactProblems(d.visualImpact));\n if (d.changes !== undefined && !(CHANGES_MODES as readonly unknown[]).includes(d.changes)) problems.push(`\"changes\" must be \"suggest\" or \"direct\" (got ${JSON.stringify(d.changes)})`);\n const sb = d.storybook;\n if (sb !== undefined) {\n if (!isObj(sb) || !isStr(sb.url)) problems.push('\"storybook\" must be { \"url\" } with the deployed Storybook address');\n else if (!/^https:\\/\\/[^\\s/]+/.test(sb.url.trim())) problems.push('\"storybook.url\" must start with https://, for example https://storybook.example.com');\n else for (const k of Object.keys(sb)) if (k !== 'url') problems.push(`\"storybook.${k}\" is not a known key`);\n }\n problems.push(...productProblems(d.products));\n const audit = d.audit;\n if (audit !== undefined) {\n if (!isObj(audit)) problems.push('\"audit\" must be an object');\n else for (const k of ['packages', 'foreignLibraries', 'nativeElements', 'exclude']) if (audit[k] !== undefined && !isStrList(audit[k])) problems.push(`\"audit.${k}\" must be a list of strings`);\n }\n const pv = d.previews;\n if (pv !== undefined) {\n if (!isObj(pv)) problems.push('\"previews\" must be an object');\n else {\n if (pv.packages !== undefined && !isStrList(pv.packages)) problems.push('\"previews.packages\" must be a list of package names');\n for (const field of ['apps', 'production'] as const) {\n const apps = pv[field];\n if (apps === undefined) continue;\n if (!isObj(apps)) {\n problems.push(`\"previews.${field}\" must be an object`);\n continue;\n }\n for (const [k, v] of Object.entries(apps)) {\n if (!(k in PREVIEW_APP_LABELS)) problems.push(`\"previews.${field}.${k}\" is not a known app (${Object.keys(PREVIEW_APP_LABELS).join(', ')})`);\n else if (!isStr(v) || !/^https?:\\/\\//.test(v)) problems.push(`\"previews.${field}.${k}\" must be an http(s) URL${field === 'apps' ? ' template' : ''}`);\n else if (field === 'production' && /\\{\\w+\\}/.test(v)) problems.push(`\"previews.production.${k}\" is a fixed URL: placeholders such as {branch} belong in \"previews.apps\"`);\n }\n }\n }\n }\n if (problems.length) throw new ConfigError(problems);\n return defineConfig(d as unknown as BridgeConfigInput);\n}\n\n/** Path of a file under the tokens root, relative to the repository root. */\nexport const tokensPath = (config: BridgeConfig, rel = '') => [config.tokens.root === '.' ? '' : config.tokens.root, rel].filter(Boolean).join('/');\n\n/** Branches no write may target: the configured protected list plus the default branch. */\nexport const protectedBranchesOf = (config: BridgeConfig): string[] => [...new Set([...config.governance.protectedBranches, ...(config.repo ? [config.repo.defaultBranch] : [])])];\n\n/** The base branch proposals target. */\nexport const baseBranchOf = (config: BridgeConfig): string => config.repo?.defaultBranch ?? 'main';\n\n/** How changes reach the code for this repo: the config's mode (\"suggest\" when the file does not say). */\nexport const changesMode = (config: Pick<BridgeConfig, 'changes'> | null | undefined): ChangesMode => (config?.changes === 'direct' ? 'direct' : DEFAULT_CHANGES_MODE);\n\n/**\n * The Storybook to read: `storybook.url`, else the production Storybook of `previews` when it is https. Undefined\n * when neither is set. No trailing slash.\n */\nexport function storybookUrl(config: Pick<BridgeConfig, 'storybook' | 'previews'> | null | undefined): string | undefined {\n const explicit = config?.storybook?.url?.trim();\n if (explicit) return explicit.replace(/\\/+$/, '');\n const prod = config?.previews?.production?.storybook?.trim();\n return prod && /^https:\\/\\//.test(prod) && !/\\{\\w+\\}/.test(prod) ? prod.replace(/\\/+$/, '') : undefined;\n}\n\n/** Plain-JSON form of a config, in the canonical shape (what `bridge init` writes). */\nexport function toConfigJson(config: BridgeConfig, schema = './packages/core/bridge.config.schema.json'): Record<string, unknown> {\n return {\n $schema: schema,\n version: 1,\n ...(config.repo ? { repo: config.repo } : {}),\n tokens: { root: config.tokens.root, include: config.tokens.include, ...(config.tokens.exclude.length ? { exclude: config.tokens.exclude } : {}), tiers: config.tokens.tiers, layers: config.tokens.layers.map((l) => (l.optional ? l : { files: l.files })) },\n modes: Object.fromEntries(Object.entries(config.axes).map(([k, a]) => [k, a.parity ? a : { values: a.values, default: a.default }])),\n ...(config.contrast ? { contrast: config.contrast.modes ? config.contrast : { path: config.contrast.path } } : {}),\n ...(config.components ? { components: Object.fromEntries(Object.entries(config.components).filter(([, v]) => v !== undefined)) } : {}),\n docs: Object.fromEntries(Object.entries(config.docs).filter(([, v]) => v !== undefined)),\n ...(config.changesets ? { changesets: config.changesets } : {}),\n cssVar: config.cssVar,\n governance: config.governance,\n ...(config.audit ? { audit: config.audit } : {}),\n ...(config.previews ? { previews: config.previews } : {}),\n ...(config.visualImpact ? { visualImpact: config.visualImpact } : {}),\n changes: changesMode(config),\n ...(config.storybook ? { storybook: config.storybook } : {}),\n ...(config.products && !sameProducts(config.products, DEFAULT_PRODUCTS) ? { products: config.products } : {}),\n };\n}\n","// Format-preserving JSON AST.\n//\n// Every parsed node keeps the exact source slice it came from (`raw`). Serializing an untouched\n// document therefore reproduces the input byte for byte. Edits clear `raw` on the edited node and\n// its ancestors only, so a one-token change produces a one-token diff, in the file's own style\n// (inline vs multi-line objects and arrays, indent width, padding inside inline braces).\n\nexport type JsonNode = JsonObject | JsonArray | JsonScalar;\n\ninterface NodeBase {\n /** Exact source text of this node. Present only while the node is untouched. */\n raw?: string | undefined;\n}\n\nexport interface JsonEntry {\n key: string;\n value: JsonNode;\n}\n\nexport interface JsonObject extends NodeBase {\n kind: 'object';\n entries: JsonEntry[];\n /** Written on a single line in the source (or should be, for new nodes). */\n inline: boolean;\n}\n\nexport interface JsonArray extends NodeBase {\n kind: 'array';\n items: JsonNode[];\n inline: boolean;\n}\n\nexport interface JsonScalar extends NodeBase {\n kind: 'string' | 'number' | 'boolean' | 'null';\n value: string | number | boolean | null;\n}\n\nexport interface JsonStyle {\n indent: string;\n newline: '\\n' | '\\r\\n';\n /** `{ \"a\": 1 }` (true) vs `{\"a\": 1}` (false) for inline objects. */\n objectPadding: boolean;\n /** `[ 1, 2 ]` (true) vs `[1, 2]` (false) for inline arrays. */\n arrayPadding: boolean;\n}\n\nexport interface JsonDocument {\n root: JsonNode;\n leading: string;\n trailing: string;\n style: JsonStyle;\n}\n\nexport class JsonParseError extends Error {\n constructor(\n message: string,\n readonly offset: number,\n ) {\n super(message);\n this.name = 'JsonParseError';\n }\n}\n\n// ---------------------------------------------------------------------------------------------\n// Parsing\n\nexport function parseJson(text: string): JsonDocument {\n let i = 0;\n const n = text.length;\n\n const isWs = (c: string | undefined) => c === ' ' || c === '\\t' || c === '\\n' || c === '\\r';\n const skipWs = () => {\n while (i < n && isWs(text[i])) i++;\n };\n const fail = (msg: string): never => {\n throw new JsonParseError(`${msg} at offset ${i}`, i);\n };\n\n const parseString = (): string => {\n if (text[i] !== '\"') fail('Expected string');\n const start = i;\n i++;\n while (i < n) {\n const c = text[i];\n if (c === '\\\\') {\n i += 2;\n continue;\n }\n if (c === '\"') {\n i++;\n return JSON.parse(text.slice(start, i)) as string;\n }\n i++;\n }\n return fail('Unterminated string');\n };\n\n const parseValue = (): JsonNode => {\n skipWs();\n const start = i;\n const c = text[i];\n let node: JsonNode;\n if (c === '{') {\n i++;\n const entries: JsonEntry[] = [];\n skipWs();\n if (text[i] === '}') {\n i++;\n } else {\n for (;;) {\n skipWs();\n const key = parseString();\n skipWs();\n if (text[i] !== ':') fail('Expected \":\"');\n i++;\n const value = parseValue();\n entries.push({ key, value });\n skipWs();\n if (text[i] === ',') {\n i++;\n continue;\n }\n if (text[i] === '}') {\n i++;\n break;\n }\n fail('Expected \",\" or \"}\"');\n }\n }\n const raw = text.slice(start, i);\n node = { kind: 'object', entries, inline: !raw.includes('\\n'), raw };\n } else if (c === '[') {\n i++;\n const items: JsonNode[] = [];\n skipWs();\n if (text[i] === ']') {\n i++;\n } else {\n for (;;) {\n items.push(parseValue());\n skipWs();\n if (text[i] === ',') {\n i++;\n continue;\n }\n if (text[i] === ']') {\n i++;\n break;\n }\n fail('Expected \",\" or \"]\"');\n }\n }\n const raw = text.slice(start, i);\n node = { kind: 'array', items, inline: !raw.includes('\\n'), raw };\n } else if (c === '\"') {\n const value = parseString();\n node = { kind: 'string', value, raw: text.slice(start, i) };\n } else if (c === 't' && text.startsWith('true', i)) {\n i += 4;\n node = { kind: 'boolean', value: true, raw: 'true' };\n } else if (c === 'f' && text.startsWith('false', i)) {\n i += 5;\n node = { kind: 'boolean', value: false, raw: 'false' };\n } else if (c === 'n' && text.startsWith('null', i)) {\n i += 4;\n node = { kind: 'null', value: null, raw: 'null' };\n } else {\n const m = /^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?/.exec(text.slice(i, i + 64));\n if (!m) return fail('Unexpected token');\n i += m[0].length;\n node = { kind: 'number', value: Number(m[0]), raw: m[0] };\n }\n return node;\n };\n\n const leadingEnd = (() => {\n let j = 0;\n while (j < n && isWs(text[j])) j++;\n return j;\n })();\n const leading = text.slice(0, leadingEnd);\n i = leadingEnd;\n const root = parseValue();\n const trailingStart = i;\n skipWs();\n if (i < n) fail('Unexpected content after JSON value');\n const trailing = text.slice(trailingStart);\n\n return { root, leading, trailing, style: detectStyle(text, root) };\n}\n\nfunction detectStyle(text: string, root: JsonNode): JsonStyle {\n const newline: '\\n' | '\\r\\n' = text.includes('\\r\\n') ? '\\r\\n' : '\\n';\n const indentMatch = /\\n([ \\t]+)\\S/.exec(text);\n const indent = indentMatch?.[1] ?? ' ';\n let objectPadding: boolean | undefined;\n let arrayPadding: boolean | undefined;\n const visit = (node: JsonNode) => {\n if (node.kind === 'object') {\n if (node.inline && node.entries.length > 0 && objectPadding === undefined && node.raw) {\n objectPadding = node.raw.startsWith('{ ');\n }\n node.entries.forEach((e) => visit(e.value));\n } else if (node.kind === 'array') {\n if (node.inline && node.items.length > 0 && arrayPadding === undefined && node.raw) {\n arrayPadding = node.raw.startsWith('[ ');\n }\n node.items.forEach(visit);\n }\n };\n visit(root);\n return { indent, newline, objectPadding: objectPadding ?? true, arrayPadding: arrayPadding ?? false };\n}\n\n// ---------------------------------------------------------------------------------------------\n// Serializing\n\nexport function serializeJson(doc: JsonDocument): string {\n return doc.leading + serializeNode(doc.root, 0, doc.style, false) + doc.trailing;\n}\n\nexport function formatNumber(value: number): string {\n if (!Number.isFinite(value)) throw new Error(`Cannot serialize non-finite number ${value}`);\n return JSON.stringify(value);\n}\n\nfunction serializeNode(node: JsonNode, depth: number, style: JsonStyle, forceInline: boolean): string {\n if (node.raw !== undefined && (!forceInline || !node.raw.includes('\\n'))) return node.raw;\n switch (node.kind) {\n case 'string':\n return JSON.stringify(node.value);\n case 'number':\n return formatNumber(node.value as number);\n case 'boolean':\n return node.value ? 'true' : 'false';\n case 'null':\n return 'null';\n case 'object': {\n if (node.entries.length === 0) return '{}';\n const inline = forceInline || node.inline;\n if (inline) {\n const body = node.entries\n .map((e) => `${JSON.stringify(e.key)}: ${serializeNode(e.value, depth + 1, style, true)}`)\n .join(', ');\n return style.objectPadding ? `{ ${body} }` : `{${body}}`;\n }\n const pad = style.indent.repeat(depth + 1);\n const body = node.entries\n .map((e) => `${pad}${JSON.stringify(e.key)}: ${serializeNode(e.value, depth + 1, style, false)}`)\n .join(`,${style.newline}`);\n return `{${style.newline}${body}${style.newline}${style.indent.repeat(depth)}}`;\n }\n case 'array': {\n if (node.items.length === 0) return '[]';\n const inline = forceInline || node.inline;\n if (inline) {\n const body = node.items.map((v) => serializeNode(v, depth + 1, style, true)).join(', ');\n return style.arrayPadding ? `[ ${body} ]` : `[${body}]`;\n }\n const pad = style.indent.repeat(depth + 1);\n const body = node.items.map((v) => `${pad}${serializeNode(v, depth + 1, style, false)}`).join(`,${style.newline}`);\n return `[${style.newline}${body}${style.newline}${style.indent.repeat(depth)}]`;\n }\n }\n}\n\n// ---------------------------------------------------------------------------------------------\n// Conversions and helpers\n\nexport type Plain = string | number | boolean | null | Plain[] | { [key: string]: Plain };\n\n/** Plain JS value of a node. Object key order follows the source (except integer-like keys, see JS rules). */\nexport function toPlain(node: JsonNode): Plain {\n switch (node.kind) {\n case 'object': {\n const out: { [key: string]: Plain } = {};\n for (const e of node.entries) out[e.key] = toPlain(e.value);\n return out;\n }\n case 'array':\n return node.items.map(toPlain);\n default:\n return node.value as Plain;\n }\n}\n\n/**\n * Build a node from a plain value. When `template` is given (for example the node being replaced\n * or a sibling token), inline/multi-line layout is copied from it key by key so new content looks\n * like its neighbours.\n */\nexport function fromPlain(value: unknown, template?: JsonNode, inlineDefault = false): JsonNode {\n if (value === null || value === undefined) return { kind: 'null', value: null };\n if (typeof value === 'string') return { kind: 'string', value };\n if (typeof value === 'number') return { kind: 'number', value };\n if (typeof value === 'boolean') return { kind: 'boolean', value };\n if (Array.isArray(value)) {\n const inline = template?.kind === 'array' ? template.inline : inlineDefault || value.every((v) => typeof v !== 'object' || v === null);\n const tItem = template?.kind === 'array' ? template.items[0] : undefined;\n return { kind: 'array', inline, items: value.map((v) => fromPlain(v, tItem, inline)) };\n }\n if (typeof value === 'object') {\n const inline = template?.kind === 'object' ? template.inline : inlineDefault;\n const entries: JsonEntry[] = Object.entries(value as Record<string, unknown>)\n .filter(([, v]) => v !== undefined)\n .map(([key, v]) => {\n const t = template?.kind === 'object' ? getEntry(template, key)?.value : undefined;\n return { key, value: fromPlain(v, t, inline) };\n });\n return { kind: 'object', inline, entries };\n }\n throw new Error(`Unsupported value type ${typeof value}`);\n}\n\nexport function getEntry(obj: JsonObject, key: string): JsonEntry | undefined {\n return obj.entries.find((e) => e.key === key);\n}\n\nexport function getChild(node: JsonNode | undefined, key: string): JsonNode | undefined {\n if (!node || node.kind !== 'object') return undefined;\n return getEntry(node, key)?.value;\n}\n\n/** Remove cached source text from a node and all its descendants (after moving it to another depth). */\nexport function clearRawDeep(node: JsonNode): void {\n node.raw = undefined;\n if (node.kind === 'object') node.entries.forEach((e) => clearRawDeep(e.value));\n if (node.kind === 'array') node.items.forEach(clearRawDeep);\n}\n\n/** Deep structural equality of two nodes, ignoring layout. */\nexport function nodesEqual(a: JsonNode, b: JsonNode): boolean {\n return plainEqual(toPlain(a), toPlain(b));\n}\n\nexport function plainEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (typeof a !== typeof b || a === null || b === null || typeof a !== 'object') return false;\n if (Array.isArray(a) !== Array.isArray(b)) return false;\n if (Array.isArray(a) && Array.isArray(b)) {\n return a.length === b.length && a.every((v, idx) => plainEqual(v, b[idx]));\n }\n const ka = Object.keys(a as object);\n const kb = Object.keys(b as object);\n if (ka.length !== kb.length) return false;\n return ka.every((k) => plainEqual((a as Record<string, unknown>)[k], (b as Record<string, unknown>)[k]));\n}\n","// DTCG 2025.10 codec: read token files into flat tokens, and edit them in place without\n// disturbing anything that did not change (key order, layout, number spelling, descriptions,\n// $extensions). Built on the format-preserving JSON AST.\n\nimport {\n type JsonDocument,\n type JsonEntry,\n type JsonNode,\n type JsonObject,\n clearRawDeep,\n fromPlain,\n getEntry,\n parseJson,\n plainEqual,\n serializeJson,\n toPlain,\n} from './json-ast';\nimport type { FlatToken } from './types';\n\nexport interface TokenDocument {\n file: string;\n json: JsonDocument;\n}\n\nexport function parseTokenFile(file: string, text: string): TokenDocument {\n const json = parseJson(text);\n if (json.root.kind !== 'object') throw new Error(`${file}: top level must be a JSON object`);\n return { file, json };\n}\n\nexport function serializeTokenFile(doc: TokenDocument): string {\n return serializeJson(doc.json);\n}\n\nconst isTokenNode = (node: JsonNode): node is JsonObject => node.kind === 'object' && getEntry(node, '$value') !== undefined;\nconst isGroupKey = (key: string) => !key.startsWith('$');\n\n/** All tokens in a document, in source order, with `$type` inherited from groups. */\nexport function flattenTokens(doc: TokenDocument): FlatToken[] {\n const out: FlatToken[] = [];\n const walk = (node: JsonObject, path: string[], inheritedType: string | undefined) => {\n const ownGroupType = stringEntry(node, '$type');\n const groupType = ownGroupType ?? inheritedType;\n for (const entry of node.entries) {\n if (!isGroupKey(entry.key) || entry.value.kind !== 'object') continue;\n const childPath = [...path, entry.key];\n if (isTokenNode(entry.value)) {\n out.push(readToken(entry.value, childPath.join('.'), groupType, doc.file));\n } else {\n walk(entry.value, childPath, groupType);\n }\n }\n };\n walk(doc.json.root as JsonObject, [], undefined);\n return out;\n}\n\nfunction readToken(node: JsonObject, path: string, inheritedType: string | undefined, file: string): FlatToken {\n const ownType = stringEntry(node, '$type');\n const ext = getEntry(node, '$extensions')?.value;\n return {\n path,\n type: ownType ?? inheritedType,\n ownType,\n value: toPlain(getEntry(node, '$value')!.value),\n description: stringEntry(node, '$description'),\n extensions: ext && ext.kind === 'object' ? (toPlain(ext) as Record<string, unknown>) : undefined,\n file,\n };\n}\n\nfunction stringEntry(node: JsonObject, key: string): string | undefined {\n const v = getEntry(node, key)?.value;\n return v && v.kind === 'string' ? (v.value as string) : undefined;\n}\n\n// ---------------------------------------------------------------------------------------------\n// Navigation\n\ninterface Located {\n node: JsonObject;\n /** Root first, parent group last. */\n ancestors: JsonObject[];\n}\n\nexport function findToken(doc: TokenDocument, path: string): Located | undefined {\n const segments = path.split('.');\n const ancestors: JsonObject[] = [];\n let current = doc.json.root as JsonObject;\n for (const seg of segments) {\n ancestors.push(current);\n const next = getEntry(current, seg)?.value;\n if (!next || next.kind !== 'object') return undefined;\n current = next;\n }\n return isTokenNode(current) ? { node: current, ancestors } : undefined;\n}\n\n/** `$type` that a token at `path` would inherit from its groups (ignoring its own `$type`). */\nexport function inheritedTypeAt(doc: TokenDocument, path: string): string | undefined {\n const segments = path.split('.').slice(0, -1);\n let current: JsonNode | undefined = doc.json.root;\n let type: string | undefined;\n for (let idx = 0; idx <= segments.length; idx++) {\n if (!current || current.kind !== 'object') break;\n type = stringEntry(current, '$type') ?? type;\n const seg = segments[idx];\n if (seg === undefined) break;\n current = getEntry(current, seg)?.value;\n }\n return type;\n}\n\nconst touch = (nodes: JsonNode[]) => nodes.forEach((n) => (n.raw = undefined));\n\n// Canonical position for keys we insert into a token object.\nconst KEY_RANK: Record<string, number> = { $type: 0, $description: 1, $value: 2, $deprecated: 3, $extensions: 4 };\nconst rank = (key: string) => KEY_RANK[key] ?? 5;\n\nfunction insertEntry(obj: JsonObject, entry: JsonEntry): void {\n // `$` keys go before the first `$` key that ranks higher, and before any child group.\n const r = rank(entry.key);\n const at = obj.entries.findIndex((e) => !e.key.startsWith('$') || rank(e.key) > r);\n if (at === -1) obj.entries.push(entry);\n else obj.entries.splice(at, 0, entry);\n}\n\nfunction findTemplateToken(group: JsonObject, doc: TokenDocument): JsonObject | undefined {\n const sibling = group.entries.find((e) => isGroupKey(e.key) && isTokenNode(e.value))?.value;\n if (sibling && sibling.kind === 'object') return sibling;\n let found: JsonObject | undefined;\n const walk = (node: JsonNode) => {\n if (found || node.kind !== 'object') return;\n if (getEntry(node, '$value')) {\n found = node;\n return;\n }\n node.entries.forEach((e) => isGroupKey(e.key) && walk(e.value));\n };\n walk(doc.json.root);\n return found;\n}\n\n// ---------------------------------------------------------------------------------------------\n// Edits\n\nexport interface TokenFields {\n /** Effective $type; undefined leaves the type to the groups (or, for an alias, to its target). */\n type: string | undefined;\n value: unknown;\n description: string | undefined;\n /** Extension keys to set (value) or delete (undefined). Other keys are preserved. */\n extensions?: Record<string, unknown | undefined>;\n}\n\n/**\n * Create or update the token at `path`. Returns true when the document changed.\n * Values equal to the current ones are left untouched, so the file text stays identical.\n * `template` (for example the node of a renamed token) controls the layout of new nodes.\n */\nexport function upsertToken(doc: TokenDocument, path: string, fields: TokenFields, template?: JsonObject): boolean {\n const existing = findToken(doc, path);\n if (existing) return updateTokenNode(doc, existing, path, fields);\n\n const segments = path.split('.');\n const name = segments.pop()!;\n const ancestors: JsonObject[] = [];\n let group = doc.json.root as JsonObject;\n for (const seg of segments) {\n ancestors.push(group);\n let next = getEntry(group, seg)?.value;\n if (!next) {\n next = { kind: 'object', inline: false, entries: [] };\n group.entries.push({ key: seg, value: next });\n } else if (next.kind !== 'object' || isTokenNode(next)) {\n throw new Error(`${doc.file}: cannot create \"${path}\" because \"${seg}\" is a token, not a group`);\n }\n group = next;\n }\n ancestors.push(group);\n const layout = template ?? findTemplateToken(group, doc);\n const node: JsonObject = { kind: 'object', inline: layout?.inline ?? false, entries: [] };\n const inherited = inheritedTypeAt(doc, path);\n if (fields.type !== undefined && fields.type !== inherited) node.entries.push({ key: '$type', value: { kind: 'string', value: fields.type } });\n if (fields.description) node.entries.push({ key: '$description', value: { kind: 'string', value: fields.description } });\n const valueTemplate = layout ? getEntry(layout, '$value')?.value : undefined;\n node.entries.push({ key: '$value', value: fromPlain(fields.value, valueTemplate, node.inline) });\n const ext = cleanExtensions(fields.extensions);\n if (ext) {\n const extTemplate = layout ? getEntry(layout, '$extensions')?.value : undefined;\n node.entries.push({ key: '$extensions', value: fromPlain(ext, extTemplate, node.inline) });\n }\n group.entries.push({ key: name, value: node });\n touch(ancestors);\n return true;\n}\n\nfunction cleanExtensions(ext: Record<string, unknown | undefined> | undefined): Record<string, unknown> | undefined {\n if (!ext) return undefined;\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(ext)) if (v !== undefined) out[k] = v;\n return Object.keys(out).length ? out : undefined;\n}\n\nfunction updateTokenNode(doc: TokenDocument, loc: Located, path: string, fields: TokenFields): boolean {\n const { node } = loc;\n let changed = false;\n\n // $type: only written when it differs from what the groups already say.\n const ownType = stringEntry(node, '$type');\n const inherited = inheritedTypeAt(doc, path);\n if (fields.type !== undefined && (ownType ?? inherited) !== fields.type) {\n const entry = getEntry(node, '$type');\n if (fields.type === inherited && entry) node.entries.splice(node.entries.indexOf(entry), 1);\n else if (entry) entry.value = { kind: 'string', value: fields.type };\n else insertEntry(node, { key: '$type', value: { kind: 'string', value: fields.type } });\n changed = true;\n }\n\n const valueEntry = getEntry(node, '$value')!;\n if (!plainEqual(toPlain(valueEntry.value), fields.value)) {\n valueEntry.value = fromPlain(fields.value, valueEntry.value, node.inline);\n changed = true;\n }\n\n const desc = stringEntry(node, '$description');\n if ((desc ?? '') !== (fields.description ?? '')) {\n const entry = getEntry(node, '$description');\n if (!fields.description) node.entries.splice(node.entries.indexOf(entry!), 1);\n else if (entry) entry.value = { kind: 'string', value: fields.description };\n else insertEntry(node, { key: '$description', value: { kind: 'string', value: fields.description } });\n changed = true;\n }\n\n if (fields.extensions) {\n let extEntry = getEntry(node, '$extensions');\n for (const [key, value] of Object.entries(fields.extensions)) {\n const ext = extEntry?.value.kind === 'object' ? extEntry.value : undefined;\n const current = ext ? getEntry(ext, key) : undefined;\n if (value === undefined) {\n if (ext && current) {\n ext.entries.splice(ext.entries.indexOf(current), 1);\n ext.raw = undefined;\n changed = true;\n }\n continue;\n }\n if (current && plainEqual(toPlain(current.value), value)) continue;\n if (!extEntry || !ext) {\n extEntry = { key: '$extensions', value: { kind: 'object', inline: node.inline, entries: [] } };\n insertEntry(node, extEntry);\n }\n const target = extEntry.value as JsonObject;\n if (current) current.value = fromPlain(value, current.value, target.inline);\n else target.entries.push({ key, value: fromPlain(value, undefined, target.inline) });\n target.raw = undefined;\n changed = true;\n }\n if (extEntry && extEntry.value.kind === 'object' && extEntry.value.entries.length === 0) {\n node.entries.splice(node.entries.indexOf(extEntry), 1);\n changed = true;\n }\n }\n\n if (changed) touch([...loc.ancestors, node]);\n return changed;\n}\n\n/** Remove a token and any group left empty by its removal. Returns true when something was removed. */\nexport function removeToken(doc: TokenDocument, path: string): boolean {\n const loc = findToken(doc, path);\n if (!loc) return false;\n const segments = path.split('.');\n let child: JsonNode = loc.node;\n for (let idx = loc.ancestors.length - 1; idx >= 0; idx--) {\n const parent = loc.ancestors[idx]!;\n const key = segments[idx]!;\n const entry = getEntry(parent, key);\n if (!entry || entry.value !== child) break;\n parent.entries.splice(parent.entries.indexOf(entry), 1);\n const hasChildren = parent.entries.some((e) => isGroupKey(e.key));\n if (hasChildren || idx === 0) break;\n child = parent;\n }\n touch(loc.ancestors);\n return true;\n}\n\n/** Raw token node at `path` (for use as a layout template when moving a token). */\nexport function tokenNode(doc: TokenDocument, path: string): JsonObject | undefined {\n return findToken(doc, path)?.node;\n}\n\n/** The token at `path` as written in this file (with inherited type), if any. */\nexport function readTokenAt(doc: TokenDocument, path: string): FlatToken | undefined {\n const loc = findToken(doc, path);\n return loc ? readToken(loc.node, path, inheritedTypeAt(doc, path), doc.file) : undefined;\n}\n\n/** A new, empty token file. */\nexport function emptyTokenFile(file: string): TokenDocument {\n return {\n file,\n json: {\n root: { kind: 'object', inline: false, entries: [] },\n leading: '',\n trailing: '\\n',\n style: { indent: ' ', newline: '\\n', objectPadding: true, arrayPadding: false },\n },\n };\n}\n\n/**\n * Move the token node at `from` to `to` inside the same file, keeping every field it has\n * ($description, $extensions from other tools, $deprecated...). Returns false when `from` is missing.\n */\nexport function moveToken(doc: TokenDocument, from: string, to: string): boolean {\n const loc = findToken(doc, from);\n if (!loc || findToken(doc, to)) return false;\n const node = loc.node;\n const fromType = stringEntry(node, '$type') ?? inheritedTypeAt(doc, from);\n removeToken(doc, from);\n const segments = to.split('.');\n const name = segments.pop()!;\n const ancestors: JsonObject[] = [];\n let group = doc.json.root as JsonObject;\n for (const seg of segments) {\n ancestors.push(group);\n let next = getEntry(group, seg)?.value;\n if (!next) {\n next = { kind: 'object', inline: false, entries: [] };\n group.entries.push({ key: seg, value: next });\n } else if (next.kind !== 'object' || isTokenNode(next)) {\n throw new Error(`${doc.file}: cannot move to \"${to}\" because \"${seg}\" is a token, not a group`);\n }\n group = next;\n }\n ancestors.push(group);\n clearRawDeep(node);\n group.entries.push({ key: name, value: node });\n touch(ancestors);\n // Keep the effective type: write $type when the new groups would infer something else.\n const inherited = inheritedTypeAt(doc, to);\n const typeEntry = getEntry(node, '$type');\n if (fromType && fromType !== inherited && !typeEntry) insertEntry(node, { key: '$type', value: { kind: 'string', value: fromType } });\n if (typeEntry && typeEntry.value.kind === 'string' && typeEntry.value.value === inherited) node.entries.splice(node.entries.indexOf(typeEntry), 1);\n return true;\n}\n","// Build the logical token set (one entry per token, values per mode of its tier) from the repo's\n// DTCG files. The tier of a file comes from where it lives (see RepoLayout in types.ts).\n\nimport { type BridgeConfig, DEFAULT_TOKEN_PATHS, type TokenPaths } from './config';\nimport { type TokenDocument, flattenTokens, parseTokenFile } from './dtcg-codec';\nimport type { ResolveContext } from './resolver';\nimport {\n EXT_ID,\n EXT_SCOPES,\n type LogicalToken,\n type ModeFile,\n type RepoLayout,\n SINGLE_MODE,\n TIER_AXIS,\n type ThemeOverride,\n type Tier,\n type TokenMap,\n} from './types';\n\nexport interface TokenSet {\n tokens: TokenMap;\n byPath: Map<string, LogicalToken>;\n docs: Map<string, TokenDocument>;\n layout: RepoLayout;\n /** Tier directories and mode order the set was read with. */\n options: LayoutOptions;\n /** Brand x theme overrides of semantic tokens (brands/<brand>.<theme>.tokens.json). */\n overrides: ThemeOverride[];\n /** overrideKey(brand, theme, path) -> value. */\n overrideIndex: Map<string, unknown>;\n /** Problems found while reading (duplicate paths, missing types, parse errors). */\n problems: string[];\n}\n\nexport const isTokenFile = (file: string) => file.endsWith('.tokens.json');\n\n/** Default id of a token that does not declare `com.dsbridge.id`. */\nexport const pathId = (path: string) => `path:${path}`;\n\nexport const overrideKey = (brand: string, theme: string, path: string) => `${brand}|${theme}|${path}`;\n\n/** Where each tier lives (relative to the tokens root) and the preferred mode order (default first). */\nexport interface LayoutOptions {\n dirs?: Partial<Pick<TokenPaths, 'primitives' | 'brands' | 'semantic' | 'base' | 'density' | 'components'>> | undefined;\n order?: { brand?: string[] | undefined; theme?: string[] | undefined; density?: string[] | undefined } | undefined;\n}\n\n/** Layout options from a bridge.config.json: tier directories and mode order (defaults first). */\nexport function layoutOptions(config: BridgeConfig): LayoutOptions {\n const first = (list: string[], def: string | undefined) => (def ? [def, ...list.filter((m) => m !== def)] : list);\n return {\n dirs: config.tokens,\n order: {\n brand: first(config.modes.brands, config.modes.defaults.brand),\n theme: first(config.modes.themes, config.modes.defaults.theme),\n density: first(config.modes.densities, config.modes.defaults.density),\n },\n };\n}\n\nconst FALLBACK_ORDER = { theme: ['light', 'dark'], brand: [] as string[], density: [] as string[] };\nconst stem = (file: string) => file.slice(file.lastIndexOf('/') + 1).replace(/\\.tokens\\.json$/, '');\n\nfunction ordered(list: ModeFile[], pref: string[]): ModeFile[] {\n const rank = (m: string) => (pref.indexOf(m) === -1 ? 99 : pref.indexOf(m));\n return list.sort((a, b) => rank(a.mode) - rank(b.mode) || a.mode.localeCompare(b.mode));\n}\n\n/**\n * Sort token files (paths relative to the tokens root) into tiers. Files outside every tier\n * directory are treated as primitives, so a flat legacy layout still loads.\n */\nexport function detectLayout(files: string[], options: LayoutOptions = {}): RepoLayout {\n const d = { ...DEFAULT_TOKEN_PATHS, ...options.dirs };\n const inDir = (file: string, dir: string) => file.startsWith(`${dir}/`) && !file.slice(dir.length + 1).includes('/');\n const layout: RepoLayout = { primitiveFiles: [], brands: [], baseFiles: [], themes: [], overrides: [], densities: [], componentFiles: [] };\n for (const file of files.filter(isTokenFile).sort()) {\n const name = stem(file);\n if (inDir(file, d.brands)) {\n const parts = name.split('.');\n if (parts.length === 2) layout.overrides.push({ brand: parts[0]!, theme: parts[1]!, file });\n else layout.brands.push({ mode: name, file });\n } else if (inDir(file, d.semantic)) {\n if (name === d.base) layout.baseFiles.push(file);\n else layout.themes.push({ mode: name, file });\n } else if (inDir(file, d.density)) layout.densities.push({ mode: name, file });\n else if (file.startsWith(`${d.components}/`)) layout.componentFiles.push(file);\n else layout.primitiveFiles.push(file);\n }\n ordered(layout.brands, options.order?.brand ?? FALLBACK_ORDER.brand);\n ordered(layout.themes, options.order?.theme ?? FALLBACK_ORDER.theme);\n ordered(layout.densities, options.order?.density ?? FALLBACK_ORDER.density);\n return layout;\n}\n\n/** Mode keys of a tier in this repo, in display order. */\nexport function modesOf(layout: RepoLayout, tier: Tier): string[] {\n switch (TIER_AXIS[tier]) {\n case 'brand':\n return layout.brands.map((b) => b.mode);\n case 'theme':\n return layout.themes.map((t) => t.mode);\n case 'density':\n return layout.densities.map((d) => d.mode);\n default:\n return [SINGLE_MODE];\n }\n}\n\n/** File holding a multi-mode tier's value for `mode`. */\nexport function modeFile(layout: RepoLayout, tier: Tier, mode: string): string | undefined {\n const list = TIER_AXIS[tier] === 'brand' ? layout.brands : TIER_AXIS[tier] === 'theme' ? layout.themes : TIER_AXIS[tier] === 'density' ? layout.densities : [];\n return list.find((m) => m.mode === mode)?.file;\n}\n\n/** Default file for a new single-mode token at `path` (relative to the tokens root). */\nexport function defaultFile(tier: Tier, path: string, dirs: LayoutOptions['dirs'] = {}): string {\n const d = { ...DEFAULT_TOKEN_PATHS, ...dirs };\n const head = path.split('.')[0];\n if (tier === 'base') return `${d.semantic}/${d.base}.tokens.json`;\n if (tier === 'component') return `${d.components}/${head}.tokens.json`;\n return `${d.primitives}/${head}.tokens.json`;\n}\n\n/** Default resolution context: first brand, first theme, first density, with overrides. */\nexport function defaultContext(set: Pick<TokenSet, 'layout' | 'overrideIndex'>): ResolveContext {\n return {\n brand: set.layout.brands[0]?.mode,\n theme: set.layout.themes[0]?.mode,\n density: set.layout.densities[0]?.mode,\n overrides: set.overrideIndex,\n };\n}\n\n/** Context to describe a token's value in one mode of its own tier (other axes at their default). */\nexport function contextFor(set: Pick<TokenSet, 'layout' | 'overrideIndex'>, tier: Tier, mode: string): ResolveContext {\n const ctx = defaultContext(set);\n const axis = TIER_AXIS[tier];\n if (axis) ctx[axis] = mode;\n return ctx;\n}\n\nfunction readScopes(ext: Record<string, unknown> | undefined): string[] | undefined {\n const s = ext?.[EXT_SCOPES];\n return Array.isArray(s) && s.every((x) => typeof x === 'string') ? (s as string[]) : undefined;\n}\n\nfunction readId(ext: Record<string, unknown> | undefined): string | undefined {\n const id = ext?.[EXT_ID];\n return typeof id === 'string' && id ? id : undefined;\n}\n\nconst TIER_LABEL: Record<Tier, string> = {\n primitive: 'a primitive',\n brand: 'a brand token',\n base: 'a base semantic token',\n semantic: 'a semantic token',\n density: 'a density token',\n component: 'a component token',\n};\n\n/** `files` maps paths relative to the tokens root to file contents. */\nexport function buildTokenSet(files: Record<string, string>, options: LayoutOptions = {}): TokenSet {\n const problems: string[] = [];\n const docs = new Map<string, TokenDocument>();\n for (const [file, text] of Object.entries(files)) {\n if (!isTokenFile(file)) continue;\n try {\n docs.set(file, parseTokenFile(file, text));\n } catch (err) {\n problems.push(`${file} is not valid JSON: ${(err as Error).message}`);\n }\n }\n const layout = detectLayout([...docs.keys()], options);\n const tokens: TokenMap = new Map();\n const byPath = new Map<string, LogicalToken>();\n\n const add = (t: LogicalToken) => {\n if (tokens.has(t.id)) {\n problems.push(`Two tokens share the id \"${t.id}\" (${tokens.get(t.id)!.path} and ${t.path}).`);\n return;\n }\n tokens.set(t.id, t);\n byPath.set(t.path, t);\n };\n\n const single = (tier: Tier, fileList: string[]) => {\n for (const file of fileList) {\n for (const flat of flattenTokens(docs.get(file)!)) {\n const prev = byPath.get(flat.path);\n if (prev) {\n problems.push(\n prev.tier === tier\n ? `${flat.path} is defined twice (${prev.files[SINGLE_MODE]} and ${file}).`\n : `${flat.path} exists both as ${TIER_LABEL[prev.tier]} and as ${TIER_LABEL[tier]} (${file}).`,\n );\n continue;\n }\n if (!flat.type) problems.push(`${flat.path} in ${file} has no $type.`);\n add({\n id: readId(flat.extensions) ?? pathId(flat.path),\n path: flat.path,\n type: flat.type ?? 'unknown',\n tier,\n values: { [SINGLE_MODE]: flat.value },\n description: flat.description,\n scopes: readScopes(flat.extensions),\n files: { [SINGLE_MODE]: file },\n });\n }\n }\n };\n\n const multi = (tier: Tier, modes: ModeFile[]) => {\n const merged = new Map<string, LogicalToken>();\n for (const { mode, file } of modes) {\n for (const flat of flattenTokens(docs.get(file)!)) {\n let t = merged.get(flat.path);\n if (!t) {\n const prev = byPath.get(flat.path);\n if (prev) {\n problems.push(`${flat.path} exists both as ${TIER_LABEL[prev.tier]} and as ${TIER_LABEL[tier]} (${file}).`);\n continue;\n }\n t = {\n id: readId(flat.extensions) ?? pathId(flat.path),\n path: flat.path,\n type: flat.type ?? 'unknown',\n tier,\n values: {},\n description: flat.description,\n scopes: readScopes(flat.extensions),\n files: {},\n };\n merged.set(flat.path, t);\n if (!flat.type) problems.push(`${flat.path} in ${file} has no $type.`);\n } else if (flat.type && t.type !== flat.type) {\n problems.push(`${flat.path} has type ${t.type} in one mode and ${flat.type} in ${file}.`);\n }\n t.values[mode] = flat.value;\n t.files[mode] = file;\n t.description ??= flat.description;\n t.scopes ??= readScopes(flat.extensions);\n }\n }\n merged.forEach(add);\n };\n\n single('primitive', layout.primitiveFiles);\n multi('brand', layout.brands);\n single('base', layout.baseFiles);\n multi('semantic', layout.themes);\n multi('density', layout.densities);\n single('component', layout.componentFiles);\n\n const overrides: ThemeOverride[] = [];\n const overrideIndex = new Map<string, unknown>();\n for (const o of layout.overrides) {\n for (const flat of flattenTokens(docs.get(o.file)!)) {\n overrides.push({ brand: o.brand, theme: o.theme, path: flat.path, type: flat.type, value: flat.value, file: o.file });\n overrideIndex.set(overrideKey(o.brand, o.theme, flat.path), flat.value);\n }\n }\n return { tokens, byPath, docs, layout, options, overrides, overrideIndex, problems };\n}\n\nexport function indexByPath(tokens: Iterable<LogicalToken>): Map<string, LogicalToken> {\n const m = new Map<string, LogicalToken>();\n for (const t of tokens) m.set(t.path, t);\n return m;\n}\n","// Default Figma variable scopes, inferred from token path and type when the DTCG file does not\n// declare `$extensions[\"com.figma.scopes\"]`. Figma's own default is ALL_SCOPES, which shows every\n// variable in every picker; DS Bridge never creates variables with it.\n\nimport type { Tier } from './types';\n\nconst has = (segments: string[], ...names: string[]) => names.some((n) => segments.includes(n));\n\nexport function defaultScopes(path: string, type: string, tier: Tier): string[] {\n const s = path.split('.');\n switch (type) {\n case 'color':\n // Raw ramps and brand palette roles are referenced by semantic tokens, never applied directly.\n if (tier === 'primitive' || (tier === 'brand' && s[0] === 'palette')) return [];\n if (has(s, 'text')) return ['TEXT_FILL'];\n if (has(s, 'border', 'ring', 'outline')) return ['STROKE_COLOR'];\n if (has(s, 'bg', 'surface', 'background')) return ['FRAME_FILL', 'SHAPE_FILL'];\n if (has(s, 'shadow')) return ['EFFECT_COLOR'];\n return ['FRAME_FILL', 'SHAPE_FILL', 'TEXT_FILL', 'STROKE_COLOR'];\n case 'dimension':\n if (has(s, 'radius')) return ['CORNER_RADIUS'];\n if (has(s, 'border', 'width', 'stroke')) return ['STROKE_FLOAT'];\n if (has(s, 'space', 'spacing', 'gap')) return ['GAP', 'WIDTH_HEIGHT'];\n if (has(s, 'size') && has(s, 'font')) return ['FONT_SIZE'];\n if (has(s, 'letter-spacing')) return ['LETTER_SPACING'];\n return ['WIDTH_HEIGHT', 'GAP'];\n case 'fontWeight':\n return ['FONT_WEIGHT'];\n case 'fontFamily':\n return ['FONT_FAMILY'];\n case 'number':\n if (has(s, 'line-height', 'lineHeight')) return ['LINE_HEIGHT'];\n if (has(s, 'opacity')) return ['OPACITY'];\n return ['WIDTH_HEIGHT', 'GAP'];\n case 'string':\n return ['TEXT_CONTENT'];\n default:\n return [];\n }\n}\n\nexport const sameScopes = (a: string[], b: string[]) => {\n const sa = [...new Set(a)].sort();\n const sb = [...new Set(b)].sort();\n return sa.length === sb.length && sa.every((x, i) => x === sb[i]);\n};\n\n/** Scopes a token effectively has: the declared ones, or the inferred default. */\nexport const effectiveScopes = (t: { path: string; type: string; tier: Tier; scopes: string[] | undefined }) =>\n t.scopes ?? defaultScopes(t.path, t.type, t.tier);\n","// Three-way diff per token.\n//\n// base = tokens at the commit the Figma file was last pulled from (stored baseSha)\n// figma = tokens read from Figma variables now\n// head = tokens on the main branch now\n//\n// A side \"changed\" a token when it differs from base. Figma-only changes are local edits (they go\n// into the PR). Main-only changes are upstream edits (a pull brings them in; a push keeps them).\n// When both sides changed the same token differently, it is a conflict and the user decides.\n// Without a base (first sync), every difference between Figma and main is a conflict.\n\nimport { effectiveScopes, sameScopes } from './scopes';\nimport type { LogicalToken } from './types';\nimport { valuesEqual } from './values';\n\nexport type ChangeKind = 'added' | 'changed' | 'renamed' | 'removed';\n\nexport interface FieldChange {\n field: 'path' | 'type' | 'value' | 'description' | 'scopes';\n /** Mode key for value changes. */\n mode?: string;\n before: unknown;\n after: unknown;\n}\n\nexport interface SideChange {\n kind: ChangeKind;\n fields: FieldChange[];\n}\n\nexport interface DiffEntry {\n id: string;\n /** Display path: the newest name on the side that changed. */\n path: string;\n base?: LogicalToken | undefined;\n figma?: LogicalToken | undefined;\n head?: LogicalToken | undefined;\n /** Change made in Figma (base -> figma). */\n local?: SideChange | undefined;\n /** Change made on main (base -> head). */\n remote?: SideChange | undefined;\n conflict: boolean;\n}\n\nexport interface ThreeWayResult {\n /** Figma-side changes that main did not touch: candidates for the PR. */\n local: DiffEntry[];\n /** Main-side changes that Figma did not touch: candidates for a pull. */\n remote: DiffEntry[];\n /** Both sides changed the same token differently. */\n conflicts: DiffEntry[];\n unchanged: number;\n}\n\nconst normDesc = (d: string | undefined) => (d ?? '').trim();\n\nexport function fieldChanges(a: LogicalToken, b: LogicalToken): FieldChange[] {\n const out: FieldChange[] = [];\n if (a.path !== b.path) out.push({ field: 'path', before: a.path, after: b.path });\n if (a.type !== b.type) out.push({ field: 'type', before: a.type, after: b.type });\n const modes = [...new Set([...Object.keys(a.values), ...Object.keys(b.values)])];\n for (const mode of modes) {\n if (!valuesEqual(b.type, a.values[mode], b.values[mode])) out.push({ field: 'value', mode, before: a.values[mode], after: b.values[mode] });\n }\n if (normDesc(a.description) !== normDesc(b.description)) out.push({ field: 'description', before: a.description, after: b.description });\n const sa = effectiveScopes(a);\n const sb = effectiveScopes(b);\n if (!sameScopes(sa, sb)) out.push({ field: 'scopes', before: sa, after: sb });\n return out;\n}\n\nexport function sameToken(a: LogicalToken | undefined, b: LogicalToken | undefined): boolean {\n if (!a || !b) return a === b;\n return fieldChanges(a, b).length === 0;\n}\n\nfunction sideChange(from: LogicalToken | undefined, to: LogicalToken | undefined): SideChange | undefined {\n if (!from && !to) return undefined;\n if (!from) return { kind: 'added', fields: [] };\n if (!to) return { kind: 'removed', fields: [] };\n const fields = fieldChanges(from, to);\n if (!fields.length) return undefined;\n return { kind: fields.some((f) => f.field === 'path') ? 'renamed' : 'changed', fields };\n}\n\n/** `base` is undefined when the file was never pulled. Maps are keyed by token id. */\nexport function threeWayDiff(\n base: Map<string, LogicalToken> | undefined,\n figma: Map<string, LogicalToken>,\n head: Map<string, LogicalToken>,\n): ThreeWayResult {\n const ids = new Set<string>([...(base?.keys() ?? []), ...figma.keys(), ...head.keys()]);\n const result: ThreeWayResult = { local: [], remote: [], conflicts: [], unchanged: 0 };\n for (const id of [...ids].sort()) {\n const b = base?.get(id);\n const f = figma.get(id);\n const h = head.get(id);\n const local = sideChange(b, f);\n const remote = sideChange(b, h);\n if ((!local && !remote) || (f && h && sameToken(f, h)) || (!f && !h)) {\n result.unchanged++;\n continue;\n }\n const entry: DiffEntry = { id, path: (f ?? h ?? b)!.path, base: b, figma: f, head: h, local, remote, conflict: false };\n if (local && !remote) {\n entry.path = (f ?? b)!.path;\n result.local.push(entry);\n } else if (remote && !local) {\n entry.path = (h ?? b)!.path;\n result.remote.push(entry);\n } else {\n entry.conflict = true;\n result.conflicts.push(entry);\n }\n }\n const byPath = (a: DiffEntry, b: DiffEntry) => a.path.localeCompare(b.path);\n result.local.sort(byPath);\n result.remote.sort(byPath);\n result.conflicts.sort(byPath);\n return result;\n}\n\nexport const toMap = (tokens: Iterable<LogicalToken>) => new Map([...tokens].map((t) => [t.id, t]));\n\nexport type ConflictChoice = 'figma' | 'main';\n","// Risk tier of a change, following docs/GOVERNANCE.md (\"If a PR spans tiers, the highest tier applies\").\n// The one classifier: the Figma plugin, the docs site editor and reviews, the CLI and the MCP server all\n// call classifyRisk, so a change gets the same tier and semver bump wherever it is proposed.\n//\n// Rules, highest first:\n// Tier 3 (high): any token added, changed (value, type, scopes), renamed or removed, in any tier or in a\n// brand theme override. Renames and removals are breaking (\"major\"); additions and changes are\n// \"minor\". Also any guardrail file: governance.guardrails from bridge.config.json (default: the\n// contrast checks, bridge.config.json, AGENTS.md, CLAUDE.md, docs/GOVERNANCE.md, .stylelintrc.json,\n// anything under .github/). A *.tokens.json file counts as Tier 3 when the token changes inside it\n// are not known.\n// Tier 2 (medium): code component source under the components directory that is not a story, docs or test\n// file, and unknown source files (\"When in doubt about the tier, choose the higher one\").\n// Tier 1 (low): a token whose description is the only thing that changed (\"patch\"), documentation\n// (*.md, docs/**), stories, *.docs.json, tests, changesets.\n\nimport type { AcceptedChange } from './compose';\nimport { type BridgeConfig, CONFIG_FILE, DEFAULT_GOVERNANCE } from './config';\nimport { fieldChanges } from './diff-engine';\n\nexport type RiskTier = 1 | 2 | 3;\nexport type SemverBump = 'patch' | 'minor' | 'major';\nexport type TokenChangeKind = 'added' | 'changed' | 'renamed' | 'removed';\n\nexport interface ChangedFile {\n /** Path relative to the repository root. */\n path: string;\n status?: 'added' | 'modified' | 'removed' | 'renamed' | string;\n}\n\n/** A token change described by kind, for callers that do not hold LogicalTokens (CLI, MCP). */\nexport interface TokenChangeSummary {\n kind: TokenChangeKind;\n path: string;\n /** For \"changed\": true when only the description moved. */\n descriptionOnly?: boolean;\n}\n\nexport interface RiskInput {\n /** Token changes (from a diff or a push). */\n tokenChanges?: (AcceptedChange | TokenChangeSummary)[];\n /** Changed files (from a PR or a commit). */\n files?: ChangedFile[];\n config?: BridgeConfig | undefined;\n}\n\nexport interface RiskResult {\n tier: RiskTier;\n /** PR-template label, for example \"Tier 3: token change, needs design + tech approval\". */\n label: string;\n /** One line per rule that fired, highest tier first. */\n reasons: string[];\n /** Semver bump for the changeset of a token change: undefined when no token changed. */\n bump?: SemverBump | undefined;\n}\n\nexport const RISK_LABELS: Record<RiskTier, string> = {\n 1: 'Tier 1: low risk, one code owner',\n 2: 'Tier 2: medium risk, design review then design + tech approval',\n 3: 'Tier 3: token change, needs design + tech approval',\n};\n\nconst BUMP_RANK: Record<SemverBump, number> = { patch: 0, minor: 1, major: 2 };\nconst LOW = [/\\.md$/, /^docs\\//, /\\.stories\\.tsx?$/, /\\.docs\\.json$/, /\\.test\\.tsx?$/, /^\\.changeset\\//];\n\nconst isSummary = (c: AcceptedChange | TokenChangeSummary): c is TokenChangeSummary => 'kind' in c;\n\n/** Kind and description-only flag of any token change. */\nexport function summarizeTokenChange(c: AcceptedChange | TokenChangeSummary): TokenChangeSummary {\n if (isSummary(c)) return c;\n const path = (c.target ?? c.current)!.path;\n if (!c.target) return { kind: 'removed', path };\n if (!c.current) return { kind: 'added', path };\n if (c.current.path !== c.target.path) return { kind: 'renamed', path };\n const fields = fieldChanges(c.current, c.target);\n return { kind: 'changed', path, descriptionOnly: fields.length > 0 && fields.every((f) => f.field === 'description') };\n}\n\n/** Semver bump of a set of token changes: renames and removals major, other changes minor, descriptions patch. */\nexport function tokenBump(changes: (AcceptedChange | TokenChangeSummary)[]): SemverBump | undefined {\n let bump: SemverBump | undefined;\n for (const c of changes.map(summarizeTokenChange)) {\n const b: SemverBump = c.kind === 'removed' || c.kind === 'renamed' ? 'major' : c.kind === 'changed' && c.descriptionOnly ? 'patch' : 'minor';\n if (!bump || BUMP_RANK[b] > BUMP_RANK[bump]) bump = b;\n }\n return bump;\n}\n\n/** Whether a repo-relative path is a guardrail file under this config (or the defaults). */\nexport function isGuardrail(path: string, config?: BridgeConfig): boolean {\n const list = config ? [...config.governance.guardrails, CONFIG_FILE, ...(config.contrast ? [config.contrast.path] : [])] : DEFAULT_GOVERNANCE.guardrails;\n return list.some((g) => (g.endsWith('/') ? path.startsWith(g) : path === g)) || path.startsWith('.github/') || path.endsWith('/contrast.checks.json') || path === 'contrast.checks.json';\n}\n\nexport function classifyRisk(input: RiskInput): RiskResult {\n const reasons: { tier: RiskTier; text: string }[] = [];\n const tokenChanges = (input.tokenChanges ?? []).map(summarizeTokenChange);\n for (const c of tokenChanges) {\n if (c.kind === 'changed' && c.descriptionOnly) reasons.push({ tier: 1, text: `Token description changed: ${c.path}` });\n else reasons.push({ tier: 3, text: `Token ${c.kind}: ${c.path}` });\n }\n const bump = tokenBump(tokenChanges);\n const componentsDir = input.config?.components?.dir;\n for (const f of input.files ?? []) {\n const p = f.path.replace(/^\\/+/, '');\n if (p.endsWith('.tokens.json')) {\n // Known token changes already decided the tier of token files.\n if (!input.tokenChanges) reasons.push({ tier: 3, text: `Token file ${f.status ?? 'changed'}: ${p}` });\n } else if (isGuardrail(p, input.config)) reasons.push({ tier: 3, text: `Guardrail file changed: ${p}` });\n else if (LOW.some((r) => r.test(p))) reasons.push({ tier: 1, text: `Docs, story or test: ${p}` });\n else if (componentsDir && p.startsWith(`${componentsDir}/`)) reasons.push({ tier: 2, text: `Component source ${f.status ?? 'changed'}: ${p}` });\n else reasons.push({ tier: 2, text: `Source file changed: ${p}` });\n }\n reasons.sort((a, b) => b.tier - a.tier);\n const tier = (reasons[0]?.tier ?? 1) as RiskTier;\n return { tier, label: RISK_LABELS[tier], reasons: reasons.map((r) => r.text), bump };\n}\n","// WCAG 2.x contrast for declared foreground/background token pairs.\n\nimport { type PathIndex, type ResolveContext, type StepSource, resolve } from './resolver';\nimport { type Rgba, hexToRgba, parseColor } from './values';\n\nexport type PairKind = 'text' | 'large-text' | 'ui';\n\n/** One entry of contrast.checks.json: foreground and background token paths and the minimum ratio. */\nexport interface ContrastPair {\n foreground: string;\n background: string;\n /** Minimum ratio from contrast.checks.json (4.5 for text, 3 for non-text UI). */\n min: number;\n /** Derived from `min`: 4.5 or more is text, anything lower is a UI component (WCAG 1.4.11). */\n kind: PairKind;\n}\n\n/** contrast.checks.json in the tokens path: the one source of contrast pairs (the token build uses it too). */\nexport const CONTRAST_CHECKS_FILE = 'contrast.checks.json';\n\n/** Minimum ratio for WCAG AA per pair kind (1.4.3 and 1.4.11). */\nexport const AA_MIN: Record<PairKind, number> = { text: 4.5, 'large-text': 3, ui: 3 };\n/** Minimum ratio for WCAG AAA (1.4.6). UI components have no AAA criterion; 4.5 is used as a stretch goal. */\nexport const AAA_MIN: Record<PairKind, number> = { text: 7, 'large-text': 4.5, ui: 4.5 };\n\nconst channel = (c: number) => (c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4);\n\n/** Relative luminance of an opaque sRGB color (channels 0..1, rounded to 8-bit like browsers render). */\nexport function luminance(c: Rgba): number {\n const q = (x: number) => Math.round(Math.min(1, Math.max(0, x)) * 255) / 255;\n return 0.2126 * channel(q(c.r)) + 0.7152 * channel(q(c.g)) + 0.0722 * channel(q(c.b));\n}\n\n/** Composite a possibly translucent foreground over an opaque background. */\nexport function composite(fg: Rgba, bg: Rgba): Rgba {\n const a = fg.a;\n return { r: fg.r * a + bg.r * (1 - a), g: fg.g * a + bg.g * (1 - a), b: fg.b * a + bg.b * (1 - a), a: 1 };\n}\n\nexport function contrastRatio(fg: Rgba | string, bg: Rgba | string): number {\n const f = typeof fg === 'string' ? hexToRgba(fg) : fg;\n const b = typeof bg === 'string' ? hexToRgba(bg) : bg;\n if (!f || !b) throw new Error('Invalid color');\n const opaqueBg = { ...b, a: 1 };\n const l1 = luminance(composite(f, opaqueBg));\n const l2 = luminance(opaqueBg);\n const [hi, lo] = l1 > l2 ? [l1, l2] : [l2, l1];\n return (hi + 0.05) / (lo + 0.05);\n}\n\nexport type ContrastLevel = 'AAA' | 'AA' | 'fail';\n\n/** AAA when it meets the AAA ratio of its kind, AA when it meets `min` (the pair's own minimum), else fail. */\nexport function contrastLevel(ratio: number, kind: PairKind, min = AA_MIN[kind]): ContrastLevel {\n if (ratio < min) return 'fail';\n if (ratio >= AAA_MIN[kind]) return 'AAA';\n return 'AA';\n}\n\n/** One token visited while resolving a pair: its path and whether a brand override supplied the value. */\nexport interface ContrastStep {\n path: string;\n via: StepSource;\n}\n\nexport interface ContrastResult {\n pair: ContrastPair;\n /** Brand mode key; undefined when the repo has no brands. */\n brand: string | undefined;\n /** Theme mode key. */\n theme: string;\n ratio?: number;\n level?: ContrastLevel;\n /** Why the ratio could not be computed (unresolvable alias, not a color). */\n error?: string;\n /** Every token both colors resolve through in this brand x theme (used to find what a change affects). */\n steps: ContrastStep[];\n}\n\n/** Brand x theme combinations a set is checked in, like the token build (density does not change colors). */\nexport interface ContrastScope {\n brands: string[];\n themes: string[];\n density?: string | undefined;\n overrides?: Map<string, unknown> | undefined;\n}\n\nexport function contrastScope(set: { layout: { brands: { mode: string }[]; themes: { mode: string }[]; densities: { mode: string }[] }; overrideIndex: Map<string, unknown> }): ContrastScope {\n return {\n brands: set.layout.brands.map((b) => b.mode),\n themes: set.layout.themes.map((t) => t.mode),\n density: set.layout.densities[0]?.mode,\n overrides: set.overrideIndex,\n };\n}\n\nconst cap = (s: string) => s.charAt(0).toUpperCase() + s.slice(1);\n/** \"Ocean dark\", or \"Dark\" when the repo has a single unnamed brand. */\nexport const contextLabel = (r: { brand: string | undefined; theme: string }) => (r.brand ? `${cap(r.brand)} ${r.theme}` : cap(r.theme));\n\n/**\n * The color a browser renders: tokens.css writes the `hex` of a DTCG color when it has one, and\n * components can round differently at the 8-bit boundary, so hex wins (same as the token build).\n */\nexport function renderedColor(value: unknown): Rgba | undefined {\n const c = parseColor(value);\n const hex = value && typeof value === 'object' ? (value as { hex?: unknown }).hex : undefined;\n const fromHex = typeof hex === 'string' ? hexToRgba(hex) : undefined;\n return c && fromHex ? { ...fromHex, a: c.a } : c;\n}\n\n/** Ratios of every pair in every brand x theme. Ratios are rounded to 2 decimals. */\nexport function evaluatePairs(index: PathIndex, pairs: ContrastPair[], scope: ContrastScope): ContrastResult[] {\n const out: ContrastResult[] = [];\n const brands = scope.brands.length ? scope.brands : [undefined];\n for (const brand of brands) {\n for (const theme of scope.themes) {\n const ctx: ResolveContext = { brand, theme, density: scope.density, overrides: scope.overrides };\n for (const pair of pairs) {\n const steps: ContrastStep[] = [];\n const color = (path: string): Rgba | string => {\n const r = resolve(index, path, ctx);\n r.via.forEach((via, i) => steps.push({ path: r.chain[i]!, via }));\n if (r.error) return `${path} cannot be resolved (${r.error === 'broken' ? `missing ${r.at}` : r.error})`;\n return renderedColor(r.value) ?? `${path} is not a color`;\n };\n const fg = color(pair.foreground);\n const bg = color(pair.background);\n if (typeof fg === 'string' || typeof bg === 'string') {\n out.push({ pair, brand, theme, steps, error: typeof fg === 'string' ? fg : (bg as string) });\n continue;\n }\n const ratio = Math.round(contrastRatio(fg, bg) * 100) / 100;\n out.push({ pair, brand, theme, ratio, level: contrastLevel(ratio, pair.kind, pair.min), steps });\n }\n }\n }\n return out;\n}\n\n/** Text pair when the minimum is 4.5:1 or more, UI pair (WCAG 1.4.11) below that. */\nexport const kindForMin = (min: number): PairKind => (min >= AA_MIN.text ? 'text' : 'ui');\n\n/** A pair from its parts; the kind follows the minimum. */\nexport const contrastPair = (foreground: string, background: string, min = AA_MIN.text): ContrastPair => ({ foreground, background, min, kind: kindForMin(min) });\n\n/**\n * Parse contrast checks: `{ \"$description\": \"...\", \"pairs\": [[fg, bg, min], ...] }`. A top-level array and\n * `{ \"fg\", \"bg\", \"min\" }` (or foreground, background, ratio) entries are read too, for other repos' files.\n * Entries that are not a pair of token paths with a positive minimum are skipped.\n */\nexport function parseContrastChecks(text: string | undefined): ContrastPair[] {\n if (!text) return [];\n const data = JSON.parse(text) as { pairs?: unknown } | unknown[];\n const list = Array.isArray(data) ? data : Array.isArray(data.pairs) ? data.pairs : [];\n const out: ContrastPair[] = [];\n for (const p of list) {\n let fg: unknown, bg: unknown, min: unknown;\n if (Array.isArray(p)) [fg, bg, min] = p;\n else if (p && typeof p === 'object') {\n const o = p as Record<string, unknown>;\n fg = o.fg ?? o.foreground;\n bg = o.bg ?? o.background;\n min = o.min ?? o.ratio ?? AA_MIN.text;\n }\n if (typeof fg !== 'string' || typeof bg !== 'string' || typeof min !== 'number' || !(min > 0)) continue;\n out.push(contrastPair(fg, bg, min));\n }\n return out;\n}\n\nexport const pairKey = (r: { pair: ContrastPair; brand: string | undefined; theme: string }) => `${r.brand ?? ''}/${r.theme}:${r.pair.foreground}|${r.pair.background}`;\n","// Branch name, commit message and a reviewer-friendly PR body for a token change (changesets: changeset.ts).\n\nimport type { AcceptedChange } from './compose';\nimport { resolve } from './resolver';\nimport { type TokenSet, contextFor, modesOf } from './token-set';\nimport { type LogicalToken, SINGLE_MODE, TIER_AXIS, TIER_NAMES, isMultiMode, modeDisplayName } from './types';\nimport { RISK_LABELS, classifyRisk } from './risk';\nimport type { ProposalValidation } from './validators';\nimport { formatValue, isAlias, valuesEqual } from './values';\nimport { type ContrastResult, contextLabel, pairKey } from './wcag';\n\n/** Label of the risk tier every token change gets (see risk.ts). */\nexport const RISK_TIER = RISK_LABELS[3];\n\nexport function slugify(text: string, max = 40): string {\n const s = text\n .toLowerCase()\n .normalize('NFKD')\n .replace(/[̀-ͯ]/g, '')\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n // Cut at a word boundary so branch names do not end in half a word.\n const cut = s.length <= max ? s : s.slice(0, max + 1).replace(/-[^-]*$/, '');\n return cut.replace(/-+$/g, '') || 'update';\n}\n\nconst pad = (n: number) => String(n).padStart(2, '0');\n\n/** \"tokens/<slug>-<yyyymmdd-hhmm>\" in UTC. */\nexport function branchName(slug: string, date: Date): string {\n const stamp = `${date.getUTCFullYear()}${pad(date.getUTCMonth() + 1)}${pad(date.getUTCDate())}-${pad(date.getUTCHours())}${pad(date.getUTCMinutes())}`;\n return `tokens/${slugify(slug)}-${stamp}`;\n}\n\nexport type RowKind = 'added' | 'changed' | 'renamed' | 'removed';\n\nexport function changeKind(c: AcceptedChange): RowKind {\n if (!c.target) return 'removed';\n if (!c.current) return 'added';\n return c.current.path !== c.target.path ? 'renamed' : 'changed';\n}\n\nexport function defaultTitle(changes: AcceptedChange[]): string {\n const paths = changes.map((c) => (c.target ?? c.current)!.path);\n const first = paths[0] ?? 'tokens';\n const verb = (() => {\n const kinds = new Set(changes.map(changeKind));\n if (kinds.size === 1) return { added: 'Add', changed: 'Update', renamed: 'Rename', removed: 'Remove' }[[...kinds][0]!];\n return 'Update';\n })();\n return paths.length <= 1 ? `${verb} token ${first}` : `${verb} ${paths.length} tokens (${first} and more)`;\n}\n\nconst describe = (set: TokenSet, t: LogicalToken | undefined, mode: string): string => {\n if (!t) return '';\n const v = t.values[mode];\n if (v === undefined) return '';\n if (!isAlias(v)) return formatValue(t.type, v);\n const r = resolve(set.byPath, t.path, contextFor(set, t.tier, mode));\n const resolved = r.value === undefined ? 'unresolved' : formatValue(t.type, r.value);\n return `${formatValue(t.type, v)} (${resolved})`;\n};\n\nconst cell = (s: string) => s.replace(/\\|/g, '\\\\|').replace(/\\n/g, ' ') || ' ';\nconst code = (s: string) => (s ? `\\`${s}\\`` : '');\n\nfunction valueText(head: TokenSet, proposed: TokenSet, c: AcceptedChange, mode: string): string {\n const t = c.target ?? c.current!;\n const before = describe(head, c.current, mode);\n const after = describe(proposed, c.target, mode);\n if (c.current && c.target && valuesEqual(t.type, c.current.values[mode], c.target.values[mode]) && before === after) return before ? `${code(before)} (unchanged)` : '';\n return `${before ? code(before) : 'none'} -> ${after ? code(after) : 'removed'}`;\n}\n\n/** One line per mode of the token's tier (\"Light: a -> b\"), or the bare value for single-mode tiers. */\nfunction valuesCell(head: TokenSet, proposed: TokenSet, c: AcceptedChange): string {\n const t = c.target ?? c.current!;\n if (!isMultiMode(t.tier)) return valueText(head, proposed, c, SINGLE_MODE);\n return modesOf(head.layout, t.tier)\n .map((m) => {\n const text = valueText(head, proposed, c, m);\n return text ? `${modeDisplayName(m)}: ${text}` : '';\n })\n .filter(Boolean)\n .join('<br>');\n}\n\n/** Modes whose value differs; undefined means every mode (added, removed, renamed or retyped). */\nexport function changedModes(c: AcceptedChange): Set<string> | undefined {\n if (!c.current || !c.target || c.current.path !== c.target.path || c.current.type !== c.target.type) return undefined;\n const modes = new Set([...Object.keys(c.current.values), ...Object.keys(c.target.values)]);\n return new Set([...modes].filter((m) => !valuesEqual(c.target!.type, c.current!.values[m], c.target!.values[m])));\n}\n\n/**\n * Does this contrast result depend on the changed token? True when either color resolves through\n * the token (directly, or indirectly through aliases: a palette role or a primitive that a semantic\n * token points to) in that brand x theme, using a mode that changed. A semantic token a brand\n * overrides for the theme is not used there, so it does not count.\n */\nfunction dependsOn(r: ContrastResult, path: string, tier: LogicalToken['tier'], modes: Set<string> | undefined): boolean {\n const axis = TIER_AXIS[tier];\n if (modes && modes.size === 0) return false; // description or scopes only\n if (modes && axis) {\n const mode = axis === 'brand' ? r.brand : axis === 'theme' ? r.theme : undefined;\n // Density does not change colors; a brand or theme that did not change is not affected.\n if (mode === undefined || !modes.has(mode)) return false;\n }\n return r.steps.some((s) => s.path === path && s.via === 'token');\n}\n\n/** Pairs affected by a change, with before and after results matched by brand x theme x pair. */\nexport function affectedContrast(c: AcceptedChange, before: ContrastResult[], after: ContrastResult[]): { before?: ContrastResult | undefined; after?: ContrastResult | undefined }[] {\n const modes = changedModes(c);\n const keys = new Set<string>();\n if (c.current) for (const r of before) if (dependsOn(r, c.current.path, c.current.tier, modes)) keys.add(pairKey(r));\n if (c.target) for (const r of after) if (dependsOn(r, c.target.path, c.target.tier, modes)) keys.add(pairKey(r));\n const b = new Map(before.map((r) => [pairKey(r), r]));\n const a = new Map(after.map((r) => [pairKey(r), r]));\n return [...keys].map((k) => ({ before: b.get(k), after: a.get(k) }));\n}\n\n/** Contrast lines shown per row of the Changes table before pointing to the full impact table. */\nexport const CONTRAST_CELL_MAX = 12;\n\nfunction contrastCell(c: AcceptedChange, before: ContrastResult[], after: ContrastResult[]): string {\n const rows = affectedContrast(c, before, after);\n const fmt = (x: ContrastResult | undefined) => (x?.ratio !== undefined ? `${x.ratio}` : 'n/a');\n // Changed ratios first, then the biggest drops, so the cell leads with what a reviewer must look at.\n const delta = (x: (typeof rows)[number]) => (x.after?.ratio ?? 0) - (x.before?.ratio ?? 0);\n rows.sort((x, y) => Number(delta(y) === 0) - Number(delta(x) === 0) || delta(x) - delta(y));\n const parts = rows.slice(0, CONTRAST_CELL_MAX).map((x) => {\n const r = (x.after ?? x.before)!;\n return `${contextLabel(r)}, ${r.pair.foreground} on ${r.pair.background}: ${fmt(x.before)} -> ${fmt(x.after)} ${x.after?.level ?? ''}`.trim();\n });\n if (rows.length > CONTRAST_CELL_MAX) parts.push(`and ${rows.length - CONTRAST_CELL_MAX} more (see Contrast impact)`);\n return parts.join('<br>') || ' ';\n}\n\nexport interface PrInput {\n changes: AcceptedChange[];\n head: TokenSet;\n proposed: TokenSet;\n validation: ProposalValidation;\n baseBranch: string;\n headSha: string;\n baseSha: string | undefined;\n /** Who opened the PR and where the edits were made. */\n origin: PrOrigin;\n title: string;\n notes: string;\n /** Upstream changes kept from main (informational). */\n upstreamPaths: string[];\n /** Conflicts resolved before opening the PR: \"edit\" kept the edited side, \"main\" kept the base branch. */\n resolvedConflicts: { path: string; choice: 'figma' | 'edit' | 'main' }[];\n}\n\n/** Where a token change comes from. The plugin, the CLI and the MCP server each pass their own. */\nexport interface PrOrigin {\n /** Tool that opened the PR, for example \"the DS Bridge Figma plugin\". */\n tool: string;\n /** Where the edits were made, for example \"Figma\". */\n surface: string;\n /** File or session the edits come from, for example the Figma file name. */\n location?: string | undefined;\n /** \"Authored by\" line, for example \"Human designer in Figma, via the DS Bridge plugin (no AI involved in the values)\". */\n authoredBy: string;\n}\n\nexport function composePrBody(input: PrInput): string {\n const { changes, head, proposed, validation } = input;\n const lines: string[] = [];\n lines.push('## What changed and why', '');\n const o = input.origin;\n lines.push(input.notes.trim() || `Token edits made in ${o.surface}${o.location ? ` (\"${o.location}\")` : ''}, exported with ${o.tool}.`);\n lines.push('', `Opened from ${o.tool}. ${o.surface} is the editing surface; this PR is the change. Nothing is merged until it is reviewed.`);\n lines.push('');\n const risk = classifyRisk({ tokenChanges: changes });\n lines.push('## Risk tier', '', `- [x] ${risk.label}`, '');\n lines.push('## Changes', '');\n const header = ['Token', 'Tier', 'Change', 'Value (old -> new)', 'Contrast (before -> after)'];\n lines.push(`| ${header.join(' | ')} |`, `| ${header.map(() => '---').join(' | ')} |`);\n for (const c of changes) {\n const t = (c.target ?? c.current)!;\n const kind = changeKind(c);\n const name = kind === 'renamed' ? `${code(c.current!.path)} -> ${code(c.target!.path)}` : code(t.path);\n const extras: string[] = [];\n if (c.current && c.target && (c.current.description ?? '') !== (c.target.description ?? '')) extras.push('description');\n lines.push(\n `| ${name} | ${TIER_NAMES[t.tier]} | ${kind}${extras.length ? ` (+${extras.join(', ')})` : ''} | ${cell(valuesCell(head, proposed, c))} | ${contrastCell(c, validation.contrastBefore, validation.contrastAfter)} |`,\n );\n }\n lines.push('');\n\n const before = new Map(validation.contrastBefore.map((r) => [pairKey(r), r]));\n const impacted = validation.contrastAfter.filter((r) => before.get(pairKey(r))?.ratio !== r.ratio);\n if (impacted.length) {\n lines.push('### Contrast impact', '', '| Pair | Brand and theme | Before | After | Minimum | WCAG |', '| --- | --- | --- | --- | --- | --- |');\n for (const r of impacted) {\n const b = before.get(pairKey(r));\n lines.push(\n `| ${code(r.pair.foreground)} on ${code(r.pair.background)} | ${contextLabel(r)} | ${b?.ratio ?? 'n/a'} | ${r.ratio ?? 'n/a'} | ${r.pair.min} | ${r.level ?? 'n/a'} |`,\n );\n }\n lines.push('');\n }\n\n if (input.resolvedConflicts.length) {\n lines.push(`### Conflicts resolved in ${o.surface}`, '');\n for (const c of input.resolvedConflicts) lines.push(`- ${code(c.path)}: kept the ${c.choice === 'main' ? input.baseBranch : o.surface} version`);\n lines.push('');\n }\n if (input.upstreamPaths.length) {\n lines.push(`### Kept from ${input.baseBranch}`, '', `${input.upstreamPaths.length} token(s) changed on ${input.baseBranch} since the last pull; this PR leaves them as they are on ${input.baseBranch}.`, '');\n }\n if (validation.warnings.length) {\n lines.push('### Warnings (not introduced by this change)', '');\n for (const w of validation.warnings) lines.push(`- ${w.message}`);\n lines.push('');\n }\n\n lines.push('## Guardrail checklist', '');\n const ok = validation.blocking.length === 0;\n lines.push(`- [${ok ? 'x' : ' '}] Checked by Bridge: tiers alias in order (brand -> primitives, semantic colors -> palette roles, component -> semantic), no raw values where an alias is required`);\n lines.push(`- [${ok ? 'x' : ' '}] Checked by Bridge: no broken references or alias cycles, no \"ALL_SCOPES\" variables`);\n lines.push(`- [${ok ? 'x' : ' '}] Checked by Bridge: every pair in contrast.checks.json meets its minimum in every brand and theme`);\n lines.push('- [ ] CI green: token build, typecheck, Stylelint, Storybook build, changeset present');\n lines.push('- [ ] Design review: Storybook checked in light and dark, both brands, Accessibility panel clean');\n lines.push('- [ ] Tech review: names, semver bump, no consumer breakage');\n lines.push('- [ ] Design owner and tech owner approved (CODEOWNERS)');\n lines.push('');\n lines.push('## Authored by', '', `- [x] ${o.authoredBy}`, '');\n lines.push('<details><summary>Sync details</summary>', '');\n lines.push(`- Base (last pull): ${input.baseSha ? code(input.baseSha.slice(0, 7)) : 'none (first sync)'}`);\n lines.push(`- ${input.baseBranch} at export: ${code(input.headSha.slice(0, 7))}`);\n if (o.location) lines.push(`- ${o.surface}: ${o.location}`);\n lines.push('', '</details>', '');\n return lines.join('\\n');\n}\n\n/** Commit message: \"tokens: <title>\", one line per change, then `footer`. */\nexport function commitMessage(title: string, changes: AcceptedChange[], footer = 'Exported with Bridge.'): string {\n const body = changes.map((c) => `- ${changeKind(c)} ${(c.target ?? c.current)!.path}`).join('\\n');\n return `tokens: ${title.replace(/^tokens:\\s*/i, '')}\\n\\n${body}\\n\\n${footer}`;\n}\n","// Product branches and the library: a designer explores a feature with Claude on a product branch (an exploration\n// labeled `product: <key>`) built on the real components. What the branch invents outside the library (a colour\n// written by hand, a component restyled into a new tone, a component the library lacks) are \"missing pieces\". Each\n// one becomes a library branch linked to the product branch: a token change, a library exploration for a variant, or\n// a component request. In suggest mode (config `changes`), a token piece becomes a suggestion (an issue a developer\n// applies) and a variant a component request, so nothing needs write access to the code. Once the library ships it,\n// the product branch switches to the real version.\n//\n// Pure and browser safe: the pieces record kept in the product branch body, the \"needed by\" mark on the library side,\n// the status and preview sentences Studio, the CLI and the MCP server all show, and what each piece opens. Finding the\n// pieces needs the adoption audit (audit/missing-pieces.ts, Node or a bundler with TypeScript); the GitHub writes are\n// in prod-branch-github.ts.\n\nimport type { Exploration } from './explorations';\nimport { slugify } from './pr-composer';\nimport type { ChangesMode } from './config';\nimport type { ComponentChangeRequest } from './requests';\nimport type { SuggestionStatus } from './suggestions';\nimport type { TokenEdit } from './token-edits';\n\n/** What the library lacks: a token value, a variant of an existing component, or a component. */\nexport type PieceKind = 'token' | 'variant' | 'component';\n\n/** What a variant changes on its component, in designer words. */\nexport type PieceAspect = 'tone' | 'shape' | 'size' | 'style';\n\nexport interface PieceValue {\n /** Audit category: color, radius, spacing... */\n category: string;\n /** CSS property, when known: background-color, border-radius. */\n property?: string | undefined;\n /** As written: \"#c2410c\", \"10px\". */\n value: string;\n}\n\nexport interface PieceNearest {\n /** Token path of the closest library value: color.feedback.danger.bg. */\n token: string;\n cssVar: string;\n /** Its value, as the audit resolved it. */\n value: string;\n /** How close: high means it looks a lot like it. */\n level: 'exact' | 'high' | 'medium' | 'low';\n /** The word people use for it: \"danger\" for color.feedback.danger.bg, \"control\" for radius.control. */\n label: string;\n}\n\nexport interface MissingPiece {\n /** Stable id inside one product branch: \"badge-overdue-tone\", \"color-c2410c\". */\n id: string;\n kind: PieceKind;\n /** Designer title: \"Badge: overdue tone\", \"New color #C2410C\", \"New component: Timeline\". */\n title: string;\n /** One plain sentence: what the branch did and what the library has today. */\n summary: string;\n /** The name the branch gives it (\"overdue\"), from a class name, the element's text or the component name. */\n name: string;\n /** The library component it extends (variant) or the proposed component name (component). */\n component?: string | undefined;\n aspect?: PieceAspect | undefined;\n values: PieceValue[];\n nearest?: PieceNearest | undefined;\n /** Where the branch writes it, first places only. */\n where: { file: string; line: number }[];\n /** Token pieces: the token the library branch would add (one value, every file the closest token lives in). */\n token?: { path: string; type: string; value: string; files: string[] } | undefined;\n}\n\n/** Where the library side of a piece lives. A suggestion is an issue holding the exact token change (suggestions.ts). */\nexport type LibraryLinkKind = 'token-change' | 'exploration' | 'request' | 'suggestion';\n\nexport interface LibraryLink {\n /** The piece id. */\n piece: string;\n kind: LibraryLinkKind;\n /** Pull request number (token change, exploration) or issue number (request, suggestion). */\n number: number;\n url: string;\n title: string;\n /** Head branch of a pull request. */\n branch?: string | undefined;\n /** GitHub login of who opened it, and the AI agent behind it (\"claude\") when one did. */\n openedBy?: string | undefined;\n agent?: string | undefined;\n /** ISO date. */\n at: string;\n}\n\n/** What the product branch body keeps: the last check and the library branches opened for its pieces. */\nexport interface PiecesRecord {\n /** ISO date of the last check. */\n checkedAt: string;\n /** Head commit the check read. */\n headSha?: string | undefined;\n pieces: MissingPiece[];\n links: LibraryLink[];\n /** Values and elements the library already has (a token or a component to use instead): fixes, not pieces. */\n fixes?: number | undefined;\n}\n\nconst PIECES_MARK = 'bridge-pieces';\nconst NEEDED_MARK = 'bridge-needed-by';\nconst SECTION = '### Missing from the library';\n\n/** Every library branch opened for a product branch carries this label, so lists can find them without the body. */\nexport const NEEDED_BY_LABEL = 'needed-by-product';\n\nconst hiddenJson = (mark: string, data: unknown) => `<!-- ${mark} ${JSON.stringify(data).replace(/-->/g, '--\\\\u003e')} -->`;\nconst readHidden = <T>(mark: string, body: string | null | undefined): T | undefined => {\n if (!body) return undefined;\n const m = new RegExp(`<!-- ${mark} (\\\\{[\\\\s\\\\S]*?\\\\}) -->`).exec(body);\n if (!m) return undefined;\n try {\n return JSON.parse(m[1]!) as T;\n } catch {\n return undefined;\n }\n};\n\nconst KIND_WORD: Record<LibraryLinkKind, string> = { 'token-change': 'token change', exploration: 'library exploration', request: 'component request', suggestion: 'suggested token change' };\n\n/** The record in a product branch body, or undefined when the branch was never checked. */\nexport function parsePiecesRecord(body: string | null | undefined): PiecesRecord | undefined {\n const r = readHidden<PiecesRecord>(PIECES_MARK, body);\n if (!r || !Array.isArray(r.pieces) || !Array.isArray(r.links) || typeof r.checkedAt !== 'string') return undefined;\n return r;\n}\n\n/** The section people read on GitHub, then the hidden record tools read. */\nexport function piecesSection(r: PiecesRecord): string {\n const link = (p: MissingPiece) => r.links.find((l) => l.piece === p.id);\n const lines = r.pieces.length\n ? r.pieces.map((p) => {\n const l = link(p);\n return `- **${p.title}**: ${p.summary}${l ? ` ${cap(KIND_WORD[l.kind])}: #${l.number}.` : ' No library branch yet.'}`;\n })\n : ['- Nothing: every value and component comes from the library.'];\n return [SECTION, '', `Checked ${r.checkedAt.slice(0, 10)}${r.headSha ? ` on ${r.headSha.slice(0, 7)}` : ''} by Bridge.`, '', ...lines, '', hiddenJson(PIECES_MARK, r)].join('\\n');\n}\n\n/** The body with the pieces section replaced, or added at the end. */\nexport function withPiecesRecord(body: string | null | undefined, r: PiecesRecord): string {\n const b = (body ?? '').trimEnd();\n const start = b.indexOf(SECTION);\n const markAt = b.indexOf(`<!-- ${PIECES_MARK} `);\n if (start >= 0 && markAt > start) {\n const end = b.indexOf('-->', markAt);\n return `${b.slice(0, start)}${piecesSection(r)}${end >= 0 ? b.slice(end + 3) : ''}`.trimEnd();\n }\n return `${b}${b ? '\\n\\n' : ''}${piecesSection(r)}`;\n}\n\n/**\n * A new check merged with the previous record: links stay with their piece (same id), and links of pieces the branch\n * no longer has stay too, so a library branch is never forgotten.\n */\nexport function mergePiecesRecord(prev: PiecesRecord | undefined, next: Omit<PiecesRecord, 'links'> & { links?: LibraryLink[] | undefined }): PiecesRecord {\n const links = [...(prev?.links ?? [])];\n for (const l of next.links ?? []) {\n const at = links.findIndex((x) => x.piece === l.piece);\n if (at >= 0) links[at] = l;\n else links.push(l);\n }\n return { ...next, links };\n}\n\n/** The record with one more link (replacing the piece's earlier one). */\nexport function withLink(r: PiecesRecord, l: LibraryLink): PiecesRecord {\n return { ...r, links: [...r.links.filter((x) => x.piece !== l.piece), l] };\n}\n\n// ---------------------------------------------------------------------------------------------------------------\n// The library side: \"needed by\"\n\nexport interface NeededBy {\n /** The product branch (pull request number), its title and branch. */\n pr: number;\n title: string;\n branch: string;\n url: string;\n /** Product key and name: \"admin\", \"Admin demo\". */\n product: string;\n productName: string;\n /** Who started the product branch (GitHub login). */\n author?: string | undefined;\n /** The piece it answers. */\n piece: string;\n pieceTitle: string;\n /** The closest thing the library has today, so a reviewer can suggest it instead: \"danger\". */\n nearest?: string | undefined;\n nearestToken?: string | undefined;\n}\n\n/** \"Needed by\" for a library branch body: one line people read, one hidden block tools read. */\nexport function neededBySection(n: NeededBy): string {\n const who = n.author ? ` for @${n.author}` : '';\n const near = n.nearest ? ` The closest the library has today is ${n.nearest}${n.nearestToken ? ` (\\`${n.nearestToken}\\`)` : ''}.` : '';\n return [`**Needed by:** [${n.title}](${n.url}) (#${n.pr}) in ${n.productName}${who}.${near}`, '', hiddenJson(NEEDED_MARK, n)].join('\\n');\n}\n\nexport function parseNeededBy(body: string | null | undefined): NeededBy | undefined {\n const n = readHidden<NeededBy>(NEEDED_MARK, body);\n return n && typeof n.pr === 'number' && typeof n.title === 'string' && typeof n.piece === 'string' ? n : undefined;\n}\n\n/** The body with the \"Needed by\" section first (replacing an earlier one). */\nexport function withNeededBy(body: string | null | undefined, n: NeededBy): string {\n let b = (body ?? '').trim();\n const at = b.indexOf('**Needed by:**');\n const mark = b.indexOf(`<!-- ${NEEDED_MARK} `);\n if (at >= 0 && mark > at) {\n const end = b.indexOf('-->', mark);\n b = `${b.slice(0, at)}${b.slice(end + 3)}`.trim();\n }\n return `${neededBySection(n)}${b ? `\\n\\n${b}` : ''}`;\n}\n\n// ---------------------------------------------------------------------------------------------------------------\n// What each piece opens in the library\n\nexport interface ProductBranchRef {\n pr: number;\n title: string;\n branch: string;\n url: string;\n productKey: string;\n productName: string;\n author?: string | undefined;\n}\n\nexport type LibraryBranchPlan =\n | { kind: 'token-change'; title: string; summary: string; edits: TokenEdit[]; neededBy: NeededBy }\n | { kind: 'exploration'; title: string; exploration: Exploration; neededBy: NeededBy; brief: string }\n | { kind: 'request'; title: string; request: ComponentChangeRequest; neededBy: NeededBy };\n\nconst cap = (s: string) => (s ? s.charAt(0).toUpperCase() + s.slice(1) : s);\n\n/** \"Admin demo needs it for \"Billing screen with overdue invoices\"\". */\nconst forLine = (b: ProductBranchRef) => `${b.productName} needs it for \"${b.title.replace(/\"/g, \"'\")}\" (#${b.pr})`;\n\n/**\n * What a piece opens in the library, honestly labelled by what Bridge can write:\n * - a token piece: a token change (the new token, a draft for review, the usual gate); in suggest mode the same\n * change is filed as a suggestion;\n * - a variant: a library exploration (a branch and a draft for the component work, with a brief for Claude); in\n * suggest mode a component request, since an exploration is a branch;\n * - a new component: a component request (an issue): it needs design work before code.\n */\nexport function libraryBranchPlan(piece: MissingPiece, branch: ProductBranchRef, opts: { source?: ComponentChangeRequest['source']; requestedBy?: string | undefined; mode?: ChangesMode | undefined } = {}): LibraryBranchPlan {\n const neededBy: NeededBy = {\n pr: branch.pr,\n title: branch.title,\n branch: branch.branch,\n url: branch.url,\n product: branch.productKey,\n productName: branch.productName,\n ...(branch.author ? { author: branch.author } : {}),\n piece: piece.id,\n pieceTitle: piece.title,\n ...(piece.nearest ? { nearest: piece.nearest.label, nearestToken: piece.nearest.token } : {}),\n };\n const near = piece.nearest ? ` The closest the library has today is ${piece.nearest.label} (${piece.nearest.token}, ${piece.nearest.value}).` : '';\n if (piece.kind === 'token' && piece.token) {\n const t = piece.token;\n const files = t.files.length ? t.files : [undefined];\n const edits: TokenEdit[] = files.map((file) => ({\n op: 'add',\n path: t.path,\n type: t.type,\n value: t.value,\n description: `${cap(piece.name)}: ${forLine(branch)}.${files.length > 1 ? ' Same value in every theme: review it in each.' : ''}`,\n ...(file ? { file } : {}),\n }));\n return { kind: 'token-change', title: `Add ${t.path}`, summary: `${forLine(branch)}: ${piece.summary}${near}`, edits, neededBy };\n }\n if (piece.kind === 'variant' && piece.component && opts.mode === 'suggest') {\n const request: ComponentChangeRequest = {\n component: piece.component,\n kind: 'new-variant',\n title: piece.title,\n summary: `${forLine(branch)}: ${piece.summary}${near}`,\n changes: piece.values.slice(0, 6).map((v) => ({ field: v.property ?? v.category, after: v.value })),\n source: opts.source ?? 'mcp',\n ...(opts.requestedBy ? { requestedBy: opts.requestedBy } : {}),\n };\n return { kind: 'request', title: piece.title, request, neededBy };\n }\n if (piece.kind === 'variant' && piece.component) {\n const values = piece.values.map((v) => `${v.property ?? v.category} ${v.value}`).join(', ');\n const exploration: Exploration = {\n name: piece.title,\n purpose: `${forLine(branch)}: ${/^[aeiou]/i.test(piece.name) ? 'an' : 'a'} ${piece.name} ${piece.aspect ?? 'style'} on ${piece.component} (${values}).${near}`,\n useCase: 'terminal',\n experimental: [piece.title],\n source: opts.source === 'figma' ? 'figma' : (opts.source ?? 'mcp'),\n };\n const brief = [\n `Add the ${piece.name} ${piece.aspect ?? 'style'} to ${piece.component} in the library, on this exploration branch.`,\n `The product branch writes it by hand: ${values}. Express it with tokens (a component or semantic token per value), add it to the component's props, docs and examples, and keep every existing ${piece.component} unchanged.`,\n piece.nearest ? `Say in the pull request why ${piece.nearest.label} is not enough, or recommend it instead.` : '',\n ]\n .filter(Boolean)\n .join(' ');\n return { kind: 'exploration', title: piece.title, exploration, neededBy, brief };\n }\n const name = piece.component ?? cap(piece.name);\n const request: ComponentChangeRequest = {\n component: name,\n kind: 'new-component',\n title: `Add ${name}`,\n summary: `${forLine(branch)}: ${piece.summary}${near}`,\n changes: piece.values.slice(0, 6).map((v) => ({ field: v.property ?? v.category, after: v.value })),\n source: opts.source ?? 'mcp',\n ...(opts.requestedBy ? { requestedBy: opts.requestedBy } : {}),\n };\n return { kind: 'request', title: `New component: ${name}`, request, neededBy };\n}\n\n// ---------------------------------------------------------------------------------------------------------------\n// Where a linked library branch stands\n\nexport type LinkStatusKey = 'draft' | 'in-review' | 'changes' | 'approved' | 'shipped' | 'closed' | 'exploring' | 'requested' | 'in-progress' | 'done' | 'declined' | 'outdated';\n\nexport interface LinkStatus {\n key: LinkStatusKey;\n /** \"In review\", \"Shipped\". */\n label: string;\n /** Logins asked to review (pull requests), or assignees (requests). */\n people: string[];\n /** \"In review · @dana reviews\". */\n line: string;\n}\n\nconst STATUS_LABEL: Record<LinkStatusKey, string> = {\n draft: 'Draft',\n 'in-review': 'In review',\n changes: 'Changes requested',\n approved: 'Approved',\n shipped: 'Shipped',\n closed: 'Closed',\n exploring: 'Being built',\n requested: 'Requested',\n 'in-progress': 'In progress',\n done: 'Done',\n declined: 'Declined',\n outdated: 'Outdated',\n};\n\n/** Badge tone of a status: status colours only for status. */\nexport const LINK_STATUS_TONE: Record<LinkStatusKey, 'neutral' | 'info' | 'warning' | 'success' | 'danger'> = {\n draft: 'neutral',\n 'in-review': 'info',\n changes: 'warning',\n approved: 'success',\n shipped: 'success',\n closed: 'neutral',\n exploring: 'neutral',\n requested: 'neutral',\n 'in-progress': 'info',\n done: 'success',\n declined: 'neutral',\n outdated: 'warning',\n};\n\nconst names = (people: string[]) => (people.length <= 2 ? people.map((p) => `@${p}`).join(' and ') : `@${people[0]} and ${people.length - 1} more`);\n\n/** The link status of each suggestion status: review states read like a pull request's, applied like shipped. */\nconst SUGGESTION_LINK_STATUS: Record<SuggestionStatus, LinkStatusKey> = {\n 'needs-review': 'in-review',\n 'changes-requested': 'changes',\n approved: 'approved',\n applying: 'in-progress',\n applied: 'shipped',\n declined: 'declined',\n outdated: 'outdated',\n};\n\n/**\n * Where a library branch stands, from what GitHub says: a pull request (state, draft, labels, requested reviewers,\n * latest review per person), a request issue (state, reason, assignees, whether a pull request implements it) or a\n * suggestion (its status, suggestionStatus in suggestions.ts, and who it is assigned to).\n */\nexport function linkStatus(\n x:\n | { kind: 'token-change' | 'exploration'; state: string; draft: boolean; labels?: readonly string[] | undefined; requestedReviewers?: readonly string[] | undefined; reviews?: readonly { user?: string | undefined; state: string }[] | undefined }\n | { kind: 'request'; state: 'open' | 'closed'; stateReason?: string | null | undefined; assignees?: readonly string[] | undefined; implemented?: boolean | undefined }\n | { kind: 'suggestion'; status: SuggestionStatus; assignees?: readonly string[] | undefined },\n): LinkStatus {\n const make = (key: LinkStatusKey, people: string[] = [], verb = 'reviews'): LinkStatus => {\n const label = STATUS_LABEL[key];\n const tail = people.length ? ` · ${names(people)} ${people.length === 1 ? verb : verb.replace(/s$/, '')}` : '';\n return { key, label, people, line: `${label}${tail}` };\n };\n if (x.kind === 'suggestion') {\n const key = SUGGESTION_LINK_STATUS[x.status];\n return make(key, key === 'in-progress' ? [...(x.assignees ?? [])] : [], 'builds');\n }\n if (x.kind === 'request') {\n if (x.state === 'closed') return make(x.stateReason === 'not_planned' ? 'declined' : 'done');\n return x.implemented ? make('in-progress', [...(x.assignees ?? [])], 'builds') : make('requested', [...(x.assignees ?? [])], 'builds');\n }\n if (x.state === 'merged') return make('shipped');\n if (x.state !== 'open') return make('closed');\n if ((x.labels ?? []).includes('exploration')) return make('exploring');\n if (x.draft) return make('draft');\n const latest = new Map<string, string>();\n for (const r of x.reviews ?? []) if (r.user && r.state !== 'COMMENTED') latest.set(r.user, r.state);\n const states = [...latest.values()];\n if (states.includes('CHANGES_REQUESTED')) return make('changes', [...latest].filter(([, s]) => s === 'CHANGES_REQUESTED').map(([u]) => u), 'asks');\n const waiting = [...(x.requestedReviewers ?? [])];\n if (states.includes('APPROVED') && !waiting.length) return make('approved');\n return make('in-review', waiting);\n}\n\n// ---------------------------------------------------------------------------------------------------------------\n// The preview: the product branch uses the library branch before it ships\n\nexport type LibraryPreviewKey = 'nothing-yet' | 'not-used' | 'preview' | 'outdated' | 'published' | 'switched' | 'declined';\n\nexport interface LibraryPreviewState {\n key: LibraryPreviewKey;\n /** One sentence in designer words. */\n sentence: string;\n /** The one action that moves it on, when there is one. */\n action: { kind: 'use-preview' | 'refresh-preview' | 'switch'; label: string } | null;\n}\n\n/**\n * What the product branch shows of a library branch, and what to do next:\n * - while the library branch is open, the product branch carries its commits (Bridge merges the library branch in),\n * so the product preview shows the real library change; new library commits make it outdated;\n * - once the library branch ships, \"Switch to the published version\" brings main into the product branch: its own\n * diff no longer carries the library change, the shipped one is used;\n * - a request has nothing to preview until someone builds it; a closed library branch says so.\n *\n * `missing` is how many library commits the product branch lacks, `total` how many the library branch has on top of\n * main (null when unknown). `behindMain` is how far the product branch is behind main.\n */\nexport function libraryPreviewState(x: {\n kind: LibraryLinkKind;\n lifecycle: 'open' | 'merged' | 'closed';\n /** The library branch changes something beyond its exploration note. */\n hasChanges: boolean;\n missing: number | null;\n total: number | null;\n behindMain: number | null;\n nearest?: string | undefined;\n}): LibraryPreviewState {\n if (x.kind === 'suggestion') {\n if (x.lifecycle === 'closed') return { key: 'declined', sentence: `The library declined this suggestion.${x.nearest ? ` Ask Claude to use ${x.nearest} instead.` : ''}`, action: null };\n if (x.lifecycle === 'merged') return x.behindMain === 0 ? { key: 'switched', sentence: 'Your branch uses the published version.', action: null } : { key: 'published', sentence: 'The library applied the suggestion. Switch your branch to the published version.', action: { kind: 'switch', label: 'Switch to the published version' } };\n return { key: 'nothing-yet', sentence: 'Nothing to preview yet: owners review the suggestion, then a developer applies it. Your branch keeps its own value until then.', action: null };\n }\n if (x.kind === 'request') {\n if (x.lifecycle === 'closed') return { key: 'declined', sentence: `The library declined this request.${x.nearest ? ` Ask Claude to use ${x.nearest} instead.` : ''}`, action: null };\n if (x.lifecycle === 'merged') return x.behindMain === 0 ? { key: 'switched', sentence: 'Your branch uses the published version.', action: null } : { key: 'published', sentence: 'The library built it. Switch your branch to the published version, then ask Claude to use it.', action: { kind: 'switch', label: 'Switch to the published version' } };\n return { key: 'nothing-yet', sentence: 'Nothing to preview yet: the library builds it first. Your branch keeps its own version until then.', action: null };\n }\n if (x.lifecycle === 'merged') {\n if (x.behindMain === 0) return { key: 'switched', sentence: 'Your branch uses the published version.', action: null };\n return { key: 'published', sentence: 'The library published it. Switch your branch to the published version.', action: { kind: 'switch', label: 'Switch to the published version' } };\n }\n if (x.lifecycle === 'closed') return { key: 'declined', sentence: `The library closed it without shipping.${x.nearest ? ` Ask Claude to use ${x.nearest} instead.` : ''}`, action: null };\n if (!x.hasChanges) return { key: 'nothing-yet', sentence: 'The library branch has no change yet. Claude adds it there, then your branch can use its preview.', action: null };\n if (x.missing === 0) return { key: 'preview', sentence: 'Your branch uses a preview of the library branch. When the library publishes it, switch to the real version here in one click.', action: null };\n if (x.missing !== null && x.total !== null && x.missing < x.total) return { key: 'outdated', sentence: 'The library branch changed since your branch took its preview.', action: { kind: 'refresh-preview', label: 'Get the latest preview' } };\n return { key: 'not-used', sentence: 'Your branch does not use the library branch yet.', action: { kind: 'use-preview', label: 'Use its preview in my branch' } };\n}\n\n// ---------------------------------------------------------------------------------------------------------------\n// The summary sentence of a product branch\n\nconst nPieces = (n: number) => `${n} ${n === 1 ? 'piece' : 'pieces'}`;\n\n/**\n * The one sentence first on a product branch: \"Built with the library. 1 piece was missing, and Claude AI opened a\n * library branch for it.\" `who` names who opened the library branches when they are all from the same one.\n */\nexport function productBranchSentence(r: PiecesRecord | undefined, opts: { agentName?: string | undefined; viewer?: string | null | undefined } = {}): { lead: string; strong: string; rest: string } {\n if (!r) return { lead: 'Not checked against the library yet.', strong: '', rest: ' Ask Claude what is missing from the library.' };\n const n = r.pieces.length;\n if (!n) return { lead: 'Built with the library.', strong: ' Nothing is missing', rest: ': every value and component comes from it.' };\n const linked = r.pieces.filter((p) => r.links.some((l) => l.piece === p.id));\n const openers = [...new Set(linked.map((p) => r.links.find((l) => l.piece === p.id)!).map((l) => (l.agent ? (opts.agentName ?? 'Claude AI') : l.openedBy && l.openedBy === opts.viewer ? 'you' : l.openedBy ? `@${l.openedBy}` : 'someone')))];\n const by = openers.length === 1 ? openers[0]! : 'your team';\n const was = n === 1 ? 'was' : 'were';\n if (linked.length === n) {\n const what = n === 1 ? 'a library branch for it' : 'library branches for them';\n return { lead: 'Built with the library. ', strong: `${nPieces(n)} ${was} missing`, rest: `, and ${by} opened ${what}.` };\n }\n if (!linked.length) return { lead: 'Built with the library. ', strong: `${nPieces(n)} ${n === 1 ? 'is' : 'are'} missing`, rest: n === 1 ? ': open a library branch for it.' : ': open a library branch for each.' };\n return { lead: 'Built with the library. ', strong: `${nPieces(n)} ${was} missing`, rest: `: ${linked.length} ${linked.length === 1 ? 'has' : 'have'} a library branch, ${n - linked.length} still ${n - linked.length === 1 ? 'needs' : 'need'} one.` };\n}\n\n/** \"Why it exists\" on the library review: \"Ann needs it for <title> in Admin demo.\" */\nexport function whyItExists(n: NeededBy, opts: { names?: Record<string, string> } = {}): { who: string; title: string; product: string } {\n const who = n.author ? (opts.names?.[n.author] ?? `@${n.author}`) : 'A product team';\n return { who, title: n.title, product: n.productName };\n}\n\n/** The reviewer's question when the closest library value looks a lot like the piece. */\nexport function nearestQuestion(n: NeededBy, opts: { names?: Record<string, string> } = {}): string | null {\n if (!n.nearest) return null;\n const who = n.author ? (opts.names?.[n.author] ?? `@${n.author}`) : 'the product team';\n return `It looks a lot like \"${n.nearest}\". Is a new one worth it, or should ${who} use ${n.nearest}?`;\n}\n\n/** The review comment of \"Suggest <nearest>\": request changes with the library value to use instead. */\nexport function suggestNearestComment(n: NeededBy): string | null {\n if (!n.nearest) return null;\n return `Let's not add it to the library: ${n.nearest}${n.nearestToken ? ` (\\`${n.nearestToken}\\`)` : ''} covers it. Use it on ${n.title} (#${n.pr}) instead, then close this branch.`;\n}\n\n// ---------------------------------------------------------------------------------------------------------------\n// Naming helpers shared with the audit side\n\n/** A piece id from its kind and names: \"badge-overdue-tone\". */\nexport function pieceId(parts: (string | undefined)[]): string {\n return slugify(parts.filter(Boolean).join(' '), 48);\n}\n\nconst TONE_WORDS = ['neutral', 'success', 'warning', 'danger', 'info', 'error', 'critical', 'accent', 'brand', 'primary', 'secondary'];\n\n/** The word people use for a token: the tone in its path, else its last meaningful segment. */\nexport function tokenLabel(path: string): string {\n const parts = path.split('.');\n const tone = parts.find((p) => TONE_WORDS.includes(p));\n if (tone) return tone;\n const meaningful = parts.filter((p) => !/^(color|bg|fg|text|border|default|base|value|\\d+)$/.test(p));\n return meaningful[meaningful.length - 1] ?? parts[parts.length - 1] ?? path;\n}\n\n/** A new token beside the closest one, named after the piece: color.feedback.danger.bg + \"overdue\" -> color.feedback.overdue.bg when the closest has a tone, else a sibling. */\nexport function proposedTokenPath(nearest: string | undefined, name: string, category: string): string {\n const slug = slugify(name, 32);\n if (!nearest) return `${category === 'color' ? 'color' : category}.${slug}`;\n const parts = nearest.split('.');\n const toneAt = parts.findIndex((p) => TONE_WORDS.includes(p));\n if (toneAt > 0) return [...parts.slice(0, toneAt), slug, ...parts.slice(toneAt + 1)].join('.');\n return [...parts.slice(0, -1), slug].join('.');\n}\n"],"names":["targetOf","isObj","norm","names","list","ordered","body","pad","rank","cap","request","people"],"mappings":"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"}