@nextcommerce/campaigns-os 1.62.0 → 1.63.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 +9 -0
- package/campaign-spec/dist/rules/campaign-currencies.d.ts +1 -0
- package/campaign-spec/dist/rules/campaign-currencies.js +1 -1
- package/campaign-spec/dist/rules/index.d.ts +1 -0
- package/campaign-spec/dist/rules/index.js +3 -0
- package/campaign-spec/dist/rules/package-currency-prices.d.ts +29 -0
- package/campaign-spec/dist/rules/package-currency-prices.js +137 -0
- package/campaign-spec/dist/types.d.ts +16 -0
- package/compatibility.json +1 -1
- package/contracts/fixtures/runtime-recipe/accept/current.json +1 -0
- package/contracts/fixtures/runtime-recipe/accept/minimal.json +1 -0
- package/contracts/fixtures/runtime-recipe/dist-states.json +1 -1
- package/contracts/fixtures/runtime-recipe/reject/advisory-enforcement.json +1 -0
- package/contracts/fixtures/runtime-recipe/reject/allowlist-without-hosts.json +1 -0
- package/contracts/fixtures/runtime-recipe/reject/committed-output-claim.json +1 -0
- package/contracts/fixtures/runtime-recipe/reject/engines-disagreement-warns.json +1 -0
- package/contracts/fixtures/runtime-recipe/reject/lifecycle-scripts-enabled.json +1 -0
- package/contracts/fixtures/runtime-recipe/reject/unknown-kind.json +1 -0
- package/contracts/fixtures/runtime-recipe/reject/unknown-network-policy.json +1 -0
- package/contracts/fixtures/runtime-recipe/reject/unknown-output-check.json +1 -0
- package/contracts/fixtures/runtime-recipe/reject/unknown-revision.json +1 -0
- package/contracts/fixtures/runtime-recipe/reject/unknown-step-id.json +1 -0
- package/contracts/fixtures/runtime-recipe/reject/unperformable-check-skipped.json +1 -0
- package/contracts/fixtures/runtime-recipe/reject/unpinned-lockfile.json +1 -0
- package/contracts/release-ledger.json +261 -0
- package/contracts/runtime-recipe.campaigns-os-node-v1.json +1 -0
- package/contracts/supported-surface.json +4 -4
- package/docs/campaignspec-authoring-examples.md +30 -0
- package/docs/local-setup.md +1 -1
- package/docs/orientation-contract-reference.md +1 -1
- package/docs/runtime-readiness.md +4 -3
- package/docs/skills-revision.md +10 -10
- package/package.json +1 -1
- package/schemas/campaign-spec.v4.schema.json +15 -0
- package/schemas/campaign-spec.v5.schema.json +15 -0
- 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 +3 -3
- package/skills/next-campaigns-os/SKILL.md +3 -3
- package/skills/next-campaigns-os-setup/SKILL.md +3 -3
- package/skills/next-campaigns-polish/SKILL.md +3 -3
- package/skills/next-campaigns-qa/SKILL.md +3 -3
- package/skills/next-campaigns-sdk-bump/SKILL.md +3 -3
- package/skills.json +11 -11
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
Notable supported-surface changes are recorded here.
|
|
4
4
|
|
|
5
|
+
## [1.63.0] - 2026-10-31
|
|
6
|
+
|
|
7
|
+
CampaignSpec can carry a page package's price in each currency the campaign sells in, and validation warns when a package has no price in one of them. To take it, pin `@nextcommerce/campaigns-os@1.63.0` and refresh the installed skills to `1.63.0+skills.1`; the skill text changes only in its stated revision.
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- **`prices[]` on a page package (#714).** A row in `funnels[].pages[].packages[]` may carry `prices: [{ currency, price, price_retail?, price_recurring? }]`, one entry per currency the Campaigns App prices the package in, read from the Campaigns API in that currency (`GET /campaigns/?currency=<code>`). `price` and `price_retail` stay the default currency's. The field is optional and additive in schemas v4 and v5 and in the `PagePackage` type (with `PackageCurrencyPrice`), and the authoring guide's Campaign Currencies section shows it.
|
|
12
|
+
- **`PackageCurrencyPrices` rule (#714).** A warning, tagged `fast` and `spec-only`, so `doctor` and Map Builder both run it. For a row that carries `prices[]`, it reports a currency in `campaign.available_currencies` or `campaign.currency` with no entry, since the Campaigns API leaves an unpriced package out of the campaign in that currency; an entry without an ISO 4217 `currency` and a non-negative decimal `price`, or with a malformed `price_retail` or `price_recurring`; and a currency listed twice. A row without `prices[]` (absent or null) is not checked, and malformed campaign currency codes stay with `CampaignCurrencies`.
|
|
13
|
+
|
|
5
14
|
## [1.62.0] - 2026-10-30
|
|
6
15
|
|
|
7
16
|
This release makes the path from a Map to a working campaign shorter to start and cheaper to maintain. CampaignSpec validation catches a checkout nothing sells into and malformed currencies, and it carries the starter templates' analytics vendors. One project can hold several funnels. After handoff, `spec derive` keeps the spec in step with the repo's pages and the live campaign. A change to some pages' copy owes QA on those pages only. `qa run --test-order` holds test purchases back from the analytics vendors it can intercept (all of the template vendors except Northbeam), and `qa run --currency` blocks when the currency did not take. To take it, pin `@nextcommerce/campaigns-os@1.62.0` and refresh the installed skills to `1.62.0+skills.1`.
|
|
@@ -42,6 +42,7 @@ export { PackagePricingSanity } from './package-pricing-sanity.ts';
|
|
|
42
42
|
export { ShippingMethodsPresent } from './shipping-methods-present.ts';
|
|
43
43
|
export { ShippingCountriesShape } from './shipping-countries-shape.ts';
|
|
44
44
|
export { CampaignCurrencies } from './campaign-currencies.ts';
|
|
45
|
+
export { PackageCurrencyPrices } from './package-currency-prices.ts';
|
|
45
46
|
export { OfferRefIntegrity } from './offer-ref-integrity.ts';
|
|
46
47
|
export { ExitIntentValidation } from './exit-intent-validation.ts';
|
|
47
48
|
export { PromoCodeInputValidation } from './promo-code-input-validation.ts';
|
|
@@ -41,6 +41,7 @@ import { CampaignMetadata } from "./campaign-metadata.js";
|
|
|
41
41
|
import { ShippingMethodsPresent } from "./shipping-methods-present.js";
|
|
42
42
|
import { ShippingCountriesShape } from "./shipping-countries-shape.js";
|
|
43
43
|
import { CampaignCurrencies } from "./campaign-currencies.js";
|
|
44
|
+
import { PackageCurrencyPrices } from "./package-currency-prices.js";
|
|
44
45
|
import { PackagePricingSanity } from "./package-pricing-sanity.js";
|
|
45
46
|
import { OfferRefIntegrity } from "./offer-ref-integrity.js";
|
|
46
47
|
import { ExitIntentValidation } from "./exit-intent-validation.js";
|
|
@@ -78,6 +79,7 @@ export { PackagePricingSanity } from "./package-pricing-sanity.js";
|
|
|
78
79
|
export { ShippingMethodsPresent } from "./shipping-methods-present.js";
|
|
79
80
|
export { ShippingCountriesShape } from "./shipping-countries-shape.js";
|
|
80
81
|
export { CampaignCurrencies } from "./campaign-currencies.js";
|
|
82
|
+
export { PackageCurrencyPrices } from "./package-currency-prices.js";
|
|
81
83
|
export { OfferRefIntegrity } from "./offer-ref-integrity.js";
|
|
82
84
|
export { ExitIntentValidation } from "./exit-intent-validation.js";
|
|
83
85
|
export { PromoCodeInputValidation } from "./promo-code-input-validation.js";
|
|
@@ -125,6 +127,7 @@ export const allRules = [
|
|
|
125
127
|
ShippingMethodsPresent,
|
|
126
128
|
ShippingCountriesShape,
|
|
127
129
|
CampaignCurrencies,
|
|
130
|
+
PackageCurrencyPrices,
|
|
128
131
|
OfferRefIntegrity,
|
|
129
132
|
ExitIntentValidation,
|
|
130
133
|
PromoCodeInputValidation,
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PackageCurrencyPrices — checks each page package's price in every currency
|
|
3
|
+
* the campaign sells in (#714).
|
|
4
|
+
*
|
|
5
|
+
* A package row may carry `prices[]`: one `{ currency, price, price_retail?,
|
|
6
|
+
* price_recurring? }` per currency the Campaigns App has a price for, read
|
|
7
|
+
* from the Campaigns API (`GET /campaigns/?currency=<code>`). That read
|
|
8
|
+
* returns only the packages priced in the requested currency, so a package
|
|
9
|
+
* with no price in a listed currency is missing from the campaign for a
|
|
10
|
+
* shopper paying in it.
|
|
11
|
+
*
|
|
12
|
+
* 1. `prices`, when present, is an array of entries, each with a
|
|
13
|
+
* three-letter upper-case ISO 4217 `currency` and a non-negative
|
|
14
|
+
* numeric `price`, and no currency twice.
|
|
15
|
+
* 2. A row with `prices` has an entry for every currency in
|
|
16
|
+
* campaign.available_currencies and for campaign.currency.
|
|
17
|
+
*
|
|
18
|
+
* A row without `prices` (absent or null) is silent: older Maps and
|
|
19
|
+
* hand-written specs carry the default currency's price only (`price`), and
|
|
20
|
+
* nothing is known about the others. Every finding is a warning, since a
|
|
21
|
+
* missing price is fixed in the Campaigns App, not in the spec.
|
|
22
|
+
*
|
|
23
|
+
* The selling currencies are the spec's own `campaign.currency` and
|
|
24
|
+
* `campaign.available_currencies`. The Campaigns App API's
|
|
25
|
+
* `additional_currencies` is not a CampaignSpec field (CampaignCurrencies), so
|
|
26
|
+
* it is not read here either.
|
|
27
|
+
*/
|
|
28
|
+
import type { Rule } from '../types.ts';
|
|
29
|
+
export declare const PackageCurrencyPrices: Rule;
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PackageCurrencyPrices — checks each page package's price in every currency
|
|
3
|
+
* the campaign sells in (#714).
|
|
4
|
+
*
|
|
5
|
+
* A package row may carry `prices[]`: one `{ currency, price, price_retail?,
|
|
6
|
+
* price_recurring? }` per currency the Campaigns App has a price for, read
|
|
7
|
+
* from the Campaigns API (`GET /campaigns/?currency=<code>`). That read
|
|
8
|
+
* returns only the packages priced in the requested currency, so a package
|
|
9
|
+
* with no price in a listed currency is missing from the campaign for a
|
|
10
|
+
* shopper paying in it.
|
|
11
|
+
*
|
|
12
|
+
* 1. `prices`, when present, is an array of entries, each with a
|
|
13
|
+
* three-letter upper-case ISO 4217 `currency` and a non-negative
|
|
14
|
+
* numeric `price`, and no currency twice.
|
|
15
|
+
* 2. A row with `prices` has an entry for every currency in
|
|
16
|
+
* campaign.available_currencies and for campaign.currency.
|
|
17
|
+
*
|
|
18
|
+
* A row without `prices` (absent or null) is silent: older Maps and
|
|
19
|
+
* hand-written specs carry the default currency's price only (`price`), and
|
|
20
|
+
* nothing is known about the others. Every finding is a warning, since a
|
|
21
|
+
* missing price is fixed in the Campaigns App, not in the spec.
|
|
22
|
+
*
|
|
23
|
+
* The selling currencies are the spec's own `campaign.currency` and
|
|
24
|
+
* `campaign.available_currencies`. The Campaigns App API's
|
|
25
|
+
* `additional_currencies` is not a CampaignSpec field (CampaignCurrencies), so
|
|
26
|
+
* it is not read here either.
|
|
27
|
+
*/
|
|
28
|
+
import { isCurrencyCode } from "./campaign-currencies.js";
|
|
29
|
+
// A non-negative amount: a finite number, or a plain decimal string ("49.99").
|
|
30
|
+
// Hex, binary and exponent strings ("0x10", "1e3") are not prices.
|
|
31
|
+
function isPrice(value) {
|
|
32
|
+
if (typeof value === 'number')
|
|
33
|
+
return Number.isFinite(value) && value >= 0;
|
|
34
|
+
return typeof value === 'string' && /^\d+(\.\d+)?$/.test(value.trim());
|
|
35
|
+
}
|
|
36
|
+
// An optional amount: absent, null, or a price.
|
|
37
|
+
function isOptionalPrice(value) {
|
|
38
|
+
return value === undefined || value === null || isPrice(value);
|
|
39
|
+
}
|
|
40
|
+
// What is wrong with one prices[] entry, or null when it is well formed.
|
|
41
|
+
function entryDefect(entry) {
|
|
42
|
+
if (!entry || typeof entry !== 'object' || Array.isArray(entry))
|
|
43
|
+
return 'is not a { currency, price } object';
|
|
44
|
+
const row = entry;
|
|
45
|
+
const defects = [];
|
|
46
|
+
if (!isCurrencyCode(row.currency))
|
|
47
|
+
defects.push('a three-letter upper-case ISO 4217 currency');
|
|
48
|
+
if (!isPrice(row.price))
|
|
49
|
+
defects.push('a non-negative decimal price');
|
|
50
|
+
for (const field of ['price_retail', 'price_recurring']) {
|
|
51
|
+
if (!isOptionalPrice(row[field]))
|
|
52
|
+
defects.push(`a non-negative decimal ${field} (or none)`);
|
|
53
|
+
}
|
|
54
|
+
return defects.length ? `needs ${defects.join(' and ')}` : null;
|
|
55
|
+
}
|
|
56
|
+
// The currencies the campaign sells in: the valid listed codes and a valid
|
|
57
|
+
// default. Malformed codes are CampaignCurrencies' to report.
|
|
58
|
+
function sellingCurrencies(spec) {
|
|
59
|
+
const campaign = spec.campaign;
|
|
60
|
+
if (!campaign || typeof campaign !== 'object')
|
|
61
|
+
return [];
|
|
62
|
+
const listed = Array.isArray(campaign.available_currencies) ? campaign.available_currencies : [];
|
|
63
|
+
return [...new Set([campaign.currency, ...listed].filter(isCurrencyCode))];
|
|
64
|
+
}
|
|
65
|
+
export const PackageCurrencyPrices = {
|
|
66
|
+
id: 'PackageCurrencyPrices',
|
|
67
|
+
severity: 'warning',
|
|
68
|
+
tags: ['fast', 'spec-only'],
|
|
69
|
+
check(spec) {
|
|
70
|
+
const violations = [];
|
|
71
|
+
const selling = sellingCurrencies(spec);
|
|
72
|
+
spec.funnels.forEach((funnel, funnelIdx) => {
|
|
73
|
+
;
|
|
74
|
+
(funnel.pages ?? []).forEach((page, pageIdx) => {
|
|
75
|
+
;
|
|
76
|
+
(page.packages ?? []).forEach((pkg, pkgIdx) => {
|
|
77
|
+
const prices = pkg.prices;
|
|
78
|
+
if (prices === undefined || prices === null)
|
|
79
|
+
return;
|
|
80
|
+
const path = `/funnels/${funnelIdx}/pages/${pageIdx}/packages/${pkgIdx}/prices`;
|
|
81
|
+
const name = pkg.name || pkg.ref_id;
|
|
82
|
+
const label = `"${page.label || page.id}" — Package "${name}"`;
|
|
83
|
+
if (!Array.isArray(prices)) {
|
|
84
|
+
violations.push({
|
|
85
|
+
ruleId: 'PackageCurrencyPrices',
|
|
86
|
+
severity: 'warning',
|
|
87
|
+
message: `${label}: prices must be an array of { currency, price } entries.`,
|
|
88
|
+
path,
|
|
89
|
+
data: { check: 'prices_shape', pageId: page.id, ref_id: pkg.ref_id, received: prices },
|
|
90
|
+
});
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
const seen = new Set();
|
|
94
|
+
prices.forEach((entry, index) => {
|
|
95
|
+
const currency = entry && typeof entry === 'object' && !Array.isArray(entry) ? entry.currency : undefined;
|
|
96
|
+
const defect = entryDefect(entry);
|
|
97
|
+
// A malformed entry with a valid currency still counts that
|
|
98
|
+
// currency as listed: the entry's own finding names the fix, and a
|
|
99
|
+
// second "has no EUR price" finding would report it twice.
|
|
100
|
+
if (defect) {
|
|
101
|
+
violations.push({
|
|
102
|
+
ruleId: 'PackageCurrencyPrices',
|
|
103
|
+
severity: 'warning',
|
|
104
|
+
message: `${label}: prices[${index}] ${defect}.`,
|
|
105
|
+
path: `${path}/${index}`,
|
|
106
|
+
data: { check: 'price_entry_shape', pageId: page.id, ref_id: pkg.ref_id, received: entry },
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
else if (isCurrencyCode(currency) && seen.has(currency)) {
|
|
110
|
+
violations.push({
|
|
111
|
+
ruleId: 'PackageCurrencyPrices',
|
|
112
|
+
severity: 'warning',
|
|
113
|
+
message: `${label}: prices lists ${currency} more than once.`,
|
|
114
|
+
path: `${path}/${index}`,
|
|
115
|
+
data: { check: 'price_currency_repeated', pageId: page.id, ref_id: pkg.ref_id, currency },
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
if (isCurrencyCode(currency))
|
|
119
|
+
seen.add(currency);
|
|
120
|
+
});
|
|
121
|
+
const missing = selling.filter((code) => !seen.has(code));
|
|
122
|
+
if (missing.length > 0) {
|
|
123
|
+
const list = missing.length === 1 ? missing[0] : `${missing.slice(0, -1).join(', ')} or ${missing[missing.length - 1]}`;
|
|
124
|
+
violations.push({
|
|
125
|
+
ruleId: 'PackageCurrencyPrices',
|
|
126
|
+
severity: 'warning',
|
|
127
|
+
message: `${label} has no ${list} price, so the campaign leaves it out in ${missing.length === 1 ? 'that currency' : 'those currencies'}. Add the price in the Campaigns App, then refresh the Map.`,
|
|
128
|
+
path,
|
|
129
|
+
data: { check: 'price_currency_missing', pageId: page.id, ref_id: pkg.ref_id, missing },
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
return violations;
|
|
136
|
+
},
|
|
137
|
+
};
|
|
@@ -108,6 +108,14 @@ export interface PageOffer {
|
|
|
108
108
|
benefit?: OfferBenefit;
|
|
109
109
|
[key: string]: unknown;
|
|
110
110
|
}
|
|
111
|
+
/** One currency's price for a page package (#714). */
|
|
112
|
+
export interface PackageCurrencyPrice {
|
|
113
|
+
/** Three-letter upper-case ISO 4217 code. */
|
|
114
|
+
currency: string;
|
|
115
|
+
price: number | string;
|
|
116
|
+
price_retail?: number | string | null;
|
|
117
|
+
price_recurring?: number | string | null;
|
|
118
|
+
}
|
|
111
119
|
export interface PagePackage {
|
|
112
120
|
ref_id?: string | number;
|
|
113
121
|
/**
|
|
@@ -118,6 +126,14 @@ export interface PagePackage {
|
|
|
118
126
|
name?: string | null;
|
|
119
127
|
price?: number | string | null;
|
|
120
128
|
price_retail?: number | string | null;
|
|
129
|
+
/**
|
|
130
|
+
* The package's price in each currency the Campaigns App prices it in,
|
|
131
|
+
* read from the Campaigns API (`GET /campaigns/?currency=<code>`). `price`
|
|
132
|
+
* and `price_retail` above stay the default currency's. Optional; a row
|
|
133
|
+
* that carries it should list every currency the campaign sells in
|
|
134
|
+
* (PackageCurrencyPrices).
|
|
135
|
+
*/
|
|
136
|
+
prices?: PackageCurrencyPrice[];
|
|
121
137
|
product_name?: string | null;
|
|
122
138
|
product_sku?: string | null;
|
|
123
139
|
product_variant_name?: string | null;
|
package/compatibility.json
CHANGED
|
@@ -131,6 +131,7 @@
|
|
|
131
131
|
"campaign-spec/rules/index.ts",
|
|
132
132
|
"campaign-spec/rules/offer-ref-integrity.ts",
|
|
133
133
|
"campaign-spec/rules/one-checkout-per-path.ts",
|
|
134
|
+
"campaign-spec/rules/package-currency-prices.ts",
|
|
134
135
|
"campaign-spec/rules/package-pricing-sanity.ts",
|
|
135
136
|
"campaign-spec/rules/page-count.ts",
|
|
136
137
|
"campaign-spec/rules/page-id-uniqueness.ts",
|
|
@@ -126,6 +126,7 @@
|
|
|
126
126
|
"campaign-spec/rules/index.ts",
|
|
127
127
|
"campaign-spec/rules/offer-ref-integrity.ts",
|
|
128
128
|
"campaign-spec/rules/one-checkout-per-path.ts",
|
|
129
|
+
"campaign-spec/rules/package-currency-prices.ts",
|
|
129
130
|
"campaign-spec/rules/package-pricing-sanity.ts",
|
|
130
131
|
"campaign-spec/rules/page-count.ts",
|
|
131
132
|
"campaign-spec/rules/page-id-uniqueness.ts",
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"_note": "Declarative descriptions of the prepared-runtime states an output-check implementation must distinguish. A test builds each state from the accepted recipe rather than from paths written down here, so adding a module to the input set cannot leave a fixture describing an inventory that no longer exists.",
|
|
3
3
|
"schema": "campaigns-os-runtime-recipe-dist-states/v1",
|
|
4
4
|
"directory": "campaign-spec/dist",
|
|
5
|
-
"expected_file_count":
|
|
5
|
+
"expected_file_count": 94,
|
|
6
6
|
"states": [
|
|
7
7
|
{
|
|
8
8
|
"id": "healthy",
|
|
@@ -131,6 +131,7 @@
|
|
|
131
131
|
"campaign-spec/rules/index.ts",
|
|
132
132
|
"campaign-spec/rules/offer-ref-integrity.ts",
|
|
133
133
|
"campaign-spec/rules/one-checkout-per-path.ts",
|
|
134
|
+
"campaign-spec/rules/package-currency-prices.ts",
|
|
134
135
|
"campaign-spec/rules/package-pricing-sanity.ts",
|
|
135
136
|
"campaign-spec/rules/page-count.ts",
|
|
136
137
|
"campaign-spec/rules/page-id-uniqueness.ts",
|
|
@@ -129,6 +129,7 @@
|
|
|
129
129
|
"campaign-spec/rules/index.ts",
|
|
130
130
|
"campaign-spec/rules/offer-ref-integrity.ts",
|
|
131
131
|
"campaign-spec/rules/one-checkout-per-path.ts",
|
|
132
|
+
"campaign-spec/rules/package-currency-prices.ts",
|
|
132
133
|
"campaign-spec/rules/package-pricing-sanity.ts",
|
|
133
134
|
"campaign-spec/rules/page-count.ts",
|
|
134
135
|
"campaign-spec/rules/page-id-uniqueness.ts",
|
|
@@ -131,6 +131,7 @@
|
|
|
131
131
|
"campaign-spec/rules/index.ts",
|
|
132
132
|
"campaign-spec/rules/offer-ref-integrity.ts",
|
|
133
133
|
"campaign-spec/rules/one-checkout-per-path.ts",
|
|
134
|
+
"campaign-spec/rules/package-currency-prices.ts",
|
|
134
135
|
"campaign-spec/rules/package-pricing-sanity.ts",
|
|
135
136
|
"campaign-spec/rules/page-count.ts",
|
|
136
137
|
"campaign-spec/rules/page-id-uniqueness.ts",
|
|
@@ -131,6 +131,7 @@
|
|
|
131
131
|
"campaign-spec/rules/index.ts",
|
|
132
132
|
"campaign-spec/rules/offer-ref-integrity.ts",
|
|
133
133
|
"campaign-spec/rules/one-checkout-per-path.ts",
|
|
134
|
+
"campaign-spec/rules/package-currency-prices.ts",
|
|
134
135
|
"campaign-spec/rules/package-pricing-sanity.ts",
|
|
135
136
|
"campaign-spec/rules/page-count.ts",
|
|
136
137
|
"campaign-spec/rules/page-id-uniqueness.ts",
|
|
@@ -131,6 +131,7 @@
|
|
|
131
131
|
"campaign-spec/rules/index.ts",
|
|
132
132
|
"campaign-spec/rules/offer-ref-integrity.ts",
|
|
133
133
|
"campaign-spec/rules/one-checkout-per-path.ts",
|
|
134
|
+
"campaign-spec/rules/package-currency-prices.ts",
|
|
134
135
|
"campaign-spec/rules/package-pricing-sanity.ts",
|
|
135
136
|
"campaign-spec/rules/page-count.ts",
|
|
136
137
|
"campaign-spec/rules/page-id-uniqueness.ts",
|
|
@@ -131,6 +131,7 @@
|
|
|
131
131
|
"campaign-spec/rules/index.ts",
|
|
132
132
|
"campaign-spec/rules/offer-ref-integrity.ts",
|
|
133
133
|
"campaign-spec/rules/one-checkout-per-path.ts",
|
|
134
|
+
"campaign-spec/rules/package-currency-prices.ts",
|
|
134
135
|
"campaign-spec/rules/package-pricing-sanity.ts",
|
|
135
136
|
"campaign-spec/rules/page-count.ts",
|
|
136
137
|
"campaign-spec/rules/page-id-uniqueness.ts",
|
|
@@ -131,6 +131,7 @@
|
|
|
131
131
|
"campaign-spec/rules/index.ts",
|
|
132
132
|
"campaign-spec/rules/offer-ref-integrity.ts",
|
|
133
133
|
"campaign-spec/rules/one-checkout-per-path.ts",
|
|
134
|
+
"campaign-spec/rules/package-currency-prices.ts",
|
|
134
135
|
"campaign-spec/rules/package-pricing-sanity.ts",
|
|
135
136
|
"campaign-spec/rules/page-count.ts",
|
|
136
137
|
"campaign-spec/rules/page-id-uniqueness.ts",
|
|
@@ -131,6 +131,7 @@
|
|
|
131
131
|
"campaign-spec/rules/index.ts",
|
|
132
132
|
"campaign-spec/rules/offer-ref-integrity.ts",
|
|
133
133
|
"campaign-spec/rules/one-checkout-per-path.ts",
|
|
134
|
+
"campaign-spec/rules/package-currency-prices.ts",
|
|
134
135
|
"campaign-spec/rules/package-pricing-sanity.ts",
|
|
135
136
|
"campaign-spec/rules/page-count.ts",
|
|
136
137
|
"campaign-spec/rules/page-id-uniqueness.ts",
|
|
@@ -131,6 +131,7 @@
|
|
|
131
131
|
"campaign-spec/rules/index.ts",
|
|
132
132
|
"campaign-spec/rules/offer-ref-integrity.ts",
|
|
133
133
|
"campaign-spec/rules/one-checkout-per-path.ts",
|
|
134
|
+
"campaign-spec/rules/package-currency-prices.ts",
|
|
134
135
|
"campaign-spec/rules/package-pricing-sanity.ts",
|
|
135
136
|
"campaign-spec/rules/page-count.ts",
|
|
136
137
|
"campaign-spec/rules/page-id-uniqueness.ts",
|
|
@@ -131,6 +131,7 @@
|
|
|
131
131
|
"campaign-spec/rules/index.ts",
|
|
132
132
|
"campaign-spec/rules/offer-ref-integrity.ts",
|
|
133
133
|
"campaign-spec/rules/one-checkout-per-path.ts",
|
|
134
|
+
"campaign-spec/rules/package-currency-prices.ts",
|
|
134
135
|
"campaign-spec/rules/package-pricing-sanity.ts",
|
|
135
136
|
"campaign-spec/rules/page-count.ts",
|
|
136
137
|
"campaign-spec/rules/page-id-uniqueness.ts",
|
|
@@ -131,6 +131,7 @@
|
|
|
131
131
|
"campaign-spec/rules/index.ts",
|
|
132
132
|
"campaign-spec/rules/offer-ref-integrity.ts",
|
|
133
133
|
"campaign-spec/rules/one-checkout-per-path.ts",
|
|
134
|
+
"campaign-spec/rules/package-currency-prices.ts",
|
|
134
135
|
"campaign-spec/rules/package-pricing-sanity.ts",
|
|
135
136
|
"campaign-spec/rules/page-count.ts",
|
|
136
137
|
"campaign-spec/rules/page-id-uniqueness.ts",
|
|
@@ -131,6 +131,7 @@
|
|
|
131
131
|
"campaign-spec/rules/index.ts",
|
|
132
132
|
"campaign-spec/rules/offer-ref-integrity.ts",
|
|
133
133
|
"campaign-spec/rules/one-checkout-per-path.ts",
|
|
134
|
+
"campaign-spec/rules/package-currency-prices.ts",
|
|
134
135
|
"campaign-spec/rules/package-pricing-sanity.ts",
|
|
135
136
|
"campaign-spec/rules/page-count.ts",
|
|
136
137
|
"campaign-spec/rules/page-id-uniqueness.ts",
|
|
@@ -10418,6 +10418,267 @@
|
|
|
10418
10418
|
}
|
|
10419
10419
|
],
|
|
10420
10420
|
"entry_sha256": "34151f9822332d3b3e122b637a8d49095fcfd192529bffb26fa923016d1367d5"
|
|
10421
|
+
},
|
|
10422
|
+
{
|
|
10423
|
+
"id": "RL-0313",
|
|
10424
|
+
"sequence": 301,
|
|
10425
|
+
"date": "2026-10-31",
|
|
10426
|
+
"kind": "release",
|
|
10427
|
+
"surface_version": "1.63.0",
|
|
10428
|
+
"changelog_section": "1.63.0",
|
|
10429
|
+
"changelog_sha256": "709a63c33ef9f64e9fceb7e52e7ba1a7b35e2e8fb4404bb56aa0eac8c0702707",
|
|
10430
|
+
"agent_impact": "A page package row may carry prices[] ({ currency, price, price_retail?, price_recurring? } per currency, read from GET /campaigns/?currency=<code>); price and price_retail stay the default currency's. CampaignSpec validation adds PackageCurrencyPrices, a warning for a row whose prices[] lacks a currency the campaign sells in, has a malformed entry, or lists a currency twice. A row without prices[] is unchanged and unchecked. Refresh skills to 1.63.0+skills.1 (a revision restamp; the skill text is otherwise unchanged).",
|
|
10431
|
+
"compatibility": "additive",
|
|
10432
|
+
"migration": "none",
|
|
10433
|
+
"changes": [
|
|
10434
|
+
{
|
|
10435
|
+
"class": "generated_runtime",
|
|
10436
|
+
"path": "campaign-spec/rules/campaign-currencies.ts",
|
|
10437
|
+
"surface_entry": null,
|
|
10438
|
+
"summary": "Exports isCurrencyCode for the package price rule."
|
|
10439
|
+
},
|
|
10440
|
+
{
|
|
10441
|
+
"class": "generated_runtime",
|
|
10442
|
+
"path": "campaign-spec/rules/index.ts",
|
|
10443
|
+
"surface_entry": null,
|
|
10444
|
+
"summary": "Registers PackageCurrencyPrices in the rule sets."
|
|
10445
|
+
},
|
|
10446
|
+
{
|
|
10447
|
+
"class": "generated_runtime",
|
|
10448
|
+
"path": "campaign-spec/rules/package-currency-prices.ts",
|
|
10449
|
+
"surface_entry": null,
|
|
10450
|
+
"summary": "New PackageCurrencyPrices rule: a page package row with prices[] has a well-formed entry for every currency the campaign sells in (warning)."
|
|
10451
|
+
},
|
|
10452
|
+
{
|
|
10453
|
+
"class": "generated_runtime",
|
|
10454
|
+
"path": "campaign-spec/types.ts",
|
|
10455
|
+
"surface_entry": null,
|
|
10456
|
+
"summary": "PagePackage gains prices; new PackageCurrencyPrice type."
|
|
10457
|
+
},
|
|
10458
|
+
{
|
|
10459
|
+
"class": "compatibility_policy",
|
|
10460
|
+
"path": "compatibility.json",
|
|
10461
|
+
"surface_entry": null,
|
|
10462
|
+
"summary": "Version advances to 1.63.0."
|
|
10463
|
+
},
|
|
10464
|
+
{
|
|
10465
|
+
"class": "named_surface",
|
|
10466
|
+
"path": "contracts/fixtures/runtime-recipe/accept/current.json",
|
|
10467
|
+
"surface_entry": "contracts/fixtures/runtime-recipe/accept/current.json",
|
|
10468
|
+
"summary": "Regenerated with the new recipe input."
|
|
10469
|
+
},
|
|
10470
|
+
{
|
|
10471
|
+
"class": "named_surface",
|
|
10472
|
+
"path": "contracts/fixtures/runtime-recipe/accept/minimal.json",
|
|
10473
|
+
"surface_entry": "contracts/fixtures/runtime-recipe/accept/minimal.json",
|
|
10474
|
+
"summary": "Regenerated with the new recipe input."
|
|
10475
|
+
},
|
|
10476
|
+
{
|
|
10477
|
+
"class": "named_surface",
|
|
10478
|
+
"path": "contracts/fixtures/runtime-recipe/dist-states.json",
|
|
10479
|
+
"surface_entry": "contracts/fixtures/runtime-recipe/dist-states.json",
|
|
10480
|
+
"summary": "Regenerated with the new recipe input."
|
|
10481
|
+
},
|
|
10482
|
+
{
|
|
10483
|
+
"class": "named_surface",
|
|
10484
|
+
"path": "contracts/fixtures/runtime-recipe/reject/advisory-enforcement.json",
|
|
10485
|
+
"surface_entry": "contracts/fixtures/runtime-recipe/reject/advisory-enforcement.json",
|
|
10486
|
+
"summary": "Regenerated with the new recipe input."
|
|
10487
|
+
},
|
|
10488
|
+
{
|
|
10489
|
+
"class": "named_surface",
|
|
10490
|
+
"path": "contracts/fixtures/runtime-recipe/reject/allowlist-without-hosts.json",
|
|
10491
|
+
"surface_entry": "contracts/fixtures/runtime-recipe/reject/allowlist-without-hosts.json",
|
|
10492
|
+
"summary": "Regenerated with the new recipe input."
|
|
10493
|
+
},
|
|
10494
|
+
{
|
|
10495
|
+
"class": "named_surface",
|
|
10496
|
+
"path": "contracts/fixtures/runtime-recipe/reject/committed-output-claim.json",
|
|
10497
|
+
"surface_entry": "contracts/fixtures/runtime-recipe/reject/committed-output-claim.json",
|
|
10498
|
+
"summary": "Regenerated with the new recipe input."
|
|
10499
|
+
},
|
|
10500
|
+
{
|
|
10501
|
+
"class": "named_surface",
|
|
10502
|
+
"path": "contracts/fixtures/runtime-recipe/reject/engines-disagreement-warns.json",
|
|
10503
|
+
"surface_entry": "contracts/fixtures/runtime-recipe/reject/engines-disagreement-warns.json",
|
|
10504
|
+
"summary": "Regenerated with the new recipe input."
|
|
10505
|
+
},
|
|
10506
|
+
{
|
|
10507
|
+
"class": "named_surface",
|
|
10508
|
+
"path": "contracts/fixtures/runtime-recipe/reject/lifecycle-scripts-enabled.json",
|
|
10509
|
+
"surface_entry": "contracts/fixtures/runtime-recipe/reject/lifecycle-scripts-enabled.json",
|
|
10510
|
+
"summary": "Regenerated with the new recipe input."
|
|
10511
|
+
},
|
|
10512
|
+
{
|
|
10513
|
+
"class": "named_surface",
|
|
10514
|
+
"path": "contracts/fixtures/runtime-recipe/reject/unknown-kind.json",
|
|
10515
|
+
"surface_entry": "contracts/fixtures/runtime-recipe/reject/unknown-kind.json",
|
|
10516
|
+
"summary": "Regenerated with the new recipe input."
|
|
10517
|
+
},
|
|
10518
|
+
{
|
|
10519
|
+
"class": "named_surface",
|
|
10520
|
+
"path": "contracts/fixtures/runtime-recipe/reject/unknown-network-policy.json",
|
|
10521
|
+
"surface_entry": "contracts/fixtures/runtime-recipe/reject/unknown-network-policy.json",
|
|
10522
|
+
"summary": "Regenerated with the new recipe input."
|
|
10523
|
+
},
|
|
10524
|
+
{
|
|
10525
|
+
"class": "named_surface",
|
|
10526
|
+
"path": "contracts/fixtures/runtime-recipe/reject/unknown-output-check.json",
|
|
10527
|
+
"surface_entry": "contracts/fixtures/runtime-recipe/reject/unknown-output-check.json",
|
|
10528
|
+
"summary": "Regenerated with the new recipe input."
|
|
10529
|
+
},
|
|
10530
|
+
{
|
|
10531
|
+
"class": "named_surface",
|
|
10532
|
+
"path": "contracts/fixtures/runtime-recipe/reject/unknown-revision.json",
|
|
10533
|
+
"surface_entry": "contracts/fixtures/runtime-recipe/reject/unknown-revision.json",
|
|
10534
|
+
"summary": "Regenerated with the new recipe input."
|
|
10535
|
+
},
|
|
10536
|
+
{
|
|
10537
|
+
"class": "named_surface",
|
|
10538
|
+
"path": "contracts/fixtures/runtime-recipe/reject/unknown-step-id.json",
|
|
10539
|
+
"surface_entry": "contracts/fixtures/runtime-recipe/reject/unknown-step-id.json",
|
|
10540
|
+
"summary": "Regenerated with the new recipe input."
|
|
10541
|
+
},
|
|
10542
|
+
{
|
|
10543
|
+
"class": "named_surface",
|
|
10544
|
+
"path": "contracts/fixtures/runtime-recipe/reject/unperformable-check-skipped.json",
|
|
10545
|
+
"surface_entry": "contracts/fixtures/runtime-recipe/reject/unperformable-check-skipped.json",
|
|
10546
|
+
"summary": "Regenerated with the new recipe input."
|
|
10547
|
+
},
|
|
10548
|
+
{
|
|
10549
|
+
"class": "named_surface",
|
|
10550
|
+
"path": "contracts/fixtures/runtime-recipe/reject/unpinned-lockfile.json",
|
|
10551
|
+
"surface_entry": "contracts/fixtures/runtime-recipe/reject/unpinned-lockfile.json",
|
|
10552
|
+
"summary": "Regenerated with the new recipe input."
|
|
10553
|
+
},
|
|
10554
|
+
{
|
|
10555
|
+
"class": "hashed_surface",
|
|
10556
|
+
"path": "contracts/runtime-recipe.campaigns-os-node-v1.json",
|
|
10557
|
+
"surface_entry": "contracts/runtime-recipe.campaigns-os-node-v1.json",
|
|
10558
|
+
"summary": "Inputs gain campaign-spec/rules/package-currency-prices.ts."
|
|
10559
|
+
},
|
|
10560
|
+
{
|
|
10561
|
+
"class": "compatibility_policy",
|
|
10562
|
+
"path": "contracts/supported-surface.json",
|
|
10563
|
+
"surface_entry": "contracts/supported-surface.json",
|
|
10564
|
+
"summary": "surface_version 1.63.0 and refreshed hashes for both CampaignSpec schemas and the runtime recipe."
|
|
10565
|
+
},
|
|
10566
|
+
{
|
|
10567
|
+
"class": "named_surface",
|
|
10568
|
+
"path": "docs/local-setup.md",
|
|
10569
|
+
"surface_entry": "docs/local-setup.md",
|
|
10570
|
+
"summary": "Install pins @nextcommerce/campaigns-os@1.63.0."
|
|
10571
|
+
},
|
|
10572
|
+
{
|
|
10573
|
+
"class": "documentation",
|
|
10574
|
+
"path": "docs/orientation-contract-reference.md",
|
|
10575
|
+
"surface_entry": "docs/orientation-contract-reference.md",
|
|
10576
|
+
"summary": "Regenerated at supported surface 1.63.0."
|
|
10577
|
+
},
|
|
10578
|
+
{
|
|
10579
|
+
"class": "named_surface",
|
|
10580
|
+
"path": "docs/runtime-readiness.md",
|
|
10581
|
+
"surface_entry": "docs/runtime-readiness.md",
|
|
10582
|
+
"summary": "Regenerated at supported surface 1.63.0 with the new recipe input."
|
|
10583
|
+
},
|
|
10584
|
+
{
|
|
10585
|
+
"class": "named_surface",
|
|
10586
|
+
"path": "docs/skills-revision.md",
|
|
10587
|
+
"surface_entry": "docs/skills-revision.md",
|
|
10588
|
+
"summary": "Examples name bundle revision 1.63.0+skills.1."
|
|
10589
|
+
},
|
|
10590
|
+
{
|
|
10591
|
+
"class": "generated_runtime",
|
|
10592
|
+
"path": "package-lock.json",
|
|
10593
|
+
"surface_entry": null,
|
|
10594
|
+
"summary": "Version advances to 1.63.0."
|
|
10595
|
+
},
|
|
10596
|
+
{
|
|
10597
|
+
"class": "package_export",
|
|
10598
|
+
"path": "package.json",
|
|
10599
|
+
"surface_entry": null,
|
|
10600
|
+
"summary": "Version advances to 1.63.0."
|
|
10601
|
+
},
|
|
10602
|
+
{
|
|
10603
|
+
"class": "schema",
|
|
10604
|
+
"path": "schemas/campaign-spec.v4.schema.json",
|
|
10605
|
+
"surface_entry": "schemas/campaign-spec.v4.schema.json",
|
|
10606
|
+
"summary": "pagePackage.prices: an optional per-currency price list."
|
|
10607
|
+
},
|
|
10608
|
+
{
|
|
10609
|
+
"class": "schema",
|
|
10610
|
+
"path": "schemas/campaign-spec.v5.schema.json",
|
|
10611
|
+
"surface_entry": "schemas/campaign-spec.v5.schema.json",
|
|
10612
|
+
"summary": "pagePackage.prices: an optional per-currency price list."
|
|
10613
|
+
},
|
|
10614
|
+
{
|
|
10615
|
+
"class": "skill",
|
|
10616
|
+
"path": "skills.json",
|
|
10617
|
+
"surface_entry": "skills.json",
|
|
10618
|
+
"summary": "Advance bundle revision to 1.63.0+skills.1 and each skill version one patch."
|
|
10619
|
+
},
|
|
10620
|
+
{
|
|
10621
|
+
"class": "skill",
|
|
10622
|
+
"path": "skills/campaign-lifecycle-orientation/SKILL.md",
|
|
10623
|
+
"surface_entry": null,
|
|
10624
|
+
"summary": "Carry the advanced bundle revision and matching per-skill version."
|
|
10625
|
+
},
|
|
10626
|
+
{
|
|
10627
|
+
"class": "skill",
|
|
10628
|
+
"path": "skills/campaign-readback-classification/SKILL.md",
|
|
10629
|
+
"surface_entry": null,
|
|
10630
|
+
"summary": "Carry the advanced bundle revision and matching per-skill version."
|
|
10631
|
+
},
|
|
10632
|
+
{
|
|
10633
|
+
"class": "skill",
|
|
10634
|
+
"path": "skills/campaign-run-evidence/SKILL.md",
|
|
10635
|
+
"surface_entry": null,
|
|
10636
|
+
"summary": "Carry the advanced bundle revision and matching per-skill version."
|
|
10637
|
+
},
|
|
10638
|
+
{
|
|
10639
|
+
"class": "skill",
|
|
10640
|
+
"path": "skills/contribution-intake/SKILL.md",
|
|
10641
|
+
"surface_entry": null,
|
|
10642
|
+
"summary": "Carry the advanced bundle revision and matching per-skill version."
|
|
10643
|
+
},
|
|
10644
|
+
{
|
|
10645
|
+
"class": "skill",
|
|
10646
|
+
"path": "skills/next-campaigns-build/SKILL.md",
|
|
10647
|
+
"surface_entry": null,
|
|
10648
|
+
"summary": "Carry the advanced bundle revision and matching per-skill version."
|
|
10649
|
+
},
|
|
10650
|
+
{
|
|
10651
|
+
"class": "skill",
|
|
10652
|
+
"path": "skills/next-campaigns-os-setup/SKILL.md",
|
|
10653
|
+
"surface_entry": null,
|
|
10654
|
+
"summary": "Carry the advanced bundle revision and matching per-skill version."
|
|
10655
|
+
},
|
|
10656
|
+
{
|
|
10657
|
+
"class": "skill",
|
|
10658
|
+
"path": "skills/next-campaigns-os/SKILL.md",
|
|
10659
|
+
"surface_entry": null,
|
|
10660
|
+
"summary": "Carry the advanced bundle revision and matching per-skill version."
|
|
10661
|
+
},
|
|
10662
|
+
{
|
|
10663
|
+
"class": "skill",
|
|
10664
|
+
"path": "skills/next-campaigns-polish/SKILL.md",
|
|
10665
|
+
"surface_entry": null,
|
|
10666
|
+
"summary": "Carry the advanced bundle revision and matching per-skill version."
|
|
10667
|
+
},
|
|
10668
|
+
{
|
|
10669
|
+
"class": "skill",
|
|
10670
|
+
"path": "skills/next-campaigns-qa/SKILL.md",
|
|
10671
|
+
"surface_entry": null,
|
|
10672
|
+
"summary": "Carry the advanced bundle revision and matching per-skill version."
|
|
10673
|
+
},
|
|
10674
|
+
{
|
|
10675
|
+
"class": "skill",
|
|
10676
|
+
"path": "skills/next-campaigns-sdk-bump/SKILL.md",
|
|
10677
|
+
"surface_entry": null,
|
|
10678
|
+
"summary": "Carry the advanced bundle revision and matching per-skill version."
|
|
10679
|
+
}
|
|
10680
|
+
],
|
|
10681
|
+
"entry_sha256": "a5fe5aad03d3bf64be6fd7af32b8038867982fad1ee0c8a91a733eccdb46106b"
|
|
10421
10682
|
}
|
|
10422
10683
|
]
|
|
10423
10684
|
}
|
|
@@ -131,6 +131,7 @@
|
|
|
131
131
|
"campaign-spec/rules/index.ts",
|
|
132
132
|
"campaign-spec/rules/offer-ref-integrity.ts",
|
|
133
133
|
"campaign-spec/rules/one-checkout-per-path.ts",
|
|
134
|
+
"campaign-spec/rules/package-currency-prices.ts",
|
|
134
135
|
"campaign-spec/rules/package-pricing-sanity.ts",
|
|
135
136
|
"campaign-spec/rules/page-count.ts",
|
|
136
137
|
"campaign-spec/rules/page-id-uniqueness.ts",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"_note": "The downstream contract manifest. Everything listed here is SUPPORTED SURFACE: consumers (campaigns-agent, campaign-builder, the private ops repo, page-kit campaign repos) may depend on it, and changing it is a deliberate act — hashed entries require a surface_version bump in the same change (check-supported-surface.mjs --base, mirroring the skills.json bump gate), named entries must keep existing at their path, cli_commands must keep resolving in the CLI dispatch, package_exports must stay exported, and every entry must ship in the npm pack (files[] coverage). Anything NOT listed here — src/** internals, scripts/** checkers, examples/**, prompts/**, contracts/** other than this file and the entries named[] below (the orientation contract, the release ledger, and the consumer-facing orientation fixtures) — is implementation: consumers may read it for context but must not build on it, and it can change without notice. Rationale and the compatibility promise: docs/supported-surface.md.",
|
|
3
|
-
"surface_version": "1.
|
|
3
|
+
"surface_version": "1.63.0",
|
|
4
4
|
"package_exports": [
|
|
5
5
|
"./commercial-journey",
|
|
6
6
|
"./commercial-parity",
|
|
@@ -52,7 +52,7 @@
|
|
|
52
52
|
"sha256": "53269453dfdaac4b286124d445b60b0c46205dfbaf8037ac61b30254a32df53a"
|
|
53
53
|
},
|
|
54
54
|
"contracts/runtime-recipe.campaigns-os-node-v1.json": {
|
|
55
|
-
"sha256": "
|
|
55
|
+
"sha256": "4755be6c700463e99b609ceaebeb92cb1df5c54805aeaea3e6fd68e87ebcd6ef"
|
|
56
56
|
},
|
|
57
57
|
"schemas/campaign-build-brief.v1.schema.json": {
|
|
58
58
|
"sha256": "d524003184131398dc15fdb84385af1be0de0c69d6c5ede7278689a5b6101b81"
|
|
@@ -70,10 +70,10 @@
|
|
|
70
70
|
"sha256": "1e309c5dad8c5eeef26ef6fd3b6b90b72440c5104319a161002b17f1359fbd76"
|
|
71
71
|
},
|
|
72
72
|
"schemas/campaign-spec.v4.schema.json": {
|
|
73
|
-
"sha256": "
|
|
73
|
+
"sha256": "4e9a092c1426429b727aaa6ef5622ae2c6c6dad59270f08636987847b63f5001"
|
|
74
74
|
},
|
|
75
75
|
"schemas/campaign-spec.v5.schema.json": {
|
|
76
|
-
"sha256": "
|
|
76
|
+
"sha256": "24d04c8d3ede920de161fadf914dc497a3f61e126f377cb01dd0aeff12b53c4f"
|
|
77
77
|
},
|
|
78
78
|
"schemas/campaigns-os-legacy-migration-inventory.v0.schema.json": {
|
|
79
79
|
"sha256": "d6edc4572900d15fdaf6b8c59916b0d885303c1d398bdadeb7c58285522c9049"
|
|
@@ -116,6 +116,36 @@ Generator checklist:
|
|
|
116
116
|
These checks are the `CampaignCurrencies` validator rule, which
|
|
117
117
|
`campaigns-os doctor` runs with the rest of the spec rules.
|
|
118
118
|
|
|
119
|
+
A page package row can also carry its price in each currency, as `prices[]`:
|
|
120
|
+
|
|
121
|
+
```json
|
|
122
|
+
{
|
|
123
|
+
"ref_id": 101, "qty": 1, "price": "49.99", "price_retail": "79.99",
|
|
124
|
+
"prices": [
|
|
125
|
+
{ "currency": "USD", "price": "49.99", "price_retail": "79.99" },
|
|
126
|
+
{ "currency": "EUR", "price": "46.99", "price_retail": "74.99" }
|
|
127
|
+
]
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
- `price` and `price_retail` stay the default currency's. Each `prices[]`
|
|
132
|
+
entry has a `currency` code and a `price`, plus `price_retail` and, for a
|
|
133
|
+
subscription package, `price_recurring` when the Campaigns App has them.
|
|
134
|
+
- The values come from the Campaigns API read in each currency
|
|
135
|
+
(`GET /campaigns/?currency=EUR`). That read returns only the packages the
|
|
136
|
+
Campaigns App has a price for in that currency, so a package with no EUR
|
|
137
|
+
price is missing from the campaign for a shopper paying in EUR. Map Builder
|
|
138
|
+
fills `prices[]` when it refreshes from the API; set prices in the
|
|
139
|
+
Campaigns App, not in the spec. `campaigns-os spec derive` refreshes `price`
|
|
140
|
+
and `price_retail` from one default-currency read and leaves `prices[]` as
|
|
141
|
+
it was, so after changing a non-default price, refresh the Map in Map
|
|
142
|
+
Builder.
|
|
143
|
+
- `prices[]` is optional. A row without it says nothing about other
|
|
144
|
+
currencies and is not checked. A row with it should list every currency in
|
|
145
|
+
`available_currencies` and `campaign.currency`; the `PackageCurrencyPrices`
|
|
146
|
+
rule warns on a missing currency, a malformed entry and a currency listed
|
|
147
|
+
twice.
|
|
148
|
+
|
|
119
149
|
## Order Bump Notes
|
|
120
150
|
|
|
121
151
|
An order bump is still a checkout package/offer surface. It should be encoded as
|
package/docs/local-setup.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
For a new campaign, create an empty working folder and run this from it:
|
|
4
4
|
|
|
5
5
|
```sh
|
|
6
|
-
npm init -y && npm install --save-exact next-campaign-page-kit@0.3.0 && npm install --save-dev --save-exact @nextcommerce/campaigns-os@1.
|
|
6
|
+
npm init -y && npm install --save-exact next-campaign-page-kit@0.3.0 && npm install --save-dev --save-exact @nextcommerce/campaigns-os@1.63.0 && npx --no-install campaigns-os tooling setup --target . --platform claude
|
|
7
7
|
```
|
|
8
8
|
|
|
9
9
|
`npm init -y` gives the folder its own `package.json`. Without one, npm
|
|
@@ -26,7 +26,7 @@ Ledger schema id: `campaigns-os-release-ledger/v1`
|
|
|
26
26
|
Change policy version: `1.0.0`
|
|
27
27
|
Reason-code vocabulary version: `1.0.0`
|
|
28
28
|
Limits version: `1.0.0`
|
|
29
|
-
Supported surface at generation time: `1.
|
|
29
|
+
Supported surface at generation time: `1.63.0`
|
|
30
30
|
|
|
31
31
|
## Forward compatibility
|
|
32
32
|
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
|
|
9
9
|
How a checkout of this repository at one commit becomes a usable installed runtime, and how a consumer decides whether a prepared one is still trustworthy. Everything below is generated from `contracts/runtime-recipe.campaigns-os-node-v1.json`, which is the only authority for these values.
|
|
10
10
|
|
|
11
|
-
Recipe kind `campaigns-os-node-v1`, revision `1.0.3`, validated by `schemas/campaigns-os-runtime-recipe.v1.schema.json` (`Campaigns OS Runtime Recipe v1`). Supported surface at generation time: `1.
|
|
11
|
+
Recipe kind `campaigns-os-node-v1`, revision `1.0.3`, validated by `schemas/campaigns-os-runtime-recipe.v1.schema.json` (`Campaigns OS Runtime Recipe v1`). Supported surface at generation time: `1.63.0`.
|
|
12
12
|
|
|
13
13
|
## What this is
|
|
14
14
|
|
|
@@ -81,7 +81,7 @@ Not redundant with the install step. Because install runs with lifecycle scripts
|
|
|
81
81
|
|
|
82
82
|
The complete input set, enumerated explicitly rather than globbed. The compiler's configured include globs are NOT the input set: two root modules enter the compilation transitively through imports from the entry module and are emitted, so a fingerprint derived from the globs would cover 36 of the 38 compiled sources and miss one of the larger emitted surfaces. Test fixtures and the package's own tests are not inputs; nothing under them is emitted. A checker resolves the compiler's actual file list and asserts it equals this enumeration, so this list cannot rot silently.
|
|
83
83
|
|
|
84
|
-
Fingerprint algorithm `sha256`, over
|
|
84
|
+
Fingerprint algorithm `sha256`, over 51 enumerated files:
|
|
85
85
|
|
|
86
86
|
- `campaign-spec/analytics-vendors.ts`
|
|
87
87
|
- `campaign-spec/analytics-vocabulary.ts`
|
|
@@ -109,6 +109,7 @@ Fingerprint algorithm `sha256`, over 50 enumerated files:
|
|
|
109
109
|
- `campaign-spec/rules/index.ts`
|
|
110
110
|
- `campaign-spec/rules/offer-ref-integrity.ts`
|
|
111
111
|
- `campaign-spec/rules/one-checkout-per-path.ts`
|
|
112
|
+
- `campaign-spec/rules/package-currency-prices.ts`
|
|
112
113
|
- `campaign-spec/rules/package-pricing-sanity.ts`
|
|
113
114
|
- `campaign-spec/rules/page-count.ts`
|
|
114
115
|
- `campaign-spec/rules/page-id-uniqueness.ts`
|
|
@@ -140,7 +141,7 @@ The output directory is a build product. It is untracked and git-ignored, no com
|
|
|
140
141
|
|
|
141
142
|
Directory `campaign-spec/dist`. Committed: `false`. Type entry `campaign-spec/dist/index.d.ts`.
|
|
142
143
|
|
|
143
|
-
Expected inventory is derived, never listed twice. For every enumerated input under module_source_root whose path ends in .ts, the build is expected to emit campaign-spec/dist/<path relative to module_source_root, with .ts replaced> once per entry in emitted_extensions. The expected inventory is exactly that set: nothing missing, nothing extra. Emitted extensions: `.js`, `.d.ts`. At this revision that derivation yields
|
|
144
|
+
Expected inventory is derived, never listed twice. For every enumerated input under module_source_root whose path ends in .ts, the build is expected to emit campaign-spec/dist/<path relative to module_source_root, with .ts replaced> once per entry in emitted_extensions. The expected inventory is exactly that set: nothing missing, nothing extra. Emitted extensions: `.js`, `.d.ts`. At this revision that derivation yields 94 files.
|
|
144
145
|
|
|
145
146
|
### Mandatory checks
|
|
146
147
|
|
package/docs/skills-revision.md
CHANGED
|
@@ -16,7 +16,7 @@ that the copy on disk moved.
|
|
|
16
16
|
`skills.json` carries one top-level field:
|
|
17
17
|
|
|
18
18
|
```json
|
|
19
|
-
"bundle_revision": "1.
|
|
19
|
+
"bundle_revision": "1.63.0+skills.1"
|
|
20
20
|
```
|
|
21
21
|
|
|
22
22
|
The spelling is `<package version>+skills.<n>`:
|
|
@@ -25,7 +25,7 @@ The spelling is `<package version>+skills.<n>`:
|
|
|
25
25
|
skills ship with (`check-skill-versions.mjs` fails if the two disagree);
|
|
26
26
|
- `<n>` is a plain counter, not a semver component. It says "this is the *n*th
|
|
27
27
|
skill-text revision published against that package version" and it **resets
|
|
28
|
-
with the prefix**. `1.
|
|
28
|
+
with the prefix**. `1.63.0+skills.1` is therefore ahead of `1.40.0+skills.7`.
|
|
29
29
|
|
|
30
30
|
It is one identity for the bundle as a whole, on purpose. Per-skill versions
|
|
31
31
|
still exist and still gate per-skill changes, but an agent that loaded one skill
|
|
@@ -37,7 +37,7 @@ The first body line of every bundled `SKILL.md`, immediately after the
|
|
|
37
37
|
frontmatter, is exactly:
|
|
38
38
|
|
|
39
39
|
```
|
|
40
|
-
Bundle revision: 1.
|
|
40
|
+
Bundle revision: 1.63.0+skills.1
|
|
41
41
|
```
|
|
42
42
|
|
|
43
43
|
followed by a short paragraph telling the agent to run the check below at the
|
|
@@ -48,7 +48,7 @@ text the agent is actually reading, not from a file it would have to go and open
|
|
|
48
48
|
## The check
|
|
49
49
|
|
|
50
50
|
```bash
|
|
51
|
-
npx --no-install campaigns-os tooling status --skills-revision 1.
|
|
51
|
+
npx --no-install campaigns-os tooling status --skills-revision 1.63.0+skills.1
|
|
52
52
|
```
|
|
53
53
|
|
|
54
54
|
The value is compared against the bundle revision of the **CLI the command runs
|
|
@@ -90,20 +90,20 @@ reports the choice as `skills.scope` (`requested`, `installed_platforms`, or
|
|
|
90
90
|
"revision_check": "match",
|
|
91
91
|
"skills_revision": {
|
|
92
92
|
"status": "match",
|
|
93
|
-
"requested": "1.
|
|
93
|
+
"requested": "1.63.0+skills.1",
|
|
94
94
|
"spelling": "bundle",
|
|
95
|
-
"on_disk": "1.
|
|
95
|
+
"on_disk": "1.63.0+skills.1",
|
|
96
96
|
"on_disk_skill": null,
|
|
97
|
-
"message": "match (1.
|
|
97
|
+
"message": "match (1.63.0+skills.1)"
|
|
98
98
|
}
|
|
99
99
|
```
|
|
100
100
|
|
|
101
101
|
The text view prints one named line, as a header above the rest of the status:
|
|
102
102
|
|
|
103
103
|
```
|
|
104
|
-
Skills revision: match (1.
|
|
105
|
-
Skills revision: mismatch: loaded 1.39.0+skills.1, on disk 1.
|
|
106
|
-
Skills revision: unchecked (on disk 1.
|
|
104
|
+
Skills revision: match (1.63.0+skills.1)
|
|
105
|
+
Skills revision: mismatch: loaded 1.39.0+skills.1, on disk 1.63.0+skills.1 — start a fresh session
|
|
106
|
+
Skills revision: unchecked (on disk 1.63.0+skills.1)
|
|
107
107
|
```
|
|
108
108
|
|
|
109
109
|
`unchecked` is the state when the flag is absent. It is not an error — an
|
package/package.json
CHANGED
|
@@ -254,6 +254,21 @@
|
|
|
254
254
|
"name": { "type": ["string", "null"] },
|
|
255
255
|
"price": { "type": ["string", "number", "null"] },
|
|
256
256
|
"price_retail": { "type": ["string", "number", "null"] },
|
|
257
|
+
"prices": {
|
|
258
|
+
"type": ["array", "null"],
|
|
259
|
+
"description": "The package's price in each currency the Campaigns App prices it in, one entry per currency, read from the Campaigns API (GET /campaigns/?currency=<code>), which returns only the packages priced in the requested currency. price and price_retail stay the default currency's. Optional: a row without prices (absent or null) says nothing about other currencies. A row with prices should list every currency in campaign.available_currencies and campaign.currency; the PackageCurrencyPrices rule warns when one is missing, since the campaign leaves the package out in that currency.",
|
|
260
|
+
"items": {
|
|
261
|
+
"type": "object",
|
|
262
|
+
"additionalProperties": true,
|
|
263
|
+
"required": ["currency", "price"],
|
|
264
|
+
"properties": {
|
|
265
|
+
"currency": { "type": "string", "description": "Three-letter upper-case ISO 4217 code." },
|
|
266
|
+
"price": { "type": ["string", "number"] },
|
|
267
|
+
"price_retail": { "type": ["string", "number", "null"] },
|
|
268
|
+
"price_recurring": { "type": ["string", "number", "null"] }
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
},
|
|
257
272
|
"product_name": { "type": ["string", "null"] },
|
|
258
273
|
"product_sku": { "type": ["string", "null"] },
|
|
259
274
|
"product_variant_name": { "type": ["string", "null"] },
|
|
@@ -254,6 +254,21 @@
|
|
|
254
254
|
"name": { "type": ["string", "null"] },
|
|
255
255
|
"price": { "type": ["string", "number", "null"] },
|
|
256
256
|
"price_retail": { "type": ["string", "number", "null"] },
|
|
257
|
+
"prices": {
|
|
258
|
+
"type": ["array", "null"],
|
|
259
|
+
"description": "The package's price in each currency the Campaigns App prices it in, one entry per currency, read from the Campaigns API (GET /campaigns/?currency=<code>), which returns only the packages priced in the requested currency. price and price_retail stay the default currency's. Optional: a row without prices (absent or null) says nothing about other currencies. A row with prices should list every currency in campaign.available_currencies and campaign.currency; the PackageCurrencyPrices rule warns when one is missing, since the campaign leaves the package out in that currency.",
|
|
260
|
+
"items": {
|
|
261
|
+
"type": "object",
|
|
262
|
+
"additionalProperties": true,
|
|
263
|
+
"required": ["currency", "price"],
|
|
264
|
+
"properties": {
|
|
265
|
+
"currency": { "type": "string", "description": "Three-letter upper-case ISO 4217 code." },
|
|
266
|
+
"price": { "type": ["string", "number"] },
|
|
267
|
+
"price_retail": { "type": ["string", "number", "null"] },
|
|
268
|
+
"price_recurring": { "type": ["string", "number", "null"] }
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
},
|
|
257
272
|
"product_name": { "type": ["string", "null"] },
|
|
258
273
|
"product_sku": { "type": ["string", "null"] },
|
|
259
274
|
"product_variant_name": { "type": ["string", "null"] },
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: campaign-lifecycle-orientation
|
|
3
|
-
version: 1.0.
|
|
3
|
+
version: 1.0.49
|
|
4
4
|
description: Orient a reader to the Campaigns OS lifecycle artifacts a run has already emitted, without advancing any stage or changing any state.
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
Bundle revision: 1.
|
|
8
|
-
Run `npx --no-install campaigns-os tooling status --skills-revision 1.
|
|
7
|
+
Bundle revision: 1.63.0+skills.1
|
|
8
|
+
Run `npx --no-install campaigns-os tooling status --skills-revision 1.63.0+skills.1`
|
|
9
9
|
from the campaign's Page Kit folder, where it runs the project's pinned copy and
|
|
10
10
|
never installs one, at the start of each task. Start a fresh session if it
|
|
11
11
|
reports `mismatch`: this text is already in your context and is never re-read
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: campaign-readback-classification
|
|
3
|
-
version: 1.0.
|
|
3
|
+
version: 1.0.49
|
|
4
4
|
description: Classify a selected campaign from the readback projection's v2 fields and write a read-only handoff without turning diagnosis into permission.
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
Bundle revision: 1.
|
|
8
|
-
Run `npx --no-install campaigns-os tooling status --skills-revision 1.
|
|
7
|
+
Bundle revision: 1.63.0+skills.1
|
|
8
|
+
Run `npx --no-install campaigns-os tooling status --skills-revision 1.63.0+skills.1`
|
|
9
9
|
from the campaign's Page Kit folder, where it runs the project's pinned copy and
|
|
10
10
|
never installs one, at the start of each task. Start a fresh session if it
|
|
11
11
|
reports `mismatch`: this text is already in your context and is never re-read
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: campaign-run-evidence
|
|
3
|
-
version: 1.0.
|
|
3
|
+
version: 1.0.49
|
|
4
4
|
description: Interpret existing Campaigns OS doctor, QA and proof-depth evidence without claiming more proof than the artifacts contain.
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
Bundle revision: 1.
|
|
8
|
-
Run `npx --no-install campaigns-os tooling status --skills-revision 1.
|
|
7
|
+
Bundle revision: 1.63.0+skills.1
|
|
8
|
+
Run `npx --no-install campaigns-os tooling status --skills-revision 1.63.0+skills.1`
|
|
9
9
|
from the campaign's Page Kit folder, where it runs the project's pinned copy and
|
|
10
10
|
never installs one, at the start of each task. Start a fresh session if it
|
|
11
11
|
reports `mismatch`: this text is already in your context and is never re-read
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: contribution-intake
|
|
3
|
-
version: 1.0.
|
|
3
|
+
version: 1.0.49
|
|
4
4
|
description: Turn a suggestion about the agent surface into a classified, evidence-checked proposal and, only with attended approval, one issue on this repository's tracker.
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
Bundle revision: 1.
|
|
8
|
-
Run `npx --no-install campaigns-os tooling status --skills-revision 1.
|
|
7
|
+
Bundle revision: 1.63.0+skills.1
|
|
8
|
+
Run `npx --no-install campaigns-os tooling status --skills-revision 1.63.0+skills.1`
|
|
9
9
|
from the campaign's Page Kit folder, where it runs the project's pinned copy and
|
|
10
10
|
never installs one, at the start of each task. Start a fresh session if it
|
|
11
11
|
reports `mismatch`: this text is already in your context and is never re-read
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: next-campaigns-build
|
|
3
|
-
version: 1.0.
|
|
3
|
+
version: 1.0.54
|
|
4
4
|
description: Assemble a NEXT campaign from a doctor-cleared Build Packet, CampaignSpec/API values, prepared HTML/assets, page-kit, and starter-template contracts.
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
Bundle revision: 1.
|
|
8
|
-
Run `npx --no-install campaigns-os tooling status --skills-revision 1.
|
|
7
|
+
Bundle revision: 1.63.0+skills.1
|
|
8
|
+
Run `npx --no-install campaigns-os tooling status --skills-revision 1.63.0+skills.1`
|
|
9
9
|
from the campaign's Page Kit folder, where it runs the project's pinned copy and
|
|
10
10
|
never installs one, at the start of each task. Start a fresh session if it
|
|
11
11
|
reports `mismatch`: this text is already in your context and is never re-read
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: next-campaigns-os
|
|
3
|
-
version: 1.0.
|
|
3
|
+
version: 1.0.69
|
|
4
4
|
description: Coordinate Campaigns OS lifecycle workflows from CampaignSpec, Build Packet, starter-template contracts, stage reports, deploy evidence, and QA proof depth.
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
Bundle revision: 1.
|
|
8
|
-
Run `npx --no-install campaigns-os tooling status --skills-revision 1.
|
|
7
|
+
Bundle revision: 1.63.0+skills.1
|
|
8
|
+
Run `npx --no-install campaigns-os tooling status --skills-revision 1.63.0+skills.1`
|
|
9
9
|
from the campaign's Page Kit folder, where it runs the project's pinned copy and
|
|
10
10
|
never installs one, at the start of each task. Start a fresh session if it
|
|
11
11
|
reports `mismatch`: this text is already in your context and is never re-read
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: next-campaigns-os-setup
|
|
3
|
-
version: 2.0.
|
|
3
|
+
version: 2.0.52
|
|
4
4
|
description: Bootstrap or prepare a target page-kit campaign repo from a doctor-cleared Campaigns OS Build Packet before full build wiring. Formerly installed as next-campaigns-setup; renamed 2026-08 to stop colliding with the published NextCommerceCo/skills scaffolder of that name.
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
Bundle revision: 1.
|
|
8
|
-
Run `npx --no-install campaigns-os tooling status --skills-revision 1.
|
|
7
|
+
Bundle revision: 1.63.0+skills.1
|
|
8
|
+
Run `npx --no-install campaigns-os tooling status --skills-revision 1.63.0+skills.1`
|
|
9
9
|
from the campaign's Page Kit folder, where it runs the project's pinned copy and
|
|
10
10
|
never installs one, at the start of each task. Start a fresh session if it
|
|
11
11
|
reports `mismatch`: this text is already in your context and is never re-read
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: next-campaigns-polish
|
|
3
|
-
version: 1.1.
|
|
3
|
+
version: 1.1.54
|
|
4
4
|
description: Run the visual/runtime polish pass after build and before QA for a Campaigns OS campaign.
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
Bundle revision: 1.
|
|
8
|
-
Run `npx --no-install campaigns-os tooling status --skills-revision 1.
|
|
7
|
+
Bundle revision: 1.63.0+skills.1
|
|
8
|
+
Run `npx --no-install campaigns-os tooling status --skills-revision 1.63.0+skills.1`
|
|
9
9
|
from the campaign's Page Kit folder, where it runs the project's pinned copy and
|
|
10
10
|
never installs one, at the start of each task. Start a fresh session if it
|
|
11
11
|
reports `mismatch`: this text is already in your context and is never re-read
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: next-campaigns-qa
|
|
3
|
-
version: 1.3.
|
|
3
|
+
version: 1.3.53
|
|
4
4
|
description: Run spec-aware QA from a saved Map or local-spec Build Packet and tested campaign URL after build, polish, and deploy/local evidence exist, including Playwright typed-card test-order proof.
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
Bundle revision: 1.
|
|
8
|
-
Run `npx --no-install campaigns-os tooling status --skills-revision 1.
|
|
7
|
+
Bundle revision: 1.63.0+skills.1
|
|
8
|
+
Run `npx --no-install campaigns-os tooling status --skills-revision 1.63.0+skills.1`
|
|
9
9
|
from the campaign's Page Kit folder, where it runs the project's pinned copy and
|
|
10
10
|
never installs one, at the start of each task. Start a fresh session if it
|
|
11
11
|
reports `mismatch`: this text is already in your context and is never re-read
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: next-campaigns-sdk-bump
|
|
3
|
-
version: 1.0.
|
|
3
|
+
version: 1.0.9
|
|
4
4
|
description: Bump a live campaign's Campaign Cart SDK from one 0.4.x release to a later 0.4.x on a page-kit or static repo. Use for any request to bump, upgrade or move a campaign to SDK 0.4.x, including when the repository has its own BUMP.md. Find every pin, check the release diff and storage against the campaign's own code, prove on a preview with approved test orders, and report what is not proven.
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
Bundle revision: 1.
|
|
8
|
-
Run `npx --no-install campaigns-os tooling status --skills-revision 1.
|
|
7
|
+
Bundle revision: 1.63.0+skills.1
|
|
8
|
+
Run `npx --no-install campaigns-os tooling status --skills-revision 1.63.0+skills.1`
|
|
9
9
|
from the campaign's Page Kit folder, where it runs the project's pinned copy and
|
|
10
10
|
never installs one, at the start of each task. Start a fresh session if it
|
|
11
11
|
reports `mismatch`: this text is already in your context and is never re-read
|
package/skills.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "campaigns-os-skills",
|
|
3
3
|
"description": "Skills bundled with Campaigns OS. `skills.sh` installs these into the shared agent skill directories (~/.claude/skills, ~/.codex/skills), so each one is a versioned package: bump the version whenever a package changes. `bundle_revision` identifies the bundle as a whole — `<package version>+skills.<n>`, where the prefix is this package's version and `<n>` counts the skill-text revisions published against it. It advances whenever ANY bundled skill changes, every SKILL.md states it on its first body line, and `campaigns-os tooling status --skills-revision <value>` compares the value an agent read from a skill against the bundle on disk. See docs/skills-revision.md.",
|
|
4
|
-
"bundle_revision": "1.
|
|
4
|
+
"bundle_revision": "1.63.0+skills.1",
|
|
5
5
|
"homepage": "https://github.com/NextCommerceCo/campaigns-os",
|
|
6
6
|
"retired_skills": [
|
|
7
7
|
{
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
{
|
|
17
17
|
"id": "next-campaigns-os",
|
|
18
18
|
"name": "Campaigns OS Lifecycle",
|
|
19
|
-
"version": "1.0.
|
|
19
|
+
"version": "1.0.69",
|
|
20
20
|
"path": "skills/next-campaigns-os/SKILL.md",
|
|
21
21
|
"domain": "campaigns",
|
|
22
22
|
"description": "Coordinate Campaigns OS lifecycle workflows from CampaignSpec, Build Packet, starter-template contracts, stage reports, deploy evidence, and QA proof depth."
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
{
|
|
25
25
|
"id": "next-campaigns-os-setup",
|
|
26
26
|
"name": "Campaigns OS Setup",
|
|
27
|
-
"version": "2.0.
|
|
27
|
+
"version": "2.0.52",
|
|
28
28
|
"path": "skills/next-campaigns-os-setup/SKILL.md",
|
|
29
29
|
"domain": "campaigns",
|
|
30
30
|
"description": "Bootstrap or prepare a target page-kit campaign repo from a doctor-cleared Campaigns OS Build Packet before full build wiring. Formerly next-campaigns-setup; renamed to release that name to the published NextCommerceCo/skills scaffolder."
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
{
|
|
33
33
|
"id": "next-campaigns-build",
|
|
34
34
|
"name": "Campaign Build",
|
|
35
|
-
"version": "1.0.
|
|
35
|
+
"version": "1.0.54",
|
|
36
36
|
"path": "skills/next-campaigns-build/SKILL.md",
|
|
37
37
|
"domain": "campaigns",
|
|
38
38
|
"description": "Assemble a NEXT campaign from a doctor-cleared Build Packet, CampaignSpec/API values, prepared HTML/assets, page-kit, and starter-template contracts."
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
{
|
|
41
41
|
"id": "next-campaigns-polish",
|
|
42
42
|
"name": "Campaign Polish",
|
|
43
|
-
"version": "1.1.
|
|
43
|
+
"version": "1.1.54",
|
|
44
44
|
"path": "skills/next-campaigns-polish/SKILL.md",
|
|
45
45
|
"domain": "campaigns",
|
|
46
46
|
"description": "Run the visual/runtime polish pass after build and before QA for a Campaigns OS campaign."
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
{
|
|
49
49
|
"id": "next-campaigns-qa",
|
|
50
50
|
"name": "Campaign QA",
|
|
51
|
-
"version": "1.3.
|
|
51
|
+
"version": "1.3.53",
|
|
52
52
|
"path": "skills/next-campaigns-qa/SKILL.md",
|
|
53
53
|
"domain": "campaigns",
|
|
54
54
|
"description": "Run spec-aware QA from a saved Map or local-spec Build Packet and tested campaign URL after build, polish, and deploy/local evidence exist, including Playwright typed-card test-order proof."
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
{
|
|
57
57
|
"id": "campaign-lifecycle-orientation",
|
|
58
58
|
"name": "Campaign Lifecycle Orientation",
|
|
59
|
-
"version": "1.0.
|
|
59
|
+
"version": "1.0.49",
|
|
60
60
|
"path": "skills/campaign-lifecycle-orientation/SKILL.md",
|
|
61
61
|
"domain": "campaigns",
|
|
62
62
|
"description": "Orient a reader to the Campaigns OS lifecycle artifacts a run has already emitted, without advancing their state: the shared vocabulary, doctor as a gate, the stage record, and the store-theme/Page Kit two-worlds trap."
|
|
@@ -64,7 +64,7 @@
|
|
|
64
64
|
{
|
|
65
65
|
"id": "campaign-run-evidence",
|
|
66
66
|
"name": "Campaign Run Evidence",
|
|
67
|
-
"version": "1.0.
|
|
67
|
+
"version": "1.0.49",
|
|
68
68
|
"path": "skills/campaign-run-evidence/SKILL.md",
|
|
69
69
|
"domain": "campaigns",
|
|
70
70
|
"description": "Interpret existing doctor, QA verdict and proof-depth evidence without claiming more proof than the artifacts contain, and keep funnel proof apart from merchant launch readiness."
|
|
@@ -72,7 +72,7 @@
|
|
|
72
72
|
{
|
|
73
73
|
"id": "campaign-readback-classification",
|
|
74
74
|
"name": "Campaign Readback Classification",
|
|
75
|
-
"version": "1.0.
|
|
75
|
+
"version": "1.0.49",
|
|
76
76
|
"path": "skills/campaign-readback-classification/SKILL.md",
|
|
77
77
|
"domain": "campaigns",
|
|
78
78
|
"description": "Classify a selected campaign from the campaigns-os-readback/v2 fields (artifacts, staleness.stale_keys, clean, doctor, divergences, skip_cascades) and write a read-only handoff without turning diagnosis into permission."
|
|
@@ -80,7 +80,7 @@
|
|
|
80
80
|
{
|
|
81
81
|
"id": "contribution-intake",
|
|
82
82
|
"name": "Contribution Intake",
|
|
83
|
-
"version": "1.0.
|
|
83
|
+
"version": "1.0.49",
|
|
84
84
|
"path": "skills/contribution-intake/SKILL.md",
|
|
85
85
|
"domain": "campaigns",
|
|
86
86
|
"description": "Turn a suggestion about the agent surface into a classified, evidence-checked and redacted proposal, filed on this repository tracker only with attended approval."
|
|
@@ -88,7 +88,7 @@
|
|
|
88
88
|
{
|
|
89
89
|
"id": "next-campaigns-sdk-bump",
|
|
90
90
|
"name": "Campaign SDK Bump",
|
|
91
|
-
"version": "1.0.
|
|
91
|
+
"version": "1.0.9",
|
|
92
92
|
"path": "skills/next-campaigns-sdk-bump/SKILL.md",
|
|
93
93
|
"domain": "campaigns",
|
|
94
94
|
"description": "Bump a live campaign from one Campaign Cart 0.4.x release to a later 0.4.x on a page-kit or static repo: find every pin, check the release diff and storage against the campaign code, prove on a preview with approved test orders, and report what is not proven."
|