@nextcommerce/campaigns-os 1.33.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/AGENTS.md +204 -0
- package/CHANGELOG.md +5002 -0
- package/CONTEXT.md +685 -0
- package/LICENSE +202 -0
- package/NOTICE +4 -0
- package/README.md +368 -0
- package/agents/claude/CLAUDE.md +32 -0
- package/agents/codex/AGENTS.md +27 -0
- package/agents/copilot/copilot-instructions.md +14 -0
- package/agents/cursor/campaigns-os.mdc +13 -0
- package/bin/campaigns-os.mjs +38 -0
- package/campaign-spec/README.md +138 -0
- package/campaign-spec/dist/analytics-vocabulary.d.ts +47 -0
- package/campaign-spec/dist/analytics-vocabulary.js +74 -0
- package/campaign-spec/dist/index.d.ts +40 -0
- package/campaign-spec/dist/index.js +77 -0
- package/campaign-spec/dist/normalize.d.ts +22 -0
- package/campaign-spec/dist/normalize.js +41 -0
- package/campaign-spec/dist/routing.d.ts +190 -0
- package/campaign-spec/dist/routing.js +263 -0
- package/campaign-spec/dist/rules/analytics-contract-shape.d.ts +42 -0
- package/campaign-spec/dist/rules/analytics-contract-shape.js +303 -0
- package/campaign-spec/dist/rules/assembly-hints-shape.d.ts +42 -0
- package/campaign-spec/dist/rules/assembly-hints-shape.js +191 -0
- package/campaign-spec/dist/rules/campaign-metadata.d.ts +14 -0
- package/campaign-spec/dist/rules/campaign-metadata.js +40 -0
- package/campaign-spec/dist/rules/checkout-has-success-url.d.ts +31 -0
- package/campaign-spec/dist/rules/checkout-has-success-url.js +66 -0
- package/campaign-spec/dist/rules/cycle-detection.d.ts +12 -0
- package/campaign-spec/dist/rules/cycle-detection.js +141 -0
- package/campaign-spec/dist/rules/design-source-shape.d.ts +29 -0
- package/campaign-spec/dist/rules/design-source-shape.js +142 -0
- package/campaign-spec/dist/rules/downsell-without-upsell.d.ts +11 -0
- package/campaign-spec/dist/rules/downsell-without-upsell.js +40 -0
- package/campaign-spec/dist/rules/exit-intent-validation.d.ts +23 -0
- package/campaign-spec/dist/rules/exit-intent-validation.js +147 -0
- package/campaign-spec/dist/rules/funnel-count.d.ts +9 -0
- package/campaign-spec/dist/rules/funnel-count.js +37 -0
- package/campaign-spec/dist/rules/funnel-hypothesis-length.d.ts +22 -0
- package/campaign-spec/dist/rules/funnel-hypothesis-length.js +60 -0
- package/campaign-spec/dist/rules/funnel-identity.d.ts +15 -0
- package/campaign-spec/dist/rules/funnel-identity.js +57 -0
- package/campaign-spec/dist/rules/funnel-weight-sum.d.ts +20 -0
- package/campaign-spec/dist/rules/funnel-weight-sum.js +66 -0
- package/campaign-spec/dist/rules/index.d.ts +69 -0
- package/campaign-spec/dist/rules/index.js +131 -0
- package/campaign-spec/dist/rules/offer-ref-integrity.d.ts +13 -0
- package/campaign-spec/dist/rules/offer-ref-integrity.js +59 -0
- package/campaign-spec/dist/rules/package-pricing-sanity.d.ts +12 -0
- package/campaign-spec/dist/rules/package-pricing-sanity.js +42 -0
- package/campaign-spec/dist/rules/page-count.d.ts +11 -0
- package/campaign-spec/dist/rules/page-count.js +31 -0
- package/campaign-spec/dist/rules/page-id-uniqueness.d.ts +14 -0
- package/campaign-spec/dist/rules/page-id-uniqueness.js +47 -0
- package/campaign-spec/dist/rules/promo-code-input-validation.d.ts +8 -0
- package/campaign-spec/dist/rules/promo-code-input-validation.js +126 -0
- package/campaign-spec/dist/rules/promo-codes-shape.d.ts +30 -0
- package/campaign-spec/dist/rules/promo-codes-shape.js +187 -0
- package/campaign-spec/dist/rules/route-field-ignored-for-page-type.d.ts +33 -0
- package/campaign-spec/dist/rules/route-field-ignored-for-page-type.js +81 -0
- package/campaign-spec/dist/rules/route-target-resolves.d.ts +32 -0
- package/campaign-spec/dist/rules/route-target-resolves.js +112 -0
- package/campaign-spec/dist/rules/schema-version.d.ts +21 -0
- package/campaign-spec/dist/rules/schema-version.js +53 -0
- package/campaign-spec/dist/rules/sdk-version.d.ts +26 -0
- package/campaign-spec/dist/rules/sdk-version.js +96 -0
- package/campaign-spec/dist/rules/shipping-countries-shape.d.ts +10 -0
- package/campaign-spec/dist/rules/shipping-countries-shape.js +30 -0
- package/campaign-spec/dist/rules/shipping-methods-present.d.ts +10 -0
- package/campaign-spec/dist/rules/shipping-methods-present.js +26 -0
- package/campaign-spec/dist/rules/store-profile-shape.d.ts +30 -0
- package/campaign-spec/dist/rules/store-profile-shape.js +127 -0
- package/campaign-spec/dist/rules/thank-you-requirement.d.ts +16 -0
- package/campaign-spec/dist/rules/thank-you-requirement.js +50 -0
- package/campaign-spec/dist/rules/unknown-top-level-fields.d.ts +28 -0
- package/campaign-spec/dist/rules/unknown-top-level-fields.js +114 -0
- package/campaign-spec/dist/rules/upsell-has-packages.d.ts +9 -0
- package/campaign-spec/dist/rules/upsell-has-packages.js +35 -0
- package/campaign-spec/dist/rules/upsell-routing-complete.d.ts +10 -0
- package/campaign-spec/dist/rules/upsell-routing-complete.js +45 -0
- package/campaign-spec/dist/rules/upsell-without-checkout.d.ts +11 -0
- package/campaign-spec/dist/rules/upsell-without-checkout.js +44 -0
- package/campaign-spec/dist/rules/variant-labels-shape.d.ts +28 -0
- package/campaign-spec/dist/rules/variant-labels-shape.js +86 -0
- package/campaign-spec/dist/sdk-version-parse.d.ts +43 -0
- package/campaign-spec/dist/sdk-version-parse.js +62 -0
- package/campaign-spec/dist/types.d.ts +674 -0
- package/campaign-spec/dist/types.js +40 -0
- package/campaign-spec/package.json +12 -0
- package/compatibility.json +25 -0
- package/contracts/agent-relevant-change-policy.v1.json +111 -0
- package/contracts/brand-theme-source-defaults.figma-sections-export.v0.json +32 -0
- package/contracts/brand-theme-target-tokens.next-core.v0.json +65 -0
- package/contracts/campaign-cart-checkout-field-contract.v0.json +45 -0
- package/contracts/campaign-cart-sdk-support-policy.v0.json +11 -0
- package/contracts/commerce-surface-catalog.json +2452 -0
- package/contracts/fixtures/orientation/canonicalization/v1.json +34 -0
- package/contracts/fixtures/orientation/envelope/current.json +95 -0
- package/contracts/fixtures/orientation/envelope/freshness_unknown.json +97 -0
- package/contracts/fixtures/orientation/envelope/legacy_baseline.json +95 -0
- package/contracts/fixtures/orientation/envelope/orientation_available.json +136 -0
- package/contracts/fixtures/orientation/envelope/recovered_interrupted_update.json +136 -0
- package/contracts/fixtures/orientation/envelope/refused.json +100 -0
- package/contracts/fixtures/orientation/envelope/restart_required.json +137 -0
- package/contracts/fixtures/orientation/envelope/updated.json +135 -0
- package/contracts/fixtures/orientation/hostile-target/README.md +61 -0
- package/contracts/fixtures/orientation/hostile-target/manifest.json +82 -0
- package/contracts/fixtures/orientation/hostile-target/repo/CHANGELOG.md +18 -0
- package/contracts/fixtures/orientation/hostile-target/repo/bin/intended.mjs +12 -0
- package/contracts/fixtures/orientation/hostile-target/repo/bin/tripwire.mjs +15 -0
- package/contracts/fixtures/orientation/hostile-target/repo/contracts/release-ledger.json +48 -0
- package/contracts/fixtures/orientation/hostile-target/repo/contracts/supported-surface.json +17 -0
- package/contracts/fixtures/orientation/hostile-target/repo/docs/example-contract.md +13 -0
- package/contracts/fixtures/orientation/hostile-target/repo/hooks/post-checkout +5 -0
- package/contracts/fixtures/orientation/hostile-target/repo/hooks/post-merge +5 -0
- package/contracts/fixtures/orientation/hostile-target/repo/hooks/pre-commit +5 -0
- package/contracts/fixtures/orientation/hostile-target/repo/hostile-dependency-tripwire/package.json +15 -0
- package/contracts/fixtures/orientation/hostile-target/repo/hostile-dependency-tripwire/tripwire.mjs +9 -0
- package/contracts/fixtures/orientation/hostile-target/repo/package.json +20 -0
- package/contracts/fixtures/orientation/hostile-target/repo/schemas/example.v0.schema.json +15 -0
- package/contracts/fixtures/orientation/release-gate/cases.json +1073 -0
- package/contracts/fixtures/runtime-recipe/accept/current.json +299 -0
- package/contracts/fixtures/runtime-recipe/accept/minimal.json +294 -0
- package/contracts/fixtures/runtime-recipe/dist-states.json +51 -0
- package/contracts/fixtures/runtime-recipe/manifest.json +85 -0
- package/contracts/fixtures/runtime-recipe/reject/advisory-enforcement.json +299 -0
- package/contracts/fixtures/runtime-recipe/reject/allowlist-without-hosts.json +297 -0
- package/contracts/fixtures/runtime-recipe/reject/committed-output-claim.json +299 -0
- package/contracts/fixtures/runtime-recipe/reject/engines-disagreement-warns.json +299 -0
- package/contracts/fixtures/runtime-recipe/reject/lifecycle-scripts-enabled.json +299 -0
- package/contracts/fixtures/runtime-recipe/reject/missing-required-field.json +251 -0
- package/contracts/fixtures/runtime-recipe/reject/unknown-kind.json +299 -0
- package/contracts/fixtures/runtime-recipe/reject/unknown-network-policy.json +299 -0
- package/contracts/fixtures/runtime-recipe/reject/unknown-output-check.json +310 -0
- package/contracts/fixtures/runtime-recipe/reject/unknown-revision.json +299 -0
- package/contracts/fixtures/runtime-recipe/reject/unknown-step-id.json +299 -0
- package/contracts/fixtures/runtime-recipe/reject/unperformable-check-skipped.json +299 -0
- package/contracts/fixtures/runtime-recipe/reject/unpinned-lockfile.json +299 -0
- package/contracts/fixtures/sidecar-bundle/production-shaped/.campaign-runtime/assembly-report.json +180 -0
- package/contracts/fixtures/sidecar-bundle/production-shaped/.campaign-runtime/build-context.json +115 -0
- package/contracts/fixtures/sidecar-bundle/production-shaped/.campaign-runtime/doctor-output.json +29 -0
- package/contracts/fixtures/sidecar-bundle/production-shaped/.campaign-runtime/qa-verdict.json +27 -0
- package/contracts/fixtures/sidecar-bundle/production-shaped/campaign-runtime.build.json +141 -0
- package/contracts/migration-sidecar-bundle.v0.json +149 -0
- package/contracts/orientation-limits.v1.json +41 -0
- package/contracts/orientation-reason-codes.v1.json +196 -0
- package/contracts/private-template-sources.json +8 -0
- package/contracts/release-ledger.json +4598 -0
- package/contracts/reserved-skill-names.json +13 -0
- package/contracts/runtime-recipe.campaigns-os-node-v1.json +299 -0
- package/contracts/supported-surface.json +180 -0
- package/contracts/template-brand-contract.apollo-mv-single-step.v0.json +27 -0
- package/contracts/template-brand-contract.apollo.v0.json +27 -0
- package/contracts/template-brand-contract.demeter.v0.json +27 -0
- package/contracts/template-brand-contract.olympus-mv-single-step.v0.json +27 -0
- package/contracts/template-brand-contract.olympus-mv-two-step.v0.json +28 -0
- package/contracts/template-brand-contract.olympus.v0.json +27 -0
- package/contracts/template-brand-contract.shared-commerce.v0.json +190 -0
- package/contracts/template-brand-contract.shop-single-step.v0.json +27 -0
- package/contracts/template-brand-contract.shop-three-step.v0.json +29 -0
- package/contracts/template-slot-manifest.apollo-mv-single-step.v0.json +14 -0
- package/contracts/template-slot-manifest.apollo.v0.json +12 -0
- package/contracts/template-slot-manifest.demeter.v0.json +30 -0
- package/contracts/template-slot-manifest.olympus-mv-single-step.v0.json +14 -0
- package/contracts/template-slot-manifest.olympus-mv-two-step.v0.json +15 -0
- package/contracts/template-slot-manifest.olympus.v0.json +12 -0
- package/contracts/template-slot-manifest.shared-content-core.v0.json +4254 -0
- package/contracts/template-slot-manifest.shop-single-step.v0.json +47 -0
- package/contracts/template-slot-manifest.shop-three-step.v0.json +33 -0
- package/docs/brand-theme-bridge.md +159 -0
- package/docs/build-packet.md +1300 -0
- package/docs/campaign-build-brief.md +145 -0
- package/docs/campaign-standardization-report.md +329 -0
- package/docs/campaigns-os-build-flow.md +117 -0
- package/docs/design-source-package.md +784 -0
- package/docs/legacy-migration.md +58 -0
- package/docs/migration-sidecar-bundle.md +139 -0
- package/docs/orientation-contract-reference.md +1220 -0
- package/docs/polish-evidence.md +502 -0
- package/docs/qa-and-test-orders.md +1691 -0
- package/docs/release-ledger-authoring-guide.md +274 -0
- package/docs/runtime-readiness.md +211 -0
- package/docs/supported-surface.md +83 -0
- package/docs/versioning.md +55 -0
- package/docs/workflow-findings-sidecar.md +588 -0
- package/package.json +135 -0
- package/prompts/first-build.md +27 -0
- package/prompts/friction-log.md +30 -0
- package/schemas/campaign-build-brief.v1.schema.json +149 -0
- package/schemas/campaign-design-source-package.v0.schema.json +697 -0
- package/schemas/campaign-runtime-assembly-report.v0.schema.json +390 -0
- package/schemas/campaign-runtime-build-context.v0.schema.json +339 -0
- package/schemas/campaign-runtime-build-packet.v0.schema.json +452 -0
- package/schemas/campaign-spec.v4.schema.json +582 -0
- package/schemas/campaigns-os-doctor-output.v0.schema.json +43 -0
- package/schemas/campaigns-os-legacy-migration-inventory.v0.schema.json +112 -0
- package/schemas/campaigns-os-legacy-provisioning-plan.v0.schema.json +38 -0
- package/schemas/campaigns-os-legacy-provisioning-receipt.v0.schema.json +57 -0
- package/schemas/campaigns-os-qa-verdict-sidecar.v0.schema.json +150 -0
- package/schemas/campaigns-os-qa-verdict.v0.schema.json +438 -0
- package/schemas/campaigns-os-release-ledger.v1.schema.json +162 -0
- package/schemas/campaigns-os-run-record.v0.schema.json +343 -0
- package/schemas/campaigns-os-runtime-recipe.v1.schema.json +313 -0
- package/schemas/campaigns-os-sidecar-bundle-conformance.v0.schema.json +78 -0
- package/schemas/campaigns-os-tooling-orientation.v1.schema.json +381 -0
- package/schemas/campaigns-os-workflow-finding.v0.schema.json +134 -0
- package/schemas/source-html-manifest.v0.schema.json +252 -0
- package/skills/next-campaigns-build/SKILL.md +73 -0
- package/skills/next-campaigns-os/SKILL.md +101 -0
- package/skills/next-campaigns-os/references/session-intake.md +160 -0
- package/skills/next-campaigns-os-setup/SKILL.md +22 -0
- package/skills/next-campaigns-polish/SKILL.md +145 -0
- package/skills/next-campaigns-qa/SKILL.md +92 -0
- package/skills.json +56 -0
- package/skills.sh +64 -0
- package/src/adapter-decision-contract.mjs +333 -0
- package/src/brand-theme.mjs +1151 -0
- package/src/browser-launch.mjs +79 -0
- package/src/build-brief.mjs +781 -0
- package/src/built-site-scope.mjs +312 -0
- package/src/campaign-ecosystem.mjs +734 -0
- package/src/campaign-identity.mjs +405 -0
- package/src/campaign-workspace.mjs +127 -0
- package/src/checkpoint-waiver.mjs +302 -0
- package/src/cli.mjs +13442 -0
- package/src/commercial-journey.mjs +1119 -0
- package/src/commercial-parity.mjs +965 -0
- package/src/consent.mjs +347 -0
- package/src/content-residue.mjs +322 -0
- package/src/deadline.mjs +81 -0
- package/src/design-source-package.mjs +2604 -0
- package/src/deviation.mjs +107 -0
- package/src/doctor-check-registry.mjs +49 -0
- package/src/doctor-sidecar.mjs +106 -0
- package/src/finding-cause.mjs +557 -0
- package/src/findings.mjs +326 -0
- package/src/fs-identity.mjs +68 -0
- package/src/gate-actions.mjs +105 -0
- package/src/html-scan.mjs +53 -0
- package/src/install-mode.mjs +272 -0
- package/src/legacy-migration.d.ts +128 -0
- package/src/legacy-migration.mjs +510 -0
- package/src/lifecycle.mjs +338 -0
- package/src/local-proof.mjs +401 -0
- package/src/map-pin-writeback.mjs +210 -0
- package/src/orchestration-stage-contract.mjs +81 -0
- package/src/package-install-fixture.mjs +33 -0
- package/src/page-kit-build-summary.mjs +175 -0
- package/src/page-kit-campaign-config.mjs +57 -0
- package/src/page-kit-sdk-version.mjs +392 -0
- package/src/page-kit-store-profile.mjs +369 -0
- package/src/page-kit-sync.mjs +162 -0
- package/src/polish-browser.mjs +867 -0
- package/src/polish-capture.mjs +1094 -0
- package/src/polish-deadline.mjs +51 -0
- package/src/polish-gate.mjs +739 -0
- package/src/polish-node.mjs +639 -0
- package/src/polish-page-load.mjs +1100 -0
- package/src/private-template-source.mjs +237 -0
- package/src/proof-policy.mjs +82 -0
- package/src/qa-analytics-correctness.mjs +307 -0
- package/src/qa-analytics-errors.mjs +38 -0
- package/src/qa-analytics-parity.mjs +699 -0
- package/src/qa-binding-evidence.mjs +140 -0
- package/src/qa-browser.mjs +6608 -0
- package/src/qa-cart-entry.mjs +406 -0
- package/src/qa-commercial-parity.mjs +641 -0
- package/src/qa-node.mjs +3620 -0
- package/src/qa-order-bump.mjs +381 -0
- package/src/qa-parity-capture.mjs +428 -0
- package/src/qa-parity-fixture.mjs +359 -0
- package/src/qa-publish.mjs +362 -0
- package/src/qa-purchase-data-layer.mjs +263 -0
- package/src/qa-route-probe.mjs +272 -0
- package/src/qa-sidecar.mjs +188 -0
- package/src/qa-test-order-topology.mjs +207 -0
- package/src/qa-url-privacy.mjs +13 -0
- package/src/qa-verdict-discovery.mjs +192 -0
- package/src/qa-verdict-publish.mjs +105 -0
- package/src/qa-verdict.mjs +287 -0
- package/src/remit.mjs +388 -0
- package/src/repo-scan.mjs +83 -0
- package/src/route-identity.mjs +133 -0
- package/src/run-record-closeout.mjs +229 -0
- package/src/run-record.mjs +839 -0
- package/src/run-session.mjs +226 -0
- package/src/runtime-state-ignore.mjs +113 -0
- package/src/sdk-attribute-index.mjs +212 -0
- package/src/sdk-markup.mjs +358 -0
- package/src/sdk-meta-tags.mjs +52 -0
- package/src/shell-token.mjs +7 -0
- package/src/sidecar-bundle.mjs +399 -0
- package/src/source-asset-crawl.mjs +469 -0
- package/src/source-html-intake.mjs +627 -0
- package/src/source-html-manifest.mjs +276 -0
- package/src/source-prep.mjs +284 -0
- package/src/spec-derive-store.mjs +431 -0
- package/src/spec-derive.mjs +514 -0
- package/src/spec-fetch.mjs +66 -0
- package/src/spec-hash.mjs +48 -0
- package/src/spec-identity.mjs +27 -0
- package/src/stage-ledger.mjs +509 -0
- package/src/standardization-report.mjs +1297 -0
- package/src/template-brand-contract.mjs +473 -0
- package/src/template-freshness.mjs +196 -0
- package/src/template-reference.mjs +81 -0
- package/src/template-slot-manifest.mjs +150 -0
- package/src/text-safety.mjs +62 -0
- package/src/theme-gate.mjs +185 -0
- package/src/upsell-selector-scope.mjs +299 -0
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema_version": "template-slot-manifest/v0",
|
|
3
|
+
"family": "shop-single-step",
|
|
4
|
+
"extends": "template-slot-manifest.shared-content-core.v0.json",
|
|
5
|
+
"description": "Content-slot manifest for the shop-single-step starter-template family. Shared slots come from the content-slot core; this overlay declares family-specific keys and commerce-owned pages.",
|
|
6
|
+
"overlay": {
|
|
7
|
+
"pages": {
|
|
8
|
+
"landing": {
|
|
9
|
+
"sections": [
|
|
10
|
+
{
|
|
11
|
+
"section": "family_overlay",
|
|
12
|
+
"slots": [
|
|
13
|
+
{
|
|
14
|
+
"key": "cta_params",
|
|
15
|
+
"kind": "commerce",
|
|
16
|
+
"role": "commerce_structure",
|
|
17
|
+
"owner": "commerce",
|
|
18
|
+
"description": "Structured commerce configuration \u2014 owned by the commerce-surface catalog and the family brand contract, not the content-slot layer.",
|
|
19
|
+
"reference": "integrated_commerce_surface_ref"
|
|
20
|
+
}
|
|
21
|
+
]
|
|
22
|
+
}
|
|
23
|
+
]
|
|
24
|
+
},
|
|
25
|
+
"receipt": {
|
|
26
|
+
"sections": [
|
|
27
|
+
{
|
|
28
|
+
"section": "family_overlay",
|
|
29
|
+
"slots": [
|
|
30
|
+
{
|
|
31
|
+
"key": "receipt_summary",
|
|
32
|
+
"kind": "commerce",
|
|
33
|
+
"role": "commerce_structure",
|
|
34
|
+
"owner": "commerce",
|
|
35
|
+
"description": "Structured commerce configuration \u2014 owned by the commerce-surface catalog and the family brand contract, not the content-slot layer.",
|
|
36
|
+
"reference": "integrated_commerce_surface_ref"
|
|
37
|
+
}
|
|
38
|
+
]
|
|
39
|
+
}
|
|
40
|
+
]
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
"commerce_owned_pages": [
|
|
45
|
+
"checkout"
|
|
46
|
+
]
|
|
47
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema_version": "template-slot-manifest/v0",
|
|
3
|
+
"family": "shop-three-step",
|
|
4
|
+
"extends": "template-slot-manifest.shared-content-core.v0.json",
|
|
5
|
+
"description": "Content-slot manifest for the shop-three-step starter-template family. Shared slots come from the content-slot core; this overlay declares family-specific keys and commerce-owned pages.",
|
|
6
|
+
"overlay": {
|
|
7
|
+
"pages": {
|
|
8
|
+
"landing": {
|
|
9
|
+
"sections": [
|
|
10
|
+
{
|
|
11
|
+
"section": "family_overlay",
|
|
12
|
+
"slots": [
|
|
13
|
+
{
|
|
14
|
+
"key": "cta_params",
|
|
15
|
+
"kind": "commerce",
|
|
16
|
+
"role": "commerce_structure",
|
|
17
|
+
"owner": "commerce",
|
|
18
|
+
"description": "Structured commerce configuration \u2014 owned by the commerce-surface catalog and the family brand contract, not the content-slot layer.",
|
|
19
|
+
"reference": "integrated_commerce_surface_ref"
|
|
20
|
+
}
|
|
21
|
+
]
|
|
22
|
+
}
|
|
23
|
+
]
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"commerce_owned_pages": [
|
|
28
|
+
"checkout",
|
|
29
|
+
"information",
|
|
30
|
+
"shipping",
|
|
31
|
+
"billing"
|
|
32
|
+
]
|
|
33
|
+
}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
# Brand Theme Bridge
|
|
2
|
+
|
|
3
|
+
Campaigns OS often receives campaigns midstream. A source design may come from
|
|
4
|
+
Figma, a hand-authored page, an AI export, a partially assembled page-kit repo,
|
|
5
|
+
or a developer who already cloned checkout/upsell templates and started editing.
|
|
6
|
+
The brand theme bridge is intentionally workflow-order neutral: it reads durable
|
|
7
|
+
source artifacts that exist now and records what can safely flow into commerce
|
|
8
|
+
pages.
|
|
9
|
+
|
|
10
|
+
## What v0 Does
|
|
11
|
+
|
|
12
|
+
`campaigns-os theme inspect` reads a Build Packet and looks for source-side
|
|
13
|
+
`:root` custom properties from:
|
|
14
|
+
|
|
15
|
+
- mapped HTML page inline `:root` blocks
|
|
16
|
+
- CSS files referenced by mapped HTML/frontmatter
|
|
17
|
+
- source-html manifest linked CSS assets
|
|
18
|
+
- conventional token paths such as `assets/css/tokens.css`,
|
|
19
|
+
`assets/css/landing/tokens.css`, and `assets/css/presell/tokens.css`
|
|
20
|
+
|
|
21
|
+
It compares source tokens against known `figma-sections-export` scaffold
|
|
22
|
+
defaults, maps real brand values onto a local versioned next-core target-token
|
|
23
|
+
contract, and writes evidence into a theme report.
|
|
24
|
+
|
|
25
|
+
`campaigns-os theme generate` writes:
|
|
26
|
+
|
|
27
|
+
```text
|
|
28
|
+
.campaign-runtime/theme/theme-report.json
|
|
29
|
+
.campaign-runtime/theme/brand-theme.css
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
The generated CSS is v0 root-variable-only. It can override next-core custom
|
|
33
|
+
properties such as `--brand--color--primary` and
|
|
34
|
+
`--brand--color--cta-primary`, but it must not emit selectors, `data-next`
|
|
35
|
+
selectors, payment/package/cart selectors, JavaScript, or remote URL fetches.
|
|
36
|
+
|
|
37
|
+
### Foreground tokens are derived from background luminance
|
|
38
|
+
|
|
39
|
+
Foreground / on-color tokens — `--brand--color--text-inverse`,
|
|
40
|
+
`--brand--color--cta-foreground`, `--brand--color--primary-foreground`, and
|
|
41
|
+
`--brand--color--accent-foreground` — are **not** copied from a source
|
|
42
|
+
`--text-inverse` token (which scaffolds default to white). They are derived
|
|
43
|
+
from the WCAG relative luminance of the background each sits on, picking the
|
|
44
|
+
more legible of the configured dark/light choices. A light brand (yellow,
|
|
45
|
+
white, pastel) therefore gets dark foregrounds; a dark/saturated brand gets
|
|
46
|
+
white ones. This prevents the white-on-light-CTA bug — next-core's
|
|
47
|
+
`.button` / `.submit-button` render their label with
|
|
48
|
+
`color: var(--brand--color--text-inverse)`, so `text-inverse` pairs with the
|
|
49
|
+
CTA background first, then the primary background. Pairings live in the
|
|
50
|
+
`foreground_derivations` block of
|
|
51
|
+
`contracts/brand-theme-target-tokens.next-core.v0.json`; a derived foreground
|
|
52
|
+
that still falls below the contract's `min_contrast_ratio` is emitted with a
|
|
53
|
+
`theme.foreground.low_contrast` warning so the brand background can be
|
|
54
|
+
confirmed. Derived-foreground confidence scales with the achieved contrast
|
|
55
|
+
(`>= 7:1` high, `>= 4.5:1` medium, otherwise low).
|
|
56
|
+
|
|
57
|
+
> **Contract change (PR #117):** `--text-inverse` and the three `*-foreground`
|
|
58
|
+
> targets are no longer entries under `source_mappings` — they moved to
|
|
59
|
+
> `foreground_derivations`. A source `--text-inverse` token (or anything that
|
|
60
|
+
> name-infers to one) is therefore no longer mapped directly; the foreground is
|
|
61
|
+
> always derived from the paired background's luminance. No fixtures or
|
|
62
|
+
> consumers keyed off the old mapping.
|
|
63
|
+
|
|
64
|
+
## Prepare-Build Behavior
|
|
65
|
+
|
|
66
|
+
`start` and `prepare-build` run theme discovery in `inspect_only` mode by
|
|
67
|
+
default. They write `context.theme` and
|
|
68
|
+
`.campaign-runtime/theme/theme-report.json`, but they do not write
|
|
69
|
+
`brand-theme.css` unless `--theme-policy auto` is explicitly set and the source
|
|
70
|
+
evidence is high-confidence and safe.
|
|
71
|
+
|
|
72
|
+
Policies:
|
|
73
|
+
|
|
74
|
+
| Policy | Behavior |
|
|
75
|
+
| --- | --- |
|
|
76
|
+
| `inspect_only` | Default. Discover/report only; no generated CSS. |
|
|
77
|
+
| `auto` | May write `brand-theme.css` only when confidence is high and no stale artifact risk exists. |
|
|
78
|
+
| `off` | Skip theme discovery. |
|
|
79
|
+
|
|
80
|
+
Existing `brand-theme.css` is not overwritten without `--force`. If the source
|
|
81
|
+
hash changes, source tokens disappear, or current confidence drops, Campaigns OS
|
|
82
|
+
marks the existing artifact stale and tells the operator to regenerate or skip.
|
|
83
|
+
|
|
84
|
+
## Theme Gate
|
|
85
|
+
|
|
86
|
+
Theme discovery used to be advisory: `theme inspect` could prove a brand layer
|
|
87
|
+
was generatable, doctor could surface `needs_review`, and an agent could still
|
|
88
|
+
carry the starter palette through polish, deploy, and a green QA verdict. The
|
|
89
|
+
theme gate makes the decision deterministic.
|
|
90
|
+
|
|
91
|
+
When `theme inspect` reports `can_generate: true` and the campaign ships
|
|
92
|
+
commerce pages (checkout/upsell/downsell/receipt), the gate **blocks**
|
|
93
|
+
`next polish`, `next deploy`, `next qa`, and `qa run` until one of:
|
|
94
|
+
|
|
95
|
+
- the brand layer is generated and recorded as applied
|
|
96
|
+
(`report.theme.status: applied`, `load_order: after-next-core`), or
|
|
97
|
+
- an explicit waiver is recorded:
|
|
98
|
+
`campaigns-os theme waive --packet <p> --reason "<why>" --waived-by "<named human>"`
|
|
99
|
+
(optionally `--expires-at <ISO>`; placeholders such as "operator" are refused), or
|
|
100
|
+
`qa run --theme-waive "<reason>"` for a one-off run, or
|
|
101
|
+
- theme policy is `off` for the run.
|
|
102
|
+
|
|
103
|
+
"Ships commerce pages" is a question about the campaign, not about one build's
|
|
104
|
+
output. The gate reads the pages this build produced **and** the commerce pages
|
|
105
|
+
the campaign declares but this build left out of scope, so a partial build
|
|
106
|
+
cannot retire the gate on a funnel it simply did not assemble; `commerce_pages`
|
|
107
|
+
carries the union and `commerce_pages_out_of_scope` names the half this build
|
|
108
|
+
did not produce. On the QA path the declared funnel is unioned in the same way,
|
|
109
|
+
so a thin or stale `doctor-output.json` cannot self-retire a gate on a funnel
|
|
110
|
+
whose routes `qa resolve` lists in the same output. `theme_gate.scope_source`
|
|
111
|
+
records which sources contributed: `doctor_derived_scope`, `spec_topologies`,
|
|
112
|
+
or `doctor_derived_scope+spec_topologies`.
|
|
113
|
+
|
|
114
|
+
The gate result lives at `doctor.derived.theme_gate` and in every `next`
|
|
115
|
+
response's `gates` array, with `required_actions` carrying the exact commands.
|
|
116
|
+
A waiver does not silence QA: the palette-residue checks (`:style:*`, `:logo`,
|
|
117
|
+
`:payment-chrome:*`) still run and report residue as `warn` rows so the shipped
|
|
118
|
+
palette stays visible in the verdict; placeholder-text residue stays a blocker
|
|
119
|
+
regardless of the waiver.
|
|
120
|
+
|
|
121
|
+
Per-family expectations (required token overrides, starter defaults that count
|
|
122
|
+
as residue, CSS load order, QA selectors, pricing-surface modes, exit-pop
|
|
123
|
+
residue, and the family inventory matrix) live in
|
|
124
|
+
`contracts/template-brand-contract.<family>.v0.json`. Promoted families in the
|
|
125
|
+
commerce surface catalog must have one; doctor and QA treat a missing contract
|
|
126
|
+
as a blocker instead of silently skipping residue checks.
|
|
127
|
+
See `docs/template-family-contracts.md` for the current family inventory matrix.
|
|
128
|
+
|
|
129
|
+
## Build And Polish Handoff
|
|
130
|
+
|
|
131
|
+
Build agents should read `context.theme` before styling checkout, upsell,
|
|
132
|
+
downsell, or receipt pages.
|
|
133
|
+
|
|
134
|
+
If a fresh `brand-theme.css` exists:
|
|
135
|
+
|
|
136
|
+
1. Copy it into the campaign asset tree.
|
|
137
|
+
2. Add it to commerce page frontmatter styles after `next-core.css`.
|
|
138
|
+
3. Preserve SDK-owned runtime surfaces: `data-next-*`, package selectors,
|
|
139
|
+
payment fields, totals, submit controls, receipt templates, route meta tags,
|
|
140
|
+
and SDK JavaScript.
|
|
141
|
+
4. Record `report.theme.status`, `css_path`, `commerce_pages`, `load_order`,
|
|
142
|
+
and evidence.
|
|
143
|
+
|
|
144
|
+
Polish should verify token parity, load order after next-core, starter-logo
|
|
145
|
+
replacement when source assets expose a real brand mark, and SDK safety. If the
|
|
146
|
+
brand layer is repairable, record the first repair-loop defect.
|
|
147
|
+
|
|
148
|
+
## Future Designer-Source Contract
|
|
149
|
+
|
|
150
|
+
Mario's proposed direction belongs upstream of this v0 bridge: generate a
|
|
151
|
+
campaign design-system package before design work begins, with durable assets
|
|
152
|
+
such as `colors.css`, `typography.css`, fonts, logos, and candidate
|
|
153
|
+
`lp-tokens.json`, `checkout-tokens.json`, and `upsell-tokens.json` page-family
|
|
154
|
+
variables.
|
|
155
|
+
|
|
156
|
+
That is likely the right long-term source of truth, but v0 should not require
|
|
157
|
+
that package. The bridge must also work when Campaigns OS is invoked after Figma
|
|
158
|
+
export, after partial developer edits, or after checkout/upsell templates have
|
|
159
|
+
already been cloned.
|