@brandlab-digital/conformance 1.3.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.d.ts CHANGED
@@ -6,6 +6,8 @@ interface CliOptions {
6
6
  mode: BrandlabConformanceMode;
7
7
  json: boolean;
8
8
  help: boolean;
9
+ engineering: boolean;
10
+ packedReleaseReceipt?: string;
9
11
  }
10
12
  interface CliIo {
11
13
  stdout: (value: string) => void;
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAIA,OAAO,EAGL,KAAK,uBAAuB,EAE7B,MAAM,cAAc,CAAC;AAEtB,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,IAAI,EAAE,uBAAuB,CAAC;IAC9B,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;CACf;AAED,UAAU,KAAK;IACb,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC;AAmBD,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,UAAU,CA2BhF;AAED,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,EAAE,GAAE,KAGH,GACA,MAAM,CAkBR;AAmDD,wBAAgB,kCAAkC,CAChD,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GAAG,SAAS,GAC3B,OAAO,CAOT"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAKA,OAAO,EAGL,KAAK,uBAAuB,EAE7B,MAAM,cAAc,CAAC;AAEtB,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,IAAI,EAAE,uBAAuB,CAAC;IAC9B,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IACd,WAAW,EAAE,OAAO,CAAC;IACrB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,UAAU,KAAK;IACb,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC;AAsBD,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,UAAU,CA8BhF;AAED,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,EAAE,GAAE,KAGH,GACA,MAAM,CAqBR;AAoDD,wBAAgB,kCAAkC,CAChD,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GAAG,SAAS,GAC3B,OAAO,CAOT"}
package/dist/cli.js CHANGED
@@ -2,6 +2,7 @@
2
2
  import { realpathSync } from "node:fs";
3
3
  import { resolve } from "node:path";
4
4
  import { fileURLToPath } from "node:url";
5
+ import { checkEngineeringStructure } from "./engineering.js";
5
6
  import { evaluateBrandlabProject, shouldFailBrandlabConformance, } from "./project.js";
6
7
  const HELP = `Brandlab verification
7
8
 
@@ -10,7 +11,8 @@ Runs the current objective verification checks for one project.
10
11
  Usage:
11
12
  brandlab-verify [--root <path>]
12
13
  [--installed-release <version|unadopted>]
13
- [--mode <local|ci|preflight>] [--json]
14
+ [--mode <local|ci|preflight>] [--engineering] [--json]
15
+ [--packed-release <receipt.json> (preflight only)]
14
16
 
15
17
  Exit status:
16
18
  local/ci fail only for objective current-release blockers
@@ -18,6 +20,8 @@ Exit status:
18
20
 
19
21
  Static verification reports tests, builds, browsers and deployments as not run
20
22
  until real evidence is supplied.
23
+ --engineering adds the complete-migration structural checks. It does not certify
24
+ manual review, unused-code analysis, runtime journeys or provider cutover.
21
25
  `;
22
26
  export function parseBrandlabConformanceArgs(argv) {
23
27
  const parsed = {
@@ -25,6 +29,7 @@ export function parseBrandlabConformanceArgs(argv) {
25
29
  mode: "local",
26
30
  json: false,
27
31
  help: false,
32
+ engineering: false,
28
33
  };
29
34
  for (let index = 0; index < argv.length; index += 1) {
30
35
  const argument = argv[index];
@@ -32,6 +37,10 @@ export function parseBrandlabConformanceArgs(argv) {
32
37
  parsed.help = true;
33
38
  else if (argument === "--json")
34
39
  parsed.json = true;
40
+ else if (argument === "--engineering")
41
+ parsed.engineering = true;
42
+ else if (argument === "--packed-release")
43
+ parsed.packedReleaseReceipt = resolve(requireValue(argv, ++index, "--packed-release"));
35
44
  else if (argument === "--root") {
36
45
  parsed.root = resolve(requireValue(argv, ++index, "--root"));
37
46
  }
@@ -66,9 +75,12 @@ export function runBrandlabConformanceCli(argv, io = {
66
75
  root: options.root,
67
76
  installedRelease: options.installedRelease,
68
77
  mode: options.mode,
78
+ packedReleaseReceipt: options.packedReleaseReceipt,
69
79
  });
70
- io.stdout(options.json ? `${JSON.stringify(result, null, 2)}\n` : formatResult(result));
71
- return shouldFailBrandlabConformance(result) ? 1 : 0;
80
+ const engineering = options.engineering ? checkEngineeringStructure(options.root) : undefined;
81
+ io.stdout(options.json ? `${JSON.stringify({ ...result, ...(engineering ? { engineering } : {}) }, null, 2)}\n`
82
+ : formatResult(result) + (engineering ? `Engineering structure: ${engineering.status}\n${engineering.coverage}\n${engineering.findings.map(f => `[${f.rule}] ${f.path}: ${f.message}\n`).join('')}` : ''));
83
+ return shouldFailBrandlabConformance(result) || engineering?.status === 'blocked' ? 1 : 0;
72
84
  }
73
85
  catch (error) {
74
86
  io.stderr(`${error instanceof Error ? error.message : String(error)}\n\n${HELP}`);
@@ -85,6 +97,7 @@ function formatResult(result) {
85
97
  const lines = [
86
98
  "Brandlab verification",
87
99
  `installed: ${result.installedRelease ?? "unadopted"}`,
100
+ ...(result.packedPreflight ? ['provenance: verified local packed preflight; registry publication and deployment not established'] : []),
88
101
  `policy: ${result.verification.policyVersion}`,
89
102
  `static checks: ${staticStatus}`,
90
103
  `external evidence: ${externalChecks.length > 0
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EACL,uBAAuB,EACvB,6BAA6B,GAG9B,MAAM,cAAc,CAAC;AAetB,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;CAeZ,CAAC;AAEF,MAAM,UAAU,4BAA4B,CAAC,IAAuB;IAClE,MAAM,MAAM,GAAe;QACzB,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE;QACnB,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,KAAK;QACX,IAAI,EAAE,KAAK;KACZ,CAAC;IACF,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7B,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI;YAAE,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;aAC9D,IAAI,QAAQ,KAAK,QAAQ;YAAE,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;aAC9C,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC/B,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC/D,CAAC;aAAM,IAAI,QAAQ,KAAK,qBAAqB,EAAE,CAAC;YAC9C,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,qBAAqB,CAAC,CAAC;YACjE,MAAM,CAAC,gBAAgB,GAAG,KAAK,KAAK,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;QACjE,CAAC;aAAM,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACjC,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;YACpD,IAAI,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBAClD,MAAM,IAAI,KAAK,CAAC,kBAAkB,KAAK,GAAG,CAAC,CAAC;YAC9C,CAAC;YACD,MAAM,CAAC,IAAI,GAAG,KAAgC,CAAC;QACjD,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,oBAAoB,QAAQ,GAAG,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,IAAuB,EACvB,KAAY;IACV,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;IAC9C,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;CAC/C;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,4BAA4B,CAAC,IAAI,CAAC,CAAC;QACnD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAChB,OAAO,CAAC,CAAC;QACX,CAAC;QACD,MAAM,MAAM,GAAG,uBAAuB,CAAC;YACrC,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;YAC1C,IAAI,EAAE,OAAO,CAAC,IAAI;SACnB,CAAC,CAAC;QACH,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;QACxF,OAAO,6BAA6B,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,EAAE,CAAC,MAAM,CAAC,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QAClF,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,MAAiC;IACrD,MAAM,cAAc,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CACtD,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,CACtC,CAAC;IACF,MAAM,YAAY,GAChB,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,QAAQ,GAAG,CAAC;QACtC,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,QAAQ,GAAG,CAAC;YACxC,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,MAAM,CAAC;IACf,MAAM,KAAK,GAAG;QACZ,uBAAuB;QACvB,cAAc,MAAM,CAAC,gBAAgB,IAAI,WAAW,EAAE;QACtD,WAAW,MAAM,CAAC,YAAY,CAAC,aAAa,EAAE;QAC9C,kBAAkB,YAAY,EAAE;QAChC,sBACE,cAAc,CAAC,MAAM,GAAG,CAAC;YACvB,CAAC,CAAC,YAAY,cAAc,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;YACtE,CAAC,CAAC,UACN,EAAE;QACF,aAAa,aAAa,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE;KAC1D,CAAC;IACF,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;QAClD,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM;YAAE,SAAS;QACvC,KAAK,CAAC,IAAI,CACR,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,KAAK,KAAK,MAAM,CAAC,QAAQ,gBAAgB,MAAM,CAAC,QAAQ,aAAa,CACnG,CAAC;IACJ,CAAC;IACD,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,mBAAmB,EAAE,CAAC;QACjD,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI;YAC3B,CAAC,CAAC,KAAK,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG;YAC/D,CAAC,CAAC,EAAE,CAAC;QACP,KAAK,CAAC,IAAI,CACR,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,MAAM,GAAG,QAAQ,KAAK,OAAO,CAAC,MAAM,EAAE,CAC5F,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACjC,CAAC;AAED,SAAS,aAAa,CAAC,OAA6C;IAClE,OAAO,GAAG,OAAO,CAAC,MAAM,KAAK,OAAO,CAAC,QAAQ,gBAAgB,OAAO,CAAC,QAAQ,gBAAgB,OAAO,CAAC,IAAI,OAAO,CAAC;AACnH,CAAC;AAED,SAAS,YAAY,CAAC,IAAuB,EAAE,KAAa,EAAE,QAAgB;IAC5E,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1B,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,QAAQ,oBAAoB,CAAC,CAAC;IACvF,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,kCAAkC,CAChD,SAAiB,EACjB,QAA4B;IAE5B,IAAI,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5B,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,KAAK,YAAY,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IACpF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,IAAI,kCAAkC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACzE,OAAO,CAAC,QAAQ,GAAG,yBAAyB,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACtE,CAAC","sourcesContent":["#!/usr/bin/env node\nimport { realpathSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport {\n evaluateBrandlabProject,\n shouldFailBrandlabConformance,\n type BrandlabConformanceMode,\n type BrandlabConformanceResult,\n} from \"./project.js\";\n\ninterface CliOptions {\n root: string;\n installedRelease?: string | null;\n mode: BrandlabConformanceMode;\n json: boolean;\n help: boolean;\n}\n\ninterface CliIo {\n stdout: (value: string) => void;\n stderr: (value: string) => void;\n}\n\nconst HELP = `Brandlab verification\n\nRuns the current objective verification checks for one project.\n\nUsage:\n brandlab-verify [--root <path>]\n [--installed-release <version|unadopted>]\n [--mode <local|ci|preflight>] [--json]\n\nExit status:\n local/ci fail only for objective current-release blockers\n preflight uses the same checks against an isolated candidate\n\nStatic verification reports tests, builds, browsers and deployments as not run\nuntil real evidence is supplied.\n`;\n\nexport function parseBrandlabConformanceArgs(argv: readonly string[]): CliOptions {\n const parsed: CliOptions = {\n root: process.cwd(),\n mode: \"local\",\n json: false,\n help: false,\n };\n for (let index = 0; index < argv.length; index += 1) {\n const argument = argv[index];\n if (argument === \"--help\" || argument === \"-h\") parsed.help = true;\n else if (argument === \"--json\") parsed.json = true;\n else if (argument === \"--root\") {\n parsed.root = resolve(requireValue(argv, ++index, \"--root\"));\n } else if (argument === \"--installed-release\") {\n const value = requireValue(argv, ++index, \"--installed-release\");\n parsed.installedRelease = value === \"unadopted\" ? null : value;\n } else if (argument === \"--mode\") {\n const value = requireValue(argv, ++index, \"--mode\");\n if (![\"local\", \"ci\", \"preflight\"].includes(value)) {\n throw new Error(`Invalid --mode ${value}.`);\n }\n parsed.mode = value as BrandlabConformanceMode;\n } else {\n throw new Error(`Unknown argument ${argument}.`);\n }\n }\n return parsed;\n}\n\nexport function runBrandlabConformanceCli(\n argv: readonly string[],\n io: CliIo = {\n stdout: (value) => process.stdout.write(value),\n stderr: (value) => process.stderr.write(value),\n },\n): number {\n try {\n const options = parseBrandlabConformanceArgs(argv);\n if (options.help) {\n io.stdout(HELP);\n return 0;\n }\n const result = evaluateBrandlabProject({\n root: options.root,\n installedRelease: options.installedRelease,\n mode: options.mode,\n });\n io.stdout(options.json ? `${JSON.stringify(result, null, 2)}\\n` : formatResult(result));\n return shouldFailBrandlabConformance(result) ? 1 : 0;\n } catch (error) {\n io.stderr(`${error instanceof Error ? error.message : String(error)}\\n\\n${HELP}`);\n return 2;\n }\n}\n\nfunction formatResult(result: BrandlabConformanceResult): string {\n const externalChecks = result.verification.checks.filter(\n (check) => check.status === \"not_run\",\n );\n const staticStatus =\n result.verification.summary.blockers > 0\n ? \"blocked\"\n : result.verification.summary.warnings > 0\n ? \"warning\"\n : \"pass\";\n const lines = [\n \"Brandlab verification\",\n `installed: ${result.installedRelease ?? \"unadopted\"}`,\n `policy: ${result.verification.policyVersion}`,\n `static checks: ${staticStatus}`,\n `external evidence: ${\n externalChecks.length > 0\n ? `not run (${externalChecks.map((check) => check.title).join(\", \")})`\n : \"complete\"\n }`,\n `findings: ${formatSummary(result.verification.summary)}`,\n ];\n for (const family of result.verification.families) {\n if (family.status === \"pass\") continue;\n lines.push(\n `[${family.status}] ${family.title}: ${family.blockers} blocker(s), ${family.warnings} warning(s)`,\n );\n }\n for (const finding of result.operationalFindings) {\n const location = finding.path\n ? ` (${finding.path}${finding.line ? `:${finding.line}` : \"\"})`\n : \"\";\n lines.push(\n `[${finding.familyId}/${finding.severity}] ${finding.ruleId}${location}: ${finding.actual}`,\n );\n }\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nfunction formatSummary(summary: BrandlabConformanceResult[\"summary\"]): string {\n return `${summary.status}; ${summary.blockers} blocker(s), ${summary.warnings} warning(s), ${summary.info} info`;\n}\n\nfunction requireValue(argv: readonly string[], index: number, argument: string): string {\n const value = argv[index];\n if (!value || value.startsWith(\"--\")) throw new Error(`${argument} requires a value.`);\n return value;\n}\n\nexport function isBrandlabConformanceCliEntrypoint(\n moduleUrl: string,\n argvPath: string | undefined,\n): boolean {\n if (!argvPath) return false;\n try {\n return realpathSync(fileURLToPath(moduleUrl)) === realpathSync(resolve(argvPath));\n } catch {\n return false;\n }\n}\n\nif (isBrandlabConformanceCliEntrypoint(import.meta.url, process.argv[1])) {\n process.exitCode = runBrandlabConformanceCli(process.argv.slice(2));\n}\n"]}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\nimport { realpathSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { checkEngineeringStructure } from \"./engineering.js\";\nimport {\n evaluateBrandlabProject,\n shouldFailBrandlabConformance,\n type BrandlabConformanceMode,\n type BrandlabConformanceResult,\n} from \"./project.js\";\n\ninterface CliOptions {\n root: string;\n installedRelease?: string | null;\n mode: BrandlabConformanceMode;\n json: boolean;\n help: boolean;\n engineering: boolean;\n packedReleaseReceipt?: string;\n}\n\ninterface CliIo {\n stdout: (value: string) => void;\n stderr: (value: string) => void;\n}\n\nconst HELP = `Brandlab verification\n\nRuns the current objective verification checks for one project.\n\nUsage:\n brandlab-verify [--root <path>]\n [--installed-release <version|unadopted>]\n [--mode <local|ci|preflight>] [--engineering] [--json]\n [--packed-release <receipt.json> (preflight only)]\n\nExit status:\n local/ci fail only for objective current-release blockers\n preflight uses the same checks against an isolated candidate\n\nStatic verification reports tests, builds, browsers and deployments as not run\nuntil real evidence is supplied.\n--engineering adds the complete-migration structural checks. It does not certify\nmanual review, unused-code analysis, runtime journeys or provider cutover.\n`;\n\nexport function parseBrandlabConformanceArgs(argv: readonly string[]): CliOptions {\n const parsed: CliOptions = {\n root: process.cwd(),\n mode: \"local\",\n json: false,\n help: false,\n engineering: false,\n };\n for (let index = 0; index < argv.length; index += 1) {\n const argument = argv[index];\n if (argument === \"--help\" || argument === \"-h\") parsed.help = true;\n else if (argument === \"--json\") parsed.json = true;\n else if (argument === \"--engineering\") parsed.engineering = true;\n else if (argument === \"--packed-release\") parsed.packedReleaseReceipt = resolve(requireValue(argv, ++index, \"--packed-release\"));\n else if (argument === \"--root\") {\n parsed.root = resolve(requireValue(argv, ++index, \"--root\"));\n } else if (argument === \"--installed-release\") {\n const value = requireValue(argv, ++index, \"--installed-release\");\n parsed.installedRelease = value === \"unadopted\" ? null : value;\n } else if (argument === \"--mode\") {\n const value = requireValue(argv, ++index, \"--mode\");\n if (![\"local\", \"ci\", \"preflight\"].includes(value)) {\n throw new Error(`Invalid --mode ${value}.`);\n }\n parsed.mode = value as BrandlabConformanceMode;\n } else {\n throw new Error(`Unknown argument ${argument}.`);\n }\n }\n return parsed;\n}\n\nexport function runBrandlabConformanceCli(\n argv: readonly string[],\n io: CliIo = {\n stdout: (value) => process.stdout.write(value),\n stderr: (value) => process.stderr.write(value),\n },\n): number {\n try {\n const options = parseBrandlabConformanceArgs(argv);\n if (options.help) {\n io.stdout(HELP);\n return 0;\n }\n const result = evaluateBrandlabProject({\n root: options.root,\n installedRelease: options.installedRelease,\n mode: options.mode,\n packedReleaseReceipt: options.packedReleaseReceipt,\n });\n const engineering = options.engineering ? checkEngineeringStructure(options.root) : undefined;\n io.stdout(options.json ? `${JSON.stringify({ ...result, ...(engineering ? { engineering } : {}) }, null, 2)}\\n`\n : formatResult(result) + (engineering ? `Engineering structure: ${engineering.status}\\n${engineering.coverage}\\n${engineering.findings.map(f => `[${f.rule}] ${f.path}: ${f.message}\\n`).join('')}` : ''));\n return shouldFailBrandlabConformance(result) || engineering?.status === 'blocked' ? 1 : 0;\n } catch (error) {\n io.stderr(`${error instanceof Error ? error.message : String(error)}\\n\\n${HELP}`);\n return 2;\n }\n}\n\nfunction formatResult(result: BrandlabConformanceResult): string {\n const externalChecks = result.verification.checks.filter(\n (check) => check.status === \"not_run\",\n );\n const staticStatus =\n result.verification.summary.blockers > 0\n ? \"blocked\"\n : result.verification.summary.warnings > 0\n ? \"warning\"\n : \"pass\";\n const lines = [\n \"Brandlab verification\",\n `installed: ${result.installedRelease ?? \"unadopted\"}`,\n ...(result.packedPreflight ? ['provenance: verified local packed preflight; registry publication and deployment not established'] : []),\n `policy: ${result.verification.policyVersion}`,\n `static checks: ${staticStatus}`,\n `external evidence: ${\n externalChecks.length > 0\n ? `not run (${externalChecks.map((check) => check.title).join(\", \")})`\n : \"complete\"\n }`,\n `findings: ${formatSummary(result.verification.summary)}`,\n ];\n for (const family of result.verification.families) {\n if (family.status === \"pass\") continue;\n lines.push(\n `[${family.status}] ${family.title}: ${family.blockers} blocker(s), ${family.warnings} warning(s)`,\n );\n }\n for (const finding of result.operationalFindings) {\n const location = finding.path\n ? ` (${finding.path}${finding.line ? `:${finding.line}` : \"\"})`\n : \"\";\n lines.push(\n `[${finding.familyId}/${finding.severity}] ${finding.ruleId}${location}: ${finding.actual}`,\n );\n }\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nfunction formatSummary(summary: BrandlabConformanceResult[\"summary\"]): string {\n return `${summary.status}; ${summary.blockers} blocker(s), ${summary.warnings} warning(s), ${summary.info} info`;\n}\n\nfunction requireValue(argv: readonly string[], index: number, argument: string): string {\n const value = argv[index];\n if (!value || value.startsWith(\"--\")) throw new Error(`${argument} requires a value.`);\n return value;\n}\n\nexport function isBrandlabConformanceCliEntrypoint(\n moduleUrl: string,\n argvPath: string | undefined,\n): boolean {\n if (!argvPath) return false;\n try {\n return realpathSync(fileURLToPath(moduleUrl)) === realpathSync(resolve(argvPath));\n } catch {\n return false;\n }\n}\n\nif (isBrandlabConformanceCliEntrypoint(import.meta.url, process.argv[1])) {\n process.exitCode = runBrandlabConformanceCli(process.argv.slice(2));\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"current-release.d.ts","sourceRoot":"","sources":["../src/current-release.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,8BAA8B,EAEpC,MAAM,uBAAuB,CAAC;AAE/B,eAAO,MAAM,gCAAgC,EAkD7B,8BAA8B,CAAC"}
1
+ {"version":3,"file":"current-release.d.ts","sourceRoot":"","sources":["../src/current-release.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,8BAA8B,EAEpC,MAAM,uBAAuB,CAAC;AAE/B,eAAO,MAAM,gCAAgC,EAmD7B,8BAA8B,CAAC"}
@@ -15,31 +15,32 @@ export const BRANDLAB_CURRENT_RUNTIME_RELEASE = Object.freeze({
15
15
  ],
16
16
  "contracts": {
17
17
  "analytics": "analytics-v4",
18
- "architecture": "architecture-v5",
19
- "configuration": "project-config-v5",
18
+ "architecture": "architecture-v6",
19
+ "configuration": "project-config-v6",
20
20
  "contact": "contact-v4",
21
21
  "seo": "seo-v4"
22
22
  },
23
23
  "kind": "brandlab-runtime-release-contract",
24
24
  "packages": {
25
25
  "@brandlab-digital/conformance": {
26
- "version": "1.3.0"
26
+ "version": "2.0.0"
27
27
  },
28
28
  "@brandlab-digital/eslint-plugin": {
29
- "version": "1.3.0"
29
+ "version": "2.0.0"
30
30
  },
31
31
  "@brandlab-digital/site-core": {
32
- "version": "1.3.0"
32
+ "version": "2.0.0"
33
33
  },
34
34
  "@brandlab-digital/site-next": {
35
- "version": "1.3.0"
35
+ "version": "2.0.0"
36
36
  }
37
37
  },
38
- "releaseVersion": "1.3.0",
38
+ "releaseVersion": "2.0.0",
39
39
  "runtime": {
40
40
  "bundler": "turbopack",
41
41
  "cacheComponents": false,
42
- "next": "16.3.4",
42
+ "next": "16.3.6",
43
+ "nextVersionPolicy": "exact",
43
44
  "node": "24.x",
44
45
  "packageManager": "npm@11.14.1",
45
46
  "react": "19.2.8",
@@ -1 +1 @@
1
- {"version":3,"file":"current-release.js","sourceRoot":"","sources":["../src/current-release.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,wEAAwE;AACxE,OAAO,EAEL,sCAAsC,GACvC,MAAM,uBAAuB,CAAC;AAE/B,MAAM,CAAC,MAAM,gCAAgC,GAAG,MAAM,CAAC,MAAM,CAC7D;IACE,cAAc,EAAE;QACd,uCAAuC;QACvC,8BAA8B;QAC9B,yBAAyB;QACzB,6BAA6B;QAC7B,0BAA0B;QAC1B,4BAA4B;QAC5B,kCAAkC;QAClC,wCAAwC;QACxC,yBAAyB;KAC1B;IACD,WAAW,EAAE;QACX,WAAW,EAAE,cAAc;QAC3B,cAAc,EAAE,iBAAiB;QACjC,eAAe,EAAE,mBAAmB;QACpC,SAAS,EAAE,YAAY;QACvB,KAAK,EAAE,QAAQ;KAChB;IACD,MAAM,EAAE,mCAAmC;IAC3C,UAAU,EAAE;QACV,+BAA+B,EAAE;YAC/B,SAAS,EAAE,OAAO;SACnB;QACD,iCAAiC,EAAE;YACjC,SAAS,EAAE,OAAO;SACnB;QACD,6BAA6B,EAAE;YAC7B,SAAS,EAAE,OAAO;SACnB;QACD,6BAA6B,EAAE;YAC7B,SAAS,EAAE,OAAO;SACnB;KACF;IACD,gBAAgB,EAAE,OAAO;IACzB,SAAS,EAAE;QACT,SAAS,EAAE,WAAW;QACtB,iBAAiB,EAAE,KAAK;QACxB,MAAM,EAAE,QAAQ;QAChB,MAAM,EAAE,MAAM;QACd,gBAAgB,EAAE,aAAa;QAC/B,OAAO,EAAE,QAAQ;QACjB,UAAU,EAAE,QAAQ;QACpB,QAAQ,EAAE,KAAK;QACf,OAAO,EAAE,QAAQ;QACjB,YAAY,EAAE,OAAO;KACtB;IACD,eAAe,EAAE,sCAAsC;CACxD,CAC6C,CAAC;AAE/C,sCAAsC,CAAC,gCAAgC,CAAC,CAAC","sourcesContent":["// Generated by standards/scripts/generate-conformance-current-release.mjs.\n// Each exact package release verifies its own current runtime contract.\nimport {\n type BrandlabRuntimeReleaseContract,\n validateBrandlabRuntimeReleaseContract,\n} from \"./release-manifest.js\";\n\nexport const BRANDLAB_CURRENT_RUNTIME_RELEASE = Object.freeze(\n{\n \"capabilities\": [\n \"typed-project-business-and-route-data\",\n \"essential-search-foundations\",\n \"shared-contact-delivery\",\n \"privacy-safe-lead-analytics\",\n \"security-patched-runtime\",\n \"live-google-review-summary\",\n \"high-signal-project-verification\",\n \"packed-positive-and-negative-consumers\",\n \"changesets-oidc-release\"\n ],\n \"contracts\": {\n \"analytics\": \"analytics-v4\",\n \"architecture\": \"architecture-v5\",\n \"configuration\": \"project-config-v5\",\n \"contact\": \"contact-v4\",\n \"seo\": \"seo-v4\"\n },\n \"kind\": \"brandlab-runtime-release-contract\",\n \"packages\": {\n \"@brandlab-digital/conformance\": {\n \"version\": \"1.3.0\"\n },\n \"@brandlab-digital/eslint-plugin\": {\n \"version\": \"1.3.0\"\n },\n \"@brandlab-digital/site-core\": {\n \"version\": \"1.3.0\"\n },\n \"@brandlab-digital/site-next\": {\n \"version\": \"1.3.0\"\n }\n },\n \"releaseVersion\": \"1.3.0\",\n \"runtime\": {\n \"bundler\": \"turbopack\",\n \"cacheComponents\": false,\n \"next\": \"16.3.4\",\n \"node\": \"24.x\",\n \"packageManager\": \"npm@11.14.1\",\n \"react\": \"19.2.8\",\n \"reactDom\": \"19.2.8\",\n \"router\": \"app\",\n \"sharp\": \"0.35.4\",\n \"typescript\": \"6.0.3\"\n },\n \"schemaVersion\": \"brandlab.runtime-release-contract.v1\"\n},\n) as unknown as BrandlabRuntimeReleaseContract;\n\nvalidateBrandlabRuntimeReleaseContract(BRANDLAB_CURRENT_RUNTIME_RELEASE);\n"]}
1
+ {"version":3,"file":"current-release.js","sourceRoot":"","sources":["../src/current-release.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,wEAAwE;AACxE,OAAO,EAEL,sCAAsC,GACvC,MAAM,uBAAuB,CAAC;AAE/B,MAAM,CAAC,MAAM,gCAAgC,GAAG,MAAM,CAAC,MAAM,CAC7D;IACE,cAAc,EAAE;QACd,uCAAuC;QACvC,8BAA8B;QAC9B,yBAAyB;QACzB,6BAA6B;QAC7B,0BAA0B;QAC1B,4BAA4B;QAC5B,kCAAkC;QAClC,wCAAwC;QACxC,yBAAyB;KAC1B;IACD,WAAW,EAAE;QACX,WAAW,EAAE,cAAc;QAC3B,cAAc,EAAE,iBAAiB;QACjC,eAAe,EAAE,mBAAmB;QACpC,SAAS,EAAE,YAAY;QACvB,KAAK,EAAE,QAAQ;KAChB;IACD,MAAM,EAAE,mCAAmC;IAC3C,UAAU,EAAE;QACV,+BAA+B,EAAE;YAC/B,SAAS,EAAE,OAAO;SACnB;QACD,iCAAiC,EAAE;YACjC,SAAS,EAAE,OAAO;SACnB;QACD,6BAA6B,EAAE;YAC7B,SAAS,EAAE,OAAO;SACnB;QACD,6BAA6B,EAAE;YAC7B,SAAS,EAAE,OAAO;SACnB;KACF;IACD,gBAAgB,EAAE,OAAO;IACzB,SAAS,EAAE;QACT,SAAS,EAAE,WAAW;QACtB,iBAAiB,EAAE,KAAK;QACxB,MAAM,EAAE,QAAQ;QAChB,mBAAmB,EAAE,OAAO;QAC5B,MAAM,EAAE,MAAM;QACd,gBAAgB,EAAE,aAAa;QAC/B,OAAO,EAAE,QAAQ;QACjB,UAAU,EAAE,QAAQ;QACpB,QAAQ,EAAE,KAAK;QACf,OAAO,EAAE,QAAQ;QACjB,YAAY,EAAE,OAAO;KACtB;IACD,eAAe,EAAE,sCAAsC;CACxD,CAC6C,CAAC;AAE/C,sCAAsC,CAAC,gCAAgC,CAAC,CAAC","sourcesContent":["// Generated by standards/scripts/generate-conformance-current-release.mjs.\n// Each exact package release verifies its own current runtime contract.\nimport {\n type BrandlabRuntimeReleaseContract,\n validateBrandlabRuntimeReleaseContract,\n} from \"./release-manifest.js\";\n\nexport const BRANDLAB_CURRENT_RUNTIME_RELEASE = Object.freeze(\n{\n \"capabilities\": [\n \"typed-project-business-and-route-data\",\n \"essential-search-foundations\",\n \"shared-contact-delivery\",\n \"privacy-safe-lead-analytics\",\n \"security-patched-runtime\",\n \"live-google-review-summary\",\n \"high-signal-project-verification\",\n \"packed-positive-and-negative-consumers\",\n \"changesets-oidc-release\"\n ],\n \"contracts\": {\n \"analytics\": \"analytics-v4\",\n \"architecture\": \"architecture-v6\",\n \"configuration\": \"project-config-v6\",\n \"contact\": \"contact-v4\",\n \"seo\": \"seo-v4\"\n },\n \"kind\": \"brandlab-runtime-release-contract\",\n \"packages\": {\n \"@brandlab-digital/conformance\": {\n \"version\": \"2.0.0\"\n },\n \"@brandlab-digital/eslint-plugin\": {\n \"version\": \"2.0.0\"\n },\n \"@brandlab-digital/site-core\": {\n \"version\": \"2.0.0\"\n },\n \"@brandlab-digital/site-next\": {\n \"version\": \"2.0.0\"\n }\n },\n \"releaseVersion\": \"2.0.0\",\n \"runtime\": {\n \"bundler\": \"turbopack\",\n \"cacheComponents\": false,\n \"next\": \"16.3.6\",\n \"nextVersionPolicy\": \"exact\",\n \"node\": \"24.x\",\n \"packageManager\": \"npm@11.14.1\",\n \"react\": \"19.2.8\",\n \"reactDom\": \"19.2.8\",\n \"router\": \"app\",\n \"sharp\": \"0.35.4\",\n \"typescript\": \"6.0.3\"\n },\n \"schemaVersion\": \"brandlab.runtime-release-contract.v1\"\n},\n) as unknown as BrandlabRuntimeReleaseContract;\n\nvalidateBrandlabRuntimeReleaseContract(BRANDLAB_CURRENT_RUNTIME_RELEASE);\n"]}
@@ -0,0 +1,15 @@
1
+ export declare const ENGINEERING_FAST_COMMANDS: readonly ["typecheck", "lint", "test", "check:unused", "check:unused:production", "check:standards"];
2
+ export interface EngineeringFinding {
3
+ path: string;
4
+ rule: string;
5
+ message: string;
6
+ }
7
+ export interface EngineeringCheck {
8
+ status: 'pass' | 'blocked';
9
+ findings: EngineeringFinding[];
10
+ coverage: string;
11
+ outstandingEvidence: readonly string[];
12
+ }
13
+ /** Opt-in structural check. Static success must never masquerade as whole-project acceptance. */
14
+ export declare function checkEngineeringStructure(root: string): EngineeringCheck;
15
+ //# sourceMappingURL=engineering.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engineering.d.ts","sourceRoot":"","sources":["../src/engineering.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,yBAAyB,sGAAuG,CAAC;AAE9I,MAAM,WAAW,kBAAkB;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE;AACnF,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB,EAAE,SAAS,MAAM,EAAE,CAAC;CACxC;AAED,iGAAiG;AACjG,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CA4DxE"}
@@ -0,0 +1,86 @@
1
+ import { existsSync, readdirSync, readFileSync } from 'node:fs';
2
+ import { join, relative } from 'node:path';
3
+ import ts from 'typescript';
4
+ export const ENGINEERING_FAST_COMMANDS = ['typecheck', 'lint', 'test', 'check:unused', 'check:unused:production', 'check:standards'];
5
+ /** Opt-in structural check. Static success must never masquerade as whole-project acceptance. */
6
+ export function checkEngineeringStructure(root) {
7
+ const findings = [];
8
+ const add = (path, rule, message) => findings.push({ path, rule, message });
9
+ let pkg = {};
10
+ try {
11
+ pkg = JSON.parse(readFileSync(join(root, 'package.json'), 'utf8'));
12
+ }
13
+ catch {
14
+ add('package.json', 'package-readable', 'A readable package.json is required.');
15
+ }
16
+ for (const path of ['src/app', 'src/data', 'src/config', 'src/components']) {
17
+ if (!existsSync(join(root, path)))
18
+ add(path, 'source-organisation', `Place the corresponding implementation under ${path}.`);
19
+ }
20
+ for (const path of ['app', 'components', 'data', 'lib', 'config', 'content', 'src/components/templates']) {
21
+ if (existsSync(join(root, path)))
22
+ add(path, 'retired-source-layout', 'Migrate consumers to the current src responsibilities and remove the superseded directory.');
23
+ }
24
+ const scripts = pkg.scripts ?? {};
25
+ for (const command of [...ENGINEERING_FAST_COMMANDS, 'verify', 'build', 'test:e2e']) {
26
+ if (!scripts[command]?.trim())
27
+ add('package.json', 'command-contract', `Missing ${command} command.`);
28
+ }
29
+ const reachable = new Set();
30
+ function visit(name) {
31
+ if (reachable.has(name))
32
+ return;
33
+ reachable.add(name);
34
+ for (const match of (scripts[name] ?? '').matchAll(/\bnpm\s+run\s+([\w:-]+)/g))
35
+ visit(match[1]);
36
+ }
37
+ visit('verify');
38
+ for (const command of ENGINEERING_FAST_COMMANDS) {
39
+ if (!reachable.has(command))
40
+ add('package.json', 'verification-wiring', `verify must execute ${command}.`);
41
+ }
42
+ if (reachable.has('build'))
43
+ add('package.json', 'single-build', 'Keep the production build separate from fast verify; run it once for the final candidate.');
44
+ if (!/\bknip\b/.test(scripts['check:unused'] ?? '') || /--(?:no-exit-code|max-issues|fix)\b/.test(scripts['check:unused'] ?? '')) {
45
+ add('package.json', 'unused-graph', 'check:unused must run Knip without bypassing failures or automatically deleting files.');
46
+ }
47
+ if (!/\bknip\b[^\n]*--production\b/.test(scripts['check:unused:production'] ?? ''))
48
+ add('package.json', 'production-graph', 'check:unused:production must run Knip production analysis.');
49
+ const knip = pkg.devDependencies?.knip;
50
+ if (!knip || !/^\d+\.\d+\.\d+$/.test(knip))
51
+ add('package.json', 'unused-tool-pin', 'Pin Knip exactly as a development dependency.');
52
+ if (!/\bbrandlab-verify\b[^\n]*--engineering\b/.test(scripts['check:standards'] ?? ''))
53
+ add('package.json', 'standards-wiring', 'check:standards must execute brandlab-verify --engineering.');
54
+ function inspect(directory) {
55
+ if (!existsSync(directory))
56
+ return;
57
+ for (const entry of readdirSync(directory, { withFileTypes: true })) {
58
+ const path = join(directory, entry.name);
59
+ if (entry.isSymbolicLink())
60
+ continue;
61
+ if (entry.isDirectory()) {
62
+ inspect(path);
63
+ continue;
64
+ }
65
+ if (!/\.(?:tsx?|jsx?|mjs|cjs)$/.test(entry.name) || /\.(?:test|spec)\./.test(entry.name))
66
+ continue;
67
+ const source = ts.createSourceFile(path, readFileSync(path, 'utf8'), ts.ScriptTarget.Latest, true);
68
+ const location = relative(root, path).replaceAll('\\', '/');
69
+ function walk(node) {
70
+ if (ts.isImportDeclaration(node) && ts.isStringLiteral(node.moduleSpecifier) && node.moduleSpecifier.text.startsWith('@brandlab-digital/')) {
71
+ const bindings = node.importClause?.namedBindings;
72
+ if (bindings && ts.isNamedImports(bindings) && bindings.elements.some(element => (element.propertyName ?? element.name).text === 'trackPhoneCall')) {
73
+ add(location, 'retired-phone-api', 'Use trackPhoneLinkClick; the deprecated alias is removed in the current major.');
74
+ }
75
+ }
76
+ ts.forEachChild(node, walk);
77
+ }
78
+ walk(source);
79
+ }
80
+ }
81
+ inspect(join(root, 'src'));
82
+ return { status: findings.length ? 'blocked' : 'pass', findings,
83
+ coverage: 'Static source organisation, command wiring and retired API imports only. This is not engineering-standard completion.',
84
+ outstandingEvidence: ['Usage and deletion review including assets, configuration and dynamic references', 'Business data and component/style ownership review', 'Clean install, fast checks and production build', 'Full discovered technical URL estate', 'All distinct page families and important browser journeys', 'Exact-source protected Preview', 'Reporting/Ads provider cutover and authorised production verification'] };
85
+ }
86
+ //# sourceMappingURL=engineering.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engineering.js","sourceRoot":"","sources":["../src/engineering.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport { join, relative } from 'node:path';\nimport ts from 'typescript';\n\nexport const ENGINEERING_FAST_COMMANDS = ['typecheck', 'lint', 'test', 'check:unused', 'check:unused:production', 'check:standards'] as const;\n\nexport interface EngineeringFinding { path: string; rule: string; message: string }\nexport interface EngineeringCheck {\n status: 'pass' | 'blocked';\n findings: EngineeringFinding[];\n coverage: string;\n outstandingEvidence: readonly string[];\n}\n\n/** Opt-in structural check. Static success must never masquerade as whole-project acceptance. */\nexport function checkEngineeringStructure(root: string): EngineeringCheck {\n const findings: EngineeringFinding[] = [];\n const add = (path: string, rule: string, message: string) => findings.push({ path, rule, message });\n let pkg: { scripts?: Record<string, string>; dependencies?: Record<string, string>; devDependencies?: Record<string, string> } = {};\n try { pkg = JSON.parse(readFileSync(join(root, 'package.json'), 'utf8')); }\n catch { add('package.json', 'package-readable', 'A readable package.json is required.'); }\n for (const path of ['src/app', 'src/data', 'src/config', 'src/components']) {\n if (!existsSync(join(root, path))) add(path, 'source-organisation', `Place the corresponding implementation under ${path}.`);\n }\n for (const path of ['app', 'components', 'data', 'lib', 'config', 'content', 'src/components/templates']) {\n if (existsSync(join(root, path))) add(path, 'retired-source-layout', 'Migrate consumers to the current src responsibilities and remove the superseded directory.');\n }\n const scripts = pkg.scripts ?? {};\n for (const command of [...ENGINEERING_FAST_COMMANDS, 'verify', 'build', 'test:e2e']) {\n if (!scripts[command]?.trim()) add('package.json', 'command-contract', `Missing ${command} command.`);\n }\n const reachable = new Set<string>();\n function visit(name: string) {\n if (reachable.has(name)) return;\n reachable.add(name);\n for (const match of (scripts[name] ?? '').matchAll(/\\bnpm\\s+run\\s+([\\w:-]+)/g)) visit(match[1]);\n }\n visit('verify');\n for (const command of ENGINEERING_FAST_COMMANDS) {\n if (!reachable.has(command)) add('package.json', 'verification-wiring', `verify must execute ${command}.`);\n }\n if (reachable.has('build')) add('package.json', 'single-build', 'Keep the production build separate from fast verify; run it once for the final candidate.');\n if (!/\\bknip\\b/.test(scripts['check:unused'] ?? '') || /--(?:no-exit-code|max-issues|fix)\\b/.test(scripts['check:unused'] ?? '')) {\n add('package.json', 'unused-graph', 'check:unused must run Knip without bypassing failures or automatically deleting files.');\n }\n if (!/\\bknip\\b[^\\n]*--production\\b/.test(scripts['check:unused:production'] ?? '')) add('package.json', 'production-graph', 'check:unused:production must run Knip production analysis.');\n const knip = pkg.devDependencies?.knip;\n if (!knip || !/^\\d+\\.\\d+\\.\\d+$/.test(knip)) add('package.json', 'unused-tool-pin', 'Pin Knip exactly as a development dependency.');\n if (!/\\bbrandlab-verify\\b[^\\n]*--engineering\\b/.test(scripts['check:standards'] ?? '')) add('package.json', 'standards-wiring', 'check:standards must execute brandlab-verify --engineering.');\n\n function inspect(directory: string) {\n if (!existsSync(directory)) return;\n for (const entry of readdirSync(directory, { withFileTypes: true })) {\n const path = join(directory, entry.name);\n if (entry.isSymbolicLink()) continue;\n if (entry.isDirectory()) { inspect(path); continue; }\n if (!/\\.(?:tsx?|jsx?|mjs|cjs)$/.test(entry.name) || /\\.(?:test|spec)\\./.test(entry.name)) continue;\n const source = ts.createSourceFile(path, readFileSync(path, 'utf8'), ts.ScriptTarget.Latest, true);\n const location = relative(root, path).replaceAll('\\\\', '/');\n function walk(node: ts.Node) {\n if (ts.isImportDeclaration(node) && ts.isStringLiteral(node.moduleSpecifier) && node.moduleSpecifier.text.startsWith('@brandlab-digital/')) {\n const bindings = node.importClause?.namedBindings;\n if (bindings && ts.isNamedImports(bindings) && bindings.elements.some(element => (element.propertyName ?? element.name).text === 'trackPhoneCall')) {\n add(location, 'retired-phone-api', 'Use trackPhoneLinkClick; the deprecated alias is removed in the current major.');\n }\n }\n ts.forEachChild(node, walk);\n }\n walk(source);\n }\n }\n inspect(join(root, 'src'));\n return { status: findings.length ? 'blocked' : 'pass', findings,\n coverage: 'Static source organisation, command wiring and retired API imports only. This is not engineering-standard completion.',\n outstandingEvidence: ['Usage and deletion review including assets, configuration and dynamic references', 'Business data and component/style ownership review', 'Clean install, fast checks and production build', 'Full discovered technical URL estate', 'All distinct page families and important browser journeys', 'Exact-source protected Preview', 'Reporting/Ads provider cutover and authorised production verification'] };\n}\n"]}
@@ -0,0 +1,13 @@
1
+ export interface PackedPreflight {
2
+ version: string;
3
+ receiptDigest: string;
4
+ publication: 'not-established';
5
+ packages: Record<string, {
6
+ spec: string;
7
+ integrity: string;
8
+ artifact: string;
9
+ }>;
10
+ }
11
+ /** Verify real local archives and their installed bindings without rewriting them as registry URLs. */
12
+ export declare function verifyPackedPreflight(root: string, receiptPath: string): PackedPreflight;
13
+ //# sourceMappingURL=packed-preflight.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packed-preflight.d.ts","sourceRoot":"","sources":["../src/packed-preflight.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,iBAAiB,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjF;AAED,uGAAuG;AACvG,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,eAAe,CAoCxF"}
@@ -0,0 +1,51 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { readFileSync, realpathSync } from 'node:fs';
3
+ import { basename, dirname, join, resolve } from 'node:path';
4
+ import { BRANDLAB_SHARED_PACKAGE_NAMES, isBrandlabSemver } from './release-manifest.js';
5
+ /** Verify real local archives and their installed bindings without rewriting them as registry URLs. */
6
+ export function verifyPackedPreflight(root, receiptPath) {
7
+ const bytes = readFileSync(receiptPath);
8
+ const receipt = JSON.parse(bytes.toString('utf8'));
9
+ if (receipt.state !== 'unpublished-local-test-artifacts' || !Array.isArray(receipt.packages)
10
+ || receipt.packages.length !== BRANDLAB_SHARED_PACKAGE_NAMES.length)
11
+ throw new Error('Packed preflight requires a complete unpublished four-package receipt.');
12
+ const rows = new Map(receipt.packages.map((row) => [row.name, row]));
13
+ if (rows.size !== BRANDLAB_SHARED_PACKAGE_NAMES.length)
14
+ throw new Error('Packed receipt contains duplicate packages.');
15
+ const pkg = JSON.parse(readFileSync(join(root, 'package.json'), 'utf8'));
16
+ const lock = JSON.parse(readFileSync(join(root, 'package-lock.json'), 'utf8'));
17
+ const packages = {};
18
+ let version;
19
+ for (const name of BRANDLAB_SHARED_PACKAGE_NAMES) {
20
+ const row = rows.get(name);
21
+ if (!row || !row.version || !isBrandlabSemver(row.version) || !row.filename
22
+ || basename(row.filename) !== row.filename || !row.filename.endsWith('.tgz'))
23
+ throw new Error(`Invalid packed receipt for ${name}.`);
24
+ version ??= row.version;
25
+ if (row.version !== version)
26
+ throw new Error('Packed versions must match across all four packages.');
27
+ const artifact = realpathSync(resolve(dirname(receiptPath), row.filename));
28
+ if (dirname(artifact) !== realpathSync(dirname(receiptPath)))
29
+ throw new Error('Packed artifacts must remain beside their receipt.');
30
+ const integrity = `sha512-${createHash('sha512').update(readFileSync(artifact)).digest('base64')}`;
31
+ if (integrity !== row.integrity)
32
+ throw new Error(`Packed archive integrity differs for ${name}.`);
33
+ const spec = pkg.dependencies?.[name] ?? pkg.devDependencies?.[name];
34
+ const locked = lock.packages?.['']?.dependencies?.[name] ?? lock.packages?.['']?.devDependencies?.[name];
35
+ const resolved = lock.packages?.[`node_modules/${name}`];
36
+ const filePath = (value) => typeof value === 'string' && value.startsWith('file:')
37
+ ? realpathSync(resolve(root, value.slice(5))) : null;
38
+ if (pkg.dependencies?.[name] && pkg.devDependencies?.[name])
39
+ throw new Error(`Duplicate packed declaration for ${name}.`);
40
+ if (spec !== locked || filePath(spec) !== artifact || filePath(resolved?.resolved) !== artifact
41
+ || resolved?.version !== version || resolved?.integrity !== integrity || resolved?.link === true) {
42
+ throw new Error(`Packed declaration/lockfile does not match ${name}.`);
43
+ }
44
+ const installed = JSON.parse(readFileSync(join(root, 'node_modules', name, 'package.json'), 'utf8'));
45
+ if (installed.name !== name || installed.version !== version)
46
+ throw new Error(`Installed packed identity differs for ${name}.`);
47
+ packages[name] = { spec, integrity, artifact };
48
+ }
49
+ return { version: version, receiptDigest: createHash('sha256').update(bytes).digest('hex'), publication: 'not-established', packages };
50
+ }
51
+ //# sourceMappingURL=packed-preflight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packed-preflight.js","sourceRoot":"","sources":["../src/packed-preflight.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from 'node:crypto';\nimport { readFileSync, realpathSync } from 'node:fs';\nimport { basename, dirname, join, resolve } from 'node:path';\nimport { BRANDLAB_SHARED_PACKAGE_NAMES, isBrandlabSemver } from './release-manifest.js';\n\nexport interface PackedPreflight {\n version: string;\n receiptDigest: string;\n publication: 'not-established';\n packages: Record<string, { spec: string; integrity: string; artifact: string }>;\n}\n\n/** Verify real local archives and their installed bindings without rewriting them as registry URLs. */\nexport function verifyPackedPreflight(root: string, receiptPath: string): PackedPreflight {\n const bytes = readFileSync(receiptPath);\n const receipt = JSON.parse(bytes.toString('utf8'));\n if (receipt.state !== 'unpublished-local-test-artifacts' || !Array.isArray(receipt.packages)\n || receipt.packages.length !== BRANDLAB_SHARED_PACKAGE_NAMES.length) throw new Error('Packed preflight requires a complete unpublished four-package receipt.');\n const rows = new Map(receipt.packages.map((row: { name: string }) => [row.name, row]));\n if (rows.size !== BRANDLAB_SHARED_PACKAGE_NAMES.length) throw new Error('Packed receipt contains duplicate packages.');\n const pkg = JSON.parse(readFileSync(join(root, 'package.json'), 'utf8'));\n const lock = JSON.parse(readFileSync(join(root, 'package-lock.json'), 'utf8'));\n const packages: PackedPreflight['packages'] = {};\n let version: string | undefined;\n for (const name of BRANDLAB_SHARED_PACKAGE_NAMES) {\n const row = rows.get(name) as { version?: string; filename?: string; integrity?: string } | undefined;\n if (!row || !row.version || !isBrandlabSemver(row.version) || !row.filename\n || basename(row.filename) !== row.filename || !row.filename.endsWith('.tgz')) throw new Error(`Invalid packed receipt for ${name}.`);\n version ??= row.version;\n if (row.version !== version) throw new Error('Packed versions must match across all four packages.');\n const artifact = realpathSync(resolve(dirname(receiptPath), row.filename));\n if (dirname(artifact) !== realpathSync(dirname(receiptPath))) throw new Error('Packed artifacts must remain beside their receipt.');\n const integrity = `sha512-${createHash('sha512').update(readFileSync(artifact)).digest('base64')}`;\n if (integrity !== row.integrity) throw new Error(`Packed archive integrity differs for ${name}.`);\n const spec = pkg.dependencies?.[name] ?? pkg.devDependencies?.[name];\n const locked = lock.packages?.['']?.dependencies?.[name] ?? lock.packages?.['']?.devDependencies?.[name];\n const resolved = lock.packages?.[`node_modules/${name}`];\n const filePath = (value: unknown) => typeof value === 'string' && value.startsWith('file:')\n ? realpathSync(resolve(root, value.slice(5))) : null;\n if (pkg.dependencies?.[name] && pkg.devDependencies?.[name]) throw new Error(`Duplicate packed declaration for ${name}.`);\n if (spec !== locked || filePath(spec) !== artifact || filePath(resolved?.resolved) !== artifact\n || resolved?.version !== version || resolved?.integrity !== integrity || resolved?.link === true) {\n throw new Error(`Packed declaration/lockfile does not match ${name}.`);\n }\n const installed = JSON.parse(readFileSync(join(root, 'node_modules', name, 'package.json'), 'utf8'));\n if (installed.name !== name || installed.version !== version) throw new Error(`Installed packed identity differs for ${name}.`);\n packages[name] = { spec, integrity, artifact };\n }\n return { version: version!, receiptDigest: createHash('sha256').update(bytes).digest('hex'), publication: 'not-established', packages };\n}\n"]}
package/dist/project.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import { type PackedPreflight } from "./packed-preflight.js";
1
2
  import { type BrandlabContractVersions, type BrandlabReleaseManifest, type BrandlabRuntimeReleaseContract } from "./release-manifest.js";
2
3
  import { type BrandlabOperationalFinding, type BrandlabVerificationEvidence, type BrandlabVerificationResult } from "./verification-policy.js";
3
4
  export { BRANDLAB_VERIFICATION_CHECKS, BRANDLAB_VERIFICATION_FAMILIES, BRANDLAB_VERIFICATION_POLICY_VERSION, type BrandlabVerificationCheckId, type BrandlabVerificationCheckResult, type BrandlabVerificationEvidence, type BrandlabVerificationEvidenceKind, type BrandlabVerificationFamilyId, type BrandlabVerificationFamilyResult, type BrandlabVerificationResult, type BrandlabVerificationStatus, } from "./verification-policy.js";
@@ -28,6 +29,7 @@ export interface ConformanceSummary {
28
29
  info: number;
29
30
  }
30
31
  export interface BrandlabConformanceResult {
32
+ packedPreflight?: PackedPreflight;
31
33
  schemaVersion: typeof BRANDLAB_CONFORMANCE_SCHEMA_VERSION;
32
34
  evaluatorVersion: typeof BRANDLAB_CONFORMANCE_EVALUATOR_VERSION;
33
35
  authorityDigest: string;
@@ -41,6 +43,7 @@ export interface BrandlabConformanceResult {
41
43
  summary: ConformanceSummary;
42
44
  }
43
45
  export interface EvaluateBrandlabProjectOptions {
46
+ packedReleaseReceipt?: string;
44
47
  root: string;
45
48
  installedRelease?: string | null;
46
49
  mode?: BrandlabConformanceMode;
@@ -1 +1 @@
1
- {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"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"}
package/dist/project.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import { existsSync, readFileSync, readdirSync } from "node:fs";
2
2
  import { join, relative, resolve } from "node:path";
3
3
  import { BRANDLAB_CURRENT_RUNTIME_RELEASE } from "./current-release.js";
4
+ import { verifyPackedPreflight } from "./packed-preflight.js";
4
5
  import { BRANDLAB_SHARED_PACKAGE_NAMES, compareBrandlabSemver, digestBrandlabAuthority, isBrandlabSemver, projectBrandlabRuntimeReleaseContract, validateBrandlabReleaseManifest, validateBrandlabRuntimeReleaseContract, } from "./release-manifest.js";
5
6
  import { applyBrandlabVerificationPolicy, BRANDLAB_VERIFICATION_POLICY_VERSION, } from "./verification-policy.js";
6
7
  export { BRANDLAB_VERIFICATION_CHECKS, BRANDLAB_VERIFICATION_FAMILIES, BRANDLAB_VERIFICATION_POLICY_VERSION, } from "./verification-policy.js";
@@ -120,7 +121,12 @@ export function evaluateBrandlabProject(options) {
120
121
  }
121
122
  const packageJson = readPackageJson(root);
122
123
  const packageLock = readPackageLock(root);
123
- const detectedRelease = detectInstalledBrandlabRelease(packageJson);
124
+ if (options.packedReleaseReceipt && mode !== "preflight") {
125
+ throw new Error("Local packed artifacts are permitted only in explicit preflight mode.");
126
+ }
127
+ const packedPreflight = options.packedReleaseReceipt
128
+ ? verifyPackedPreflight(root, resolve(options.packedReleaseReceipt)) : undefined;
129
+ const detectedRelease = packedPreflight?.version ?? detectInstalledBrandlabRelease(packageJson);
124
130
  const installedRelease = options.installedRelease === undefined ? detectedRelease : options.installedRelease;
125
131
  const manifest = release.releaseVersion === installedRelease ? release : null;
126
132
  const attestation = options.releaseManifest?.releaseVersion === installedRelease
@@ -135,7 +141,10 @@ export function evaluateBrandlabProject(options) {
135
141
  detectedRelease,
136
142
  manifest,
137
143
  attestation,
144
+ packedPreflight,
138
145
  });
146
+ if (manifest?.runtime.nextVersionPolicy === "exact")
147
+ inspectImageRuntime(root, findings);
139
148
  inspectProjectConfig(root, findings);
140
149
  inspectProjectSource(root, findings);
141
150
  const sortedFindings = findings.sort(compareFindings);
@@ -144,6 +153,7 @@ export function evaluateBrandlabProject(options) {
144
153
  const authorityDigest = digestBrandlabAuthority({
145
154
  release,
146
155
  releaseManifest: options.releaseManifest ?? null,
156
+ ...(packedPreflight ? { packedReceipt: packedPreflight.receiptDigest } : {}),
147
157
  });
148
158
  const contractDigest = digestBrandlabAuthority({
149
159
  installed: manifest?.contracts ?? null,
@@ -154,6 +164,8 @@ export function evaluateBrandlabProject(options) {
154
164
  packageJson: packageJson ?? null,
155
165
  packageLock: packageLock.fingerprint,
156
166
  brandlabConfig: readOptionalText(join(root, "brandlab.config.ts")),
167
+ nextConfig: ["next.config.ts", "next.config.mts", "next.config.mjs", "next.config.js"]
168
+ .map((name) => [name, readOptionalText(join(root, name))]),
157
169
  findings: sortedFindings.map(({ ruleId, severity, path, line }) => ({
158
170
  ruleId,
159
171
  severity,
@@ -163,6 +175,7 @@ export function evaluateBrandlabProject(options) {
163
175
  });
164
176
  return {
165
177
  schemaVersion: BRANDLAB_CONFORMANCE_SCHEMA_VERSION,
178
+ ...(packedPreflight ? { packedPreflight } : {}),
166
179
  evaluatorVersion: BRANDLAB_CONFORMANCE_EVALUATOR_VERSION,
167
180
  authorityDigest,
168
181
  contractDigest,
@@ -210,6 +223,7 @@ function inspectRelease(options) {
210
223
  packageLock: options.packageLock,
211
224
  installedRelease: options.installedRelease,
212
225
  attestation: options.attestation,
226
+ packedPreflight: options.packedPreflight,
213
227
  });
214
228
  inspectRuntime({
215
229
  findings: options.findings,
@@ -229,7 +243,8 @@ function inspectBrandlabPackages(options) {
229
243
  const resolved = options.packageLock.resolvedPackages.get(packageName);
230
244
  const duplicate = options.packageJson.dependencies?.[packageName] !== undefined &&
231
245
  options.packageJson.devDependencies?.[packageName] !== undefined;
232
- if (duplicate || declared !== options.installedRelease || locked !== declared) {
246
+ const packed = options.packedPreflight?.packages[packageName];
247
+ if (duplicate || declared !== (packed?.spec ?? options.installedRelease) || locked !== declared) {
233
248
  options.findings.push(releaseFinding("brandlab-release-package-pin-mismatch", `${packageName}@${options.installedRelease} declared once and locked exactly`, `package.json=${declared ?? "missing"}; lockfile=${locked ?? "missing"}; duplicate=${String(duplicate)}.`, "Restore exact lockstep package declarations and regenerate the lockfile.", "package.json"));
234
249
  }
235
250
  if (!resolved ||
@@ -237,7 +252,7 @@ function inspectBrandlabPackages(options) {
237
252
  resolved.linked ||
238
253
  !resolved.integrity ||
239
254
  !resolved.resolved ||
240
- !isApprovedRegistryResolution(resolved.resolved, packageName, options.installedRelease)) {
255
+ (!packed && !isApprovedRegistryResolution(resolved.resolved, packageName, options.installedRelease))) {
241
256
  options.findings.push(releaseFinding("brandlab-release-package-resolution-mismatch", `${packageName}@${options.installedRelease} from the canonical npm registry`, !resolved
242
257
  ? "The resolved lockfile package is missing."
243
258
  : `version=${resolved.version ?? "missing"}; linked=${String(resolved.linked)}; integrity=${resolved.integrity ? "present" : "missing"}.`, "Run a clean npm install from the exact published release.", "package-lock.json"));
@@ -254,11 +269,11 @@ function inspectRuntime(options) {
254
269
  const declared = declaredPackageSpec(options.packageJson, packageName);
255
270
  const locked = lockedRootSpec(options.packageLock, packageName);
256
271
  const resolved = options.packageLock.resolvedPackages.get(packageName);
257
- if (!runtimeVersionSatisfiesRelease(packageName, declared, expected) ||
272
+ if (!runtimeVersionSatisfiesRelease(packageName, declared, expected, options.manifest.runtime.nextVersionPolicy) ||
258
273
  locked !== declared ||
259
274
  resolved?.version !== declared ||
260
275
  resolved.linked) {
261
- options.findings.push(runtimeFinding(`brandlab-runtime-${slugify(packageName)}`, runtimeExpectation(packageName, expected), `package.json=${declared ?? "missing"}; lockfile=${locked ?? "missing"}; resolved=${resolved?.version ?? "missing"}.`, `Use the supported ${options.manifest.releaseVersion} runtime or a newer exact stable release in the same framework major.`, "package.json"));
276
+ options.findings.push(runtimeFinding(`brandlab-runtime-${slugify(packageName)}`, runtimeExpectation(packageName, expected, options.manifest.runtime.nextVersionPolicy), `package.json=${declared ?? "missing"}; lockfile=${locked ?? "missing"}; resolved=${resolved?.version ?? "missing"}.`, `Use the runtime versions permitted by the ${options.manifest.releaseVersion} contract; an exact mitigation pin requires a reviewed policy change before upgrading.`, "package.json"));
262
277
  }
263
278
  }
264
279
  const node = options.packageJson.engines?.node ?? null;
@@ -279,6 +294,17 @@ function inspectRuntime(options) {
279
294
  }
280
295
  }
281
296
  }
297
+ function inspectImageRuntime(root, findings) {
298
+ const filename = ["next.config.ts", "next.config.mts", "next.config.mjs", "next.config.js"]
299
+ .find((name) => existsSync(join(root, name)));
300
+ const source = filename ? stripCommentsPreservingLayout(readOptionalText(join(root, filename)) ?? "") : "";
301
+ // A direct side-effect import executes the shared guard before Next starts.
302
+ // This source check is not runtime certification; packed/browser checks prove that separately.
303
+ if (/^\s*import\s*['"]@brandlab-digital\/site-next\/image-runtime['"]/m.test(source) ||
304
+ /^\s*require\(\s*['"]@brandlab-digital\/site-next\/image-runtime['"]\s*\)/m.test(source))
305
+ return;
306
+ findings.push(runtimeFinding("brandlab-runtime-image-initialisation", "The shared image-runtime side-effect import in next.config", "The startup decoder exclusion could not be established from configuration.", "Import @brandlab-digital/site-next/image-runtime at the top of next.config; verify the packed runtime and affected images.", filename ?? "next.config.ts"));
307
+ }
282
308
  function inspectProjectConfig(root, findings) {
283
309
  const configPath = join(root, "brandlab.config.ts");
284
310
  const source = readOptionalText(configPath);
@@ -541,7 +567,9 @@ function emptyPackageLock(state, fingerprint = {}) {
541
567
  fingerprint: { state, ...fingerprint },
542
568
  };
543
569
  }
544
- function runtimeVersionSatisfiesRelease(packageName, actual, expected) {
570
+ function runtimeVersionSatisfiesRelease(packageName, actual, expected, nextVersionPolicy) {
571
+ if (packageName === "next" && nextVersionPolicy === "exact")
572
+ return actual === expected;
545
573
  if (!actual || !isBrandlabSemver(actual))
546
574
  return false;
547
575
  if (!["next", "react", "react-dom"].includes(packageName))
@@ -556,7 +584,9 @@ function runtimeVersionSatisfiesRelease(packageName, actual, expected) {
556
584
  sameSupportedLine &&
557
585
  compareBrandlabSemver(actual, expected) >= 0);
558
586
  }
559
- function runtimeExpectation(packageName, expected) {
587
+ function runtimeExpectation(packageName, expected, nextVersionPolicy) {
588
+ if (packageName === "next" && nextVersionPolicy === "exact")
589
+ return `${packageName}@${expected} (exact HEIF mitigation pin)`;
560
590
  if (packageName === "next") {
561
591
  return `${packageName}@${expected} or a newer exact stable release in the same major line`;
562
592
  }
@@ -1 +1 @@
1
- {"version":3,"file":"project.js","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync, readdirSync } from \"node:fs\";\nimport { join, relative, resolve } from \"node:path\";\nimport { BRANDLAB_CURRENT_RUNTIME_RELEASE } from \"./current-release.js\";\nimport {\n BRANDLAB_SHARED_PACKAGE_NAMES,\n compareBrandlabSemver,\n digestBrandlabAuthority,\n isBrandlabSemver,\n type BrandlabContractVersions,\n type BrandlabReleaseManifest,\n type BrandlabRuntimeReleaseContract,\n projectBrandlabRuntimeReleaseContract,\n validateBrandlabReleaseManifest,\n validateBrandlabRuntimeReleaseContract,\n} from \"./release-manifest.js\";\nimport {\n applyBrandlabVerificationPolicy,\n BRANDLAB_VERIFICATION_POLICY_VERSION,\n type BrandlabOperationalFinding,\n type BrandlabVerificationEvidence,\n type BrandlabVerificationResult,\n} from \"./verification-policy.js\";\n\nexport {\n BRANDLAB_VERIFICATION_CHECKS,\n BRANDLAB_VERIFICATION_FAMILIES,\n BRANDLAB_VERIFICATION_POLICY_VERSION,\n type BrandlabVerificationCheckId,\n type BrandlabVerificationCheckResult,\n type BrandlabVerificationEvidence,\n type BrandlabVerificationEvidenceKind,\n type BrandlabVerificationFamilyId,\n type BrandlabVerificationFamilyResult,\n type BrandlabVerificationResult,\n type BrandlabVerificationStatus,\n} from \"./verification-policy.js\";\n\nexport const BRANDLAB_CONFORMANCE_SCHEMA_VERSION = \"brandlab.conformance.v2\";\nexport const BRANDLAB_CONFORMANCE_EVALUATOR_VERSION = \"current-only-v2\";\n\nconst RUNTIME_PACKAGE_FIELDS = [\n [\"next\", \"next\"],\n [\"react\", \"react\"],\n [\"react-dom\", \"reactDom\"],\n [\"typescript\", \"typescript\"],\n] as const;\n\nconst SOURCE_EXTENSIONS = new Set([\".js\", \".jsx\", \".mjs\", \".ts\", \".tsx\"]);\n\nexport type BrandlabConformanceMode = \"local\" | \"ci\" | \"preflight\";\nexport type BrandlabFindingSeverity = \"blocker\" | \"warning\" | \"info\";\n\nexport interface BrandlabFinding {\n ruleId: string;\n surface: string;\n severity: BrandlabFindingSeverity;\n contract: { name: string; version: string };\n evidenceKind: \"static\" | \"behavioural\" | \"runtime\";\n path?: string;\n line?: number;\n expected: string;\n actual: string;\n remediation: string;\n}\n\nexport interface ConformanceSummary {\n status: \"pass\" | \"warning\" | \"blocked\";\n total: number;\n blockers: number;\n warnings: number;\n info: number;\n}\n\nexport interface BrandlabConformanceResult {\n schemaVersion: typeof BRANDLAB_CONFORMANCE_SCHEMA_VERSION;\n evaluatorVersion: typeof BRANDLAB_CONFORMANCE_EVALUATOR_VERSION;\n authorityDigest: string;\n contractDigest: string;\n implementationFingerprint: string;\n mode: BrandlabConformanceMode;\n installedRelease: string | null;\n findings: BrandlabFinding[];\n operationalFindings: BrandlabOperationalFinding[];\n verification: BrandlabVerificationResult;\n summary: ConformanceSummary;\n}\n\nexport interface EvaluateBrandlabProjectOptions {\n root: string;\n installedRelease?: string | null;\n mode?: BrandlabConformanceMode;\n release?: BrandlabRuntimeReleaseContract;\n releaseManifest?: BrandlabReleaseManifest;\n verificationEvidence?: readonly BrandlabVerificationEvidence[];\n}\n\ninterface ProjectPackageJsonLike {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n engines?: Record<string, string>;\n overrides?: Record<string, string>;\n packageManager?: string;\n}\n\ninterface LockedPackage {\n version: string | null;\n resolved: string | null;\n integrity: string | null;\n linked: boolean;\n}\n\ninterface PackageLockInspection {\n state: \"valid\" | \"missing\" | \"invalid\" | \"unsupported\";\n lockfileVersion: number | null;\n rootDependencies: Record<string, string>;\n rootDevDependencies: Record<string, string>;\n rootEngines: Record<string, string>;\n resolvedPackages: ReadonlyMap<string, LockedPackage>;\n sharpResolutions: readonly { path: string; version: string | null }[];\n fingerprint: Record<string, unknown>;\n}\n\ninterface SourceRule {\n ruleId: string;\n surface: string;\n pattern: RegExp;\n expected: string;\n remediation: string;\n}\n\nconst SOURCE_RULES: readonly SourceRule[] = [\n {\n ruleId: \"brandlab-source-retired-analytics-event\",\n surface: \"analytics\",\n pattern: /\\b(?:contact_form_submission|phone_call|phone_calls|form_start|cta_click)\\b/,\n expected: \"Only the current Brandlab analytics event contract is used.\",\n remediation: \"Use contact_form for accepted forms and phone_link_click for telephone-link diagnostics.\",\n },\n {\n ruleId: \"brandlab-source-local-google-tag-bootstrap\",\n surface: \"analytics\",\n pattern: /googletagmanager\\.com\\/gtag\\/js|window\\.dataLayer\\s*=\\s*window\\.dataLayer|function\\s+gtag\\s*\\(/,\n expected: \"Google tag bootstrap is owned by the shared analytics runtime.\",\n remediation: \"Remove the project-local bootstrap and supply only approved analytics identifiers.\",\n },\n {\n ruleId: \"brandlab-source-local-contact-delivery\",\n surface: \"contact\",\n pattern: /\\.emails\\.send\\s*\\(|resend\\.emails\\.send\\s*\\(/,\n expected: \"Email delivery is owned by the shared contact runtime.\",\n remediation: \"Pass the Resend client to the shared contact adapter instead of sending locally.\",\n },\n {\n ruleId: \"brandlab-source-local-contact-email-renderer\",\n surface: \"contact\",\n pattern: /\\bContactFormEmail\\b|\\brenderContactEmail\\b/,\n expected: \"Contact email rendering is owned by the shared contact runtime.\",\n remediation: \"Remove the local email renderer and configure shared brand variation only.\",\n },\n {\n ruleId: \"brandlab-source-local-contact-attachments\",\n surface: \"contact\",\n pattern: /from\\s+['\\\"]browser-image-compression['\\\"]|import\\s*\\(\\s*['\\\"]browser-image-compression['\\\"]\\s*\\)|(?:function|const)\\s+useContactAttachments\\b/,\n expected: \"Contact attachment preparation is owned by the shared contact runtime.\",\n remediation: \"Use useBrandlabContactAttachments from @brandlab-digital/site-next/contact/client.\",\n },\n {\n ruleId: \"brandlab-source-contact-draft-persistence\",\n surface: \"contact\",\n pattern: /(?:function|const)\\s+useFormDraftPersistence\\b/,\n expected: \"Contact details are not persisted in browser storage.\",\n remediation: \"Keep contact details in memory and clear them when the page closes.\",\n },\n {\n ruleId: \"brandlab-source-dangerously-set-inner-html\",\n surface: \"security\",\n pattern: /\\bdangerouslySetInnerHTML\\b/,\n expected: \"No project-owned raw HTML injection.\",\n remediation: \"Use structured React output or the shared sanitised renderer.\",\n },\n {\n ruleId: \"brandlab-source-raw-json-ld\",\n surface: \"schema\",\n pattern: /application\\/ld\\+json/,\n expected: \"Structured data is rendered through the shared schema component.\",\n remediation: \"Replace raw JSON-LD output with the shared schema graph renderer.\",\n },\n {\n ruleId: \"brandlab-source-self-serving-rating-schema\",\n surface: \"schema\",\n pattern: /['\"]AggregateRating['\"]/,\n expected: \"No self-serving aggregate rating schema.\",\n remediation: \"Show verified review proof visibly without LocalBusiness or Organization rating schema.\",\n },\n {\n ruleId: \"brandlab-source-synthetic-offer-schema\",\n surface: \"schema\",\n pattern: /\\bpriceValidUntil\\b|['\"]@type['\"]\\s*:\\s*['\"]Offer['\"]/,\n expected: \"No synthetic Offer markup on service pages.\",\n remediation: \"Remove invented Offer data and use the shared service schema.\",\n },\n {\n ruleId: \"brandlab-source-local-google-reviews-fetch\",\n surface: \"reviews\",\n pattern: /places\\.googleapis\\.com|maps\\.googleapis\\.com\\/maps\\/api\\/place/,\n expected: \"Google Places fetching is owned by the shared review runtime.\",\n remediation: \"Provide only the verified Place ID, Maps URL and server-side API key.\",\n },\n {\n ruleId: \"brandlab-source-public-secret\",\n surface: \"security\",\n pattern: /NEXT_PUBLIC_[A-Z0-9_]*(?:API_KEY|SECRET|TOKEN)/,\n expected: \"Secrets remain server-only.\",\n remediation: \"Move the credential to an approved server-only environment variable.\",\n },\n {\n ruleId: \"brandlab-source-retired-contact-state\",\n surface: \"contact\",\n pattern: /\\bCONTACT_CONTEXT_SECRET\\b|\\bKV_REST_API_(?:URL|TOKEN)\\b/,\n expected: \"The simplified contact runtime has no project-level state-service requirement.\",\n remediation: \"Remove the retired contact state variables and use the shared stateless contact flow.\",\n },\n];\n\nexport function evaluateBrandlabProject(\n options: EvaluateBrandlabProjectOptions,\n): BrandlabConformanceResult {\n const root = resolve(options.root);\n const mode = options.mode ?? \"local\";\n const release = options.release ?? BRANDLAB_CURRENT_RUNTIME_RELEASE;\n validateBrandlabRuntimeReleaseContract(release);\n if (options.releaseManifest) {\n validateBrandlabReleaseManifest(options.releaseManifest);\n if (\n digestBrandlabAuthority(projectBrandlabRuntimeReleaseContract(options.releaseManifest)) !==\n digestBrandlabAuthority(release)\n ) {\n throw new Error(\"The release manifest differs from the embedded current release.\");\n }\n }\n\n const packageJson = readPackageJson(root);\n const packageLock = readPackageLock(root);\n const detectedRelease = detectInstalledBrandlabRelease(packageJson);\n const installedRelease =\n options.installedRelease === undefined ? detectedRelease : options.installedRelease;\n const manifest = release.releaseVersion === installedRelease ? release : null;\n const attestation =\n options.releaseManifest?.releaseVersion === installedRelease\n ? options.releaseManifest\n : null;\n const findings: BrandlabFinding[] = [];\n\n inspectRelease({\n findings,\n packageJson,\n packageLock,\n installedRelease,\n detectedRelease,\n manifest,\n attestation,\n });\n inspectProjectConfig(root, findings);\n inspectProjectSource(root, findings);\n\n const sortedFindings = findings.sort(compareFindings);\n const policyResult = applyBrandlabVerificationPolicy(\n sortedFindings,\n options.verificationEvidence,\n );\n const operationalFindings = policyResult.operationalFindings.sort(compareFindings);\n const authorityDigest = digestBrandlabAuthority({\n release,\n releaseManifest: options.releaseManifest ?? null,\n });\n const contractDigest = digestBrandlabAuthority({\n installed: manifest?.contracts ?? null,\n evaluator: BRANDLAB_CONFORMANCE_EVALUATOR_VERSION,\n verificationPolicy: BRANDLAB_VERIFICATION_POLICY_VERSION,\n });\n const implementationFingerprint = digestBrandlabAuthority({\n packageJson: packageJson ?? null,\n packageLock: packageLock.fingerprint,\n brandlabConfig: readOptionalText(join(root, \"brandlab.config.ts\")),\n findings: sortedFindings.map(({ ruleId, severity, path, line }) => ({\n ruleId,\n severity,\n path: path ?? null,\n line: line ?? null,\n })),\n });\n\n return {\n schemaVersion: BRANDLAB_CONFORMANCE_SCHEMA_VERSION,\n evaluatorVersion: BRANDLAB_CONFORMANCE_EVALUATOR_VERSION,\n authorityDigest,\n contractDigest,\n implementationFingerprint,\n mode,\n installedRelease,\n findings: operationalFindings,\n operationalFindings,\n verification: policyResult.verification,\n summary: policyResult.verification.summary,\n };\n}\n\nexport function shouldFailBrandlabConformance(result: BrandlabConformanceResult): boolean {\n return result.verification.summary.blockers > 0;\n}\n\nexport function detectInstalledBrandlabRelease(\n packageJson: ProjectPackageJsonLike | null,\n): string | null {\n if (!packageJson) return null;\n const versions = BRANDLAB_SHARED_PACKAGE_NAMES.map(\n (packageName) =>\n packageJson.dependencies?.[packageName] ??\n packageJson.devDependencies?.[packageName] ??\n null,\n );\n if (versions.some((version) => !version || !isBrandlabSemver(version))) return null;\n return new Set(versions).size === 1 ? versions[0] : null;\n}\n\nfunction inspectRelease(options: {\n findings: BrandlabFinding[];\n packageJson: ProjectPackageJsonLike | null;\n packageLock: PackageLockInspection;\n installedRelease: string | null;\n detectedRelease: string | null;\n manifest: BrandlabRuntimeReleaseContract | null;\n attestation: BrandlabReleaseManifest | null;\n}) {\n if (!options.packageJson) {\n options.findings.push(releaseFinding(\n \"brandlab-release-package-json-missing\",\n \"A readable package.json\",\n \"package.json is missing or invalid.\",\n \"Restore a valid package.json.\",\n ));\n return;\n }\n if (!options.installedRelease) {\n options.findings.push(releaseFinding(\n \"brandlab-release-installed-version-unresolved\",\n \"All four Brandlab packages pinned to one exact release\",\n \"The installed Brandlab release could not be resolved.\",\n \"Pin all four packages to one exact supported version.\",\n ));\n return;\n }\n if (!options.manifest) {\n options.findings.push(releaseFinding(\n \"brandlab-release-unsupported\",\n \"The release selected by the active Brandlab channel\",\n `${options.installedRelease} is not supported by the active platform.`,\n \"Upgrade the project to the current candidate before further work.\",\n ));\n return;\n }\n\n if (options.detectedRelease !== options.installedRelease) {\n options.findings.push(releaseFinding(\n \"brandlab-release-declared-installed-mismatch\",\n options.installedRelease,\n options.detectedRelease ?? \"unresolved\",\n \"Restore one exact package version across all four Brandlab packages.\",\n \"package.json\",\n ));\n }\n\n inspectBrandlabPackages({\n findings: options.findings,\n packageJson: options.packageJson,\n packageLock: options.packageLock,\n installedRelease: options.installedRelease,\n attestation: options.attestation,\n });\n inspectRuntime({\n findings: options.findings,\n packageJson: options.packageJson,\n packageLock: options.packageLock,\n manifest: options.manifest,\n });\n}\n\nfunction inspectBrandlabPackages(options: {\n findings: BrandlabFinding[];\n packageJson: ProjectPackageJsonLike;\n packageLock: PackageLockInspection;\n installedRelease: string;\n attestation: BrandlabReleaseManifest | null;\n}) {\n if (options.packageLock.state !== \"valid\") {\n options.findings.push(releaseFinding(\n `brandlab-release-package-lock-${options.packageLock.state}`,\n \"A valid npm lockfile v2 or v3\",\n `package-lock.json state is ${options.packageLock.state}.`,\n \"Regenerate the lockfile from the exact package declarations.\",\n \"package-lock.json\",\n ));\n return;\n }\n\n for (const packageName of BRANDLAB_SHARED_PACKAGE_NAMES) {\n const declared = declaredPackageSpec(options.packageJson, packageName);\n const locked = lockedRootSpec(options.packageLock, packageName);\n const resolved = options.packageLock.resolvedPackages.get(packageName);\n const duplicate =\n options.packageJson.dependencies?.[packageName] !== undefined &&\n options.packageJson.devDependencies?.[packageName] !== undefined;\n if (duplicate || declared !== options.installedRelease || locked !== declared) {\n options.findings.push(releaseFinding(\n \"brandlab-release-package-pin-mismatch\",\n `${packageName}@${options.installedRelease} declared once and locked exactly`,\n `package.json=${declared ?? \"missing\"}; lockfile=${locked ?? \"missing\"}; duplicate=${String(duplicate)}.`,\n \"Restore exact lockstep package declarations and regenerate the lockfile.\",\n \"package.json\",\n ));\n }\n if (\n !resolved ||\n resolved.version !== options.installedRelease ||\n resolved.linked ||\n !resolved.integrity ||\n !resolved.resolved ||\n !isApprovedRegistryResolution(\n resolved.resolved,\n packageName,\n options.installedRelease,\n )\n ) {\n options.findings.push(releaseFinding(\n \"brandlab-release-package-resolution-mismatch\",\n `${packageName}@${options.installedRelease} from the canonical npm registry`,\n !resolved\n ? \"The resolved lockfile package is missing.\"\n : `version=${resolved.version ?? \"missing\"}; linked=${String(resolved.linked)}; integrity=${resolved.integrity ? \"present\" : \"missing\"}.`,\n \"Run a clean npm install from the exact published release.\",\n \"package-lock.json\",\n ));\n }\n const expectedIntegrity =\n options.attestation?.packages[packageName].registry.integrity ?? null;\n if (expectedIntegrity && resolved?.integrity !== expectedIntegrity) {\n options.findings.push(releaseFinding(\n \"brandlab-release-package-integrity-mismatch\",\n `${packageName} integrity matching the immutable manifest`,\n \"The lockfile integrity differs from the release attestation.\",\n \"Regenerate the lockfile from the verified registry package.\",\n \"package-lock.json\",\n ));\n }\n }\n}\n\nfunction inspectRuntime(options: {\n findings: BrandlabFinding[];\n packageJson: ProjectPackageJsonLike;\n packageLock: PackageLockInspection;\n manifest: BrandlabRuntimeReleaseContract;\n}) {\n for (const [packageName, runtimeField] of RUNTIME_PACKAGE_FIELDS) {\n const expected = options.manifest.runtime[runtimeField];\n const declared = declaredPackageSpec(options.packageJson, packageName);\n const locked = lockedRootSpec(options.packageLock, packageName);\n const resolved = options.packageLock.resolvedPackages.get(packageName);\n if (\n !runtimeVersionSatisfiesRelease(packageName, declared, expected) ||\n locked !== declared ||\n resolved?.version !== declared ||\n resolved.linked\n ) {\n options.findings.push(runtimeFinding(\n `brandlab-runtime-${slugify(packageName)}`,\n runtimeExpectation(packageName, expected),\n `package.json=${declared ?? \"missing\"}; lockfile=${locked ?? \"missing\"}; resolved=${resolved?.version ?? \"missing\"}.`,\n `Use the supported ${options.manifest.releaseVersion} runtime or a newer exact stable release in the same framework major.`,\n \"package.json\",\n ));\n }\n }\n\n const node = options.packageJson.engines?.node ?? null;\n const lockNode = options.packageLock.rootEngines.node ?? null;\n if (node !== options.manifest.runtime.node || lockNode !== node) {\n options.findings.push(runtimeFinding(\n \"brandlab-runtime-node\",\n `engines.node=${options.manifest.runtime.node}`,\n `package.json=${node ?? \"missing\"}; lockfile=${lockNode ?? \"missing\"}.`,\n \"Restore the supported Node engine and regenerate the lockfile.\",\n \"package.json\",\n ));\n }\n if (options.packageJson.packageManager !== options.manifest.runtime.packageManager) {\n options.findings.push(runtimeFinding(\n \"brandlab-runtime-package-manager\",\n options.manifest.runtime.packageManager,\n options.packageJson.packageManager ?? \"missing\",\n \"Use the package manager declared by the current release.\",\n \"package.json\",\n ));\n }\n\n const expectedSharp = options.manifest.runtime.sharp;\n if (expectedSharp) {\n const override = options.packageJson.overrides?.sharp ?? null;\n if (\n override !== expectedSharp ||\n options.packageLock.sharpResolutions.length !== 1 ||\n options.packageLock.sharpResolutions[0]?.version !== expectedSharp\n ) {\n options.findings.push(runtimeFinding(\n \"brandlab-runtime-sharp\",\n `one sharp@${expectedSharp} resolution`,\n `override=${override ?? \"missing\"}; resolutions=${options.packageLock.sharpResolutions.map((entry) => `${entry.path}=${entry.version}`).join(\", \") || \"none\"}.`,\n \"Restore the release-owned Sharp override and regenerate the lockfile.\",\n \"package-lock.json\",\n ));\n }\n }\n}\n\nfunction inspectProjectConfig(root: string, findings: BrandlabFinding[]) {\n const configPath = join(root, \"brandlab.config.ts\");\n const source = readOptionalText(configPath);\n if (!source) {\n findings.push(staticFinding({\n ruleId: \"brandlab-config-missing\",\n surface: \"routes\",\n path: \"brandlab.config.ts\",\n expected: \"One small typed Brandlab project configuration\",\n actual: \"brandlab.config.ts is missing.\",\n remediation: \"Add project identity, route families and enabled capabilities.\",\n }));\n return;\n }\n if (\n !/\\bdefineBrandlabProject\\s*\\(\\s*\\{/.test(source) ||\n !/\\bprojectId\\s*:\\s*['\"][a-z0-9][a-z0-9-]*['\"]/.test(source) ||\n !/\\bprofile\\s*:\\s*['\"]next-(?:local-service|root-level)['\"]/.test(source)\n ) {\n findings.push(staticFinding({\n ruleId: \"brandlab-config-invalid\",\n surface: \"routes\",\n path: \"brandlab.config.ts\",\n expected: \"A literal defineBrandlabProject configuration with projectId and profile\",\n actual: \"The minimum project identity contract could not be verified.\",\n remediation: \"Keep the configuration literal and limited to project variation.\",\n }));\n }\n\n const envSource = readOptionalText(join(root, \".env.example\")) ?? \"\";\n if (/\\bcontact\\s*:\\s*\\{/.test(source)) {\n requireEnvKey(findings, envSource, \"RESEND_API_KEY\", \"contact\");\n requireEnvKey(findings, envSource, \"CONTACT_EMAIL\", \"contact\");\n }\n const reviewsConfig = source.match(/\\breviews\\s*:\\s*\\{([^{}]*)\\}/)?.[1] ?? \"\";\n const usesLiveGooglePlacesReviews =\n /\\bprovider\\s*:\\s*['\"]google-places['\"]/.test(reviewsConfig) &&\n /\\bmode\\s*:\\s*['\"](?:summary|full)['\"]/.test(reviewsConfig);\n if (usesLiveGooglePlacesReviews) {\n requireEnvKey(findings, envSource, \"GOOGLE_MAPS_PLATFORM_API_KEY\", \"reviews\");\n }\n for (const retired of [\"CONTACT_CONTEXT_SECRET\", \"KV_REST_API_URL\", \"KV_REST_API_TOKEN\"]) {\n if (new RegExp(`^${retired}=`, \"m\").test(envSource)) {\n findings.push(staticFinding({\n ruleId: \"brandlab-environment-retired-contact-state\",\n surface: \"environment\",\n path: \".env.example\",\n expected: \"Only current contact environment variables\",\n actual: `${retired} is still documented.`,\n remediation: `Remove ${retired}; it is not part of the simplified contact standard.`,\n }));\n }\n }\n}\n\nfunction requireEnvKey(\n findings: BrandlabFinding[],\n envSource: string,\n key: string,\n capability: string,\n) {\n if (new RegExp(`^${key}=`, \"m\").test(envSource)) return;\n findings.push(staticFinding({\n ruleId: `brandlab-environment-${capability}-${slugify(key)}`,\n surface: \"environment\",\n path: \".env.example\",\n expected: `${key} documented for the enabled ${capability} capability`,\n actual: `${key} is missing from .env.example.`,\n remediation: `Document the non-secret ${key} variable name without adding a credential value.`,\n }));\n}\n\nfunction inspectProjectSource(root: string, findings: BrandlabFinding[]) {\n const sourceRoot = join(root, \"src\");\n if (!existsSync(sourceRoot)) return;\n for (const file of sourceFiles(sourceRoot)) {\n const source = readFileSync(file, \"utf8\");\n const executableSource = stripCommentsPreservingLayout(source);\n for (const rule of SOURCE_RULES) {\n const match = executableSource.match(rule.pattern);\n if (!match || match.index === undefined) continue;\n findings.push(staticFinding({\n ruleId: rule.ruleId,\n surface: rule.surface,\n path: normalizePath(relative(root, file)),\n line: lineAt(source, match.index),\n expected: rule.expected,\n actual: \"A project-owned implementation was detected.\",\n remediation: rule.remediation,\n }));\n }\n }\n}\n\nfunction stripCommentsPreservingLayout(source: string): string {\n const output = [...source];\n let state: \"code\" | \"single\" | \"double\" | \"template\" | \"line\" | \"block\" =\n \"code\";\n let escaped = false;\n\n for (let index = 0; index < output.length; index += 1) {\n const current = output[index];\n const next = output[index + 1];\n\n if (state === \"line\") {\n if (current === \"\\n\" || current === \"\\r\") {\n state = \"code\";\n } else {\n output[index] = \" \";\n }\n continue;\n }\n\n if (state === \"block\") {\n if (current === \"*\" && next === \"/\") {\n output[index] = \" \";\n output[index + 1] = \" \";\n index += 1;\n state = \"code\";\n } else if (current !== \"\\n\" && current !== \"\\r\") {\n output[index] = \" \";\n }\n continue;\n }\n\n if (state !== \"code\") {\n if (escaped) {\n escaped = false;\n } else if (current === \"\\\\\") {\n escaped = true;\n } else if (\n (state === \"single\" && current === \"'\") ||\n (state === \"double\" && current === '\"') ||\n (state === \"template\" && current === \"`\")\n ) {\n state = \"code\";\n }\n continue;\n }\n\n if (current === \"'\") {\n state = \"single\";\n } else if (current === '\"') {\n state = \"double\";\n } else if (current === \"`\") {\n state = \"template\";\n } else if (current === \"/\" && next === \"/\") {\n output[index] = \" \";\n output[index + 1] = \" \";\n index += 1;\n state = \"line\";\n } else if (current === \"/\" && next === \"*\") {\n output[index] = \" \";\n output[index + 1] = \" \";\n index += 1;\n state = \"block\";\n }\n }\n\n return output.join(\"\");\n}\n\nfunction sourceFiles(root: string): string[] {\n const files: string[] = [];\n for (const entry of readdirSync(root, { withFileTypes: true })) {\n if (entry.name.startsWith(\".\") || entry.name === \"node_modules\") continue;\n const path = join(root, entry.name);\n if (entry.isDirectory()) {\n files.push(...sourceFiles(path));\n continue;\n }\n if (\n SOURCE_EXTENSIONS.has(extension(entry.name)) &&\n !/\\.(?:test|spec)\\.[cm]?[jt]sx?$/.test(entry.name)\n ) {\n files.push(path);\n }\n }\n return files.sort();\n}\n\nfunction readPackageJson(root: string): ProjectPackageJsonLike | null {\n const source = readOptionalText(join(root, \"package.json\"));\n if (!source) return null;\n try {\n return JSON.parse(source) as ProjectPackageJsonLike;\n } catch {\n return null;\n }\n}\n\nfunction readPackageLock(root: string): PackageLockInspection {\n const source = readOptionalText(join(root, \"package-lock.json\"));\n if (!source) return emptyPackageLock(\"missing\");\n let parsed: unknown;\n try {\n parsed = JSON.parse(source);\n } catch {\n return emptyPackageLock(\"invalid\", { digest: digestBrandlabAuthority(source) });\n }\n if (!isRecord(parsed)) return emptyPackageLock(\"invalid\");\n const lockfileVersion =\n typeof parsed.lockfileVersion === \"number\" ? parsed.lockfileVersion : null;\n if (lockfileVersion !== 2 && lockfileVersion !== 3) {\n return emptyPackageLock(\"unsupported\", { lockfileVersion });\n }\n if (!isRecord(parsed.packages) || !isRecord(parsed.packages[\"\"])) {\n return emptyPackageLock(\"invalid\", { lockfileVersion });\n }\n\n const rootPackage = parsed.packages[\"\"];\n const rootDependencies = stringRecord(rootPackage.dependencies);\n const rootDevDependencies = stringRecord(rootPackage.devDependencies);\n const rootEngines = stringRecord(rootPackage.engines);\n const resolvedPackages = new Map<string, LockedPackage>();\n const packageNames = [\n ...BRANDLAB_SHARED_PACKAGE_NAMES,\n ...RUNTIME_PACKAGE_FIELDS.map(([name]) => name),\n \"sharp\",\n ];\n for (const packageName of packageNames) {\n const entry = parsed.packages[`node_modules/${packageName}`];\n if (!isRecord(entry)) continue;\n resolvedPackages.set(packageName, {\n version: typeof entry.version === \"string\" ? entry.version : null,\n resolved: typeof entry.resolved === \"string\" ? entry.resolved : null,\n integrity: typeof entry.integrity === \"string\" ? entry.integrity : null,\n linked: entry.link === true,\n });\n }\n const sharpResolutions = Object.entries(parsed.packages)\n .filter(([path]) => path === \"node_modules/sharp\" || path.endsWith(\"/node_modules/sharp\"))\n .map(([path, entry]) => ({\n path,\n version: isRecord(entry) && typeof entry.version === \"string\" ? entry.version : null,\n }))\n .sort((left, right) => left.path.localeCompare(right.path));\n return {\n state: \"valid\",\n lockfileVersion,\n rootDependencies,\n rootDevDependencies,\n rootEngines,\n resolvedPackages,\n sharpResolutions,\n fingerprint: {\n lockfileVersion,\n rootDependencies,\n rootDevDependencies,\n rootEngines,\n resolved: Object.fromEntries(\n [...resolvedPackages].map(([name, value]) => [\n name,\n { version: value.version, linked: value.linked },\n ]),\n ),\n sharpResolutions,\n },\n };\n}\n\nfunction emptyPackageLock(\n state: Exclude<PackageLockInspection[\"state\"], \"valid\">,\n fingerprint: Record<string, unknown> = {},\n): PackageLockInspection {\n return {\n state,\n lockfileVersion:\n typeof fingerprint.lockfileVersion === \"number\"\n ? fingerprint.lockfileVersion\n : null,\n rootDependencies: {},\n rootDevDependencies: {},\n rootEngines: {},\n resolvedPackages: new Map(),\n sharpResolutions: [],\n fingerprint: { state, ...fingerprint },\n };\n}\n\nfunction runtimeVersionSatisfiesRelease(\n packageName: (typeof RUNTIME_PACKAGE_FIELDS)[number][0],\n actual: string | null,\n expected: string,\n): boolean {\n if (!actual || !isBrandlabSemver(actual)) return false;\n if (![\"next\", \"react\", \"react-dom\"].includes(packageName)) return actual === expected;\n const actualParts = actual.match(/^(\\d+)\\.(\\d+)\\.(\\d+)$/);\n const expectedParts = expected.match(/^(\\d+)\\.(\\d+)\\.(\\d+)$/);\n const sameSupportedLine = packageName === \"next\"\n ? actualParts?.[1] === expectedParts?.[1]\n : actualParts?.[1] === expectedParts?.[1] && actualParts?.[2] === expectedParts?.[2];\n return Boolean(\n actualParts &&\n expectedParts &&\n sameSupportedLine &&\n compareBrandlabSemver(actual, expected) >= 0,\n );\n}\n\nfunction runtimeExpectation(packageName: string, expected: string): string {\n if (packageName === \"next\") {\n return `${packageName}@${expected} or a newer exact stable release in the same major line`;\n }\n return [\"react\", \"react-dom\"].includes(packageName)\n ? `${packageName}@${expected} or a newer exact patch in the same major/minor line`\n : `${packageName}@${expected}`;\n}\n\nfunction isApprovedRegistryResolution(\n resolved: string,\n packageName: string,\n version: string,\n): boolean {\n try {\n const url = new URL(resolved);\n const artifact = packageName.split(\"/\").at(-1);\n return Boolean(\n artifact &&\n url.protocol === \"https:\" &&\n url.hostname === \"registry.npmjs.org\" &&\n url.pathname === `/${packageName}/-/${artifact}-${version}.tgz`,\n );\n } catch {\n return false;\n }\n}\n\nfunction declaredPackageSpec(\n packageJson: ProjectPackageJsonLike,\n packageName: string,\n): string | null {\n return (\n packageJson.dependencies?.[packageName] ??\n packageJson.devDependencies?.[packageName] ??\n null\n );\n}\n\nfunction lockedRootSpec(\n lock: PackageLockInspection,\n packageName: string,\n): string | null {\n return lock.rootDependencies[packageName] ?? lock.rootDevDependencies[packageName] ?? null;\n}\n\nfunction releaseFinding(\n ruleId: string,\n expected: string,\n actual: string,\n remediation: string,\n path?: string,\n): BrandlabFinding {\n return {\n ruleId,\n surface: \"release\",\n severity: \"blocker\",\n contract: { name: \"release\", version: \"current-release\" },\n evidenceKind: \"static\",\n ...(path ? { path } : {}),\n expected,\n actual,\n remediation,\n };\n}\n\nfunction runtimeFinding(\n ruleId: string,\n expected: string,\n actual: string,\n remediation: string,\n path: string,\n): BrandlabFinding {\n return {\n ruleId,\n surface: \"runtime\",\n severity: \"blocker\",\n contract: { name: \"runtime\", version: \"installed-release\" },\n evidenceKind: \"static\",\n path,\n expected,\n actual,\n remediation,\n };\n}\n\nfunction staticFinding(options: {\n ruleId: string;\n surface: string;\n expected: string;\n actual: string;\n remediation: string;\n path?: string;\n line?: number;\n}): BrandlabFinding {\n return {\n ruleId: options.ruleId,\n surface: options.surface,\n severity: \"blocker\",\n contract: { name: \"project\", version: \"current-only-v2\" },\n evidenceKind: \"static\",\n ...(options.path ? { path: options.path } : {}),\n ...(options.line ? { line: options.line } : {}),\n expected: options.expected,\n actual: options.actual,\n remediation: options.remediation,\n };\n}\n\nfunction compareFindings(left: BrandlabFinding, right: BrandlabFinding): number {\n return (\n left.ruleId.localeCompare(right.ruleId) ||\n (left.path ?? \"\").localeCompare(right.path ?? \"\") ||\n (left.line ?? 0) - (right.line ?? 0)\n );\n}\n\nfunction readOptionalText(path: string): string | null {\n return existsSync(path) ? readFileSync(path, \"utf8\") : null;\n}\n\nfunction stringRecord(value: unknown): Record<string, string> {\n if (!isRecord(value)) return {};\n return Object.fromEntries(\n Object.entries(value).filter(\n (entry): entry is [string, string] => typeof entry[1] === \"string\",\n ),\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction extension(name: string): string {\n const index = name.lastIndexOf(\".\");\n return index === -1 ? \"\" : name.slice(index);\n}\n\nfunction lineAt(source: string, index: number): number {\n return source.slice(0, index).split(\"\\n\").length;\n}\n\nfunction slugify(value: string): string {\n return value.toLowerCase().replace(/[^a-z0-9]+/g, \"-\").replace(/^-|-$/g, \"\");\n}\n\nfunction normalizePath(value: string): string {\n return value.split(/[/\\\\]/).join(\"/\");\n}\n\nexport type { BrandlabContractVersions };\n"]}
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync, readdirSync } from \"node:fs\";\nimport { join, relative, resolve } from \"node:path\";\nimport { BRANDLAB_CURRENT_RUNTIME_RELEASE } from \"./current-release.js\";\nimport { verifyPackedPreflight, type PackedPreflight } from \"./packed-preflight.js\";\nimport {\n BRANDLAB_SHARED_PACKAGE_NAMES,\n compareBrandlabSemver,\n digestBrandlabAuthority,\n isBrandlabSemver,\n type BrandlabContractVersions,\n type BrandlabReleaseManifest,\n type BrandlabRuntimeReleaseContract,\n projectBrandlabRuntimeReleaseContract,\n validateBrandlabReleaseManifest,\n validateBrandlabRuntimeReleaseContract,\n} from \"./release-manifest.js\";\nimport {\n applyBrandlabVerificationPolicy,\n BRANDLAB_VERIFICATION_POLICY_VERSION,\n type BrandlabOperationalFinding,\n type BrandlabVerificationEvidence,\n type BrandlabVerificationResult,\n} from \"./verification-policy.js\";\n\nexport {\n BRANDLAB_VERIFICATION_CHECKS,\n BRANDLAB_VERIFICATION_FAMILIES,\n BRANDLAB_VERIFICATION_POLICY_VERSION,\n type BrandlabVerificationCheckId,\n type BrandlabVerificationCheckResult,\n type BrandlabVerificationEvidence,\n type BrandlabVerificationEvidenceKind,\n type BrandlabVerificationFamilyId,\n type BrandlabVerificationFamilyResult,\n type BrandlabVerificationResult,\n type BrandlabVerificationStatus,\n} from \"./verification-policy.js\";\n\nexport const BRANDLAB_CONFORMANCE_SCHEMA_VERSION = \"brandlab.conformance.v2\";\nexport const BRANDLAB_CONFORMANCE_EVALUATOR_VERSION = \"current-only-v2\";\n\nconst RUNTIME_PACKAGE_FIELDS = [\n [\"next\", \"next\"],\n [\"react\", \"react\"],\n [\"react-dom\", \"reactDom\"],\n [\"typescript\", \"typescript\"],\n] as const;\n\nconst SOURCE_EXTENSIONS = new Set([\".js\", \".jsx\", \".mjs\", \".ts\", \".tsx\"]);\n\nexport type BrandlabConformanceMode = \"local\" | \"ci\" | \"preflight\";\nexport type BrandlabFindingSeverity = \"blocker\" | \"warning\" | \"info\";\n\nexport interface BrandlabFinding {\n ruleId: string;\n surface: string;\n severity: BrandlabFindingSeverity;\n contract: { name: string; version: string };\n evidenceKind: \"static\" | \"behavioural\" | \"runtime\";\n path?: string;\n line?: number;\n expected: string;\n actual: string;\n remediation: string;\n}\n\nexport interface ConformanceSummary {\n status: \"pass\" | \"warning\" | \"blocked\";\n total: number;\n blockers: number;\n warnings: number;\n info: number;\n}\n\nexport interface BrandlabConformanceResult {\n packedPreflight?: PackedPreflight;\n schemaVersion: typeof BRANDLAB_CONFORMANCE_SCHEMA_VERSION;\n evaluatorVersion: typeof BRANDLAB_CONFORMANCE_EVALUATOR_VERSION;\n authorityDigest: string;\n contractDigest: string;\n implementationFingerprint: string;\n mode: BrandlabConformanceMode;\n installedRelease: string | null;\n findings: BrandlabFinding[];\n operationalFindings: BrandlabOperationalFinding[];\n verification: BrandlabVerificationResult;\n summary: ConformanceSummary;\n}\n\nexport interface EvaluateBrandlabProjectOptions {\n packedReleaseReceipt?: string;\n root: string;\n installedRelease?: string | null;\n mode?: BrandlabConformanceMode;\n release?: BrandlabRuntimeReleaseContract;\n releaseManifest?: BrandlabReleaseManifest;\n verificationEvidence?: readonly BrandlabVerificationEvidence[];\n}\n\ninterface ProjectPackageJsonLike {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n engines?: Record<string, string>;\n overrides?: Record<string, string>;\n packageManager?: string;\n}\n\ninterface LockedPackage {\n version: string | null;\n resolved: string | null;\n integrity: string | null;\n linked: boolean;\n}\n\ninterface PackageLockInspection {\n state: \"valid\" | \"missing\" | \"invalid\" | \"unsupported\";\n lockfileVersion: number | null;\n rootDependencies: Record<string, string>;\n rootDevDependencies: Record<string, string>;\n rootEngines: Record<string, string>;\n resolvedPackages: ReadonlyMap<string, LockedPackage>;\n sharpResolutions: readonly { path: string; version: string | null }[];\n fingerprint: Record<string, unknown>;\n}\n\ninterface SourceRule {\n ruleId: string;\n surface: string;\n pattern: RegExp;\n expected: string;\n remediation: string;\n}\n\nconst SOURCE_RULES: readonly SourceRule[] = [\n {\n ruleId: \"brandlab-source-retired-analytics-event\",\n surface: \"analytics\",\n pattern: /\\b(?:contact_form_submission|phone_call|phone_calls|form_start|cta_click)\\b/,\n expected: \"Only the current Brandlab analytics event contract is used.\",\n remediation: \"Use contact_form for accepted forms and phone_link_click for telephone-link diagnostics.\",\n },\n {\n ruleId: \"brandlab-source-local-google-tag-bootstrap\",\n surface: \"analytics\",\n pattern: /googletagmanager\\.com\\/gtag\\/js|window\\.dataLayer\\s*=\\s*window\\.dataLayer|function\\s+gtag\\s*\\(/,\n expected: \"Google tag bootstrap is owned by the shared analytics runtime.\",\n remediation: \"Remove the project-local bootstrap and supply only approved analytics identifiers.\",\n },\n {\n ruleId: \"brandlab-source-local-contact-delivery\",\n surface: \"contact\",\n pattern: /\\.emails\\.send\\s*\\(|resend\\.emails\\.send\\s*\\(/,\n expected: \"Email delivery is owned by the shared contact runtime.\",\n remediation: \"Pass the Resend client to the shared contact adapter instead of sending locally.\",\n },\n {\n ruleId: \"brandlab-source-local-contact-email-renderer\",\n surface: \"contact\",\n pattern: /\\bContactFormEmail\\b|\\brenderContactEmail\\b/,\n expected: \"Contact email rendering is owned by the shared contact runtime.\",\n remediation: \"Remove the local email renderer and configure shared brand variation only.\",\n },\n {\n ruleId: \"brandlab-source-local-contact-attachments\",\n surface: \"contact\",\n pattern: /from\\s+['\\\"]browser-image-compression['\\\"]|import\\s*\\(\\s*['\\\"]browser-image-compression['\\\"]\\s*\\)|(?:function|const)\\s+useContactAttachments\\b/,\n expected: \"Contact attachment preparation is owned by the shared contact runtime.\",\n remediation: \"Use useBrandlabContactAttachments from @brandlab-digital/site-next/contact/client.\",\n },\n {\n ruleId: \"brandlab-source-contact-draft-persistence\",\n surface: \"contact\",\n pattern: /(?:function|const)\\s+useFormDraftPersistence\\b/,\n expected: \"Contact details are not persisted in browser storage.\",\n remediation: \"Keep contact details in memory and clear them when the page closes.\",\n },\n {\n ruleId: \"brandlab-source-dangerously-set-inner-html\",\n surface: \"security\",\n pattern: /\\bdangerouslySetInnerHTML\\b/,\n expected: \"No project-owned raw HTML injection.\",\n remediation: \"Use structured React output or the shared sanitised renderer.\",\n },\n {\n ruleId: \"brandlab-source-raw-json-ld\",\n surface: \"schema\",\n pattern: /application\\/ld\\+json/,\n expected: \"Structured data is rendered through the shared schema component.\",\n remediation: \"Replace raw JSON-LD output with the shared schema graph renderer.\",\n },\n {\n ruleId: \"brandlab-source-self-serving-rating-schema\",\n surface: \"schema\",\n pattern: /['\"]AggregateRating['\"]/,\n expected: \"No self-serving aggregate rating schema.\",\n remediation: \"Show verified review proof visibly without LocalBusiness or Organization rating schema.\",\n },\n {\n ruleId: \"brandlab-source-synthetic-offer-schema\",\n surface: \"schema\",\n pattern: /\\bpriceValidUntil\\b|['\"]@type['\"]\\s*:\\s*['\"]Offer['\"]/,\n expected: \"No synthetic Offer markup on service pages.\",\n remediation: \"Remove invented Offer data and use the shared service schema.\",\n },\n {\n ruleId: \"brandlab-source-local-google-reviews-fetch\",\n surface: \"reviews\",\n pattern: /places\\.googleapis\\.com|maps\\.googleapis\\.com\\/maps\\/api\\/place/,\n expected: \"Google Places fetching is owned by the shared review runtime.\",\n remediation: \"Provide only the verified Place ID, Maps URL and server-side API key.\",\n },\n {\n ruleId: \"brandlab-source-public-secret\",\n surface: \"security\",\n pattern: /NEXT_PUBLIC_[A-Z0-9_]*(?:API_KEY|SECRET|TOKEN)/,\n expected: \"Secrets remain server-only.\",\n remediation: \"Move the credential to an approved server-only environment variable.\",\n },\n {\n ruleId: \"brandlab-source-retired-contact-state\",\n surface: \"contact\",\n pattern: /\\bCONTACT_CONTEXT_SECRET\\b|\\bKV_REST_API_(?:URL|TOKEN)\\b/,\n expected: \"The simplified contact runtime has no project-level state-service requirement.\",\n remediation: \"Remove the retired contact state variables and use the shared stateless contact flow.\",\n },\n];\n\nexport function evaluateBrandlabProject(\n options: EvaluateBrandlabProjectOptions,\n): BrandlabConformanceResult {\n const root = resolve(options.root);\n const mode = options.mode ?? \"local\";\n const release = options.release ?? BRANDLAB_CURRENT_RUNTIME_RELEASE;\n validateBrandlabRuntimeReleaseContract(release);\n if (options.releaseManifest) {\n validateBrandlabReleaseManifest(options.releaseManifest);\n if (\n digestBrandlabAuthority(projectBrandlabRuntimeReleaseContract(options.releaseManifest)) !==\n digestBrandlabAuthority(release)\n ) {\n throw new Error(\"The release manifest differs from the embedded current release.\");\n }\n }\n\n const packageJson = readPackageJson(root);\n const packageLock = readPackageLock(root);\n if (options.packedReleaseReceipt && mode !== \"preflight\") {\n throw new Error(\"Local packed artifacts are permitted only in explicit preflight mode.\");\n }\n const packedPreflight = options.packedReleaseReceipt\n ? verifyPackedPreflight(root, resolve(options.packedReleaseReceipt)) : undefined;\n const detectedRelease = packedPreflight?.version ?? detectInstalledBrandlabRelease(packageJson);\n const installedRelease =\n options.installedRelease === undefined ? detectedRelease : options.installedRelease;\n const manifest = release.releaseVersion === installedRelease ? release : null;\n const attestation =\n options.releaseManifest?.releaseVersion === installedRelease\n ? options.releaseManifest\n : null;\n const findings: BrandlabFinding[] = [];\n\n inspectRelease({\n findings,\n packageJson,\n packageLock,\n installedRelease,\n detectedRelease,\n manifest,\n attestation,\n packedPreflight,\n });\n if (manifest?.runtime.nextVersionPolicy === \"exact\") inspectImageRuntime(root, findings);\n inspectProjectConfig(root, findings);\n inspectProjectSource(root, findings);\n\n const sortedFindings = findings.sort(compareFindings);\n const policyResult = applyBrandlabVerificationPolicy(\n sortedFindings,\n options.verificationEvidence,\n );\n const operationalFindings = policyResult.operationalFindings.sort(compareFindings);\n const authorityDigest = digestBrandlabAuthority({\n release,\n releaseManifest: options.releaseManifest ?? null,\n ...(packedPreflight ? { packedReceipt: packedPreflight.receiptDigest } : {}),\n });\n const contractDigest = digestBrandlabAuthority({\n installed: manifest?.contracts ?? null,\n evaluator: BRANDLAB_CONFORMANCE_EVALUATOR_VERSION,\n verificationPolicy: BRANDLAB_VERIFICATION_POLICY_VERSION,\n });\n const implementationFingerprint = digestBrandlabAuthority({\n packageJson: packageJson ?? null,\n packageLock: packageLock.fingerprint,\n brandlabConfig: readOptionalText(join(root, \"brandlab.config.ts\")),\n nextConfig: [\"next.config.ts\", \"next.config.mts\", \"next.config.mjs\", \"next.config.js\"]\n .map((name) => [name, readOptionalText(join(root, name))]),\n findings: sortedFindings.map(({ ruleId, severity, path, line }) => ({\n ruleId,\n severity,\n path: path ?? null,\n line: line ?? null,\n })),\n });\n\n return {\n schemaVersion: BRANDLAB_CONFORMANCE_SCHEMA_VERSION,\n ...(packedPreflight ? { packedPreflight } : {}),\n evaluatorVersion: BRANDLAB_CONFORMANCE_EVALUATOR_VERSION,\n authorityDigest,\n contractDigest,\n implementationFingerprint,\n mode,\n installedRelease,\n findings: operationalFindings,\n operationalFindings,\n verification: policyResult.verification,\n summary: policyResult.verification.summary,\n };\n}\n\nexport function shouldFailBrandlabConformance(result: BrandlabConformanceResult): boolean {\n return result.verification.summary.blockers > 0;\n}\n\nexport function detectInstalledBrandlabRelease(\n packageJson: ProjectPackageJsonLike | null,\n): string | null {\n if (!packageJson) return null;\n const versions = BRANDLAB_SHARED_PACKAGE_NAMES.map(\n (packageName) =>\n packageJson.dependencies?.[packageName] ??\n packageJson.devDependencies?.[packageName] ??\n null,\n );\n if (versions.some((version) => !version || !isBrandlabSemver(version))) return null;\n return new Set(versions).size === 1 ? versions[0] : null;\n}\n\nfunction inspectRelease(options: {\n packedPreflight?: PackedPreflight;\n findings: BrandlabFinding[];\n packageJson: ProjectPackageJsonLike | null;\n packageLock: PackageLockInspection;\n installedRelease: string | null;\n detectedRelease: string | null;\n manifest: BrandlabRuntimeReleaseContract | null;\n attestation: BrandlabReleaseManifest | null;\n}) {\n if (!options.packageJson) {\n options.findings.push(releaseFinding(\n \"brandlab-release-package-json-missing\",\n \"A readable package.json\",\n \"package.json is missing or invalid.\",\n \"Restore a valid package.json.\",\n ));\n return;\n }\n if (!options.installedRelease) {\n options.findings.push(releaseFinding(\n \"brandlab-release-installed-version-unresolved\",\n \"All four Brandlab packages pinned to one exact release\",\n \"The installed Brandlab release could not be resolved.\",\n \"Pin all four packages to one exact supported version.\",\n ));\n return;\n }\n if (!options.manifest) {\n options.findings.push(releaseFinding(\n \"brandlab-release-unsupported\",\n \"The release selected by the active Brandlab channel\",\n `${options.installedRelease} is not supported by the active platform.`,\n \"Upgrade the project to the current candidate before further work.\",\n ));\n return;\n }\n\n if (options.detectedRelease !== options.installedRelease) {\n options.findings.push(releaseFinding(\n \"brandlab-release-declared-installed-mismatch\",\n options.installedRelease,\n options.detectedRelease ?? \"unresolved\",\n \"Restore one exact package version across all four Brandlab packages.\",\n \"package.json\",\n ));\n }\n\n inspectBrandlabPackages({\n findings: options.findings,\n packageJson: options.packageJson,\n packageLock: options.packageLock,\n installedRelease: options.installedRelease,\n attestation: options.attestation,\n packedPreflight: options.packedPreflight,\n });\n inspectRuntime({\n findings: options.findings,\n packageJson: options.packageJson,\n packageLock: options.packageLock,\n manifest: options.manifest,\n });\n}\n\nfunction inspectBrandlabPackages(options: {\n packedPreflight?: PackedPreflight;\n findings: BrandlabFinding[];\n packageJson: ProjectPackageJsonLike;\n packageLock: PackageLockInspection;\n installedRelease: string;\n attestation: BrandlabReleaseManifest | null;\n}) {\n if (options.packageLock.state !== \"valid\") {\n options.findings.push(releaseFinding(\n `brandlab-release-package-lock-${options.packageLock.state}`,\n \"A valid npm lockfile v2 or v3\",\n `package-lock.json state is ${options.packageLock.state}.`,\n \"Regenerate the lockfile from the exact package declarations.\",\n \"package-lock.json\",\n ));\n return;\n }\n\n for (const packageName of BRANDLAB_SHARED_PACKAGE_NAMES) {\n const declared = declaredPackageSpec(options.packageJson, packageName);\n const locked = lockedRootSpec(options.packageLock, packageName);\n const resolved = options.packageLock.resolvedPackages.get(packageName);\n const duplicate =\n options.packageJson.dependencies?.[packageName] !== undefined &&\n options.packageJson.devDependencies?.[packageName] !== undefined;\n const packed = options.packedPreflight?.packages[packageName];\n if (duplicate || declared !== (packed?.spec ?? options.installedRelease) || locked !== declared) {\n options.findings.push(releaseFinding(\n \"brandlab-release-package-pin-mismatch\",\n `${packageName}@${options.installedRelease} declared once and locked exactly`,\n `package.json=${declared ?? \"missing\"}; lockfile=${locked ?? \"missing\"}; duplicate=${String(duplicate)}.`,\n \"Restore exact lockstep package declarations and regenerate the lockfile.\",\n \"package.json\",\n ));\n }\n if (\n !resolved ||\n resolved.version !== options.installedRelease ||\n resolved.linked ||\n !resolved.integrity ||\n !resolved.resolved ||\n (!packed && !isApprovedRegistryResolution(\n resolved.resolved,\n packageName,\n options.installedRelease,\n ))\n ) {\n options.findings.push(releaseFinding(\n \"brandlab-release-package-resolution-mismatch\",\n `${packageName}@${options.installedRelease} from the canonical npm registry`,\n !resolved\n ? \"The resolved lockfile package is missing.\"\n : `version=${resolved.version ?? \"missing\"}; linked=${String(resolved.linked)}; integrity=${resolved.integrity ? \"present\" : \"missing\"}.`,\n \"Run a clean npm install from the exact published release.\",\n \"package-lock.json\",\n ));\n }\n const expectedIntegrity =\n options.attestation?.packages[packageName].registry.integrity ?? null;\n if (expectedIntegrity && resolved?.integrity !== expectedIntegrity) {\n options.findings.push(releaseFinding(\n \"brandlab-release-package-integrity-mismatch\",\n `${packageName} integrity matching the immutable manifest`,\n \"The lockfile integrity differs from the release attestation.\",\n \"Regenerate the lockfile from the verified registry package.\",\n \"package-lock.json\",\n ));\n }\n }\n}\n\nfunction inspectRuntime(options: {\n findings: BrandlabFinding[];\n packageJson: ProjectPackageJsonLike;\n packageLock: PackageLockInspection;\n manifest: BrandlabRuntimeReleaseContract;\n}) {\n for (const [packageName, runtimeField] of RUNTIME_PACKAGE_FIELDS) {\n const expected = options.manifest.runtime[runtimeField];\n const declared = declaredPackageSpec(options.packageJson, packageName);\n const locked = lockedRootSpec(options.packageLock, packageName);\n const resolved = options.packageLock.resolvedPackages.get(packageName);\n if (\n !runtimeVersionSatisfiesRelease(packageName, declared, expected, options.manifest.runtime.nextVersionPolicy) ||\n locked !== declared ||\n resolved?.version !== declared ||\n resolved.linked\n ) {\n options.findings.push(runtimeFinding(\n `brandlab-runtime-${slugify(packageName)}`,\n runtimeExpectation(packageName, expected, options.manifest.runtime.nextVersionPolicy),\n `package.json=${declared ?? \"missing\"}; lockfile=${locked ?? \"missing\"}; resolved=${resolved?.version ?? \"missing\"}.`,\n `Use the runtime versions permitted by the ${options.manifest.releaseVersion} contract; an exact mitigation pin requires a reviewed policy change before upgrading.`,\n \"package.json\",\n ));\n }\n }\n\n const node = options.packageJson.engines?.node ?? null;\n const lockNode = options.packageLock.rootEngines.node ?? null;\n if (node !== options.manifest.runtime.node || lockNode !== node) {\n options.findings.push(runtimeFinding(\n \"brandlab-runtime-node\",\n `engines.node=${options.manifest.runtime.node}`,\n `package.json=${node ?? \"missing\"}; lockfile=${lockNode ?? \"missing\"}.`,\n \"Restore the supported Node engine and regenerate the lockfile.\",\n \"package.json\",\n ));\n }\n if (options.packageJson.packageManager !== options.manifest.runtime.packageManager) {\n options.findings.push(runtimeFinding(\n \"brandlab-runtime-package-manager\",\n options.manifest.runtime.packageManager,\n options.packageJson.packageManager ?? \"missing\",\n \"Use the package manager declared by the current release.\",\n \"package.json\",\n ));\n }\n\n const expectedSharp = options.manifest.runtime.sharp;\n if (expectedSharp) {\n const override = options.packageJson.overrides?.sharp ?? null;\n if (\n override !== expectedSharp ||\n options.packageLock.sharpResolutions.length !== 1 ||\n options.packageLock.sharpResolutions[0]?.version !== expectedSharp\n ) {\n options.findings.push(runtimeFinding(\n \"brandlab-runtime-sharp\",\n `one sharp@${expectedSharp} resolution`,\n `override=${override ?? \"missing\"}; resolutions=${options.packageLock.sharpResolutions.map((entry) => `${entry.path}=${entry.version}`).join(\", \") || \"none\"}.`,\n \"Restore the release-owned Sharp override and regenerate the lockfile.\",\n \"package-lock.json\",\n ));\n }\n }\n}\n\nfunction inspectImageRuntime(root: string, findings: BrandlabFinding[]) {\n const filename = [\"next.config.ts\", \"next.config.mts\", \"next.config.mjs\", \"next.config.js\"]\n .find((name) => existsSync(join(root, name)));\n const source = filename ? stripCommentsPreservingLayout(readOptionalText(join(root, filename)) ?? \"\") : \"\";\n // A direct side-effect import executes the shared guard before Next starts.\n // This source check is not runtime certification; packed/browser checks prove that separately.\n if (/^\\s*import\\s*['\"]@brandlab-digital\\/site-next\\/image-runtime['\"]/m.test(source) ||\n /^\\s*require\\(\\s*['\"]@brandlab-digital\\/site-next\\/image-runtime['\"]\\s*\\)/m.test(source)) return;\n findings.push(runtimeFinding(\n \"brandlab-runtime-image-initialisation\",\n \"The shared image-runtime side-effect import in next.config\",\n \"The startup decoder exclusion could not be established from configuration.\",\n \"Import @brandlab-digital/site-next/image-runtime at the top of next.config; verify the packed runtime and affected images.\",\n filename ?? \"next.config.ts\",\n ));\n}\n\nfunction inspectProjectConfig(root: string, findings: BrandlabFinding[]) {\n const configPath = join(root, \"brandlab.config.ts\");\n const source = readOptionalText(configPath);\n if (!source) {\n findings.push(staticFinding({\n ruleId: \"brandlab-config-missing\",\n surface: \"routes\",\n path: \"brandlab.config.ts\",\n expected: \"One small typed Brandlab project configuration\",\n actual: \"brandlab.config.ts is missing.\",\n remediation: \"Add project identity, route families and enabled capabilities.\",\n }));\n return;\n }\n if (\n !/\\bdefineBrandlabProject\\s*\\(\\s*\\{/.test(source) ||\n !/\\bprojectId\\s*:\\s*['\"][a-z0-9][a-z0-9-]*['\"]/.test(source) ||\n !/\\bprofile\\s*:\\s*['\"]next-(?:local-service|root-level)['\"]/.test(source)\n ) {\n findings.push(staticFinding({\n ruleId: \"brandlab-config-invalid\",\n surface: \"routes\",\n path: \"brandlab.config.ts\",\n expected: \"A literal defineBrandlabProject configuration with projectId and profile\",\n actual: \"The minimum project identity contract could not be verified.\",\n remediation: \"Keep the configuration literal and limited to project variation.\",\n }));\n }\n\n const envSource = readOptionalText(join(root, \".env.example\")) ?? \"\";\n if (/\\bcontact\\s*:\\s*\\{/.test(source)) {\n requireEnvKey(findings, envSource, \"RESEND_API_KEY\", \"contact\");\n requireEnvKey(findings, envSource, \"CONTACT_EMAIL\", \"contact\");\n }\n const reviewsConfig = source.match(/\\breviews\\s*:\\s*\\{([^{}]*)\\}/)?.[1] ?? \"\";\n const usesLiveGooglePlacesReviews =\n /\\bprovider\\s*:\\s*['\"]google-places['\"]/.test(reviewsConfig) &&\n /\\bmode\\s*:\\s*['\"](?:summary|full)['\"]/.test(reviewsConfig);\n if (usesLiveGooglePlacesReviews) {\n requireEnvKey(findings, envSource, \"GOOGLE_MAPS_PLATFORM_API_KEY\", \"reviews\");\n }\n for (const retired of [\"CONTACT_CONTEXT_SECRET\", \"KV_REST_API_URL\", \"KV_REST_API_TOKEN\"]) {\n if (new RegExp(`^${retired}=`, \"m\").test(envSource)) {\n findings.push(staticFinding({\n ruleId: \"brandlab-environment-retired-contact-state\",\n surface: \"environment\",\n path: \".env.example\",\n expected: \"Only current contact environment variables\",\n actual: `${retired} is still documented.`,\n remediation: `Remove ${retired}; it is not part of the simplified contact standard.`,\n }));\n }\n }\n}\n\nfunction requireEnvKey(\n findings: BrandlabFinding[],\n envSource: string,\n key: string,\n capability: string,\n) {\n if (new RegExp(`^${key}=`, \"m\").test(envSource)) return;\n findings.push(staticFinding({\n ruleId: `brandlab-environment-${capability}-${slugify(key)}`,\n surface: \"environment\",\n path: \".env.example\",\n expected: `${key} documented for the enabled ${capability} capability`,\n actual: `${key} is missing from .env.example.`,\n remediation: `Document the non-secret ${key} variable name without adding a credential value.`,\n }));\n}\n\nfunction inspectProjectSource(root: string, findings: BrandlabFinding[]) {\n const sourceRoot = join(root, \"src\");\n if (!existsSync(sourceRoot)) return;\n for (const file of sourceFiles(sourceRoot)) {\n const source = readFileSync(file, \"utf8\");\n const executableSource = stripCommentsPreservingLayout(source);\n for (const rule of SOURCE_RULES) {\n const match = executableSource.match(rule.pattern);\n if (!match || match.index === undefined) continue;\n findings.push(staticFinding({\n ruleId: rule.ruleId,\n surface: rule.surface,\n path: normalizePath(relative(root, file)),\n line: lineAt(source, match.index),\n expected: rule.expected,\n actual: \"A project-owned implementation was detected.\",\n remediation: rule.remediation,\n }));\n }\n }\n}\n\nfunction stripCommentsPreservingLayout(source: string): string {\n const output = [...source];\n let state: \"code\" | \"single\" | \"double\" | \"template\" | \"line\" | \"block\" =\n \"code\";\n let escaped = false;\n\n for (let index = 0; index < output.length; index += 1) {\n const current = output[index];\n const next = output[index + 1];\n\n if (state === \"line\") {\n if (current === \"\\n\" || current === \"\\r\") {\n state = \"code\";\n } else {\n output[index] = \" \";\n }\n continue;\n }\n\n if (state === \"block\") {\n if (current === \"*\" && next === \"/\") {\n output[index] = \" \";\n output[index + 1] = \" \";\n index += 1;\n state = \"code\";\n } else if (current !== \"\\n\" && current !== \"\\r\") {\n output[index] = \" \";\n }\n continue;\n }\n\n if (state !== \"code\") {\n if (escaped) {\n escaped = false;\n } else if (current === \"\\\\\") {\n escaped = true;\n } else if (\n (state === \"single\" && current === \"'\") ||\n (state === \"double\" && current === '\"') ||\n (state === \"template\" && current === \"`\")\n ) {\n state = \"code\";\n }\n continue;\n }\n\n if (current === \"'\") {\n state = \"single\";\n } else if (current === '\"') {\n state = \"double\";\n } else if (current === \"`\") {\n state = \"template\";\n } else if (current === \"/\" && next === \"/\") {\n output[index] = \" \";\n output[index + 1] = \" \";\n index += 1;\n state = \"line\";\n } else if (current === \"/\" && next === \"*\") {\n output[index] = \" \";\n output[index + 1] = \" \";\n index += 1;\n state = \"block\";\n }\n }\n\n return output.join(\"\");\n}\n\nfunction sourceFiles(root: string): string[] {\n const files: string[] = [];\n for (const entry of readdirSync(root, { withFileTypes: true })) {\n if (entry.name.startsWith(\".\") || entry.name === \"node_modules\") continue;\n const path = join(root, entry.name);\n if (entry.isDirectory()) {\n files.push(...sourceFiles(path));\n continue;\n }\n if (\n SOURCE_EXTENSIONS.has(extension(entry.name)) &&\n !/\\.(?:test|spec)\\.[cm]?[jt]sx?$/.test(entry.name)\n ) {\n files.push(path);\n }\n }\n return files.sort();\n}\n\nfunction readPackageJson(root: string): ProjectPackageJsonLike | null {\n const source = readOptionalText(join(root, \"package.json\"));\n if (!source) return null;\n try {\n return JSON.parse(source) as ProjectPackageJsonLike;\n } catch {\n return null;\n }\n}\n\nfunction readPackageLock(root: string): PackageLockInspection {\n const source = readOptionalText(join(root, \"package-lock.json\"));\n if (!source) return emptyPackageLock(\"missing\");\n let parsed: unknown;\n try {\n parsed = JSON.parse(source);\n } catch {\n return emptyPackageLock(\"invalid\", { digest: digestBrandlabAuthority(source) });\n }\n if (!isRecord(parsed)) return emptyPackageLock(\"invalid\");\n const lockfileVersion =\n typeof parsed.lockfileVersion === \"number\" ? parsed.lockfileVersion : null;\n if (lockfileVersion !== 2 && lockfileVersion !== 3) {\n return emptyPackageLock(\"unsupported\", { lockfileVersion });\n }\n if (!isRecord(parsed.packages) || !isRecord(parsed.packages[\"\"])) {\n return emptyPackageLock(\"invalid\", { lockfileVersion });\n }\n\n const rootPackage = parsed.packages[\"\"];\n const rootDependencies = stringRecord(rootPackage.dependencies);\n const rootDevDependencies = stringRecord(rootPackage.devDependencies);\n const rootEngines = stringRecord(rootPackage.engines);\n const resolvedPackages = new Map<string, LockedPackage>();\n const packageNames = [\n ...BRANDLAB_SHARED_PACKAGE_NAMES,\n ...RUNTIME_PACKAGE_FIELDS.map(([name]) => name),\n \"sharp\",\n ];\n for (const packageName of packageNames) {\n const entry = parsed.packages[`node_modules/${packageName}`];\n if (!isRecord(entry)) continue;\n resolvedPackages.set(packageName, {\n version: typeof entry.version === \"string\" ? entry.version : null,\n resolved: typeof entry.resolved === \"string\" ? entry.resolved : null,\n integrity: typeof entry.integrity === \"string\" ? entry.integrity : null,\n linked: entry.link === true,\n });\n }\n const sharpResolutions = Object.entries(parsed.packages)\n .filter(([path]) => path === \"node_modules/sharp\" || path.endsWith(\"/node_modules/sharp\"))\n .map(([path, entry]) => ({\n path,\n version: isRecord(entry) && typeof entry.version === \"string\" ? entry.version : null,\n }))\n .sort((left, right) => left.path.localeCompare(right.path));\n return {\n state: \"valid\",\n lockfileVersion,\n rootDependencies,\n rootDevDependencies,\n rootEngines,\n resolvedPackages,\n sharpResolutions,\n fingerprint: {\n lockfileVersion,\n rootDependencies,\n rootDevDependencies,\n rootEngines,\n resolved: Object.fromEntries(\n [...resolvedPackages].map(([name, value]) => [\n name,\n { version: value.version, linked: value.linked },\n ]),\n ),\n sharpResolutions,\n },\n };\n}\n\nfunction emptyPackageLock(\n state: Exclude<PackageLockInspection[\"state\"], \"valid\">,\n fingerprint: Record<string, unknown> = {},\n): PackageLockInspection {\n return {\n state,\n lockfileVersion:\n typeof fingerprint.lockfileVersion === \"number\"\n ? fingerprint.lockfileVersion\n : null,\n rootDependencies: {},\n rootDevDependencies: {},\n rootEngines: {},\n resolvedPackages: new Map(),\n sharpResolutions: [],\n fingerprint: { state, ...fingerprint },\n };\n}\n\nfunction runtimeVersionSatisfiesRelease(\n packageName: (typeof RUNTIME_PACKAGE_FIELDS)[number][0],\n actual: string | null,\n expected: string,\n nextVersionPolicy?: \"exact\",\n): boolean {\n if (packageName === \"next\" && nextVersionPolicy === \"exact\") return actual === expected;\n if (!actual || !isBrandlabSemver(actual)) return false;\n if (![\"next\", \"react\", \"react-dom\"].includes(packageName)) return actual === expected;\n const actualParts = actual.match(/^(\\d+)\\.(\\d+)\\.(\\d+)$/);\n const expectedParts = expected.match(/^(\\d+)\\.(\\d+)\\.(\\d+)$/);\n const sameSupportedLine = packageName === \"next\"\n ? actualParts?.[1] === expectedParts?.[1]\n : actualParts?.[1] === expectedParts?.[1] && actualParts?.[2] === expectedParts?.[2];\n return Boolean(\n actualParts &&\n expectedParts &&\n sameSupportedLine &&\n compareBrandlabSemver(actual, expected) >= 0,\n );\n}\n\nfunction runtimeExpectation(packageName: string, expected: string, nextVersionPolicy?: \"exact\"): string {\n if (packageName === \"next\" && nextVersionPolicy === \"exact\") return `${packageName}@${expected} (exact HEIF mitigation pin)`;\n if (packageName === \"next\") {\n return `${packageName}@${expected} or a newer exact stable release in the same major line`;\n }\n return [\"react\", \"react-dom\"].includes(packageName)\n ? `${packageName}@${expected} or a newer exact patch in the same major/minor line`\n : `${packageName}@${expected}`;\n}\n\nfunction isApprovedRegistryResolution(\n resolved: string,\n packageName: string,\n version: string,\n): boolean {\n try {\n const url = new URL(resolved);\n const artifact = packageName.split(\"/\").at(-1);\n return Boolean(\n artifact &&\n url.protocol === \"https:\" &&\n url.hostname === \"registry.npmjs.org\" &&\n url.pathname === `/${packageName}/-/${artifact}-${version}.tgz`,\n );\n } catch {\n return false;\n }\n}\n\nfunction declaredPackageSpec(\n packageJson: ProjectPackageJsonLike,\n packageName: string,\n): string | null {\n return (\n packageJson.dependencies?.[packageName] ??\n packageJson.devDependencies?.[packageName] ??\n null\n );\n}\n\nfunction lockedRootSpec(\n lock: PackageLockInspection,\n packageName: string,\n): string | null {\n return lock.rootDependencies[packageName] ?? lock.rootDevDependencies[packageName] ?? null;\n}\n\nfunction releaseFinding(\n ruleId: string,\n expected: string,\n actual: string,\n remediation: string,\n path?: string,\n): BrandlabFinding {\n return {\n ruleId,\n surface: \"release\",\n severity: \"blocker\",\n contract: { name: \"release\", version: \"current-release\" },\n evidenceKind: \"static\",\n ...(path ? { path } : {}),\n expected,\n actual,\n remediation,\n };\n}\n\nfunction runtimeFinding(\n ruleId: string,\n expected: string,\n actual: string,\n remediation: string,\n path: string,\n): BrandlabFinding {\n return {\n ruleId,\n surface: \"runtime\",\n severity: \"blocker\",\n contract: { name: \"runtime\", version: \"installed-release\" },\n evidenceKind: \"static\",\n path,\n expected,\n actual,\n remediation,\n };\n}\n\nfunction staticFinding(options: {\n ruleId: string;\n surface: string;\n expected: string;\n actual: string;\n remediation: string;\n path?: string;\n line?: number;\n}): BrandlabFinding {\n return {\n ruleId: options.ruleId,\n surface: options.surface,\n severity: \"blocker\",\n contract: { name: \"project\", version: \"current-only-v2\" },\n evidenceKind: \"static\",\n ...(options.path ? { path: options.path } : {}),\n ...(options.line ? { line: options.line } : {}),\n expected: options.expected,\n actual: options.actual,\n remediation: options.remediation,\n };\n}\n\nfunction compareFindings(left: BrandlabFinding, right: BrandlabFinding): number {\n return (\n left.ruleId.localeCompare(right.ruleId) ||\n (left.path ?? \"\").localeCompare(right.path ?? \"\") ||\n (left.line ?? 0) - (right.line ?? 0)\n );\n}\n\nfunction readOptionalText(path: string): string | null {\n return existsSync(path) ? readFileSync(path, \"utf8\") : null;\n}\n\nfunction stringRecord(value: unknown): Record<string, string> {\n if (!isRecord(value)) return {};\n return Object.fromEntries(\n Object.entries(value).filter(\n (entry): entry is [string, string] => typeof entry[1] === \"string\",\n ),\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction extension(name: string): string {\n const index = name.lastIndexOf(\".\");\n return index === -1 ? \"\" : name.slice(index);\n}\n\nfunction lineAt(source: string, index: number): number {\n return source.slice(0, index).split(\"\\n\").length;\n}\n\nfunction slugify(value: string): string {\n return value.toLowerCase().replace(/[^a-z0-9]+/g, \"-\").replace(/^-|-$/g, \"\");\n}\n\nfunction normalizePath(value: string): string {\n return value.split(/[/\\\\]/).join(\"/\");\n}\n\nexport type { BrandlabContractVersions };\n"]}
@@ -2,6 +2,7 @@ export declare const BRANDLAB_SHARED_PACKAGE_NAMES: readonly ["@brandlab-digital
2
2
  export type BrandlabSharedPackageName = (typeof BRANDLAB_SHARED_PACKAGE_NAMES)[number];
3
3
  export interface BrandlabRuntimeBaseline {
4
4
  next: string;
5
+ nextVersionPolicy?: "exact";
5
6
  sharp?: string;
6
7
  react: string;
7
8
  reactDom: string;
@@ -1 +1 @@
1
- {"version":3,"file":"release-manifest.d.ts","sourceRoot":"","sources":["../src/release-manifest.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"release-manifest.d.ts","sourceRoot":"","sources":["../src/release-manifest.ts"],"names":[],"mappings":"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"}
@@ -177,6 +177,9 @@ function validateRuntime(value) {
177
177
  if (!isBrandlabSemver(runtime[field]))
178
178
  fail(`runtime.${field} must be exact semver`);
179
179
  }
180
+ if (runtime.nextVersionPolicy !== undefined && runtime.nextVersionPolicy !== "exact") {
181
+ fail("runtime.nextVersionPolicy is invalid");
182
+ }
180
183
  if (runtime.sharp !== undefined && !isBrandlabSemver(runtime.sharp)) {
181
184
  fail("runtime.sharp must be exact semver");
182
185
  }
@@ -1 +1 @@
1
- {"version":3,"file":"release-manifest.js","sourceRoot":"","sources":["../src/release-manifest.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\n\nexport const BRANDLAB_SHARED_PACKAGE_NAMES = [\n \"@brandlab-digital/site-core\",\n \"@brandlab-digital/site-next\",\n \"@brandlab-digital/conformance\",\n \"@brandlab-digital/eslint-plugin\",\n] as const;\n\nexport type BrandlabSharedPackageName =\n (typeof BRANDLAB_SHARED_PACKAGE_NAMES)[number];\n\nexport interface BrandlabRuntimeBaseline {\n next: string;\n sharp?: string;\n react: string;\n reactDom: string;\n node: string;\n typescript: string;\n packageManager: string;\n router: \"app\";\n bundler: \"turbopack\";\n cacheComponents: boolean;\n}\n\nexport interface BrandlabContractVersions {\n architecture: string;\n configuration: string;\n contact: string;\n seo: string;\n analytics: string;\n}\n\nexport interface BrandlabRuntimeReleaseContract {\n schemaVersion: \"brandlab.runtime-release-contract.v1\";\n kind: \"brandlab-runtime-release-contract\";\n releaseVersion: string;\n packages: Record<BrandlabSharedPackageName, { version: string }>;\n runtime: BrandlabRuntimeBaseline;\n contracts: BrandlabContractVersions;\n capabilities: string[];\n}\n\nexport interface BrandlabReleaseManifest {\n schemaVersion: 1;\n kind: \"brandlab-release-manifest\";\n releaseVersion: string;\n releasedAt: string;\n channel: \"prerelease\" | \"rc\" | \"stable\";\n packages: Record<\n BrandlabSharedPackageName,\n {\n version: string;\n registry: {\n state: \"verified\" | \"published-unverified\" | \"not-published\";\n shasum: string | null;\n integrity: string | null;\n };\n }\n >;\n runtime: BrandlabRuntimeBaseline;\n contracts: BrandlabContractVersions;\n capabilities: string[];\n evidence: {\n recordState: \"verified\" | \"reconstructed\" | \"planned\";\n sourceCommit: string | null;\n releaseNotes: string;\n releaseEvidence: string | null;\n testCount: number | null;\n verificationCommands: string[];\n };\n fingerprints: {\n publicApi: string | null;\n fixtures: string | null;\n };\n rollback: {\n targetRelease: string | null;\n strategy: string;\n };\n}\n\nconst SEMVER_PATTERN =\n /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-([0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*))?(?:\\+([0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*))?$/;\nconst DATE_PATTERN = /^20\\d{2}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\d|3[01])$/;\nconst SHA1_PATTERN = /^[a-f0-9]{40}$/;\nconst SHA256_PATTERN = /^[a-f0-9]{64}$/;\n\nexport function isBrandlabSemver(value: unknown): value is string {\n return typeof value === \"string\" && SEMVER_PATTERN.test(value);\n}\n\nexport function compareBrandlabSemver(first: string, second: string): number {\n const left = parseSemver(first);\n const right = parseSemver(second);\n for (const key of [\"major\", \"minor\", \"patch\"] as const) {\n if (left[key] !== right[key]) return left[key] - right[key];\n }\n if (left.prerelease.length === 0 && right.prerelease.length > 0) return 1;\n if (right.prerelease.length === 0 && left.prerelease.length > 0) return -1;\n const length = Math.max(left.prerelease.length, right.prerelease.length);\n for (let index = 0; index < length; index += 1) {\n const a = left.prerelease[index];\n const b = right.prerelease[index];\n if (a === undefined) return -1;\n if (b === undefined) return 1;\n if (a === b) continue;\n const aNumeric = /^\\d+$/.test(a);\n const bNumeric = /^\\d+$/.test(b);\n if (aNumeric && bNumeric) return Number(a) - Number(b);\n if (aNumeric) return -1;\n if (bNumeric) return 1;\n return a.localeCompare(b);\n }\n return 0;\n}\n\nexport function projectBrandlabRuntimeReleaseContract(\n input: unknown,\n): BrandlabRuntimeReleaseContract {\n validateBrandlabReleaseManifest(input);\n return {\n schemaVersion: \"brandlab.runtime-release-contract.v1\",\n kind: \"brandlab-runtime-release-contract\",\n releaseVersion: input.releaseVersion,\n packages: Object.fromEntries(\n BRANDLAB_SHARED_PACKAGE_NAMES.map((name) => [\n name,\n { version: input.packages[name].version },\n ]),\n ) as Record<BrandlabSharedPackageName, { version: string }>,\n runtime: { ...input.runtime },\n contracts: { ...input.contracts },\n capabilities: [...input.capabilities],\n };\n}\n\nexport function validateBrandlabRuntimeReleaseContract(\n input: unknown,\n): asserts input is BrandlabRuntimeReleaseContract {\n const contract = asObject(input, \"runtime release contract\");\n exactKeys(contract, [\n \"schemaVersion\",\n \"kind\",\n \"releaseVersion\",\n \"packages\",\n \"runtime\",\n \"contracts\",\n \"capabilities\",\n ], \"runtime release contract\");\n if (contract.schemaVersion !== \"brandlab.runtime-release-contract.v1\") {\n fail(\"runtime release contract schemaVersion is invalid\");\n }\n if (contract.kind !== \"brandlab-runtime-release-contract\") {\n fail(\"runtime release contract kind is invalid\");\n }\n validateReleaseVersionAndPackages(contract);\n validateRuntime(contract.runtime);\n validateContracts(contract.contracts);\n stringArray(contract.capabilities, \"capabilities\", true);\n}\n\nexport function validateBrandlabReleaseManifest(\n input: unknown,\n): asserts input is BrandlabReleaseManifest {\n const manifest = asObject(input, \"release manifest\");\n if (manifest.schemaVersion !== 1 || manifest.kind !== \"brandlab-release-manifest\") {\n fail(\"release manifest schema is invalid\");\n }\n if (!isDate(manifest.releasedAt)) fail(\"releasedAt must be an ISO date\");\n if (!includes([\"prerelease\", \"rc\", \"stable\"], manifest.channel)) {\n fail(\"channel is invalid\");\n }\n validateReleaseVersionAndPackages(manifest, true);\n validateRuntime(manifest.runtime);\n validateContracts(manifest.contracts);\n stringArray(manifest.capabilities, \"capabilities\", true);\n\n const evidence = asObject(manifest.evidence, \"evidence\");\n if (!includes([\"verified\", \"reconstructed\", \"planned\"], evidence.recordState)) {\n fail(\"evidence.recordState is invalid\");\n }\n if (evidence.sourceCommit !== null && !SHA1_PATTERN.test(String(evidence.sourceCommit))) {\n fail(\"evidence.sourceCommit must be a full Git commit\");\n }\n if (!nonEmptyString(evidence.releaseNotes)) fail(\"evidence.releaseNotes is required\");\n if (evidence.releaseEvidence !== null && !nonEmptyString(evidence.releaseEvidence)) {\n fail(\"evidence.releaseEvidence is invalid\");\n }\n if (\n evidence.testCount !== null &&\n (!Number.isInteger(evidence.testCount) || Number(evidence.testCount) < 0)\n ) {\n fail(\"evidence.testCount is invalid\");\n }\n stringArray(evidence.verificationCommands, \"verificationCommands\", false);\n\n const fingerprints = asObject(manifest.fingerprints, \"fingerprints\");\n optionalDigest(fingerprints.publicApi, SHA256_PATTERN, \"public API fingerprint\");\n optionalDigest(fingerprints.fixtures, SHA256_PATTERN, \"fixture fingerprint\");\n\n const rollback = asObject(manifest.rollback, \"rollback\");\n if (rollback.targetRelease !== null && !isBrandlabSemver(rollback.targetRelease)) {\n fail(\"rollback.targetRelease is invalid\");\n }\n if (!nonEmptyString(rollback.strategy)) fail(\"rollback.strategy is required\");\n}\n\nexport function digestBrandlabAuthority(value: unknown): string {\n return createHash(\"sha256\").update(stableStringify(value)).digest(\"hex\");\n}\n\nfunction validateReleaseVersionAndPackages(\n record: Record<string, unknown>,\n withRegistry = false,\n) {\n if (!isBrandlabSemver(record.releaseVersion)) fail(\"releaseVersion is invalid\");\n const packages = asObject(record.packages, \"packages\");\n if (\n JSON.stringify(Object.keys(packages).sort()) !==\n JSON.stringify([...BRANDLAB_SHARED_PACKAGE_NAMES].sort())\n ) {\n fail(\"packages must contain the four Brandlab packages\");\n }\n for (const name of BRANDLAB_SHARED_PACKAGE_NAMES) {\n const entry = asObject(packages[name], `packages.${name}`);\n if (entry.version !== record.releaseVersion) {\n fail(`${name} must use the lockstep releaseVersion`);\n }\n if (!withRegistry) {\n exactKeys(entry, [\"version\"], `packages.${name}`);\n continue;\n }\n const registry = asObject(entry.registry, `${name}.registry`);\n if (!includes([\"verified\", \"published-unverified\", \"not-published\"], registry.state)) {\n fail(`${name} registry state is invalid`);\n }\n optionalDigest(registry.shasum, SHA1_PATTERN, `${name} shasum`);\n if (\n registry.integrity !== null &&\n (typeof registry.integrity !== \"string\" ||\n !/^sha512-[A-Za-z0-9+/=]+$/.test(registry.integrity))\n ) {\n fail(`${name} integrity is invalid`);\n }\n if (\n registry.state === \"verified\" &&\n registry.shasum === null &&\n registry.integrity === null\n ) {\n fail(`${name} verified registry evidence is empty`);\n }\n }\n}\n\nfunction validateRuntime(value: unknown) {\n const runtime = asObject(value, \"runtime\");\n for (const field of [\n \"next\",\n \"react\",\n \"reactDom\",\n \"node\",\n \"typescript\",\n \"packageManager\",\n ] as const) {\n if (!nonEmptyString(runtime[field])) fail(`runtime.${field} is required`);\n }\n for (const field of [\"next\", \"react\", \"reactDom\", \"typescript\"] as const) {\n if (!isBrandlabSemver(runtime[field])) fail(`runtime.${field} must be exact semver`);\n }\n if (runtime.sharp !== undefined && !isBrandlabSemver(runtime.sharp)) {\n fail(\"runtime.sharp must be exact semver\");\n }\n if (!/^\\d+\\.x$/.test(String(runtime.node))) fail(\"runtime.node is invalid\");\n if (!/^npm@\\d+\\.\\d+\\.\\d+$/.test(String(runtime.packageManager))) {\n fail(\"runtime.packageManager is invalid\");\n }\n if (\n runtime.router !== \"app\" ||\n runtime.bundler !== \"turbopack\" ||\n typeof runtime.cacheComponents !== \"boolean\"\n ) {\n fail(\"runtime architecture is invalid\");\n }\n}\n\nfunction validateContracts(value: unknown) {\n const contracts = asObject(value, \"contracts\");\n for (const field of [\n \"architecture\",\n \"configuration\",\n \"contact\",\n \"seo\",\n \"analytics\",\n ] as const) {\n if (!nonEmptyString(contracts[field])) fail(`contracts.${field} is required`);\n }\n}\n\nfunction parseSemver(value: string) {\n const match = value.match(SEMVER_PATTERN);\n if (!match) throw new Error(`Invalid semver: ${value}`);\n return {\n major: Number(match[1]),\n minor: Number(match[2]),\n patch: Number(match[3]),\n prerelease: match[4]?.split(\".\") ?? [],\n };\n}\n\nfunction stableStringify(value: unknown): string {\n if (Array.isArray(value)) return `[${value.map(stableStringify).join(\",\")}]`;\n if (value && typeof value === \"object\") {\n return `{${Object.entries(value)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([key, child]) => `${JSON.stringify(key)}:${stableStringify(child)}`)\n .join(\",\")}}`;\n }\n return JSON.stringify(value) ?? \"null\";\n}\n\nfunction asObject(value: unknown, label: string): Record<string, unknown> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n fail(`${label} must be an object`);\n }\n return value as Record<string, unknown>;\n}\n\nfunction exactKeys(value: Record<string, unknown>, keys: readonly string[], label: string) {\n if (\n JSON.stringify(Object.keys(value).sort()) !== JSON.stringify([...keys].sort())\n ) {\n fail(`${label} contains unsupported fields`);\n }\n}\n\nfunction stringArray(value: unknown, label: string, unique: boolean) {\n if (!Array.isArray(value) || value.some((entry) => !nonEmptyString(entry))) {\n fail(`${label} must be an array of strings`);\n }\n if (unique && new Set(value).size !== value.length) fail(`${label} must be unique`);\n}\n\nfunction optionalDigest(value: unknown, pattern: RegExp, label: string) {\n if (value !== null && (typeof value !== \"string\" || !pattern.test(value))) {\n fail(`${label} is invalid`);\n }\n}\n\nfunction isDate(value: unknown): value is string {\n if (typeof value !== \"string\" || !DATE_PATTERN.test(value)) return false;\n return new Date(`${value}T00:00:00.000Z`).toISOString().startsWith(value);\n}\n\nfunction nonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.trim().length > 0;\n}\n\nfunction includes(values: readonly string[], value: unknown): value is string {\n return typeof value === \"string\" && values.includes(value);\n}\n\nfunction fail(message: string): never {\n throw new Error(`Invalid Brandlab release: ${message}.`);\n}\n"]}
1
+ {"version":3,"file":"release-manifest.js","sourceRoot":"","sources":["../src/release-manifest.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\n\nexport const BRANDLAB_SHARED_PACKAGE_NAMES = [\n \"@brandlab-digital/site-core\",\n \"@brandlab-digital/site-next\",\n \"@brandlab-digital/conformance\",\n \"@brandlab-digital/eslint-plugin\",\n] as const;\n\nexport type BrandlabSharedPackageName =\n (typeof BRANDLAB_SHARED_PACKAGE_NAMES)[number];\n\nexport interface BrandlabRuntimeBaseline {\n next: string;\n nextVersionPolicy?: \"exact\";\n sharp?: string;\n react: string;\n reactDom: string;\n node: string;\n typescript: string;\n packageManager: string;\n router: \"app\";\n bundler: \"turbopack\";\n cacheComponents: boolean;\n}\n\nexport interface BrandlabContractVersions {\n architecture: string;\n configuration: string;\n contact: string;\n seo: string;\n analytics: string;\n}\n\nexport interface BrandlabRuntimeReleaseContract {\n schemaVersion: \"brandlab.runtime-release-contract.v1\";\n kind: \"brandlab-runtime-release-contract\";\n releaseVersion: string;\n packages: Record<BrandlabSharedPackageName, { version: string }>;\n runtime: BrandlabRuntimeBaseline;\n contracts: BrandlabContractVersions;\n capabilities: string[];\n}\n\nexport interface BrandlabReleaseManifest {\n schemaVersion: 1;\n kind: \"brandlab-release-manifest\";\n releaseVersion: string;\n releasedAt: string;\n channel: \"prerelease\" | \"rc\" | \"stable\";\n packages: Record<\n BrandlabSharedPackageName,\n {\n version: string;\n registry: {\n state: \"verified\" | \"published-unverified\" | \"not-published\";\n shasum: string | null;\n integrity: string | null;\n };\n }\n >;\n runtime: BrandlabRuntimeBaseline;\n contracts: BrandlabContractVersions;\n capabilities: string[];\n evidence: {\n recordState: \"verified\" | \"reconstructed\" | \"planned\";\n sourceCommit: string | null;\n releaseNotes: string;\n releaseEvidence: string | null;\n testCount: number | null;\n verificationCommands: string[];\n };\n fingerprints: {\n publicApi: string | null;\n fixtures: string | null;\n };\n rollback: {\n targetRelease: string | null;\n strategy: string;\n };\n}\n\nconst SEMVER_PATTERN =\n /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-([0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*))?(?:\\+([0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*))?$/;\nconst DATE_PATTERN = /^20\\d{2}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\d|3[01])$/;\nconst SHA1_PATTERN = /^[a-f0-9]{40}$/;\nconst SHA256_PATTERN = /^[a-f0-9]{64}$/;\n\nexport function isBrandlabSemver(value: unknown): value is string {\n return typeof value === \"string\" && SEMVER_PATTERN.test(value);\n}\n\nexport function compareBrandlabSemver(first: string, second: string): number {\n const left = parseSemver(first);\n const right = parseSemver(second);\n for (const key of [\"major\", \"minor\", \"patch\"] as const) {\n if (left[key] !== right[key]) return left[key] - right[key];\n }\n if (left.prerelease.length === 0 && right.prerelease.length > 0) return 1;\n if (right.prerelease.length === 0 && left.prerelease.length > 0) return -1;\n const length = Math.max(left.prerelease.length, right.prerelease.length);\n for (let index = 0; index < length; index += 1) {\n const a = left.prerelease[index];\n const b = right.prerelease[index];\n if (a === undefined) return -1;\n if (b === undefined) return 1;\n if (a === b) continue;\n const aNumeric = /^\\d+$/.test(a);\n const bNumeric = /^\\d+$/.test(b);\n if (aNumeric && bNumeric) return Number(a) - Number(b);\n if (aNumeric) return -1;\n if (bNumeric) return 1;\n return a.localeCompare(b);\n }\n return 0;\n}\n\nexport function projectBrandlabRuntimeReleaseContract(\n input: unknown,\n): BrandlabRuntimeReleaseContract {\n validateBrandlabReleaseManifest(input);\n return {\n schemaVersion: \"brandlab.runtime-release-contract.v1\",\n kind: \"brandlab-runtime-release-contract\",\n releaseVersion: input.releaseVersion,\n packages: Object.fromEntries(\n BRANDLAB_SHARED_PACKAGE_NAMES.map((name) => [\n name,\n { version: input.packages[name].version },\n ]),\n ) as Record<BrandlabSharedPackageName, { version: string }>,\n runtime: { ...input.runtime },\n contracts: { ...input.contracts },\n capabilities: [...input.capabilities],\n };\n}\n\nexport function validateBrandlabRuntimeReleaseContract(\n input: unknown,\n): asserts input is BrandlabRuntimeReleaseContract {\n const contract = asObject(input, \"runtime release contract\");\n exactKeys(contract, [\n \"schemaVersion\",\n \"kind\",\n \"releaseVersion\",\n \"packages\",\n \"runtime\",\n \"contracts\",\n \"capabilities\",\n ], \"runtime release contract\");\n if (contract.schemaVersion !== \"brandlab.runtime-release-contract.v1\") {\n fail(\"runtime release contract schemaVersion is invalid\");\n }\n if (contract.kind !== \"brandlab-runtime-release-contract\") {\n fail(\"runtime release contract kind is invalid\");\n }\n validateReleaseVersionAndPackages(contract);\n validateRuntime(contract.runtime);\n validateContracts(contract.contracts);\n stringArray(contract.capabilities, \"capabilities\", true);\n}\n\nexport function validateBrandlabReleaseManifest(\n input: unknown,\n): asserts input is BrandlabReleaseManifest {\n const manifest = asObject(input, \"release manifest\");\n if (manifest.schemaVersion !== 1 || manifest.kind !== \"brandlab-release-manifest\") {\n fail(\"release manifest schema is invalid\");\n }\n if (!isDate(manifest.releasedAt)) fail(\"releasedAt must be an ISO date\");\n if (!includes([\"prerelease\", \"rc\", \"stable\"], manifest.channel)) {\n fail(\"channel is invalid\");\n }\n validateReleaseVersionAndPackages(manifest, true);\n validateRuntime(manifest.runtime);\n validateContracts(manifest.contracts);\n stringArray(manifest.capabilities, \"capabilities\", true);\n\n const evidence = asObject(manifest.evidence, \"evidence\");\n if (!includes([\"verified\", \"reconstructed\", \"planned\"], evidence.recordState)) {\n fail(\"evidence.recordState is invalid\");\n }\n if (evidence.sourceCommit !== null && !SHA1_PATTERN.test(String(evidence.sourceCommit))) {\n fail(\"evidence.sourceCommit must be a full Git commit\");\n }\n if (!nonEmptyString(evidence.releaseNotes)) fail(\"evidence.releaseNotes is required\");\n if (evidence.releaseEvidence !== null && !nonEmptyString(evidence.releaseEvidence)) {\n fail(\"evidence.releaseEvidence is invalid\");\n }\n if (\n evidence.testCount !== null &&\n (!Number.isInteger(evidence.testCount) || Number(evidence.testCount) < 0)\n ) {\n fail(\"evidence.testCount is invalid\");\n }\n stringArray(evidence.verificationCommands, \"verificationCommands\", false);\n\n const fingerprints = asObject(manifest.fingerprints, \"fingerprints\");\n optionalDigest(fingerprints.publicApi, SHA256_PATTERN, \"public API fingerprint\");\n optionalDigest(fingerprints.fixtures, SHA256_PATTERN, \"fixture fingerprint\");\n\n const rollback = asObject(manifest.rollback, \"rollback\");\n if (rollback.targetRelease !== null && !isBrandlabSemver(rollback.targetRelease)) {\n fail(\"rollback.targetRelease is invalid\");\n }\n if (!nonEmptyString(rollback.strategy)) fail(\"rollback.strategy is required\");\n}\n\nexport function digestBrandlabAuthority(value: unknown): string {\n return createHash(\"sha256\").update(stableStringify(value)).digest(\"hex\");\n}\n\nfunction validateReleaseVersionAndPackages(\n record: Record<string, unknown>,\n withRegistry = false,\n) {\n if (!isBrandlabSemver(record.releaseVersion)) fail(\"releaseVersion is invalid\");\n const packages = asObject(record.packages, \"packages\");\n if (\n JSON.stringify(Object.keys(packages).sort()) !==\n JSON.stringify([...BRANDLAB_SHARED_PACKAGE_NAMES].sort())\n ) {\n fail(\"packages must contain the four Brandlab packages\");\n }\n for (const name of BRANDLAB_SHARED_PACKAGE_NAMES) {\n const entry = asObject(packages[name], `packages.${name}`);\n if (entry.version !== record.releaseVersion) {\n fail(`${name} must use the lockstep releaseVersion`);\n }\n if (!withRegistry) {\n exactKeys(entry, [\"version\"], `packages.${name}`);\n continue;\n }\n const registry = asObject(entry.registry, `${name}.registry`);\n if (!includes([\"verified\", \"published-unverified\", \"not-published\"], registry.state)) {\n fail(`${name} registry state is invalid`);\n }\n optionalDigest(registry.shasum, SHA1_PATTERN, `${name} shasum`);\n if (\n registry.integrity !== null &&\n (typeof registry.integrity !== \"string\" ||\n !/^sha512-[A-Za-z0-9+/=]+$/.test(registry.integrity))\n ) {\n fail(`${name} integrity is invalid`);\n }\n if (\n registry.state === \"verified\" &&\n registry.shasum === null &&\n registry.integrity === null\n ) {\n fail(`${name} verified registry evidence is empty`);\n }\n }\n}\n\nfunction validateRuntime(value: unknown) {\n const runtime = asObject(value, \"runtime\");\n for (const field of [\n \"next\",\n \"react\",\n \"reactDom\",\n \"node\",\n \"typescript\",\n \"packageManager\",\n ] as const) {\n if (!nonEmptyString(runtime[field])) fail(`runtime.${field} is required`);\n }\n for (const field of [\"next\", \"react\", \"reactDom\", \"typescript\"] as const) {\n if (!isBrandlabSemver(runtime[field])) fail(`runtime.${field} must be exact semver`);\n }\n if (runtime.nextVersionPolicy !== undefined && runtime.nextVersionPolicy !== \"exact\") {\n fail(\"runtime.nextVersionPolicy is invalid\");\n }\n if (runtime.sharp !== undefined && !isBrandlabSemver(runtime.sharp)) {\n fail(\"runtime.sharp must be exact semver\");\n }\n if (!/^\\d+\\.x$/.test(String(runtime.node))) fail(\"runtime.node is invalid\");\n if (!/^npm@\\d+\\.\\d+\\.\\d+$/.test(String(runtime.packageManager))) {\n fail(\"runtime.packageManager is invalid\");\n }\n if (\n runtime.router !== \"app\" ||\n runtime.bundler !== \"turbopack\" ||\n typeof runtime.cacheComponents !== \"boolean\"\n ) {\n fail(\"runtime architecture is invalid\");\n }\n}\n\nfunction validateContracts(value: unknown) {\n const contracts = asObject(value, \"contracts\");\n for (const field of [\n \"architecture\",\n \"configuration\",\n \"contact\",\n \"seo\",\n \"analytics\",\n ] as const) {\n if (!nonEmptyString(contracts[field])) fail(`contracts.${field} is required`);\n }\n}\n\nfunction parseSemver(value: string) {\n const match = value.match(SEMVER_PATTERN);\n if (!match) throw new Error(`Invalid semver: ${value}`);\n return {\n major: Number(match[1]),\n minor: Number(match[2]),\n patch: Number(match[3]),\n prerelease: match[4]?.split(\".\") ?? [],\n };\n}\n\nfunction stableStringify(value: unknown): string {\n if (Array.isArray(value)) return `[${value.map(stableStringify).join(\",\")}]`;\n if (value && typeof value === \"object\") {\n return `{${Object.entries(value)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([key, child]) => `${JSON.stringify(key)}:${stableStringify(child)}`)\n .join(\",\")}}`;\n }\n return JSON.stringify(value) ?? \"null\";\n}\n\nfunction asObject(value: unknown, label: string): Record<string, unknown> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n fail(`${label} must be an object`);\n }\n return value as Record<string, unknown>;\n}\n\nfunction exactKeys(value: Record<string, unknown>, keys: readonly string[], label: string) {\n if (\n JSON.stringify(Object.keys(value).sort()) !== JSON.stringify([...keys].sort())\n ) {\n fail(`${label} contains unsupported fields`);\n }\n}\n\nfunction stringArray(value: unknown, label: string, unique: boolean) {\n if (!Array.isArray(value) || value.some((entry) => !nonEmptyString(entry))) {\n fail(`${label} must be an array of strings`);\n }\n if (unique && new Set(value).size !== value.length) fail(`${label} must be unique`);\n}\n\nfunction optionalDigest(value: unknown, pattern: RegExp, label: string) {\n if (value !== null && (typeof value !== \"string\" || !pattern.test(value))) {\n fail(`${label} is invalid`);\n }\n}\n\nfunction isDate(value: unknown): value is string {\n if (typeof value !== \"string\" || !DATE_PATTERN.test(value)) return false;\n return new Date(`${value}T00:00:00.000Z`).toISOString().startsWith(value);\n}\n\nfunction nonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.trim().length > 0;\n}\n\nfunction includes(values: readonly string[], value: unknown): value is string {\n return typeof value === \"string\" && values.includes(value);\n}\n\nfunction fail(message: string): never {\n throw new Error(`Invalid Brandlab release: ${message}.`);\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@brandlab-digital/conformance",
3
- "version": "1.3.0",
3
+ "version": "2.0.0",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/RomieDandan/brandlab.git",
@@ -16,7 +16,7 @@
16
16
  "dist"
17
17
  ],
18
18
  "scripts": {
19
- "build": "rm -rf dist && tsc -p tsconfig.json",
19
+ "build": "rm -rf dist && tsc -p tsconfig.json && chmod +x dist/cli.js",
20
20
  "test": "vitest run",
21
21
  "typecheck": "tsc --noEmit -p tsconfig.json"
22
22
  },