@nextcommerce/campaigns-os 1.48.0 → 1.52.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/CHANGELOG.md +539 -0
- package/agents/claude/CLAUDE.md +6 -5
- package/agents/codex/AGENTS.md +6 -5
- package/agents/copilot/copilot-instructions.md +3 -3
- package/agents/cursor/campaigns-os.mdc +3 -3
- package/campaign-spec/dist/rules/campaign-metadata.d.ts +5 -1
- package/campaign-spec/dist/rules/campaign-metadata.js +9 -2
- package/campaign-spec/dist/rules/design-source-shape.js +13 -3
- package/campaign-spec/dist/rules/sdk-version.js +2 -1
- package/compatibility.json +1 -1
- package/contracts/commerce-surface-catalog.json +26 -46
- package/contracts/effects.v1.json +254 -2
- package/contracts/release-ledger.json +1239 -0
- package/contracts/supported-surface.json +4 -4
- package/contracts/template-brand-contract.shared-commerce.v0.json +2 -2
- package/contracts/template-slot-manifest.shared-content-core.v0.json +24 -0
- package/docs/brand-theme-bridge.md +12 -6
- package/docs/build-packet.md +101 -12
- package/docs/campaign-build-brief.md +25 -1
- package/docs/effects.md +6 -0
- package/docs/local-setup.md +1 -1
- package/docs/orientation-contract-reference.md +1 -1
- package/docs/polish-evidence.md +10 -0
- package/docs/qa-and-test-orders.md +66 -11
- package/docs/runtime-readiness.md +1 -1
- package/docs/sdk-storage-compatibility.md +1 -1
- package/docs/skills-revision.md +10 -10
- package/package.json +1 -1
- package/schemas/campaign-runtime-build-packet.v0.schema.json +4 -0
- package/schemas/campaigns-os-qa-verdict.v0.schema.json +8 -3
- package/skills/campaign-lifecycle-orientation/SKILL.md +3 -3
- package/skills/campaign-readback-classification/SKILL.md +3 -3
- package/skills/campaign-run-evidence/SKILL.md +3 -3
- package/skills/contribution-intake/SKILL.md +3 -3
- package/skills/next-campaigns-build/SKILL.md +4 -4
- package/skills/next-campaigns-os/SKILL.md +4 -4
- package/skills/next-campaigns-os/references/session-intake.md +7 -3
- package/skills/next-campaigns-os-setup/SKILL.md +3 -3
- package/skills/next-campaigns-polish/SKILL.md +5 -4
- package/skills/next-campaigns-qa/SKILL.md +6 -5
- package/skills.json +10 -10
- package/src/adapter-decision-contract.mjs +1 -1
- package/src/brand-theme.mjs +25 -2
- package/src/build-brief.mjs +68 -21
- package/src/built-site-scope.mjs +39 -6
- package/src/built-smoke-qc.mjs +1117 -0
- package/src/campaign-identity.mjs +36 -2
- package/src/cart-placeholders.mjs +730 -0
- package/src/cli.mjs +320 -42
- package/src/commercial-journey.mjs +65 -4
- package/src/commercial-parity.mjs +6 -1
- package/src/doctor/checks.mjs +291 -24
- package/src/doctor/inspect.mjs +53 -2
- package/src/doctor/next-step.mjs +1 -1
- package/src/install-mode.mjs +0 -8
- package/src/invocation.mjs +5 -2
- package/src/local-preview-policy.mjs +1 -1
- package/src/local-proof.mjs +4 -1
- package/src/polish-browser.mjs +218 -1
- package/src/polish-capture.mjs +1 -1
- package/src/polish-media-weight.mjs +492 -0
- package/src/polish-node.mjs +96 -4
- package/src/progress-node.mjs +5 -1
- package/src/qa-binding-evidence.mjs +21 -0
- package/src/qa-browser.mjs +338 -97
- package/src/qa-content-params.mjs +889 -0
- package/src/qa-node.mjs +114 -14
- package/src/qa-order-bump.mjs +22 -1
- package/src/qa-policy-links.mjs +1019 -0
- package/src/qa-tracking-params.mjs +1389 -0
- package/src/qa-url-privacy.mjs +168 -0
- package/src/qc-accept.mjs +446 -0
- package/src/qc-check-registry.mjs +83 -0
- package/src/qc-results.mjs +1049 -0
- package/src/sdk-attribute-index.mjs +71 -0
- package/src/sdk-markup.mjs +2 -2
- package/src/sdk-storage-compatibility.mjs +63 -3
- package/src/source-prep.mjs +37 -7
- package/src/stage-record.mjs +356 -36
- package/src/theme-gate.mjs +3 -3
|
@@ -5,11 +5,11 @@ When this repository contains Campaigns OS artifacts, use them as the build hand
|
|
|
5
5
|
- `campaign-runtime.build.json` defines the CampaignSpec, source adapter, target output, template family, deploy target, SDK origin state, and QA proof depth.
|
|
6
6
|
- `.campaign-runtime/build-context.json` records page mappings and setup/build handoff details.
|
|
7
7
|
- `.campaign-runtime/assembly-report.json` records stage evidence and blockers.
|
|
8
|
-
- To pick up an existing campaign, run `campaigns-os readback .` and `campaigns-os next --packet campaign-runtime.build.json` before reading artifacts by hand; `next` blocks polish and QA again whenever the built output changes. The committed `.campaign-runtime/qa-verdict.json` keeps no order records or URLs: its `browser-test-order:<path>` assertions are the typed-card proof, and the full verdict is under `qa-output/`.
|
|
8
|
+
- To pick up an existing campaign, run `npx --no-install campaigns-os readback .` and `npx --no-install campaigns-os next --packet campaign-runtime.build.json` before reading artifacts by hand; `next` blocks polish and QA again whenever the built output changes. The committed `.campaign-runtime/qa-verdict.json` keeps no order records or URLs: its `browser-test-order:<path>` assertions are the typed-card proof, and the full verdict is under `qa-output/`.
|
|
9
9
|
- `.campaign-runtime/theme/theme-report.json`, when present, is optional brand-theme evidence. Generated `brand-theme.css` must load after `next-core.css`; missing or low-confidence theme is a warning/skipped reason, not permission to edit SDK-owned runtime surfaces.
|
|
10
10
|
|
|
11
11
|
CampaignSpec validation is owned by the public `@nextcommerce/campaigns-os/campaign-spec` rules surfaced through doctor `spec.validation` findings; use structured rule/path detail when available.
|
|
12
12
|
|
|
13
|
-
Preserve Campaign Cart SDK-owned commerce surfaces. Replace starter demo refs from CampaignSpec/API. Prepared AI/exported HTML must be converted into page-kit-ready source first: keep page-owned body markup, strip document wrappers, add YAML frontmatter, move shared CSS/assets into the campaign structure, and use Liquid helpers only for page-kit links/assets/includes. Landing/presell pages can preserve source design; checkout/upsell/downsell/receipt should use starter-template commerce surfaces as SDK contract references while campaign/source owns visual chrome. Copy starter template families atomically with dependent pages, `_includes/`, `_layouts/`, `assets/css/`, and `assets/js/`; do not copy only checkout/receipt pages. Do not claim launch readiness until build, polish, deploy, and QA evidence are recorded.
|
|
13
|
+
Preserve Campaign Cart SDK-owned commerce surfaces. Replace starter demo refs from CampaignSpec/API. Prepared AI/exported HTML must be converted into page-kit-ready source first: keep page-owned body markup, strip document wrappers, add YAML frontmatter, move shared CSS/assets into the campaign structure, and use Liquid helpers only for page-kit links/assets/includes. Landing/presell pages can preserve source design; checkout/upsell/downsell/receipt should use starter-template commerce surfaces as SDK contract references while campaign/source owns visual chrome. Reproduce the source design's own proof and urgency elements as designed (reviews, ratings, stock counters, countdowns, guarantees). They are the merchant's content; Campaigns OS does not review them, so do not remove, soften or flag them. Copy starter template families atomically with dependent pages, `_includes/`, `_layouts/`, `assets/css/`, and `assets/js/`; do not copy only checkout/receipt pages. Do not claim launch readiness until build, polish, deploy, and QA evidence are recorded.
|
|
14
14
|
|
|
15
|
-
Before Polish becomes terminal or hands off to deploy/QA, install the package-owned Playwright browser with `npm run qa:install-browser`, serve the current build, and run `campaigns-os polish capture --packet campaign-runtime.build.json --base-url <served-current-build-url>`. After that checkpoint clears, QA must use the Campaigns OS Node/npm runner: run `campaigns-os qa resolve`, then run `campaigns-os qa run --browser --test-order common` against the tested URL. Typed-card test-order proof must use `campaigns-os qa run --test-order <common|checkout|decline|accept|both|full|explicit-path>` through the tested checkout and rendered upsell controls
|
|
15
|
+
Before Polish becomes terminal or hands off to deploy/QA, install the package-owned Playwright browser with `npm run qa:install-browser`, serve the current build, and run `npx --no-install campaigns-os polish capture --packet campaign-runtime.build.json --base-url <served-current-build-url>`. After that checkpoint clears, QA must use the Campaigns OS Node/npm runner: run `npx --no-install campaigns-os qa resolve`, then run `npx --no-install campaigns-os qa run --browser --test-order common` against the tested URL. Typed-card test-order proof must use `npx --no-install campaigns-os qa run --test-order <common|checkout|decline|accept|both|full|explicit-path>` through the tested checkout and rendered upsell controls. `qa run` has no permission flag: coverage is its only control. Test orders still land in the store as real orders (global test cards: no charge, no transaction) that someone may have to cancel. Unless the operator has already said test orders are fine for this campaign, ask once, up front in your first turn with your other setup questions, so the answer covers the whole build and QA and neither stops for it later. `common` runs every actual terminal path when they fit under the flood cap (`--max-test-orders`, 6 by default); above the cap it runs the checkout baseline, first-offer accept and decline, and a deduplicated shortest real receipt path, then adds one decline path per offer or downsell page not yet declined, up to the cap, and names any page left out. A page counts as covered only when an order clicks its decline; the `browser-test-order:upsell-action-coverage` verdict row warns naming each page whose decline no order clicked. `full` walks every actual terminal path in the selected checkout topology; cycles, missing routes, and reachable nonterminals block exhaustive proof before browser launch. The accidental-flood cap remains `6`, and an overflow names the exact explicit `--max-test-orders` raise. Analytics correctness is two-phase: the campaign-root visit inventories declared providers/tags only, and the same canonical typed-card run proves Purchase only from the topology-recognized final receipt document after `--analytics-settle`. Missing/unrecognized receipts are manual-review warnings; recognized receipt no-signal and capture/settle errors block. Only the genuine recognized-receipt/no-signal failure is waivable; capture/settle errors are not. Checkout/upsell signals remain whole-journey parity evidence and cannot satisfy a silent receipt. Do not use `next.getCartData().cartLines` as cart-populated proof; use typed-card order read-back, `cart:updated` payload `items` / `summary.lines`, and rendered bundle DOM evidence. Localhost on any port is a Campaigns App Development domain for SDK QA with analytics suppressed; non-localhost preview/production origins still need SDK origin allowlist confirmation. Do not use external browser skills, SDK test-mode events, or direct backend orders as launch proof. Campaigns OS proof is not merchant launch readiness; before launch, confirm production storefront URL, live payment methods, shipping markets, legal/support URLs, analytics expectations, and merchant-side configuration.
|
|
@@ -6,8 +6,8 @@ globs:
|
|
|
6
6
|
alwaysApply: false
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
Read Campaigns OS artifacts before editing campaign pages. To pick up an existing campaign, run `campaigns-os readback .` and `campaigns-os next --packet campaign-runtime.build.json` before reading artifacts by hand; `next` blocks polish and QA again whenever the built output changes. The committed `.campaign-runtime/qa-verdict.json` keeps no order records or URLs: its `browser-test-order:<path>` assertions are the typed-card proof, and the full verdict is under `qa-output/`. Treat CampaignSpec/API values as live commerce truth, starter-template contracts as SDK surface truth, and designed HTML/assets as visual/content intent. Treat CampaignSpec validation as owned by the public `@nextcommerce/campaigns-os/campaign-spec` rules surfaced through doctor `spec.validation` findings; use structured rule/path detail when available. If `context.theme` or `.campaign-runtime/theme/theme-report.json` exists, use it as optional brand-theme evidence; generated `brand-theme.css` must load after `next-core.css`, and missing/low-confidence theme is a warning or skipped reason, not permission to edit SDK-owned runtime surfaces.
|
|
9
|
+
Read Campaigns OS artifacts before editing campaign pages. To pick up an existing campaign, run `npx --no-install campaigns-os readback .` and `npx --no-install campaigns-os next --packet campaign-runtime.build.json` before reading artifacts by hand; `next` blocks polish and QA again whenever the built output changes. The committed `.campaign-runtime/qa-verdict.json` keeps no order records or URLs: its `browser-test-order:<path>` assertions are the typed-card proof, and the full verdict is under `qa-output/`. Treat CampaignSpec/API values as live commerce truth, starter-template contracts as SDK surface truth, and designed HTML/assets as visual/content intent. Treat CampaignSpec validation as owned by the public `@nextcommerce/campaigns-os/campaign-spec` rules surfaced through doctor `spec.validation` findings; use structured rule/path detail when available. If `context.theme` or `.campaign-runtime/theme/theme-report.json` exists, use it as optional brand-theme evidence; generated `brand-theme.css` must load after `next-core.css`, and missing/low-confidence theme is a warning or skipped reason, not permission to edit SDK-owned runtime surfaces.
|
|
10
10
|
|
|
11
|
-
Do not carry over demo package, shipping, voucher, payment, tracking, footer, or SEO values. Prepared AI/exported HTML must be converted into page-kit-ready source first: keep page-owned body markup, strip document wrappers, add YAML frontmatter, move shared CSS/assets into the campaign structure, and use Liquid helpers only for page-kit links/assets/includes. Preserve prepared landing/presell source HTML when it is a real standalone design. For checkout/upsell/downsell/receipt, use starter-template commerce surfaces as SDK contract references while campaign/source owns visual chrome. Copy starter template families atomically with dependent pages, `_includes/`, `_layouts/`, `assets/css/`, and `assets/js/`; do not copy only checkout/receipt pages. Emit SDK routing meta tags as campaign-root paths such as `/campaign-slug/upsell/`. Preserve SDK-owned checkout/cart/upsell/receipt surfaces. For `shop-three-step`, shipping is dynamic via `window.next.getShippingMethods()`.
|
|
11
|
+
Do not carry over demo package, shipping, voucher, payment, tracking, footer, or SEO values. Prepared AI/exported HTML must be converted into page-kit-ready source first: keep page-owned body markup, strip document wrappers, add YAML frontmatter, move shared CSS/assets into the campaign structure, and use Liquid helpers only for page-kit links/assets/includes. Preserve prepared landing/presell source HTML when it is a real standalone design. For checkout/upsell/downsell/receipt, use starter-template commerce surfaces as SDK contract references while campaign/source owns visual chrome. Reproduce the source design's own proof and urgency elements as designed (reviews, ratings, stock counters, countdowns, guarantees). They are the merchant's content; Campaigns OS does not review them, so do not remove, soften or flag them. Copy starter template families atomically with dependent pages, `_includes/`, `_layouts/`, `assets/css/`, and `assets/js/`; do not copy only checkout/receipt pages. Emit SDK routing meta tags as campaign-root paths such as `/campaign-slug/upsell/`. Preserve SDK-owned checkout/cart/upsell/receipt surfaces. For `shop-three-step`, shipping is dynamic via `window.next.getShippingMethods()`.
|
|
12
12
|
|
|
13
|
-
Before Polish becomes terminal or hands off to deploy/QA, install the package-owned Playwright browser with `npm run qa:install-browser`, serve the current build, and run `campaigns-os polish capture --packet campaign-runtime.build.json --base-url <served-current-build-url>`. After that checkpoint clears, QA uses the Campaigns OS Node/npm runner: `campaigns-os qa resolve`, then `campaigns-os qa run --browser --test-order common` against the tested URL. Test-order proof uses `campaigns-os qa run --test-order <common|checkout|decline|accept|both|full|explicit-path>` through the tested checkout and rendered upsell controls
|
|
13
|
+
Before Polish becomes terminal or hands off to deploy/QA, install the package-owned Playwright browser with `npm run qa:install-browser`, serve the current build, and run `npx --no-install campaigns-os polish capture --packet campaign-runtime.build.json --base-url <served-current-build-url>`. After that checkpoint clears, QA uses the Campaigns OS Node/npm runner: `npx --no-install campaigns-os qa resolve`, then `npx --no-install campaigns-os qa run --browser --test-order common` against the tested URL. Test-order proof uses `npx --no-install campaigns-os qa run --test-order <common|checkout|decline|accept|both|full|explicit-path>` through the tested checkout and rendered upsell controls. `qa run` has no permission flag: coverage is its only control. Test orders still land in the store as real orders (global test cards: no charge, no transaction) that someone may have to cancel. Unless the operator has already said test orders are fine for this campaign, ask once, up front in your first turn with your other setup questions, so the answer covers the whole build and QA and neither stops for it later. `common` runs every actual terminal path when they fit under the flood cap (`--max-test-orders`, 6 by default); above the cap it runs the checkout baseline, first-offer accept and decline, and a deduplicated shortest real receipt path, then adds one decline path per offer or downsell page not yet declined, up to the cap, and names any page left out. A page counts as covered only when an order clicks its decline; the `browser-test-order:upsell-action-coverage` verdict row warns naming each page whose decline no order clicked. `full` walks every actual terminal path in the selected checkout topology; cycles, missing routes, and reachable nonterminals block exhaustive proof before browser launch. The accidental-flood cap remains `6`, and an overflow names the exact explicit `--max-test-orders` raise. Analytics correctness is two-phase: the campaign-root visit inventories declared providers/tags only, and the same canonical typed-card run proves Purchase only from the topology-recognized final receipt document after `--analytics-settle`. Missing/unrecognized receipts are manual-review warnings; recognized receipt no-signal and capture/settle errors block. Only the genuine recognized-receipt/no-signal failure is waivable; capture/settle errors are not. Checkout/upsell signals remain whole-journey parity evidence and cannot satisfy a silent receipt. Do not use `next.getCartData().cartLines` as cart-populated proof; use typed-card order read-back, `cart:updated` payload `items` / `summary.lines`, and rendered bundle DOM evidence. Localhost on any port is a Campaigns App Development domain for SDK QA with analytics suppressed; non-localhost preview/production origins still need SDK origin allowlist confirmation. External browser skills, SDK test-mode events, and direct backend orders are not launch proof. Campaigns OS proof is not merchant launch readiness; before launch, confirm production storefront URL, live payment methods, shipping markets, legal/support URLs, analytics expectations, and merchant-side configuration.
|
|
@@ -8,7 +8,11 @@
|
|
|
8
8
|
* a need to subset them. If that need shows up, split into
|
|
9
9
|
* CampaignPaymentKey and CampaignRefId.
|
|
10
10
|
*
|
|
11
|
-
*
|
|
11
|
+
* The ref_id message is inherited verbatim from the pre-#110 validator. The
|
|
12
|
+
* payment_env_key message keeps that validator's first sentence, which
|
|
13
|
+
* consumers match, and adds which field is empty and where its value comes
|
|
14
|
+
* from: a Campaigns API key in the spec (campaign.campaigns_api_key) is a
|
|
15
|
+
* different field and does not satisfy it.
|
|
12
16
|
*/
|
|
13
17
|
import type { Rule } from '../types.ts';
|
|
14
18
|
export declare const CampaignMetadata: Rule;
|
|
@@ -8,7 +8,11 @@
|
|
|
8
8
|
* a need to subset them. If that need shows up, split into
|
|
9
9
|
* CampaignPaymentKey and CampaignRefId.
|
|
10
10
|
*
|
|
11
|
-
*
|
|
11
|
+
* The ref_id message is inherited verbatim from the pre-#110 validator. The
|
|
12
|
+
* payment_env_key message keeps that validator's first sentence, which
|
|
13
|
+
* consumers match, and adds which field is empty and where its value comes
|
|
14
|
+
* from: a Campaigns API key in the spec (campaign.campaigns_api_key) is a
|
|
15
|
+
* different field and does not satisfy it.
|
|
12
16
|
*/
|
|
13
17
|
export const CampaignMetadata = {
|
|
14
18
|
id: 'CampaignMetadata',
|
|
@@ -21,7 +25,10 @@ export const CampaignMetadata = {
|
|
|
21
25
|
violations.push({
|
|
22
26
|
ruleId: 'CampaignMetadata',
|
|
23
27
|
severity: 'warning',
|
|
24
|
-
message: 'No campaign loaded — campaign key required for spec export.'
|
|
28
|
+
message: 'No campaign loaded — campaign key required for spec export. ' +
|
|
29
|
+
'campaign.payment_env_key is empty: copy it from the campaign retrieve body ' +
|
|
30
|
+
'(docs/build-packet.md, "Reading package, offer and shipping refs"). ' +
|
|
31
|
+
'A Campaigns API key in the spec does not fill this field.',
|
|
25
32
|
path: '/campaign/payment_env_key',
|
|
26
33
|
data: { missing: 'payment_env_key' },
|
|
27
34
|
});
|
|
@@ -25,6 +25,10 @@
|
|
|
25
25
|
* a build blocker. The export tool itself is the real validator at handoff
|
|
26
26
|
* time; this rule keeps Map Builder authors honest while editing.
|
|
27
27
|
*/
|
|
28
|
+
// design_source.type values with a producer (docs/entry-points.md). A page of
|
|
29
|
+
// one of these types needs its file_url; any other type gets the hand-written
|
|
30
|
+
// HTML way out as well.
|
|
31
|
+
const DESIGN_TOOL_PRODUCERS = new Set(['figma', 'ai-generated']);
|
|
28
32
|
const FIGMA_URL_PATTERN = /^https:\/\/(?:www\.)?figma\.com\//i;
|
|
29
33
|
const ANY_URL_PATTERN = /^https?:\/\/\S+/i;
|
|
30
34
|
function isNonEmptyString(value) {
|
|
@@ -44,6 +48,9 @@ export const DesignSourceShape = {
|
|
|
44
48
|
return;
|
|
45
49
|
const basePath = `/funnels/${funnelIdx}/pages/${pageIdx}/design_source`;
|
|
46
50
|
const pageLabel = page.label || page.id || '(unnamed page)';
|
|
51
|
+
// One normalization for every type comparison below, so "Figma" and
|
|
52
|
+
// " figma " are the same producer everywhere in this rule.
|
|
53
|
+
const designType = String(design.type ?? '').trim().toLowerCase();
|
|
47
54
|
// 1. type
|
|
48
55
|
if (!isNonEmptyString(design.type)) {
|
|
49
56
|
violations.push({
|
|
@@ -59,7 +66,10 @@ export const DesignSourceShape = {
|
|
|
59
66
|
violations.push({
|
|
60
67
|
ruleId: 'DesignSourceShape',
|
|
61
68
|
severity: 'warning',
|
|
62
|
-
message: `"${pageLabel}" — design_source.file_url is missing; expected the design-tool file URL
|
|
69
|
+
message: `"${pageLabel}" — design_source.file_url is missing; expected the design-tool file URL.` +
|
|
70
|
+
(DESIGN_TOOL_PRODUCERS.has(designType)
|
|
71
|
+
? ''
|
|
72
|
+
: ' Hand-written or template HTML has no design tool: remove design_source from the page (see docs/entry-points.md).'),
|
|
63
73
|
path: `${basePath}/file_url`,
|
|
64
74
|
data: { pageId: page.id, check: 'file-url-missing' },
|
|
65
75
|
});
|
|
@@ -73,7 +83,7 @@ export const DesignSourceShape = {
|
|
|
73
83
|
data: { pageId: page.id, check: 'file-url-shape', value: design.file_url },
|
|
74
84
|
});
|
|
75
85
|
}
|
|
76
|
-
else if (
|
|
86
|
+
else if (designType === 'figma' && !FIGMA_URL_PATTERN.test(design.file_url)) {
|
|
77
87
|
// 3. figma-specific: must be a figma.com URL
|
|
78
88
|
violations.push({
|
|
79
89
|
ruleId: 'DesignSourceShape',
|
|
@@ -121,7 +131,7 @@ export const DesignSourceShape = {
|
|
|
121
131
|
});
|
|
122
132
|
continue;
|
|
123
133
|
}
|
|
124
|
-
if (
|
|
134
|
+
if (designType === 'figma' && !FIGMA_URL_PATTERN.test(value)) {
|
|
125
135
|
violations.push({
|
|
126
136
|
ruleId: 'DesignSourceShape',
|
|
127
137
|
severity: 'warning',
|
|
@@ -47,7 +47,8 @@ export const SdkVersion = {
|
|
|
47
47
|
{
|
|
48
48
|
ruleId: 'SdkVersion',
|
|
49
49
|
severity: 'error',
|
|
50
|
-
message: 'SDK version is required for spec export.'
|
|
50
|
+
message: 'SDK version is required for spec export. Set global_config.sdk_version ' +
|
|
51
|
+
'to the released Campaign Cart SDK version the pages load, in MAJOR.MINOR.PATCH form.',
|
|
51
52
|
path: '/global_config/sdk_version',
|
|
52
53
|
},
|
|
53
54
|
];
|
package/compatibility.json
CHANGED
|
@@ -849,8 +849,8 @@
|
|
|
849
849
|
},
|
|
850
850
|
"verification": {
|
|
851
851
|
"sdk_version": "0.4.40",
|
|
852
|
-
"verified_at": "2026-10-
|
|
853
|
-
"evidence": "sdk-0.4.40-2026-10-
|
|
852
|
+
"verified_at": "2026-10-04T02:15:52Z",
|
|
853
|
+
"evidence": "sdk-0.4.40-2026-10-04",
|
|
854
854
|
"status": "certified",
|
|
855
855
|
"source": "template-verification.json"
|
|
856
856
|
}
|
|
@@ -861,7 +861,7 @@
|
|
|
861
861
|
"id": "template-reference-apollo",
|
|
862
862
|
"family": "apollo",
|
|
863
863
|
"version": "sdk-0.4.38-composable-upsells-2026-09-25",
|
|
864
|
-
"source_commit": "
|
|
864
|
+
"source_commit": "80f0e30f873b5a13a5232ffd76b20da53480ae57",
|
|
865
865
|
"provenance_url": "https://raw.githubusercontent.com/NextCommerceCo/campaign-cart-starter-templates/main/docs/template-references/apollo/README.md",
|
|
866
866
|
"contract_path": "contracts/commerce-surface-catalog.json",
|
|
867
867
|
"standard_viewport_refs": [
|
|
@@ -1273,8 +1273,8 @@
|
|
|
1273
1273
|
},
|
|
1274
1274
|
"verification": {
|
|
1275
1275
|
"sdk_version": "0.4.40",
|
|
1276
|
-
"verified_at": "2026-10-
|
|
1277
|
-
"evidence": "sdk-0.4.40-2026-10-
|
|
1276
|
+
"verified_at": "2026-10-04T02:15:52Z",
|
|
1277
|
+
"evidence": "sdk-0.4.40-2026-10-04",
|
|
1278
1278
|
"status": "certified",
|
|
1279
1279
|
"source": "template-verification.json"
|
|
1280
1280
|
}
|
|
@@ -1584,8 +1584,8 @@
|
|
|
1584
1584
|
},
|
|
1585
1585
|
"verification": {
|
|
1586
1586
|
"sdk_version": "0.4.40",
|
|
1587
|
-
"verified_at": "2026-10-
|
|
1588
|
-
"evidence": "sdk-0.4.40-2026-10-
|
|
1587
|
+
"verified_at": "2026-10-04T02:15:52Z",
|
|
1588
|
+
"evidence": "sdk-0.4.40-2026-10-04",
|
|
1589
1589
|
"status": "certified",
|
|
1590
1590
|
"source": "template-verification.json"
|
|
1591
1591
|
}
|
|
@@ -1887,8 +1887,8 @@
|
|
|
1887
1887
|
},
|
|
1888
1888
|
"verification": {
|
|
1889
1889
|
"sdk_version": "0.4.40",
|
|
1890
|
-
"verified_at": "2026-10-
|
|
1891
|
-
"evidence": "sdk-0.4.40-2026-10-
|
|
1890
|
+
"verified_at": "2026-10-04T02:15:52Z",
|
|
1891
|
+
"evidence": "sdk-0.4.40-2026-10-04",
|
|
1892
1892
|
"status": "certified",
|
|
1893
1893
|
"source": "template-verification.json"
|
|
1894
1894
|
}
|
|
@@ -2228,8 +2228,8 @@
|
|
|
2228
2228
|
},
|
|
2229
2229
|
"verification": {
|
|
2230
2230
|
"sdk_version": "0.4.40",
|
|
2231
|
-
"verified_at": "2026-10-
|
|
2232
|
-
"evidence": "sdk-0.4.40-2026-10-
|
|
2231
|
+
"verified_at": "2026-10-04T02:15:52Z",
|
|
2232
|
+
"evidence": "sdk-0.4.40-2026-10-04",
|
|
2233
2233
|
"status": "certified",
|
|
2234
2234
|
"source": "template-verification.json"
|
|
2235
2235
|
}
|
|
@@ -2667,8 +2667,8 @@
|
|
|
2667
2667
|
},
|
|
2668
2668
|
"verification": {
|
|
2669
2669
|
"sdk_version": "0.4.40",
|
|
2670
|
-
"verified_at": "2026-10-
|
|
2671
|
-
"evidence": "sdk-0.4.40-2026-10-
|
|
2670
|
+
"verified_at": "2026-10-04T02:15:52Z",
|
|
2671
|
+
"evidence": "sdk-0.4.40-2026-10-04",
|
|
2672
2672
|
"status": "certified",
|
|
2673
2673
|
"source": "template-verification.json"
|
|
2674
2674
|
}
|
|
@@ -3024,8 +3024,8 @@
|
|
|
3024
3024
|
},
|
|
3025
3025
|
"verification": {
|
|
3026
3026
|
"sdk_version": "0.4.40",
|
|
3027
|
-
"verified_at": "2026-10-
|
|
3028
|
-
"evidence": "sdk-0.4.40-2026-10-
|
|
3027
|
+
"verified_at": "2026-10-04T02:15:52Z",
|
|
3028
|
+
"evidence": "sdk-0.4.40-2026-10-04",
|
|
3029
3029
|
"status": "certified",
|
|
3030
3030
|
"source": "template-verification.json"
|
|
3031
3031
|
}
|
|
@@ -3314,8 +3314,8 @@
|
|
|
3314
3314
|
},
|
|
3315
3315
|
"verification": {
|
|
3316
3316
|
"sdk_version": "0.4.40",
|
|
3317
|
-
"verified_at": "2026-10-
|
|
3318
|
-
"evidence": "sdk-0.4.40-2026-10-
|
|
3317
|
+
"verified_at": "2026-10-04T02:15:52Z",
|
|
3318
|
+
"evidence": "sdk-0.4.40-2026-10-04",
|
|
3319
3319
|
"status": "certified",
|
|
3320
3320
|
"source": "template-verification.json"
|
|
3321
3321
|
}
|
|
@@ -3334,30 +3334,15 @@
|
|
|
3334
3334
|
{
|
|
3335
3335
|
"families": [
|
|
3336
3336
|
"olympus",
|
|
3337
|
-
"apollo"
|
|
3338
|
-
|
|
3339
|
-
"note": "Single-package check-style bump."
|
|
3340
|
-
},
|
|
3341
|
-
{
|
|
3342
|
-
"families": [
|
|
3337
|
+
"apollo",
|
|
3338
|
+
"demeter",
|
|
3343
3339
|
"olympus-mv-single-step",
|
|
3344
3340
|
"apollo-mv-single-step",
|
|
3345
|
-
"olympus-mv-two-step"
|
|
3346
|
-
],
|
|
3347
|
-
"note": "MV/configurable bump: quantity sync via data-next-product-sync (product_id), so it sums across variant swaps (SDK 0.4.25+). See CLAUDE.md."
|
|
3348
|
-
},
|
|
3349
|
-
{
|
|
3350
|
-
"families": [
|
|
3341
|
+
"olympus-mv-two-step",
|
|
3351
3342
|
"shop-single-step",
|
|
3352
3343
|
"shop-three-step"
|
|
3353
3344
|
],
|
|
3354
|
-
"note": "
|
|
3355
|
-
},
|
|
3356
|
-
{
|
|
3357
|
-
"families": [
|
|
3358
|
-
"demeter"
|
|
3359
|
-
],
|
|
3360
|
-
"note": "Editorial bump styling."
|
|
3345
|
+
"note": "GENERATED from _shared/checkout/_includes/ (sync:shared, byte-identical by construction, lint:shared-enforced) since the #194 consolidation — edit the _shared source, never a family copy. Superset contract: pricing_mode + legacy show_* bools; package_sync/sync_quantity AND product_sync (product_id match for MV mains, wins when both set); per-family demo values live in page frontmatter (order_bump.check01)."
|
|
3361
3346
|
}
|
|
3362
3347
|
]
|
|
3363
3348
|
},
|
|
@@ -3375,30 +3360,25 @@
|
|
|
3375
3360
|
"shop-single-step",
|
|
3376
3361
|
"shop-three-step"
|
|
3377
3362
|
],
|
|
3378
|
-
"note": "
|
|
3363
|
+
"note": "GENERATED from _shared/checkout/_includes/ (sync:shared, byte-identical by construction, lint:shared-enforced) since the #194 consolidation — edit the _shared source, never a family copy. Unsynced product-card bump with optional PackageToggle line-item property field (SDK 0.4.27+)."
|
|
3379
3364
|
}
|
|
3380
3365
|
]
|
|
3381
3366
|
},
|
|
3382
3367
|
"bump-switch01.html": {
|
|
3383
3368
|
"surface": "orderBump",
|
|
3384
3369
|
"lineages": [
|
|
3385
|
-
{
|
|
3386
|
-
"families": [
|
|
3387
|
-
"demeter"
|
|
3388
|
-
],
|
|
3389
|
-
"note": "Switch-style bump with demeter styling."
|
|
3390
|
-
},
|
|
3391
3370
|
{
|
|
3392
3371
|
"families": [
|
|
3393
3372
|
"olympus",
|
|
3394
3373
|
"apollo",
|
|
3374
|
+
"demeter",
|
|
3395
3375
|
"olympus-mv-single-step",
|
|
3396
3376
|
"apollo-mv-single-step",
|
|
3397
3377
|
"olympus-mv-two-step",
|
|
3398
3378
|
"shop-single-step",
|
|
3399
3379
|
"shop-three-step"
|
|
3400
3380
|
],
|
|
3401
|
-
"note": "
|
|
3381
|
+
"note": "GENERATED from _shared/checkout/_includes/ (sync:shared, byte-identical by construction, lint:shared-enforced) since the #194 consolidation — edit the _shared source, never a family copy. Switch-style bump; intentionally never quantity-synced."
|
|
3402
3382
|
}
|
|
3403
3383
|
]
|
|
3404
3384
|
},
|
|
@@ -3524,6 +3504,6 @@
|
|
|
3524
3504
|
}
|
|
3525
3505
|
},
|
|
3526
3506
|
"_synced_from_repo": "NextCommerceCo/campaign-cart-starter-templates",
|
|
3527
|
-
"_synced_from_ref": "
|
|
3528
|
-
"_synced_from_sha": "
|
|
3507
|
+
"_synced_from_ref": "2c618942391ae398fb4812f36fc93e6632054874",
|
|
3508
|
+
"_synced_from_sha": "2c618942391ae398fb4812f36fc93e6632054874"
|
|
3529
3509
|
}
|