@brandlab-digital/conformance 3.12.1 → 3.14.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/README.md +41 -1
- package/dist/analytics-e2e.d.ts +10 -16
- package/dist/analytics-e2e.d.ts.map +1 -1
- package/dist/analytics-e2e.js +61 -3
- package/dist/analytics-e2e.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +4 -1
- package/dist/cli.js.map +1 -1
- package/dist/current-release.js +5 -5
- package/dist/current-release.js.map +1 -1
- package/dist/edge-probe-cli.d.ts +57 -0
- package/dist/edge-probe-cli.d.ts.map +1 -0
- package/dist/edge-probe-cli.js +134 -0
- package/dist/edge-probe-cli.js.map +1 -0
- package/dist/engineering.d.ts +4 -1
- package/dist/engineering.d.ts.map +1 -1
- package/dist/engineering.js +19 -14
- package/dist/engineering.js.map +1 -1
- package/dist/estate-sample.d.ts +60 -0
- package/dist/estate-sample.d.ts.map +1 -0
- package/dist/estate-sample.js +144 -0
- package/dist/estate-sample.js.map +1 -0
- package/dist/estate.d.ts +45 -0
- package/dist/estate.d.ts.map +1 -1
- package/dist/estate.js +82 -22
- package/dist/estate.js.map +1 -1
- package/dist/origin-region.d.ts +14 -0
- package/dist/origin-region.d.ts.map +1 -0
- package/dist/origin-region.js +46 -0
- package/dist/origin-region.js.map +1 -0
- package/dist/prefetch-probe-cli.d.ts +36 -0
- package/dist/prefetch-probe-cli.d.ts.map +1 -0
- package/dist/prefetch-probe-cli.js +163 -0
- package/dist/prefetch-probe-cli.js.map +1 -0
- package/dist/project.d.ts +20 -0
- package/dist/project.d.ts.map +1 -1
- package/dist/project.js +92 -2
- package/dist/project.js.map +1 -1
- package/dist/ready-cli.d.ts.map +1 -1
- package/dist/ready-cli.js +8 -3
- package/dist/ready-cli.js.map +1 -1
- package/dist/rule-registry.d.ts +5 -0
- package/dist/rule-registry.d.ts.map +1 -1
- package/dist/rule-registry.js +1 -0
- package/dist/rule-registry.js.map +1 -1
- package/dist/site-system/checks.d.ts +62 -1
- package/dist/site-system/checks.d.ts.map +1 -1
- package/dist/site-system/checks.js +9 -0
- package/dist/site-system/checks.js.map +1 -1
- package/dist/site-system/config.d.ts +27 -0
- package/dist/site-system/config.d.ts.map +1 -1
- package/dist/site-system/config.js +50 -1
- package/dist/site-system/config.js.map +1 -1
- package/dist/site-system/index.d.ts +1 -1
- package/dist/site-system/index.d.ts.map +1 -1
- package/dist/site-system/index.js +1 -1
- package/dist/site-system/index.js.map +1 -1
- package/dist/site-system/journeys/plan.d.ts +9 -2
- package/dist/site-system/journeys/plan.d.ts.map +1 -1
- package/dist/site-system/journeys/plan.js +11 -1
- package/dist/site-system/journeys/plan.js.map +1 -1
- package/dist/site-system/journeys/prefetch-measure.d.ts +28 -0
- package/dist/site-system/journeys/prefetch-measure.d.ts.map +1 -0
- package/dist/site-system/journeys/prefetch-measure.js +94 -0
- package/dist/site-system/journeys/prefetch-measure.js.map +1 -0
- package/dist/site-system/journeys/prefetch-policy.d.ts +85 -0
- package/dist/site-system/journeys/prefetch-policy.d.ts.map +1 -0
- package/dist/site-system/journeys/prefetch-policy.js +152 -0
- package/dist/site-system/journeys/prefetch-policy.js.map +1 -0
- package/dist/site-system/journeys/prefetch.d.ts +3 -0
- package/dist/site-system/journeys/prefetch.d.ts.map +1 -0
- package/dist/site-system/journeys/prefetch.js +37 -0
- package/dist/site-system/journeys/prefetch.js.map +1 -0
- package/dist/site-system/journeys/variants.d.ts +34 -0
- package/dist/site-system/journeys/variants.d.ts.map +1 -0
- package/dist/site-system/journeys/variants.js +139 -0
- package/dist/site-system/journeys/variants.js.map +1 -0
- package/dist/site-system/report.d.ts.map +1 -1
- package/dist/site-system/report.js +19 -5
- package/dist/site-system/report.js.map +1 -1
- package/dist/site-system/rule-modules.d.ts.map +1 -1
- package/dist/site-system/rule-modules.js +10 -0
- package/dist/site-system/rule-modules.js.map +1 -1
- package/dist/site-system/rules/delivery/h13-inbox.d.ts +23 -0
- package/dist/site-system/rules/delivery/h13-inbox.d.ts.map +1 -0
- package/dist/site-system/rules/delivery/h13-inbox.js +208 -0
- package/dist/site-system/rules/delivery/h13-inbox.js.map +1 -0
- package/dist/site-system/rules/delivery/index.d.ts +12 -0
- package/dist/site-system/rules/delivery/index.d.ts.map +1 -0
- package/dist/site-system/rules/delivery/index.js +7 -0
- package/dist/site-system/rules/delivery/index.js.map +1 -0
- package/dist/site-system/rules/full/common.d.ts +3 -0
- package/dist/site-system/rules/full/common.d.ts.map +1 -1
- package/dist/site-system/rules/full/common.js.map +1 -1
- package/dist/site-system/rules/full/e1-pattern.d.ts +4 -0
- package/dist/site-system/rules/full/e1-pattern.d.ts.map +1 -0
- package/dist/site-system/rules/full/e1-pattern.js +47 -0
- package/dist/site-system/rules/full/e1-pattern.js.map +1 -0
- package/dist/site-system/rules/full/estate.d.ts +20 -1
- package/dist/site-system/rules/full/estate.d.ts.map +1 -1
- package/dist/site-system/rules/full/estate.js +33 -5
- package/dist/site-system/rules/full/estate.js.map +1 -1
- package/dist/site-system/rules/full/geography.d.ts +8 -2
- package/dist/site-system/rules/full/geography.d.ts.map +1 -1
- package/dist/site-system/rules/full/geography.js +6 -2
- package/dist/site-system/rules/full/geography.js.map +1 -1
- package/dist/site-system/rules/full/index.d.ts +3 -2
- package/dist/site-system/rules/full/index.d.ts.map +1 -1
- package/dist/site-system/rules/full/index.js +27 -9
- package/dist/site-system/rules/full/index.js.map +1 -1
- package/dist/site-system/rules/full/k12-slots.d.ts +4 -0
- package/dist/site-system/rules/full/k12-slots.d.ts.map +1 -0
- package/dist/site-system/rules/full/k12-slots.js +40 -0
- package/dist/site-system/rules/full/k12-slots.js.map +1 -0
- package/dist/site-system/rules/full/loc-index.d.ts +5 -0
- package/dist/site-system/rules/full/loc-index.d.ts.map +1 -1
- package/dist/site-system/rules/full/loc-index.js +43 -2
- package/dist/site-system/rules/full/loc-index.js.map +1 -1
- package/dist/site-system/rules/full/strategy.d.ts +4 -0
- package/dist/site-system/rules/full/strategy.d.ts.map +1 -1
- package/dist/site-system/rules/full/strategy.js +19 -3
- package/dist/site-system/rules/full/strategy.js.map +1 -1
- package/dist/site-system/rules/full/w3-refresh.d.ts +22 -0
- package/dist/site-system/rules/full/w3-refresh.d.ts.map +1 -0
- package/dist/site-system/rules/full/w3-refresh.js +70 -0
- package/dist/site-system/rules/full/w3-refresh.js.map +1 -0
- package/dist/site-system/rules/guards/index.d.ts +22 -0
- package/dist/site-system/rules/guards/index.d.ts.map +1 -0
- package/dist/site-system/rules/guards/index.js +109 -0
- package/dist/site-system/rules/guards/index.js.map +1 -0
- package/dist/site-system/rules/guards/w10-crawlers.d.ts +55 -0
- package/dist/site-system/rules/guards/w10-crawlers.d.ts.map +1 -0
- package/dist/site-system/rules/guards/w10-crawlers.js +182 -0
- package/dist/site-system/rules/guards/w10-crawlers.js.map +1 -0
- package/dist/site-system/rules/guards/w9-params.d.ts +19 -0
- package/dist/site-system/rules/guards/w9-params.d.ts.map +1 -0
- package/dist/site-system/rules/guards/w9-params.js +84 -0
- package/dist/site-system/rules/guards/w9-params.js.map +1 -0
- package/dist/site-system/rules/sections/k2-skin-coverage.d.ts +2 -2
- package/dist/site-system/rules/sections/k2-skin-coverage.d.ts.map +1 -1
- package/dist/site-system/rules/sections/k2-skin-coverage.js +6 -2
- package/dist/site-system/rules/sections/k2-skin-coverage.js.map +1 -1
- package/dist/site-system/runners.js +1 -1
- package/dist/site-system/runners.js.map +1 -1
- package/dist/site-system-e2e.d.ts +1 -0
- package/dist/site-system-e2e.d.ts.map +1 -1
- package/dist/site-system-e2e.js +8 -2
- package/dist/site-system-e2e.js.map +1 -1
- package/package.json +6 -4
package/dist/project.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project.js","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync } from \"node:fs\";\nimport { join, 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 BRANDLAB_SOURCE_ROOT_DIRECTORIES,\n collectBrandlabSource,\n lineAt,\n readOptionalText,\n stripCommentsPreservingLayout,\n type BrandlabSourceIndex,\n} from \"./source-files.js\";\nimport {\n findContactContractRecipients,\n inspectStaticRules,\n recordEvaluation,\n staticFinding,\n} from \"./static-rules.js\";\nimport {\n applyBrandlabVerificationPolicy,\n BRANDLAB_VERIFICATION_POLICY_VERSION,\n type BrandlabOperationalFinding,\n type BrandlabRuleEvaluation,\n type BrandlabVerificationEvidence,\n type BrandlabVerificationResult,\n} from \"./verification-policy.js\";\n\nexport {\n BRANDLAB_STATIC_RULES,\n matchesBrandlabStaticRule,\n type BrandlabStaticRule,\n} from \"./rule-registry.js\";\nexport {\n BRANDLAB_VERIFICATION_CHECKS,\n BRANDLAB_VERIFICATION_FAMILIES,\n BRANDLAB_VERIFICATION_POLICY_VERSION,\n checkForRule,\n type BrandlabRuleEvaluation,\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\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 actual?: 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|form_submit|generate_lead|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-faq-howto-schema\",\n surface: \"schema\",\n pattern: /['\"]@type['\"]\\s*:\\s*['\"](?:FAQPage|HowTo)['\"]/,\n expected: \"No FAQPage or HowTo markup (FAQ rich results ended on 7 May 2026).\",\n remediation: \"Keep the questions visible on the page and remove the FAQPage or HowTo node.\",\n },\n {\n ruleId: \"brandlab-sitemap-build-time-lastmod\",\n surface: \"sitemap\",\n pattern: /\\b(?:lastSignificantChange|lastModified)\\s*:\\s*(?:new\\s+Date\\(\\s*\\)|Date\\.now\\(\\s*\\))/,\n expected: \"Sitemap lastmod is the date the content last changed, never the build time.\",\n remediation: \"Set lastSignificantChange from the page's content dates (latestContentDate from site-core/sitemaps).\",\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 ruleId: \"brandlab-analytics-retired-phone-api\",\n surface: \"analytics\",\n pattern: /\\btrackPhoneCall\\b/,\n expected: \"Telephone taps are reported only as phone_link_click by the shared instrumentation.\",\n actual: \"The retired trackPhoneCall API is still referenced.\",\n remediation: \"Remove trackPhoneCall; installBrandlabInstrumentation reports one phone_link_click per tap.\",\n },\n {\n ruleId: \"brandlab-analytics-web-vitals\",\n surface: \"analytics\",\n pattern: /\\b(?:useReportWebVitals|reportWebVitals|reportBrandlabWebVital|createBrandlabWebVitalsReporter|CoreWebVitalsReporter)\\b|['\"](?:next\\/web-vitals|web-vitals|web_vital)['\"]|\\bwebVitals\\s*:/,\n expected: \"No web-vitals reporter; speed evidence comes from Search Console.\",\n actual: \"A web-vitals reporter, web_vital event or webVitals flag is still wired.\",\n remediation: \"Remove the web-vitals reporter and the webVitals flag; web_vital events are not sent in 3.0.\",\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 const evaluations: BrandlabRuleEvaluation[] = [];\n const source = collectBrandlabSource(root);\n\n inspectRelease({\n findings,\n evaluations,\n packageJson,\n packageLock,\n installedRelease,\n detectedRelease,\n manifest,\n attestation,\n packedPreflight,\n });\n if (manifest?.runtime.nextVersionPolicy === \"exact\") {\n inspectImageRuntime(root, findings, evaluations);\n }\n inspectProjectConfig(root, source, findings, evaluations);\n inspectProjectSource(source, findings, evaluations);\n inspectStaticRules({\n root,\n source,\n config: readOptionalText(join(root, \"brandlab.config.ts\")),\n findings,\n evaluations,\n });\n\n const sortedFindings = findings.sort(compareFindings);\n const policyResult = applyBrandlabVerificationPolicy(\n sortedFindings,\n options.verificationEvidence,\n evaluations,\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 evaluations: BrandlabRuleEvaluation[];\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 recordEvaluation(options.evaluations, \"release\", \"brandlab-release-package-json-missing\");\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 recordEvaluation(options.evaluations, \"release\", \"brandlab-release-installed-version-unresolved\");\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 recordEvaluation(options.evaluations, \"release\", \"brandlab-release-unsupported\");\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 recordEvaluation(options.evaluations, \"release\", \"brandlab-release-declared-installed-mismatch\");\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 evaluations: options.evaluations,\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 evaluations: options.evaluations,\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 evaluations: BrandlabRuleEvaluation[];\n packageJson: ProjectPackageJsonLike;\n packageLock: PackageLockInspection;\n installedRelease: string;\n attestation: BrandlabReleaseManifest | null;\n}) {\n recordEvaluation(options.evaluations, \"release\", \"brandlab-release-package-lock\");\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 recordEvaluation(\n options.evaluations,\n \"release\",\n \"brandlab-release-package-pin-mismatch\",\n \"brandlab-release-package-resolution-mismatch\",\n ...(options.attestation ? [\"brandlab-release-package-integrity-mismatch\"] : []),\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 (options.attestation && !packed && !expectedIntegrity) {\n // A bound manifest without registry integrity cannot prove the lockfile.\n options.findings.push(releaseFinding(\n \"brandlab-release-package-integrity-mismatch\",\n `${packageName} integrity matching the immutable manifest`,\n \"The release manifest records no registry integrity for this package.\",\n \"Bind the verified release manifest recorded after registry publication.\",\n \"package-lock.json\",\n ));\n } else 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 evaluations: BrandlabRuleEvaluation[];\n packageJson: ProjectPackageJsonLike;\n packageLock: PackageLockInspection;\n manifest: BrandlabRuntimeReleaseContract;\n}) {\n recordEvaluation(\n options.evaluations,\n \"runtime\",\n ...RUNTIME_PACKAGE_FIELDS.map(([packageName]) => `brandlab-runtime-${slugify(packageName)}`),\n \"brandlab-runtime-react-pair\",\n \"brandlab-runtime-node\",\n \"brandlab-runtime-package-manager\",\n ...(options.manifest.runtime.sharp ? [\"brandlab-runtime-sharp\"] : []),\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 // React and React DOM are one runtime: a newer patch of one alone is a mismatch.\n const declaredReact = declaredPackageSpec(options.packageJson, \"react\");\n const declaredReactDom = declaredPackageSpec(options.packageJson, \"react-dom\");\n const lockedReact = options.packageLock.resolvedPackages.get(\"react\")?.version ?? null;\n const lockedReactDom = options.packageLock.resolvedPackages.get(\"react-dom\")?.version ?? null;\n if (!declaredReact || declaredReact !== declaredReactDom || lockedReact !== lockedReactDom) {\n options.findings.push(runtimeFinding(\n \"brandlab-runtime-react-pair\",\n \"react and react-dom declared and locked at the same exact version\",\n `package.json react=${declaredReact ?? \"missing\"}, react-dom=${declaredReactDom ?? \"missing\"}; lockfile react=${lockedReact ?? \"missing\"}, react-dom=${lockedReactDom ?? \"missing\"}.`,\n \"Pin react and react-dom to one exact version and regenerate the lockfile.\",\n \"package.json\",\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(\n root: string,\n findings: BrandlabFinding[],\n evaluations: BrandlabRuleEvaluation[],\n) {\n recordEvaluation(evaluations, \"runtime\", \"brandlab-runtime-image-initialisation\");\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 (/^[ \\t]*import[ \\t]*['\"]@brandlab-digital\\/site-next\\/image-runtime['\"]/m.test(source) ||\n /^[ \\t]*require\\([ \\t]*['\"]@brandlab-digital\\/site-next\\/image-runtime['\"][ \\t]*\\)/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(\n root: string,\n projectSource: BrandlabSourceIndex,\n findings: BrandlabFinding[],\n evaluations: BrandlabRuleEvaluation[],\n) {\n const configPath = join(root, \"brandlab.config.ts\");\n const source = readOptionalText(configPath);\n recordEvaluation(evaluations, \"routes\", \"brandlab-config-missing\", \"brandlab-config-invalid\");\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 // 3.0 removed the profile field; a leftover one is reported as a retired API.\n if (\n !/\\bdefineBrandlabProject\\s*\\(\\s*\\{/.test(source) ||\n !/\\bprojectId\\s*:\\s*['\"][a-z0-9][a-z0-9-]*['\"]/.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\",\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 envKeys = parseEnvironmentKeys(readOptionalText(join(root, \".env.example\")) ?? \"\");\n const contracts = findContactContractRecipients(projectSource);\n if (/\\bcontact\\s*:\\s*\\{/.test(source) || contracts.length > 0) {\n requireEnvKey(findings, evaluations, envKeys, \"RESEND_API_KEY\", \"contact\");\n inspectContactRecipients(contracts, envKeys, findings, evaluations);\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, evaluations, envKeys, \"GOOGLE_MAPS_PLATFORM_API_KEY\", \"reviews\");\n }\n recordEvaluation(evaluations, \"environment\", \"brandlab-environment-retired-contact-state\");\n for (const retired of [\"CONTACT_CONTEXT_SECRET\", \"KV_REST_API_URL\", \"KV_REST_API_TOKEN\"]) {\n if (envKeys.has(retired)) {\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\n/** The environment variable key rule site-core applies to delivery.recipientEnv. */\nconst ENV_KEY_PATTERN = /^[A-Z][A-Z0-9_]*$/;\n\n/** Variable names documented in an env example file (`KEY=`, `export KEY=`); values are ignored. */\nexport function parseEnvironmentKeys(text: string): Set<string> {\n const keys = new Set<string>();\n for (const rawLine of text.split(/\\r?\\n/)) {\n const line = rawLine.trim();\n if (!line || line.startsWith(\"#\")) continue;\n const assignment = line.startsWith(\"export \") ? line.slice(\"export \".length).trimStart() : line;\n const separator = assignment.indexOf(\"=\");\n if (separator <= 0) continue;\n const key = assignment.slice(0, separator).trimEnd();\n if (/^[A-Za-z_][A-Za-z0-9_]*$/.test(key)) keys.add(key);\n }\n return keys;\n}\n\n/** The recipient variable is whatever the contact contract declares, never an assumed name. */\nfunction inspectContactRecipients(\n contracts: ReturnType<typeof findContactContractRecipients>,\n envKeys: ReadonlySet<string>,\n findings: BrandlabFinding[],\n evaluations: BrandlabRuleEvaluation[],\n) {\n recordEvaluation(evaluations, \"contact\", \"brandlab-contact-recipient-env\");\n if (contracts.length === 0) {\n findings.push(staticFinding({\n ruleId: \"brandlab-contact-recipient-env\",\n surface: \"contact\",\n path: \"src/config/contact.ts\",\n expected: \"One defineContactContract contract declaring delivery.recipientEnv\",\n actual: \"The contact capability is enabled but no contact contract was found.\",\n remediation: \"Declare the contact contract with defineContactContract in src/config/contact.ts.\",\n }));\n return;\n }\n for (const contract of contracts.filter(({ recipientEnv }) => !recipientEnv)) {\n findings.push(staticFinding({\n ruleId: \"brandlab-contact-recipient-env\",\n surface: \"contact\",\n path: contract.path,\n line: contract.line,\n expected: \"delivery.recipientEnv declared as a literal environment variable key\",\n actual: \"The recipient environment variable could not be read from the contract.\",\n remediation: \"Write delivery.recipientEnv as a string literal such as 'CONTACT_EMAIL'.\",\n }));\n }\n for (const contract of contracts) {\n if (!contract.recipientEnv || ENV_KEY_PATTERN.test(contract.recipientEnv)) continue;\n findings.push(staticFinding({\n ruleId: \"brandlab-contact-recipient-env\",\n surface: \"contact\",\n path: contract.path,\n line: contract.line,\n expected: \"delivery.recipientEnv is an environment variable key (A-Z, 0-9 and _, starting with a letter)\",\n actual: `delivery.recipientEnv ${JSON.stringify(contract.recipientEnv.slice(0, 64))} is not an environment variable key.`,\n remediation: \"Name the recipient variable in upper case, for example 'CONTACT_EMAIL'.\",\n }));\n }\n const keys = [...new Set(contracts.flatMap(({ recipientEnv }) =>\n recipientEnv && ENV_KEY_PATTERN.test(recipientEnv) ? [recipientEnv] : []))];\n for (const key of keys.sort()) requireEnvKey(findings, evaluations, envKeys, key, \"contact\");\n}\n\nfunction requireEnvKey(\n findings: BrandlabFinding[],\n evaluations: BrandlabRuleEvaluation[],\n envKeys: ReadonlySet<string>,\n key: string,\n capability: string,\n) {\n const ruleId = `brandlab-environment-${capability}-${slugify(key)}`;\n recordEvaluation(evaluations, \"environment\", ruleId);\n if (envKeys.has(key)) return;\n findings.push(staticFinding({\n ruleId,\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(\n source: BrandlabSourceIndex,\n findings: BrandlabFinding[],\n evaluations: BrandlabRuleEvaluation[],\n) {\n recordEvaluation(evaluations, \"source\", \"brandlab-source-root-missing\");\n if (source.directoryRoots.length === 0) {\n findings.push(staticFinding({\n ruleId: \"brandlab-source-root-missing\",\n surface: \"source\",\n expected: `Project source under a recognised root (${BRANDLAB_SOURCE_ROOT_DIRECTORIES.map((name) => `${name}/`).join(\", \")})`,\n actual: \"No recognised source root was found, so no source rule could run.\",\n remediation: \"Keep application source under src/ (or a recognised legacy root) and rerun verification.\",\n }));\n }\n if (source.files.length === 0) return;\n for (const rule of SOURCE_RULES) recordEvaluation(evaluations, rule.surface, rule.ruleId);\n for (const file of source.files) {\n for (const rule of SOURCE_RULES) {\n const match = file.executable.match(rule.pattern);\n if (!match || match.index === undefined) continue;\n findings.push(staticFinding({\n ruleId: rule.ruleId,\n surface: rule.surface,\n path: file.path,\n line: lineAt(file.text, match.index),\n expected: rule.expected,\n actual: rule.actual ?? \"A project-owned implementation was detected.\",\n remediation: rule.remediation,\n }));\n }\n }\n}\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 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 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 slugify(value: string): string {\n return value.toLowerCase().replace(/[^a-z0-9]+/g, \"-\").replace(/^-|-$/g, \"\");\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 } from \"node:fs\";\nimport { join, 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 BRANDLAB_SOURCE_ROOT_DIRECTORIES,\n collectBrandlabSource,\n lineAt,\n readOptionalText,\n stripCommentsPreservingLayout,\n type BrandlabSourceIndex,\n} from \"./source-files.js\";\nimport {\n findContactContractRecipients,\n inspectStaticRules,\n recordEvaluation,\n staticFinding,\n} from \"./static-rules.js\";\nimport {\n applyBrandlabVerificationPolicy,\n BRANDLAB_VERIFICATION_POLICY_VERSION,\n type BrandlabOperationalFinding,\n type BrandlabRuleEvaluation,\n type BrandlabVerificationEvidence,\n type BrandlabVerificationResult,\n} from \"./verification-policy.js\";\n\nexport {\n BRANDLAB_STATIC_RULES,\n matchesBrandlabStaticRule,\n type BrandlabStaticRule,\n} from \"./rule-registry.js\";\nexport {\n BRANDLAB_VERIFICATION_CHECKS,\n BRANDLAB_VERIFICATION_FAMILIES,\n BRANDLAB_VERIFICATION_POLICY_VERSION,\n checkForRule,\n type BrandlabRuleEvaluation,\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\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 /**\n * Set only when all four packages are one canary prerelease (`X.Y.Z-canary.N`). A canary is never an\n * installed release: `installedRelease` stays null, so it cannot stand as release evidence.\n */\n canaryRelease?: BrandlabCanaryRelease;\n findings: BrandlabFinding[];\n operationalFindings: BrandlabOperationalFinding[];\n verification: BrandlabVerificationResult;\n summary: ConformanceSummary;\n}\n\nexport interface BrandlabCanaryRelease {\n /** The canary version, e.g. `3.14.0-canary.2`. */\n version: string;\n /** The release line it previews, e.g. `3.14.0`. */\n line: string;\n /** `embedded`: checked against this checker's contract for the line; `not-cut`: the line has no contract yet. */\n contract: \"embedded\" | \"not-cut\";\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 actual?: 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|form_submit|generate_lead|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-faq-howto-schema\",\n surface: \"schema\",\n pattern: /['\"]@type['\"]\\s*:\\s*['\"](?:FAQPage|HowTo)['\"]/,\n expected: \"No FAQPage or HowTo markup (FAQ rich results ended on 7 May 2026).\",\n remediation: \"Keep the questions visible on the page and remove the FAQPage or HowTo node.\",\n },\n {\n ruleId: \"brandlab-sitemap-build-time-lastmod\",\n surface: \"sitemap\",\n pattern: /\\b(?:lastSignificantChange|lastModified)\\s*:\\s*(?:new\\s+Date\\(\\s*\\)|Date\\.now\\(\\s*\\))/,\n expected: \"Sitemap lastmod is the date the content last changed, never the build time.\",\n remediation: \"Set lastSignificantChange from the page's content dates (latestContentDate from site-core/sitemaps).\",\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 ruleId: \"brandlab-analytics-retired-phone-api\",\n surface: \"analytics\",\n pattern: /\\btrackPhoneCall\\b/,\n expected: \"Telephone taps are reported only as phone_link_click by the shared instrumentation.\",\n actual: \"The retired trackPhoneCall API is still referenced.\",\n remediation: \"Remove trackPhoneCall; installBrandlabInstrumentation reports one phone_link_click per tap.\",\n },\n {\n ruleId: \"brandlab-analytics-web-vitals\",\n surface: \"analytics\",\n pattern: /\\b(?:useReportWebVitals|reportWebVitals|reportBrandlabWebVital|createBrandlabWebVitalsReporter|CoreWebVitalsReporter)\\b|['\"](?:next\\/web-vitals|web-vitals|web_vital)['\"]|\\bwebVitals\\s*:/,\n expected: \"No web-vitals reporter; speed evidence comes from Search Console.\",\n actual: \"A web-vitals reporter, web_vital event or webVitals flag is still wired.\",\n remediation: \"Remove the web-vitals reporter and the webVitals flag; web_vital events are not sent in 3.0.\",\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 canary =\n !detectedRelease && options.installedRelease === undefined\n ? detectBrandlabCanaryRelease(packageJson, release)\n : null;\n const manifest =\n release.releaseVersion === installedRelease || canary?.contract === \"embedded\" ? release : null;\n const attestation =\n options.releaseManifest?.releaseVersion === installedRelease\n ? options.releaseManifest\n : null;\n const findings: BrandlabFinding[] = [];\n const evaluations: BrandlabRuleEvaluation[] = [];\n const source = collectBrandlabSource(root);\n\n inspectRelease({\n findings,\n evaluations,\n packageJson,\n packageLock,\n installedRelease,\n detectedRelease,\n canary,\n releaseVersion: release.releaseVersion,\n manifest,\n attestation,\n packedPreflight,\n });\n if (manifest?.runtime.nextVersionPolicy === \"exact\") {\n inspectImageRuntime(root, findings, evaluations);\n }\n inspectProjectConfig(root, source, findings, evaluations);\n inspectProjectSource(source, findings, evaluations);\n inspectStaticRules({\n root,\n source,\n config: readOptionalText(join(root, \"brandlab.config.ts\")),\n findings,\n evaluations,\n });\n\n const sortedFindings = findings.sort(compareFindings);\n const policyResult = applyBrandlabVerificationPolicy(\n sortedFindings,\n options.verificationEvidence,\n evaluations,\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 ...(canary ? { canaryRelease: canary } : {}),\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\nconst CANARY_VERSION_PATTERN = /^((?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*))-canary\\.(?:0|[1-9]\\d*)$/;\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 // A canary (X.Y.Z-canary.N) is never an installed release; detectBrandlabCanaryRelease reads it.\n if (versions.some((version) => !version || !isBrandlabSemver(version) || CANARY_VERSION_PATTERN.test(version))) {\n return null;\n }\n return new Set(versions).size === 1 ? versions[0] : null;\n}\n\n/**\n * Reads one canary prerelease across all four packages, pinned exactly (`3.14.0-canary.2`) or installed from\n * the packed tarball (`file:.canary/brandlab-digital-site-core-3.14.0-canary.2.tgz`). A canary previews the line\n * `X.Y.Z`: it is checked against that line's contract when this checker carries it, and is otherwise reported\n * as a canary notice. Lines older than the checker's release are not supported. Never a published release.\n */\nexport function detectBrandlabCanaryRelease(\n packageJson: ProjectPackageJsonLike | null,\n release: Pick<BrandlabRuntimeReleaseContract, \"releaseVersion\"> = BRANDLAB_CURRENT_RUNTIME_RELEASE,\n): BrandlabCanaryRelease | null {\n if (!packageJson) return null;\n const versions = BRANDLAB_SHARED_PACKAGE_NAMES.map((packageName) => {\n const spec = packageJson.dependencies?.[packageName] ?? packageJson.devDependencies?.[packageName];\n if (!spec) return null;\n if (CANARY_VERSION_PATTERN.test(spec)) return spec;\n if (!spec.startsWith(\"file:\")) return null;\n const tarballPrefix = `brandlab-digital-${packageName.split(\"/\")[1]}-`;\n const fileName = spec.slice(\"file:\".length).split(\"/\").at(-1) ?? \"\";\n if (!fileName.startsWith(tarballPrefix) || !fileName.endsWith(\".tgz\")) return null;\n const version = fileName.slice(tarballPrefix.length, -\".tgz\".length);\n return CANARY_VERSION_PATTERN.test(version) ? version : null;\n });\n const [version] = versions;\n if (!version || versions.some((candidate) => candidate !== version)) return null;\n const line = CANARY_VERSION_PATTERN.exec(version)![1];\n const contract = line === release.releaseVersion ? \"embedded\" : \"not-cut\";\n return { version, line, contract };\n}\n\nfunction inspectCanary(options: {\n findings: BrandlabFinding[];\n evaluations: BrandlabRuleEvaluation[];\n packageJson: ProjectPackageJsonLike;\n packageLock: PackageLockInspection;\n canary: BrandlabCanaryRelease;\n release: string;\n manifest: BrandlabRuntimeReleaseContract | null;\n}) {\n const { canary } = options;\n recordEvaluation(options.evaluations, \"release\", \"brandlab-release-unsupported\");\n if (compareBrandlabSemver(canary.line, options.release) < 0) {\n options.findings.push(releaseFinding(\n \"brandlab-release-unsupported\",\n `A published release, or a canary of ${options.release} or later`,\n `${canary.version} is a canary of an older line than ${options.release}.`,\n \"Install the published release or a current canary.\",\n ));\n return;\n }\n recordEvaluation(options.evaluations, \"release\", \"brandlab-release-canary\");\n options.findings.push({\n ...releaseFinding(\n \"brandlab-release-canary\",\n \"A published Brandlab release\",\n canary.contract === \"embedded\"\n ? `${canary.version} is a canary of ${canary.line}, not a published release; it was checked against the ${canary.line} contract.`\n : `${canary.version} is a canary of ${canary.line}, not a published release; ${canary.line} has no release contract yet.`,\n `Install the published ${canary.line} before release or launch.`,\n \"package.json\",\n ),\n severity: \"warning\",\n });\n\n recordEvaluation(options.evaluations, \"release\", \"brandlab-release-package-lock\");\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 recordEvaluation(options.evaluations, \"release\", \"brandlab-release-package-pin-mismatch\");\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 if (locked !== declared || resolved?.version !== canary.version || resolved.linked) {\n options.findings.push(releaseFinding(\n \"brandlab-release-package-pin-mismatch\",\n `${packageName}@${canary.version} declared once and locked exactly`,\n `package.json=${declared ?? \"missing\"}; lockfile=${locked ?? \"missing\"}; resolved=${resolved?.version ?? \"missing\"}.`,\n \"Reinstall the four canary packages together and regenerate the lockfile.\",\n \"package.json\",\n ));\n }\n }\n if (options.manifest) {\n inspectRuntime({\n findings: options.findings,\n evaluations: options.evaluations,\n packageJson: options.packageJson,\n packageLock: options.packageLock,\n manifest: options.manifest,\n });\n }\n}\n\nfunction inspectRelease(options: {\n packedPreflight?: PackedPreflight;\n findings: BrandlabFinding[];\n evaluations: BrandlabRuleEvaluation[];\n packageJson: ProjectPackageJsonLike | null;\n packageLock: PackageLockInspection;\n installedRelease: string | null;\n detectedRelease: string | null;\n canary: BrandlabCanaryRelease | null;\n releaseVersion: string;\n manifest: BrandlabRuntimeReleaseContract | null;\n attestation: BrandlabReleaseManifest | null;\n}) {\n recordEvaluation(options.evaluations, \"release\", \"brandlab-release-package-json-missing\");\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 recordEvaluation(options.evaluations, \"release\", \"brandlab-release-installed-version-unresolved\");\n if (!options.installedRelease && options.canary) {\n inspectCanary({\n findings: options.findings,\n evaluations: options.evaluations,\n packageJson: options.packageJson,\n packageLock: options.packageLock,\n canary: options.canary,\n release: options.releaseVersion,\n manifest: options.manifest,\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 recordEvaluation(options.evaluations, \"release\", \"brandlab-release-unsupported\");\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 recordEvaluation(options.evaluations, \"release\", \"brandlab-release-declared-installed-mismatch\");\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 evaluations: options.evaluations,\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 evaluations: options.evaluations,\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 evaluations: BrandlabRuleEvaluation[];\n packageJson: ProjectPackageJsonLike;\n packageLock: PackageLockInspection;\n installedRelease: string;\n attestation: BrandlabReleaseManifest | null;\n}) {\n recordEvaluation(options.evaluations, \"release\", \"brandlab-release-package-lock\");\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 recordEvaluation(\n options.evaluations,\n \"release\",\n \"brandlab-release-package-pin-mismatch\",\n \"brandlab-release-package-resolution-mismatch\",\n ...(options.attestation ? [\"brandlab-release-package-integrity-mismatch\"] : []),\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 (options.attestation && !packed && !expectedIntegrity) {\n // A bound manifest without registry integrity cannot prove the lockfile.\n options.findings.push(releaseFinding(\n \"brandlab-release-package-integrity-mismatch\",\n `${packageName} integrity matching the immutable manifest`,\n \"The release manifest records no registry integrity for this package.\",\n \"Bind the verified release manifest recorded after registry publication.\",\n \"package-lock.json\",\n ));\n } else 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 evaluations: BrandlabRuleEvaluation[];\n packageJson: ProjectPackageJsonLike;\n packageLock: PackageLockInspection;\n manifest: BrandlabRuntimeReleaseContract;\n}) {\n recordEvaluation(\n options.evaluations,\n \"runtime\",\n ...RUNTIME_PACKAGE_FIELDS.map(([packageName]) => `brandlab-runtime-${slugify(packageName)}`),\n \"brandlab-runtime-react-pair\",\n \"brandlab-runtime-node\",\n \"brandlab-runtime-package-manager\",\n ...(options.manifest.runtime.sharp ? [\"brandlab-runtime-sharp\"] : []),\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 // React and React DOM are one runtime: a newer patch of one alone is a mismatch.\n const declaredReact = declaredPackageSpec(options.packageJson, \"react\");\n const declaredReactDom = declaredPackageSpec(options.packageJson, \"react-dom\");\n const lockedReact = options.packageLock.resolvedPackages.get(\"react\")?.version ?? null;\n const lockedReactDom = options.packageLock.resolvedPackages.get(\"react-dom\")?.version ?? null;\n if (!declaredReact || declaredReact !== declaredReactDom || lockedReact !== lockedReactDom) {\n options.findings.push(runtimeFinding(\n \"brandlab-runtime-react-pair\",\n \"react and react-dom declared and locked at the same exact version\",\n `package.json react=${declaredReact ?? \"missing\"}, react-dom=${declaredReactDom ?? \"missing\"}; lockfile react=${lockedReact ?? \"missing\"}, react-dom=${lockedReactDom ?? \"missing\"}.`,\n \"Pin react and react-dom to one exact version and regenerate the lockfile.\",\n \"package.json\",\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(\n root: string,\n findings: BrandlabFinding[],\n evaluations: BrandlabRuleEvaluation[],\n) {\n recordEvaluation(evaluations, \"runtime\", \"brandlab-runtime-image-initialisation\");\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 (/^[ \\t]*import[ \\t]*['\"]@brandlab-digital\\/site-next\\/image-runtime['\"]/m.test(source) ||\n /^[ \\t]*require\\([ \\t]*['\"]@brandlab-digital\\/site-next\\/image-runtime['\"][ \\t]*\\)/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(\n root: string,\n projectSource: BrandlabSourceIndex,\n findings: BrandlabFinding[],\n evaluations: BrandlabRuleEvaluation[],\n) {\n const configPath = join(root, \"brandlab.config.ts\");\n const source = readOptionalText(configPath);\n recordEvaluation(evaluations, \"routes\", \"brandlab-config-missing\", \"brandlab-config-invalid\");\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 // 3.0 removed the profile field; a leftover one is reported as a retired API.\n if (\n !/\\bdefineBrandlabProject\\s*\\(\\s*\\{/.test(source) ||\n !/\\bprojectId\\s*:\\s*['\"][a-z0-9][a-z0-9-]*['\"]/.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\",\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 envKeys = parseEnvironmentKeys(readOptionalText(join(root, \".env.example\")) ?? \"\");\n const contracts = findContactContractRecipients(projectSource);\n if (/\\bcontact\\s*:\\s*\\{/.test(source) || contracts.length > 0) {\n requireEnvKey(findings, evaluations, envKeys, \"RESEND_API_KEY\", \"contact\");\n inspectContactRecipients(contracts, envKeys, findings, evaluations);\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, evaluations, envKeys, \"GOOGLE_MAPS_PLATFORM_API_KEY\", \"reviews\");\n }\n recordEvaluation(evaluations, \"environment\", \"brandlab-environment-retired-contact-state\");\n for (const retired of [\"CONTACT_CONTEXT_SECRET\", \"KV_REST_API_URL\", \"KV_REST_API_TOKEN\"]) {\n if (envKeys.has(retired)) {\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\n/** The environment variable key rule site-core applies to delivery.recipientEnv. */\nconst ENV_KEY_PATTERN = /^[A-Z][A-Z0-9_]*$/;\n\n/** Variable names documented in an env example file (`KEY=`, `export KEY=`); values are ignored. */\nexport function parseEnvironmentKeys(text: string): Set<string> {\n const keys = new Set<string>();\n for (const rawLine of text.split(/\\r?\\n/)) {\n const line = rawLine.trim();\n if (!line || line.startsWith(\"#\")) continue;\n const assignment = line.startsWith(\"export \") ? line.slice(\"export \".length).trimStart() : line;\n const separator = assignment.indexOf(\"=\");\n if (separator <= 0) continue;\n const key = assignment.slice(0, separator).trimEnd();\n if (/^[A-Za-z_][A-Za-z0-9_]*$/.test(key)) keys.add(key);\n }\n return keys;\n}\n\n/** The recipient variable is whatever the contact contract declares, never an assumed name. */\nfunction inspectContactRecipients(\n contracts: ReturnType<typeof findContactContractRecipients>,\n envKeys: ReadonlySet<string>,\n findings: BrandlabFinding[],\n evaluations: BrandlabRuleEvaluation[],\n) {\n recordEvaluation(evaluations, \"contact\", \"brandlab-contact-recipient-env\");\n if (contracts.length === 0) {\n findings.push(staticFinding({\n ruleId: \"brandlab-contact-recipient-env\",\n surface: \"contact\",\n path: \"src/config/contact.ts\",\n expected: \"One defineContactContract contract declaring delivery.recipientEnv\",\n actual: \"The contact capability is enabled but no contact contract was found.\",\n remediation: \"Declare the contact contract with defineContactContract in src/config/contact.ts.\",\n }));\n return;\n }\n for (const contract of contracts.filter(({ recipientEnv }) => !recipientEnv)) {\n findings.push(staticFinding({\n ruleId: \"brandlab-contact-recipient-env\",\n surface: \"contact\",\n path: contract.path,\n line: contract.line,\n expected: \"delivery.recipientEnv declared as a literal environment variable key\",\n actual: \"The recipient environment variable could not be read from the contract.\",\n remediation: \"Write delivery.recipientEnv as a string literal such as 'CONTACT_EMAIL'.\",\n }));\n }\n for (const contract of contracts) {\n if (!contract.recipientEnv || ENV_KEY_PATTERN.test(contract.recipientEnv)) continue;\n findings.push(staticFinding({\n ruleId: \"brandlab-contact-recipient-env\",\n surface: \"contact\",\n path: contract.path,\n line: contract.line,\n expected: \"delivery.recipientEnv is an environment variable key (A-Z, 0-9 and _, starting with a letter)\",\n actual: `delivery.recipientEnv ${JSON.stringify(contract.recipientEnv.slice(0, 64))} is not an environment variable key.`,\n remediation: \"Name the recipient variable in upper case, for example 'CONTACT_EMAIL'.\",\n }));\n }\n const keys = [...new Set(contracts.flatMap(({ recipientEnv }) =>\n recipientEnv && ENV_KEY_PATTERN.test(recipientEnv) ? [recipientEnv] : []))];\n for (const key of keys.sort()) requireEnvKey(findings, evaluations, envKeys, key, \"contact\");\n}\n\nfunction requireEnvKey(\n findings: BrandlabFinding[],\n evaluations: BrandlabRuleEvaluation[],\n envKeys: ReadonlySet<string>,\n key: string,\n capability: string,\n) {\n const ruleId = `brandlab-environment-${capability}-${slugify(key)}`;\n recordEvaluation(evaluations, \"environment\", ruleId);\n if (envKeys.has(key)) return;\n findings.push(staticFinding({\n ruleId,\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(\n source: BrandlabSourceIndex,\n findings: BrandlabFinding[],\n evaluations: BrandlabRuleEvaluation[],\n) {\n recordEvaluation(evaluations, \"source\", \"brandlab-source-root-missing\");\n if (source.directoryRoots.length === 0) {\n findings.push(staticFinding({\n ruleId: \"brandlab-source-root-missing\",\n surface: \"source\",\n expected: `Project source under a recognised root (${BRANDLAB_SOURCE_ROOT_DIRECTORIES.map((name) => `${name}/`).join(\", \")})`,\n actual: \"No recognised source root was found, so no source rule could run.\",\n remediation: \"Keep application source under src/ (or a recognised legacy root) and rerun verification.\",\n }));\n }\n if (source.files.length === 0) return;\n for (const rule of SOURCE_RULES) recordEvaluation(evaluations, rule.surface, rule.ruleId);\n for (const file of source.files) {\n for (const rule of SOURCE_RULES) {\n const match = file.executable.match(rule.pattern);\n if (!match || match.index === undefined) continue;\n findings.push(staticFinding({\n ruleId: rule.ruleId,\n surface: rule.surface,\n path: file.path,\n line: lineAt(file.text, match.index),\n expected: rule.expected,\n actual: rule.actual ?? \"A project-owned implementation was detected.\",\n remediation: rule.remediation,\n }));\n }\n }\n}\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 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 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 slugify(value: string): string {\n return value.toLowerCase().replace(/[^a-z0-9]+/g, \"-\").replace(/^-|-$/g, \"\");\n}\n\nexport type { BrandlabContractVersions };\n"]}
|
package/dist/ready-cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ready-cli.d.ts","sourceRoot":"","sources":["../src/ready-cli.ts"],"names":[],"mappings":";AAiBA,OAAO,EAGL,KAAK,wBAAwB,EAC9B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAkD,KAAK,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAGhH,UAAU,kBAAkB;IAC1B,OAAO,EAAE,QAAQ,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,UAAU,kBAAkB;IAC1B,OAAO,EAAE,QAAQ,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,KAAK,eAAe,GAAG,kBAAkB,GAAG,kBAAkB,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAErF,UAAU,KAAK;IACb,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC;AAED,MAAM,WAAW,4BAA4B;IAC3C,uEAAuE;IACvE,OAAO,CAAC,EAAE,SAAS,wBAAwB,EAAE,CAAC;IAC9C,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AA8BD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,eAAe,CAkC/E;AAiBD,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,EAAE,GAAE,KAGH,EACD,YAAY,GAAE,4BAAiC,GAC9C,OAAO,CAAC,MAAM,CAAC,CAwCjB;
|
|
1
|
+
{"version":3,"file":"ready-cli.d.ts","sourceRoot":"","sources":["../src/ready-cli.ts"],"names":[],"mappings":";AAiBA,OAAO,EAGL,KAAK,wBAAwB,EAC9B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAkD,KAAK,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAGhH,UAAU,kBAAkB;IAC1B,OAAO,EAAE,QAAQ,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,UAAU,kBAAkB;IAC1B,OAAO,EAAE,QAAQ,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,KAAK,eAAe,GAAG,kBAAkB,GAAG,kBAAkB,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAErF,UAAU,KAAK;IACb,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC;AAED,MAAM,WAAW,4BAA4B;IAC3C,uEAAuE;IACvE,OAAO,CAAC,EAAE,SAAS,wBAAwB,EAAE,CAAC;IAC9C,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AA8BD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,eAAe,CAkC/E;AAiBD,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,EAAE,GAAE,KAGH,EACD,YAAY,GAAE,4BAAiC,GAC9C,OAAO,CAAC,MAAM,CAAC,CAwCjB;AAiLD,wBAAgB,4BAA4B,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAOrG"}
|
package/dist/ready-cli.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { existsSync, mkdirSync, readFileSync, realpathSync, writeFileSync } from "node:fs";
|
|
3
3
|
import { dirname, isAbsolute, join, relative, resolve } from "node:path";
|
|
4
4
|
import { fileURLToPath } from "node:url";
|
|
5
|
-
import { detectInstalledBrandlabRelease, evaluateBrandlabProject } from "./project.js";
|
|
5
|
+
import { detectBrandlabCanaryRelease, detectInstalledBrandlabRelease, evaluateBrandlabProject } from "./project.js";
|
|
6
6
|
import { readSiteSystemProjectConfig } from "./site-system/config.js";
|
|
7
7
|
import { readSiteSystemJourneyReport } from "./site-system/playwright-report.js";
|
|
8
8
|
import { appendSiteSystemRecord, readSiteSystemRecords } from "./site-system/records.js";
|
|
@@ -151,9 +151,12 @@ export async function runBrandlabReadyCli(argv, io = {
|
|
|
151
151
|
async function createReadyReport(options, dependencies, now) {
|
|
152
152
|
const root = options.root;
|
|
153
153
|
const config = readSiteSystemProjectConfig(root);
|
|
154
|
-
const
|
|
154
|
+
const packageJson = readPackageJson(root);
|
|
155
|
+
// A canary (X.Y.Z-canary.N) gates checks as its line X.Y.Z, but never launches.
|
|
156
|
+
const canary = options.installedRelease ? null : detectBrandlabCanaryRelease(packageJson);
|
|
157
|
+
const release = options.installedRelease ?? detectInstalledBrandlabRelease(packageJson) ?? canary?.version ?? null;
|
|
155
158
|
if (config.siteSystem && !release) {
|
|
156
|
-
throw new Error("The installed Brandlab release could not be read from package.json. Pin all four Brandlab packages to one exact version, or pass --installed-release.");
|
|
159
|
+
throw new Error("The installed Brandlab release could not be read from package.json. Pin all four Brandlab packages to one exact version (or one canary), or pass --installed-release.");
|
|
157
160
|
}
|
|
158
161
|
const problems = [...config.problems];
|
|
159
162
|
const findings = [];
|
|
@@ -208,6 +211,8 @@ async function createReadyReport(options, dependencies, now) {
|
|
|
208
211
|
problems.push(...rendered.problems);
|
|
209
212
|
// Fail closed: a config the gate cannot read in full, and (for a declared tier) pages it could not read.
|
|
210
213
|
const blockers = [];
|
|
214
|
+
if (canary && options.launch)
|
|
215
|
+
blockers.push(`the Brandlab packages are the canary ${canary.version}, not a published release`);
|
|
211
216
|
if (!config.complete)
|
|
212
217
|
blockers.push("brandlab.config.ts could not be read in full");
|
|
213
218
|
if (config.siteSystem) {
|
package/dist/ready-cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ready-cli.js","sourceRoot":"","sources":["../src/ready-cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC3F,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,8BAA8B,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAEvF,OAAO,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,2BAA2B,EAAE,MAAM,oCAAoC,CAAC;AACjF,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACzF,OAAO,EACL,0BAA0B,EAC1B,6BAA6B,EAC7B,8BAA8B,GAG/B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,4BAA4B,EAAE,MAAM,+BAA+B,CAAC;AAC7E,OAAO,EACL,mBAAmB,EACnB,4BAA4B,GAE7B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,mBAAmB,EAAE,yBAAyB,EAAwB,MAAM,0BAA0B,CAAC;AAChH,OAAO,EAAE,8BAA8B,EAAE,MAAM,wBAAwB,CAAC;AAmCxE,MAAM,yBAAyB,GAAG,+BAA+B,CAAC;AAClE,qGAAqG;AACrG,MAAM,cAAc,GAAG,IAAI,GAAG,CAAS,8BAA8B,CAAC,CAAC;AACvE,MAAM,iBAAiB,GAAG,OAAO,CAAC;AAElC,MAAM,IAAI,GAAG;;;;;;;8DAOiD,yBAAyB;;uFAEA,iBAAiB;;;;;;;;;;;;CAYvG,CAAC;AAEF,MAAM,UAAU,sBAAsB,CAAC,IAAuB;IAC5D,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAC/E,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ;QAAE,OAAO,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAChE,MAAM,MAAM,GAAuB;QACjC,OAAO,EAAE,QAAQ;QACjB,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE;QACnB,gBAAgB,EAAE,yBAAyB;QAC3C,QAAQ,EAAE,iBAAiB;QAC3B,QAAQ,EAAE,EAAE;QACZ,MAAM,EAAE,KAAK;KACd,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;YAAE,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;aACnF,IAAI,QAAQ,KAAK,qBAAqB;YAAE,MAAM,CAAC,gBAAgB,GAAG,YAAY,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;aACxG,IAAI,QAAQ,KAAK,aAAa;YAAE,MAAM,CAAC,QAAQ,GAAG,YAAY,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;aACxF,IAAI,QAAQ,KAAK,YAAY;YAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;aAC3F,IAAI,QAAQ,KAAK,qBAAqB;YAAE,MAAM,CAAC,gBAAgB,GAAG,YAAY,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;aACxG,IAAI,QAAQ,KAAK,UAAU;YAAE,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC;aAClD,IAAI,QAAQ,KAAK,YAAY,EAAE,CAAC;YACnC,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;YACpD,IAAI,GAAQ,CAAC;YACb,IAAI,CAAC;gBACH,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;YACvB,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,IAAI,KAAK,CAAC,cAAc,KAAK,gBAAgB,CAAC,CAAC;YACvD,CAAC;YACD,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ;gBAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;YACvH,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,oBAAoB,QAAQ,GAAG,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,eAAe,CAAC,IAAuB;IAC9C,MAAM,MAAM,GAAuB,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;IACtF,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAE,CAAC;QAC9B,IAAI,QAAQ,KAAK,YAAY;YAAE,MAAM,CAAC,QAAQ,GAAG,YAAY,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;aAClF,IAAI,QAAQ,KAAK,QAAQ;YAAE,MAAM,CAAC,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;aAC/E,IAAI,QAAQ,KAAK,QAAQ;YAAE,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;aACxF,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;YAAE,MAAM,CAAC,EAAE,GAAG,QAAQ,CAAC;;YACnE,MAAM,IAAI,KAAK,CAAC,oBAAoB,QAAQ,GAAG,CAAC,CAAC;IACxD,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,qFAAqF,CAAC,CAAC;IACvH,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,UAAU,MAAM,CAAC,EAAE,yCAAyC,CAAC,CAAC;IACjH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,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,EACD,eAA6C,EAAE;IAE/C,IAAI,OAAwB,CAAC;IAC7B,IAAI,CAAC;QACH,OAAO,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,EAAE,CAAC,MAAM,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QAC/C,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,OAAO,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;QAC/B,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAChB,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IACnD,IAAI,CAAC;QACH,IAAI,OAAO,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YACjC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,sBAAsB,CAAC,OAAO,CAAC,IAAI,EAAE;gBAC5D,EAAE,EAAE,OAAO,CAAC,EAAE;gBACd,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,EAAE;gBAChC,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7D,GAAG,EAAE,GAAG,EAAE;aACX,CAAC,CAAC;YACH,EAAE,CAAC,MAAM,CAAC,YAAY,MAAM,CAAC,EAAE,OAAO,IAAI,KAAK,CAAC,CAAC;YACjD,OAAO,CAAC,CAAC;QACX,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC;QACrE,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,8BAA8B,CAAC,QAAQ,CAAC,CAAC;QACjF,SAAS,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,aAAa,CAAC,YAAY,EAAE,6BAA6B,CAAC,MAAM,CAAC,CAAC,CAAC;QACnE,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,8BAA8B,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAC/G,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QACxC,EAAE,CAAC,MAAM,CACP,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,KAAK;YAC5B,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,oBAAoB,QAAQ,WAAW,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3G,SAAS,8BAA8B,CAAC,QAAQ,QAAQ,8BAA8B,CAAC,IAAI,KAAK,CACnG,CAAC;QACF,OAAO,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;IACjC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,EAAE,CAAC,MAAM,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACtC,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,OAA2B,EAC3B,YAA0C,EAC1C,GAAS;IAET,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC1B,MAAM,MAAM,GAAG,2BAA2B,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,OAAO,CAAC,gBAAgB,IAAI,8BAA8B,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;IAClG,IAAI,MAAM,CAAC,UAAU,IAAI,CAAC,OAAO,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CACb,uJAAuJ,CACxJ,CAAC;IACJ,CAAC;IACD,MAAM,QAAQ,GAAa,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAwB,EAAE,CAAC;IAEzC,gEAAgE;IAChE,MAAM,WAAW,GAAG,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC9D,IAAI,aAAa,GAAkB,IAAI,CAAC;IACxC,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,QAAQ,CAAC,IAAI,CAAC,2BAA2B,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,kGAAkG,CAAC,CAAC;IAC7K,CAAC;SAAM,CAAC;QACN,aAAa,GAAG,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;QACrC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,QAAQ,CAAC,IAAI,CAAC,GAAG,aAAa,wDAAwD,CAAC,CAAC;QAC1F,CAAC;aAAM,CAAC;YACN,MAAM,QAAQ,GAAG,2BAA2B,CAAC,MAAM,CAAC,CAAC;YACrD,QAAQ,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACpC,QAAQ,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACpC,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC;QAChC,CAAC;IACH,CAAC;IAED,2DAA2D;IAC3D,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnD,MAAM,iBAAiB,GAAG,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,yBAAyB,CAAC,CAAC,CAAC;IAC9E,MAAM,KAAK,GAAG,yBAAyB,CAAC;QACtC,oBAAoB,EAAE,MAAM,CAAC,oBAAoB;QACjD,OAAO,EAAE,MAAM,CAAC,UAAU,EAAE,OAAO,IAAI,EAAE;QACzC,iBAAiB;KAClB,CAAC,CAAC;IACH,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,iBAAiB,KAAK,SAAS,EAAE,CAAC;QACxD,QAAQ,CAAC,IAAI,CAAC,0BAA0B,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC,6CAA6C,CAAC,CAAC;IACpH,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,IAAI,iBAAiB,KAAK,SAAS;QAC/D,CAAC,CAAC,MAAM,mBAAmB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,CAAC;QACrG,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAgB,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC1E,QAAQ,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAClC,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,QAAQ,CAAC,IAAI,CAAC,gFAAgF,CAAC,CAAC;IAC/H,wGAAwG;IACxG,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,IAAI,4BAA4B,CAAC;IACrE,MAAM,QAAQ,GAAG,MAAM,4BAA4B,CAAC,OAAO,EAAE;QAC3D,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;QAC9B,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,WAAW,EAAE,IAAI;QACjB,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,QAAQ;KACT,CAAC,CAAC;IACH,QAAQ,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACpC,QAAQ,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAEpC,yGAAyG;IACzG,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,CAAC,MAAM,CAAC,QAAQ;QAAE,QAAQ,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;IACpF,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9D,QAAQ,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,eAAe,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,2BAA2B,CAAC,CAAC;QAC1H,CAAC;aAAM,CAAC;YACN,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAAE,QAAQ,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;YACnF,MAAM,OAAO,GAAG,MAAM,CAAC,oBAAoB,CAAC,OAAO,CAAC;YACpD,IAAI,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAAE,QAAQ,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;QACvG,CAAC;IACH,CAAC;IAED,uDAAuD;IACvD,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACnC,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC9B,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;QAC1H,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,QAAQ,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,8DAA8D,CAAC,CAAC;YACxG,SAAS;QACX,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAC/C,IAAI,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YAC/B,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,iBAAiB,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,yDAAyD,CAAC,CAAC;QAChJ,CAAC;QACD,oGAAoG;QACpG,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAChI,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,QAAQ,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,iCAAiC,CAAC,GAAG,cAAc,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC;QAC3K,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACnF,CAAC;IAED,gEAAgE;IAChE,IAAI,MAAM,GAAkC,IAAI,CAAC;IACjD,IAAI,CAAC;QACH,MAAM,GAAG,uBAAuB,CAAC;YAC/B,IAAI;YACJ,GAAG,CAAC,OAAO,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAClG,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,QAAQ,CAAC,IAAI,CAAC,kCAAkC,YAAY,CAAC,KAAK,CAAC,6DAA6D,CAAC,CAAC;IACpI,CAAC;IAED,OAAO,0BAA0B,CAAC;QAChC,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,OAAO;QACP,QAAQ;QACR,MAAM;QACN,aAAa,EAAE,qBAAqB,CAAC,IAAI,EAAE,QAAQ,CAAC;QACpD,YAAY,EAAE,qBAAqB,CAAC,IAAI,EAAE,OAAO,CAAC;QAClD,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,MAAM,EAAE;YACN,aAAa;YACb,YAAY;YACZ,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM;YAC9D,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;YAC5C,OAAO,EAAE,OAAO,CAAC,MAAM;YACvB,YAAY,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;SACvF;QACD,QAAQ;QACR,GAAG;QACH,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,QAAQ;KACT,CAAC,CAAC;AACL,CAAC;AAED,SAAS,eAAe,CAAC,IAAY;IACnC,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC;IACpD,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAE,MAA+D,CAAC,CAAC,CAAC,IAAI,CAAC;AACpG,CAAC;AAED,qEAAqE;AACrE,SAAS,QAAQ,CAAC,IAAY;IAC5B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IACxC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,IAAY,EAAE,IAAY;IAC3C,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,WAAW,CAAC,IAAY,EAAE,IAAY;IAC7C,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC1C,OAAO,YAAY,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3G,CAAC;AAED,SAAS,YAAY,CAAC,IAAuB,EAAE,KAAa,EAAE,QAAgB;IAC5E,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,QAAQ,oBAAoB,CAAC,CAAC;IACpG,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,SAAiB,EAAE,QAA4B;IAC1F,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,4BAA4B,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACnE,mBAAmB,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;QACvD,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["#!/usr/bin/env node\nimport { existsSync, mkdirSync, readFileSync, realpathSync, writeFileSync } from \"node:fs\";\nimport { dirname, isAbsolute, join, relative, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { detectInstalledBrandlabRelease, evaluateBrandlabProject } from \"./project.js\";\nimport type { SiteSystemFinding } from \"./site-system/checks.js\";\nimport { readSiteSystemProjectConfig } from \"./site-system/config.js\";\nimport { readSiteSystemJourneyReport } from \"./site-system/playwright-report.js\";\nimport { appendSiteSystemRecord, readSiteSystemRecords } from \"./site-system/records.js\";\nimport {\n buildSiteSystemReadyReport,\n renderSiteSystemReadyMarkdown,\n SITE_SYSTEM_READY_REPORT_PATHS,\n type SiteSystemReadyReport,\n type SiteSystemVerifyResult,\n} from \"./site-system/report.js\";\nimport { SITE_SYSTEM_RENDERED_RUNNERS } from \"./site-system/rule-modules.js\";\nimport {\n isSiteSystemFinding,\n runSiteSystemRenderedRunners,\n type SiteSystemRenderedRunner,\n} from \"./site-system/runners.js\";\nimport { loadSiteSystemPages, planSiteSystemSamplePaths, type SiteSystemFetch } from \"./site-system/samples.js\";\nimport { SITE_SYSTEM_RECORDED_CHECK_IDS } from \"./site-system/steps.js\";\n\ninterface ReadyReportOptions {\n command: \"report\";\n root: string;\n playwrightReport: string;\n baseUrl?: string;\n buildDir: string;\n findings: string[];\n installedRelease?: string;\n launch: boolean;\n}\n\ninterface ReadyRecordOptions {\n command: \"record\";\n root: string;\n id: string;\n evidence?: string;\n note?: string;\n}\n\ntype ReadyCliOptions = ReadyReportOptions | ReadyRecordOptions | { command: \"help\" };\n\ninterface CliIo {\n stdout: (value: string) => void;\n stderr: (value: string) => void;\n}\n\nexport interface BrandlabReadyCliDependencies {\n /** The rule modules to run (default: SITE_SYSTEM_RENDERED_RUNNERS). */\n runners?: readonly SiteSystemRenderedRunner[];\n fetch?: SiteSystemFetch;\n now?: () => Date;\n}\n\nconst DEFAULT_PLAYWRIGHT_REPORT = \"test-results/site-system.json\";\n/** The checks a --findings file may set: K10 (the lenient harness) and the other recorded checks. */\nconst SUPPLIABLE_IDS = new Set<string>(SITE_SYSTEM_RECORDED_CHECK_IDS);\nconst DEFAULT_BUILD_DIR = \".next\";\n\nconst HELP = `Brandlab ready gate\n\nWrites docs/ready/ready-report.md and .json for the Site System tier declared in\nbrandlab.config.ts (siteSystem: { tier }), and records launch-day and human steps.\n\nUsage:\n brandlab-ready [--root <path>]\n [--playwright-report <path>] journey results (default ${DEFAULT_PLAYWRIGHT_REPORT})\n [--base-url <url>] fetch the sample pages from the running site\n [--build-dir <path>] otherwise read their HTML from the build (default ${DEFAULT_BUILD_DIR})\n [--findings <path>]... K10 or X1 results as SiteSystemFinding JSON (the lenient harness)\n [--installed-release <version>]\n [--launch] also require every launch-day and human step\n brandlab-ready record <id> --evidence <where the proof is> [--note <text>] [--root <path>]\n\nExit status:\n 0 ready at the declared tier, or nothing blocks (no tier declared, or none of its checks released)\n 1 a blocking check failed or did not run, home or the contact page could not be read, a --base-url\n sample did not answer with HTML, or brandlab.config.ts could not be read in full\n (with --launch, also a step not recorded)\n 2 the gate could not run (bad arguments, an unreadable config or records file)\n`;\n\nexport function parseBrandlabReadyArgs(argv: readonly string[]): ReadyCliOptions {\n if (argv.includes(\"--help\") || argv.includes(\"-h\")) return { command: \"help\" };\n if (argv[0] === \"record\") return parseRecordArgs(argv.slice(1));\n const parsed: ReadyReportOptions = {\n command: \"report\",\n root: process.cwd(),\n playwrightReport: DEFAULT_PLAYWRIGHT_REPORT,\n buildDir: DEFAULT_BUILD_DIR,\n findings: [],\n launch: false,\n };\n for (let index = 0; index < argv.length; index += 1) {\n const argument = argv[index];\n if (argument === \"--root\") parsed.root = resolve(requireValue(argv, ++index, argument));\n else if (argument === \"--playwright-report\") parsed.playwrightReport = requireValue(argv, ++index, argument);\n else if (argument === \"--build-dir\") parsed.buildDir = requireValue(argv, ++index, argument);\n else if (argument === \"--findings\") parsed.findings.push(requireValue(argv, ++index, argument));\n else if (argument === \"--installed-release\") parsed.installedRelease = requireValue(argv, ++index, argument);\n else if (argument === \"--launch\") parsed.launch = true;\n else if (argument === \"--base-url\") {\n const value = requireValue(argv, ++index, argument);\n let url: URL;\n try {\n url = new URL(value);\n } catch {\n throw new Error(`--base-url ${value} is not a URL.`);\n }\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") throw new Error(\"--base-url must be an http or https URL.\");\n parsed.baseUrl = value;\n } else {\n throw new Error(`Unknown argument ${argument}.`);\n }\n }\n return parsed;\n}\n\nfunction parseRecordArgs(argv: readonly string[]): ReadyRecordOptions {\n const parsed: ReadyRecordOptions = { command: \"record\", root: process.cwd(), id: \"\" };\n for (let index = 0; index < argv.length; index += 1) {\n const argument = argv[index]!;\n if (argument === \"--evidence\") parsed.evidence = requireValue(argv, ++index, argument);\n else if (argument === \"--note\") parsed.note = requireValue(argv, ++index, argument);\n else if (argument === \"--root\") parsed.root = resolve(requireValue(argv, ++index, argument));\n else if (!argument.startsWith(\"--\") && !parsed.id) parsed.id = argument;\n else throw new Error(`Unknown argument ${argument}.`);\n }\n if (!parsed.id) throw new Error(\"record needs a step id, for example: brandlab-ready record X3 --evidence <PR link>.\");\n if (parsed.evidence === undefined) throw new Error(`record ${parsed.id} needs --evidence <where the proof is>.`);\n return parsed;\n}\n\nexport async function runBrandlabReadyCli(\n argv: readonly string[],\n io: CliIo = {\n stdout: (value) => process.stdout.write(value),\n stderr: (value) => process.stderr.write(value),\n },\n dependencies: BrandlabReadyCliDependencies = {},\n): Promise<number> {\n let options: ReadyCliOptions;\n try {\n options = parseBrandlabReadyArgs(argv);\n } catch (error) {\n io.stderr(`${errorMessage(error)}\\n\\n${HELP}`);\n return 2;\n }\n if (options.command === \"help\") {\n io.stdout(HELP);\n return 0;\n }\n const now = dependencies.now ?? (() => new Date());\n try {\n if (options.command === \"record\") {\n const { path, record } = appendSiteSystemRecord(options.root, {\n id: options.id,\n evidence: options.evidence ?? \"\",\n ...(options.note !== undefined ? { note: options.note } : {}),\n now: now(),\n });\n io.stdout(`Recorded ${record.id} in ${path}.\\n`);\n return 0;\n }\n const report = await createReadyReport(options, dependencies, now());\n const markdownPath = join(options.root, SITE_SYSTEM_READY_REPORT_PATHS.markdown);\n mkdirSync(dirname(markdownPath), { recursive: true });\n writeFileSync(markdownPath, renderSiteSystemReadyMarkdown(report));\n writeFileSync(join(options.root, SITE_SYSTEM_READY_REPORT_PATHS.json), `${JSON.stringify(report, null, 2)}\\n`);\n const problems = report.problems.length;\n io.stdout(\n `${report.verdict.summary}.\\n` +\n (problems > 0 ? `The report lists ${problems} problem${problems === 1 ? \"\" : \"s\"} with the inputs.\\n` : \"\") +\n `Wrote ${SITE_SYSTEM_READY_REPORT_PATHS.markdown} and ${SITE_SYSTEM_READY_REPORT_PATHS.json}.\\n`,\n );\n return report.verdict.exitCode;\n } catch (error) {\n io.stderr(`${errorMessage(error)}\\n`);\n return 2;\n }\n}\n\nasync function createReadyReport(\n options: ReadyReportOptions,\n dependencies: BrandlabReadyCliDependencies,\n now: Date,\n): Promise<SiteSystemReadyReport> {\n const root = options.root;\n const config = readSiteSystemProjectConfig(root);\n const release = options.installedRelease ?? detectInstalledBrandlabRelease(readPackageJson(root));\n if (config.siteSystem && !release) {\n throw new Error(\n \"The installed Brandlab release could not be read from package.json. Pin all four Brandlab packages to one exact version, or pass --installed-release.\",\n );\n }\n const problems: string[] = [...config.problems];\n const findings: SiteSystemFinding[] = [];\n\n // Journeys: the Playwright JSON report of the site-system spec.\n const journeyPath = resolveIn(root, options.playwrightReport);\n let journeyReport: string | null = null;\n let journeyTests = 0;\n if (!existsSync(journeyPath)) {\n problems.push(`No Playwright report at ${displayPath(root, journeyPath)}, so the journey checks did not run (run the site-system journeys with the JSON reporter first).`);\n } else {\n journeyReport = displayPath(root, journeyPath);\n const parsed = readJson(journeyPath);\n if (parsed === undefined) {\n problems.push(`${journeyReport} is not valid JSON, so the journey checks did not run.`);\n } else {\n const journeys = readSiteSystemJourneyReport(parsed);\n findings.push(...journeys.findings);\n problems.push(...journeys.problems);\n journeyTests = journeys.tests;\n }\n }\n\n // Rendered and static rule modules over the sampled pages.\n const buildDir = resolveIn(root, options.buildDir);\n const prerenderManifest = readJson(join(buildDir, \"prerender-manifest.json\"));\n const paths = planSiteSystemSamplePaths({\n representativeRoutes: config.representativeRoutes,\n samples: config.siteSystem?.samples ?? [],\n prerenderManifest,\n });\n if (!options.baseUrl && prerenderManifest === undefined) {\n problems.push(`No production build at ${displayPath(root, buildDir)}: run next build first, or pass --base-url.`);\n }\n const loaded = options.baseUrl || prerenderManifest !== undefined\n ? await loadSiteSystemPages({ paths, buildDir, baseUrl: options.baseUrl, fetch: dependencies.fetch })\n : { pages: [], missing: paths, source: \"build\" as const, problems: [] };\n problems.push(...loaded.problems);\n if (loaded.pages.length === 0) problems.push(\"No page HTML was available, so the rule modules ran on the project files only.\");\n // Every runner runs: static rules read the project, rendered rules report not-applicable without pages.\n const runners = dependencies.runners ?? SITE_SYSTEM_RENDERED_RUNNERS;\n const rendered = await runSiteSystemRenderedRunners(runners, {\n baseUrl: options.baseUrl ?? \"\",\n pages: loaded.pages,\n missing: loaded.missing,\n projectRoot: root,\n siteSystem: config.siteSystem,\n buildDir,\n });\n findings.push(...rendered.findings);\n problems.push(...rendered.problems);\n\n // Fail closed: a config the gate cannot read in full, and (for a declared tier) pages it could not read.\n const blockers: string[] = [];\n if (!config.complete) blockers.push(\"brandlab.config.ts could not be read in full\");\n if (config.siteSystem) {\n if (loaded.source === \"base-url\" && loaded.missing.length > 0) {\n blockers.push(`${loaded.missing.length} sample page${loaded.missing.length === 1 ? \"\" : \"s\"} did not answer with HTML`);\n } else {\n if (loaded.missing.includes(\"/\")) blockers.push(\"the home page could not be read\");\n const contact = config.representativeRoutes.contact;\n if (contact && loaded.missing.includes(contact)) blockers.push(\"the contact page could not be read\");\n }\n }\n\n // Results other tools wrote as SiteSystemFinding JSON.\n for (const file of options.findings) {\n const path = resolveIn(root, file);\n const parsed = readJson(path);\n const list = Array.isArray(parsed) ? parsed : isRecord(parsed) && Array.isArray(parsed.findings) ? parsed.findings : null;\n if (!list) {\n problems.push(`${displayPath(root, path)} is missing or is not a list of findings, so it was ignored.`);\n continue;\n }\n const valid = list.filter(isSiteSystemFinding);\n if (valid.length < list.length) {\n problems.push(`${list.length - valid.length} result(s) in ${displayPath(root, path)} name an unknown check or status, so they were ignored.`);\n }\n // Supplied files carry harness and recorded results only; they cannot pass a journey or rule check.\n const refused = [...new Set(valid.filter((finding) => !SUPPLIABLE_IDS.has(finding.checkId)).map((finding) => finding.checkId))];\n if (refused.length > 0) {\n problems.push(`${displayPath(root, path)} sets ${refused.join(\", \")}, but --findings may only set ${[...SUPPLIABLE_IDS].join(\" and \")}, so those results were ignored.`);\n }\n findings.push(...valid.filter((finding) => SUPPLIABLE_IDS.has(finding.checkId)));\n }\n\n // The existing brandlab-verify families the shell tier carries.\n let verify: SiteSystemVerifyResult | null = null;\n try {\n verify = evaluateBrandlabProject({\n root,\n ...(options.installedRelease !== undefined ? { installedRelease: options.installedRelease } : {}),\n });\n } catch (error) {\n problems.push(`brandlab-verify could not run (${errorMessage(error)}), so its search, contact and analytics checks did not run.`);\n }\n\n return buildSiteSystemReadyReport({\n projectId: config.projectId,\n siteSystem: config.siteSystem,\n release,\n findings,\n verify,\n launchRecords: readSiteSystemRecords(root, \"launch\"),\n humanRecords: readSiteSystemRecords(root, \"human\"),\n exceptions: config.exceptions,\n inputs: {\n journeyReport,\n journeyTests,\n pageSource: loaded.pages.length === 0 ? \"none\" : loaded.source,\n pages: loaded.pages.map((page) => page.path),\n runners: runners.length,\n findingFiles: options.findings.map((file) => displayPath(root, resolveIn(root, file))),\n },\n problems,\n now,\n launch: options.launch,\n blockers,\n });\n}\n\nfunction readPackageJson(root: string): Parameters<typeof detectInstalledBrandlabRelease>[0] {\n const parsed = readJson(join(root, \"package.json\"));\n return isRecord(parsed) ? (parsed as Parameters<typeof detectInstalledBrandlabRelease>[0]) : null;\n}\n\n/** Parsed JSON, or undefined when the file is missing or invalid. */\nfunction readJson(path: string): unknown {\n if (!existsSync(path)) return undefined;\n try {\n return JSON.parse(readFileSync(path, \"utf8\"));\n } catch {\n return undefined;\n }\n}\n\nfunction resolveIn(root: string, path: string): string {\n return isAbsolute(path) ? path : resolve(root, path);\n}\n\nfunction displayPath(root: string, path: string): string {\n const relativePath = relative(root, path);\n return relativePath && !relativePath.startsWith(\"..\") && !isAbsolute(relativePath) ? relativePath : path;\n}\n\nfunction requireValue(argv: readonly string[], index: number, argument: string): string {\n const value = argv[index];\n if (value === undefined || value.startsWith(\"--\")) throw new Error(`${argument} requires a value.`);\n return value;\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nexport function isBrandlabReadyCliEntrypoint(moduleUrl: string, argvPath: string | undefined): 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 (isBrandlabReadyCliEntrypoint(import.meta.url, process.argv[1])) {\n runBrandlabReadyCli(process.argv.slice(2)).then((code) => {\n process.exitCode = code;\n });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ready-cli.js","sourceRoot":"","sources":["../src/ready-cli.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\nimport { existsSync, mkdirSync, readFileSync, realpathSync, writeFileSync } from \"node:fs\";\nimport { dirname, isAbsolute, join, relative, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { detectBrandlabCanaryRelease, detectInstalledBrandlabRelease, evaluateBrandlabProject } from \"./project.js\";\nimport type { SiteSystemFinding } from \"./site-system/checks.js\";\nimport { readSiteSystemProjectConfig } from \"./site-system/config.js\";\nimport { readSiteSystemJourneyReport } from \"./site-system/playwright-report.js\";\nimport { appendSiteSystemRecord, readSiteSystemRecords } from \"./site-system/records.js\";\nimport {\n buildSiteSystemReadyReport,\n renderSiteSystemReadyMarkdown,\n SITE_SYSTEM_READY_REPORT_PATHS,\n type SiteSystemReadyReport,\n type SiteSystemVerifyResult,\n} from \"./site-system/report.js\";\nimport { SITE_SYSTEM_RENDERED_RUNNERS } from \"./site-system/rule-modules.js\";\nimport {\n isSiteSystemFinding,\n runSiteSystemRenderedRunners,\n type SiteSystemRenderedRunner,\n} from \"./site-system/runners.js\";\nimport { loadSiteSystemPages, planSiteSystemSamplePaths, type SiteSystemFetch } from \"./site-system/samples.js\";\nimport { SITE_SYSTEM_RECORDED_CHECK_IDS } from \"./site-system/steps.js\";\n\ninterface ReadyReportOptions {\n command: \"report\";\n root: string;\n playwrightReport: string;\n baseUrl?: string;\n buildDir: string;\n findings: string[];\n installedRelease?: string;\n launch: boolean;\n}\n\ninterface ReadyRecordOptions {\n command: \"record\";\n root: string;\n id: string;\n evidence?: string;\n note?: string;\n}\n\ntype ReadyCliOptions = ReadyReportOptions | ReadyRecordOptions | { command: \"help\" };\n\ninterface CliIo {\n stdout: (value: string) => void;\n stderr: (value: string) => void;\n}\n\nexport interface BrandlabReadyCliDependencies {\n /** The rule modules to run (default: SITE_SYSTEM_RENDERED_RUNNERS). */\n runners?: readonly SiteSystemRenderedRunner[];\n fetch?: SiteSystemFetch;\n now?: () => Date;\n}\n\nconst DEFAULT_PLAYWRIGHT_REPORT = \"test-results/site-system.json\";\n/** The checks a --findings file may set: K10 (the lenient harness) and the other recorded checks. */\nconst SUPPLIABLE_IDS = new Set<string>(SITE_SYSTEM_RECORDED_CHECK_IDS);\nconst DEFAULT_BUILD_DIR = \".next\";\n\nconst HELP = `Brandlab ready gate\n\nWrites docs/ready/ready-report.md and .json for the Site System tier declared in\nbrandlab.config.ts (siteSystem: { tier }), and records launch-day and human steps.\n\nUsage:\n brandlab-ready [--root <path>]\n [--playwright-report <path>] journey results (default ${DEFAULT_PLAYWRIGHT_REPORT})\n [--base-url <url>] fetch the sample pages from the running site\n [--build-dir <path>] otherwise read their HTML from the build (default ${DEFAULT_BUILD_DIR})\n [--findings <path>]... K10 or X1 results as SiteSystemFinding JSON (the lenient harness)\n [--installed-release <version>]\n [--launch] also require every launch-day and human step\n brandlab-ready record <id> --evidence <where the proof is> [--note <text>] [--root <path>]\n\nExit status:\n 0 ready at the declared tier, or nothing blocks (no tier declared, or none of its checks released)\n 1 a blocking check failed or did not run, home or the contact page could not be read, a --base-url\n sample did not answer with HTML, or brandlab.config.ts could not be read in full\n (with --launch, also a step not recorded)\n 2 the gate could not run (bad arguments, an unreadable config or records file)\n`;\n\nexport function parseBrandlabReadyArgs(argv: readonly string[]): ReadyCliOptions {\n if (argv.includes(\"--help\") || argv.includes(\"-h\")) return { command: \"help\" };\n if (argv[0] === \"record\") return parseRecordArgs(argv.slice(1));\n const parsed: ReadyReportOptions = {\n command: \"report\",\n root: process.cwd(),\n playwrightReport: DEFAULT_PLAYWRIGHT_REPORT,\n buildDir: DEFAULT_BUILD_DIR,\n findings: [],\n launch: false,\n };\n for (let index = 0; index < argv.length; index += 1) {\n const argument = argv[index];\n if (argument === \"--root\") parsed.root = resolve(requireValue(argv, ++index, argument));\n else if (argument === \"--playwright-report\") parsed.playwrightReport = requireValue(argv, ++index, argument);\n else if (argument === \"--build-dir\") parsed.buildDir = requireValue(argv, ++index, argument);\n else if (argument === \"--findings\") parsed.findings.push(requireValue(argv, ++index, argument));\n else if (argument === \"--installed-release\") parsed.installedRelease = requireValue(argv, ++index, argument);\n else if (argument === \"--launch\") parsed.launch = true;\n else if (argument === \"--base-url\") {\n const value = requireValue(argv, ++index, argument);\n let url: URL;\n try {\n url = new URL(value);\n } catch {\n throw new Error(`--base-url ${value} is not a URL.`);\n }\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") throw new Error(\"--base-url must be an http or https URL.\");\n parsed.baseUrl = value;\n } else {\n throw new Error(`Unknown argument ${argument}.`);\n }\n }\n return parsed;\n}\n\nfunction parseRecordArgs(argv: readonly string[]): ReadyRecordOptions {\n const parsed: ReadyRecordOptions = { command: \"record\", root: process.cwd(), id: \"\" };\n for (let index = 0; index < argv.length; index += 1) {\n const argument = argv[index]!;\n if (argument === \"--evidence\") parsed.evidence = requireValue(argv, ++index, argument);\n else if (argument === \"--note\") parsed.note = requireValue(argv, ++index, argument);\n else if (argument === \"--root\") parsed.root = resolve(requireValue(argv, ++index, argument));\n else if (!argument.startsWith(\"--\") && !parsed.id) parsed.id = argument;\n else throw new Error(`Unknown argument ${argument}.`);\n }\n if (!parsed.id) throw new Error(\"record needs a step id, for example: brandlab-ready record X3 --evidence <PR link>.\");\n if (parsed.evidence === undefined) throw new Error(`record ${parsed.id} needs --evidence <where the proof is>.`);\n return parsed;\n}\n\nexport async function runBrandlabReadyCli(\n argv: readonly string[],\n io: CliIo = {\n stdout: (value) => process.stdout.write(value),\n stderr: (value) => process.stderr.write(value),\n },\n dependencies: BrandlabReadyCliDependencies = {},\n): Promise<number> {\n let options: ReadyCliOptions;\n try {\n options = parseBrandlabReadyArgs(argv);\n } catch (error) {\n io.stderr(`${errorMessage(error)}\\n\\n${HELP}`);\n return 2;\n }\n if (options.command === \"help\") {\n io.stdout(HELP);\n return 0;\n }\n const now = dependencies.now ?? (() => new Date());\n try {\n if (options.command === \"record\") {\n const { path, record } = appendSiteSystemRecord(options.root, {\n id: options.id,\n evidence: options.evidence ?? \"\",\n ...(options.note !== undefined ? { note: options.note } : {}),\n now: now(),\n });\n io.stdout(`Recorded ${record.id} in ${path}.\\n`);\n return 0;\n }\n const report = await createReadyReport(options, dependencies, now());\n const markdownPath = join(options.root, SITE_SYSTEM_READY_REPORT_PATHS.markdown);\n mkdirSync(dirname(markdownPath), { recursive: true });\n writeFileSync(markdownPath, renderSiteSystemReadyMarkdown(report));\n writeFileSync(join(options.root, SITE_SYSTEM_READY_REPORT_PATHS.json), `${JSON.stringify(report, null, 2)}\\n`);\n const problems = report.problems.length;\n io.stdout(\n `${report.verdict.summary}.\\n` +\n (problems > 0 ? `The report lists ${problems} problem${problems === 1 ? \"\" : \"s\"} with the inputs.\\n` : \"\") +\n `Wrote ${SITE_SYSTEM_READY_REPORT_PATHS.markdown} and ${SITE_SYSTEM_READY_REPORT_PATHS.json}.\\n`,\n );\n return report.verdict.exitCode;\n } catch (error) {\n io.stderr(`${errorMessage(error)}\\n`);\n return 2;\n }\n}\n\nasync function createReadyReport(\n options: ReadyReportOptions,\n dependencies: BrandlabReadyCliDependencies,\n now: Date,\n): Promise<SiteSystemReadyReport> {\n const root = options.root;\n const config = readSiteSystemProjectConfig(root);\n const packageJson = readPackageJson(root);\n // A canary (X.Y.Z-canary.N) gates checks as its line X.Y.Z, but never launches.\n const canary = options.installedRelease ? null : detectBrandlabCanaryRelease(packageJson);\n const release = options.installedRelease ?? detectInstalledBrandlabRelease(packageJson) ?? canary?.version ?? null;\n if (config.siteSystem && !release) {\n throw new Error(\n \"The installed Brandlab release could not be read from package.json. Pin all four Brandlab packages to one exact version (or one canary), or pass --installed-release.\",\n );\n }\n const problems: string[] = [...config.problems];\n const findings: SiteSystemFinding[] = [];\n\n // Journeys: the Playwright JSON report of the site-system spec.\n const journeyPath = resolveIn(root, options.playwrightReport);\n let journeyReport: string | null = null;\n let journeyTests = 0;\n if (!existsSync(journeyPath)) {\n problems.push(`No Playwright report at ${displayPath(root, journeyPath)}, so the journey checks did not run (run the site-system journeys with the JSON reporter first).`);\n } else {\n journeyReport = displayPath(root, journeyPath);\n const parsed = readJson(journeyPath);\n if (parsed === undefined) {\n problems.push(`${journeyReport} is not valid JSON, so the journey checks did not run.`);\n } else {\n const journeys = readSiteSystemJourneyReport(parsed);\n findings.push(...journeys.findings);\n problems.push(...journeys.problems);\n journeyTests = journeys.tests;\n }\n }\n\n // Rendered and static rule modules over the sampled pages.\n const buildDir = resolveIn(root, options.buildDir);\n const prerenderManifest = readJson(join(buildDir, \"prerender-manifest.json\"));\n const paths = planSiteSystemSamplePaths({\n representativeRoutes: config.representativeRoutes,\n samples: config.siteSystem?.samples ?? [],\n prerenderManifest,\n });\n if (!options.baseUrl && prerenderManifest === undefined) {\n problems.push(`No production build at ${displayPath(root, buildDir)}: run next build first, or pass --base-url.`);\n }\n const loaded = options.baseUrl || prerenderManifest !== undefined\n ? await loadSiteSystemPages({ paths, buildDir, baseUrl: options.baseUrl, fetch: dependencies.fetch })\n : { pages: [], missing: paths, source: \"build\" as const, problems: [] };\n problems.push(...loaded.problems);\n if (loaded.pages.length === 0) problems.push(\"No page HTML was available, so the rule modules ran on the project files only.\");\n // Every runner runs: static rules read the project, rendered rules report not-applicable without pages.\n const runners = dependencies.runners ?? SITE_SYSTEM_RENDERED_RUNNERS;\n const rendered = await runSiteSystemRenderedRunners(runners, {\n baseUrl: options.baseUrl ?? \"\",\n pages: loaded.pages,\n missing: loaded.missing,\n projectRoot: root,\n siteSystem: config.siteSystem,\n buildDir,\n });\n findings.push(...rendered.findings);\n problems.push(...rendered.problems);\n\n // Fail closed: a config the gate cannot read in full, and (for a declared tier) pages it could not read.\n const blockers: string[] = [];\n if (canary && options.launch) blockers.push(`the Brandlab packages are the canary ${canary.version}, not a published release`);\n if (!config.complete) blockers.push(\"brandlab.config.ts could not be read in full\");\n if (config.siteSystem) {\n if (loaded.source === \"base-url\" && loaded.missing.length > 0) {\n blockers.push(`${loaded.missing.length} sample page${loaded.missing.length === 1 ? \"\" : \"s\"} did not answer with HTML`);\n } else {\n if (loaded.missing.includes(\"/\")) blockers.push(\"the home page could not be read\");\n const contact = config.representativeRoutes.contact;\n if (contact && loaded.missing.includes(contact)) blockers.push(\"the contact page could not be read\");\n }\n }\n\n // Results other tools wrote as SiteSystemFinding JSON.\n for (const file of options.findings) {\n const path = resolveIn(root, file);\n const parsed = readJson(path);\n const list = Array.isArray(parsed) ? parsed : isRecord(parsed) && Array.isArray(parsed.findings) ? parsed.findings : null;\n if (!list) {\n problems.push(`${displayPath(root, path)} is missing or is not a list of findings, so it was ignored.`);\n continue;\n }\n const valid = list.filter(isSiteSystemFinding);\n if (valid.length < list.length) {\n problems.push(`${list.length - valid.length} result(s) in ${displayPath(root, path)} name an unknown check or status, so they were ignored.`);\n }\n // Supplied files carry harness and recorded results only; they cannot pass a journey or rule check.\n const refused = [...new Set(valid.filter((finding) => !SUPPLIABLE_IDS.has(finding.checkId)).map((finding) => finding.checkId))];\n if (refused.length > 0) {\n problems.push(`${displayPath(root, path)} sets ${refused.join(\", \")}, but --findings may only set ${[...SUPPLIABLE_IDS].join(\" and \")}, so those results were ignored.`);\n }\n findings.push(...valid.filter((finding) => SUPPLIABLE_IDS.has(finding.checkId)));\n }\n\n // The existing brandlab-verify families the shell tier carries.\n let verify: SiteSystemVerifyResult | null = null;\n try {\n verify = evaluateBrandlabProject({\n root,\n ...(options.installedRelease !== undefined ? { installedRelease: options.installedRelease } : {}),\n });\n } catch (error) {\n problems.push(`brandlab-verify could not run (${errorMessage(error)}), so its search, contact and analytics checks did not run.`);\n }\n\n return buildSiteSystemReadyReport({\n projectId: config.projectId,\n siteSystem: config.siteSystem,\n release,\n findings,\n verify,\n launchRecords: readSiteSystemRecords(root, \"launch\"),\n humanRecords: readSiteSystemRecords(root, \"human\"),\n exceptions: config.exceptions,\n inputs: {\n journeyReport,\n journeyTests,\n pageSource: loaded.pages.length === 0 ? \"none\" : loaded.source,\n pages: loaded.pages.map((page) => page.path),\n runners: runners.length,\n findingFiles: options.findings.map((file) => displayPath(root, resolveIn(root, file))),\n },\n problems,\n now,\n launch: options.launch,\n blockers,\n });\n}\n\nfunction readPackageJson(root: string): Parameters<typeof detectInstalledBrandlabRelease>[0] {\n const parsed = readJson(join(root, \"package.json\"));\n return isRecord(parsed) ? (parsed as Parameters<typeof detectInstalledBrandlabRelease>[0]) : null;\n}\n\n/** Parsed JSON, or undefined when the file is missing or invalid. */\nfunction readJson(path: string): unknown {\n if (!existsSync(path)) return undefined;\n try {\n return JSON.parse(readFileSync(path, \"utf8\"));\n } catch {\n return undefined;\n }\n}\n\nfunction resolveIn(root: string, path: string): string {\n return isAbsolute(path) ? path : resolve(root, path);\n}\n\nfunction displayPath(root: string, path: string): string {\n const relativePath = relative(root, path);\n return relativePath && !relativePath.startsWith(\"..\") && !isAbsolute(relativePath) ? relativePath : path;\n}\n\nfunction requireValue(argv: readonly string[], index: number, argument: string): string {\n const value = argv[index];\n if (value === undefined || value.startsWith(\"--\")) throw new Error(`${argument} requires a value.`);\n return value;\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nexport function isBrandlabReadyCliEntrypoint(moduleUrl: string, argvPath: string | undefined): 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 (isBrandlabReadyCliEntrypoint(import.meta.url, process.argv[1])) {\n runBrandlabReadyCli(process.argv.slice(2)).then((code) => {\n process.exitCode = code;\n });\n}\n"]}
|
package/dist/rule-registry.d.ts
CHANGED
|
@@ -21,6 +21,11 @@ export declare const BRANDLAB_STATIC_RULES: readonly [{
|
|
|
21
21
|
readonly surface: "release";
|
|
22
22
|
readonly checkId: "release-consistency";
|
|
23
23
|
readonly summary: "All four Brandlab packages are pinned to one exact release.";
|
|
24
|
+
}, {
|
|
25
|
+
readonly ruleId: "brandlab-release-canary";
|
|
26
|
+
readonly surface: "release";
|
|
27
|
+
readonly checkId: "release-consistency";
|
|
28
|
+
readonly summary: "A canary (X.Y.Z-canary.N) is reported as a warning, checked against its line's contract when present, and never counts as a published release.";
|
|
24
29
|
}, {
|
|
25
30
|
readonly ruleId: "brandlab-release-unsupported";
|
|
26
31
|
readonly surface: "release";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rule-registry.d.ts","sourceRoot":"","sources":["../src/rule-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AAE5E;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,2BAA2B,CAAC;IACrC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,qBAAqB
|
|
1
|
+
{"version":3,"file":"rule-registry.d.ts","sourceRoot":"","sources":["../src/rule-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AAE5E;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,2BAA2B,CAAC;IACrC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6DgB,CAAC;AAEnD,6FAA6F;AAC7F,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAM3F"}
|