@nextcommerce/campaigns-os 1.50.0 → 1.53.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 +474 -0
- package/agents/claude/CLAUDE.md +4 -2
- package/agents/codex/AGENTS.md +3 -1
- package/agents/copilot/copilot-instructions.md +3 -1
- package/agents/cursor/campaigns-os.mdc +3 -1
- 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 +282 -14
- package/contracts/release-ledger.json +1233 -0
- package/contracts/supported-surface.json +2 -2
- 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 +2 -0
- package/docs/build-packet.md +148 -23
- package/docs/campaign-build-brief.md +57 -2
- package/docs/effects.md +14 -0
- package/docs/local-setup.md +1 -1
- package/docs/orientation-contract-reference.md +1 -1
- package/docs/polish-evidence.md +12 -0
- package/docs/progress-snapshots.md +2 -4
- package/docs/qa-and-test-orders.md +47 -4
- package/docs/readback.md +19 -2
- 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/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 +5 -3
- package/skills/next-campaigns-os/SKILL.md +11 -20
- package/skills/next-campaigns-os/references/session-intake.md +17 -9
- package/skills/next-campaigns-os-setup/SKILL.md +4 -3
- package/skills/next-campaigns-polish/SKILL.md +7 -5
- package/skills/next-campaigns-qa/SKILL.md +8 -5
- package/skills.json +10 -10
- package/src/adapter-decision-contract.mjs +1 -1
- package/src/brand-theme.mjs +33 -20
- package/src/brief-summary.mjs +275 -0
- package/src/build-brief.mjs +229 -30
- 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 +467 -143
- package/src/commercial-journey.mjs +65 -4
- package/src/commercial-parity.mjs +6 -1
- package/src/contrast.mjs +649 -0
- package/src/design-source-publication.mjs +110 -3
- package/src/doctor/checks.mjs +415 -33
- package/src/doctor/inspect.mjs +53 -2
- package/src/doctor/next-step.mjs +16 -7
- package/src/input-currency.mjs +394 -0
- package/src/input-refresh.mjs +708 -0
- 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 +660 -141
- package/src/polish-capture.mjs +1 -1
- package/src/polish-deadline.mjs +7 -0
- package/src/polish-media-weight.mjs +492 -0
- package/src/polish-node.mjs +400 -28
- package/src/polish-readability.mjs +828 -0
- package/src/progress-node.mjs +19 -3
- package/src/qa-browser.mjs +439 -180
- package/src/qa-content-params.mjs +889 -0
- package/src/qa-node.mjs +116 -13
- 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 +482 -0
- package/src/qc-check-registry.mjs +91 -0
- package/src/qc-results.mjs +1341 -0
- package/src/readback.mjs +58 -10
- 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-ledger.mjs +235 -44
- package/src/stage-record.mjs +165 -33
- package/src/tooling-setup.mjs +1 -1
|
@@ -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
|
}
|