@bettercms-ai/kit 2.0.0-next.8 → 2.0.1

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.
@@ -39,7 +39,16 @@ var exclusions = [
39
39
  "pattern": "^/fields/\\d+/name ",
40
40
  "key": "layout",
41
41
  "reason": "A model's top-level field named `layout` (rich-blog-post, journalStory) collides with the API's address prefix (KEY_RESERVED): the key is stored as `layoutField`. Below the top level `layout` and `page` are kept (019141ffc).",
42
- "signedBy": "pending-owner"
42
+ "signedBy": "owner 2026-10-24"
43
+ },
44
+ {
45
+ "id": "block-shaped-model-layout-key",
46
+ "plane": "schema",
47
+ "feature": "reserved name",
48
+ "pattern": "^/fields/\\d+/of/\\d+/fields/\\d+/name ",
49
+ "key": "layout",
50
+ "reason": "A modular item type's own top-level field named `layout` (polymorphic-modules galleryModule), when the item type is a model whose v2.shape is \"block\" (a field no block primitive renders keeps it one): such a model can hold entries, so the key stays KEY_RESERVED (bc9ba34a3) and is stored as `layoutField`. On a kind \"block\" model it is kept.",
51
+ "signedBy": "owner 2026-10-24"
43
52
  }
44
53
  ];
45
54
  var equivalences = [
@@ -1 +1 @@
1
- {"version":3,"file":"exclusions.v1.js","names":[],"sources":["../../ledgers/exclusions.v1.json"],"sourcesContent":["{\n \"about\": \"What the V2 → prod mapping does not carry, and why that is no loss. `exclusions`: owner-signed losses (kit-facet-table.v3.md: row 12, row 9's Shopify subset, and B's two 'CATALOG not hit' rules); nothing goes here unsigned. `equivalences`: representation moves, where prod holds the same fact elsewhere; each names the recovery its proof checks (the dashboard's kitCorpusDock gate). A lost key the gate finds must match an exclusion or a proven equivalence, or it is a gap.\",\n \"version\": 1,\n \"exclusions\": [\n {\n \"id\": \"shopify-reference\",\n \"plane\": \"schema\",\n \"feature\": \"shopify reference\",\n \"reason\": \"A Shopify product reference: prod has no Shopify integration behind a reference yet (deferred:shopify); the backend refuses the target by name (reference_target_unsupported).\",\n \"signedBy\": \"owner, G0a (kit-facet-table.v3.md row 12)\"\n },\n {\n \"id\": \"reference-target-shopify\",\n \"plane\": \"schema\",\n \"feature\": \"reference target\",\n \"pattern\": \"shopify\",\n \"reason\": \"The Shopify subset of reference targets on any reference field (row 9): the rest of reference targets are stored natively (config.targets).\",\n \"signedBy\": \"owner, G0a (kit-facet-table.v3.md row 9)\"\n },\n {\n \"id\": \"reference_in_definition\",\n \"plane\": \"schema\",\n \"feature\": \"seeded instance\",\n \"key\": \"reference_in_definition\",\n \"reason\": \"A seeded instance's reference value in a component definition: deliberate backend rule; a definition names no entry, the placement does.\",\n \"signedBy\": \"owner (kit-facet-table.v3.md B, 'CATALOG not hit')\"\n },\n {\n \"id\": \"unique_prop_scope\",\n \"plane\": \"schema\",\n \"feature\": \"not applicable (props)\",\n \"key\": \"unique_prop_scope\",\n \"reason\": \"A uniqueness rule scoped to a component prop: deliberate backend rule; uniqueness is a collection's, not a placement's.\",\n \"signedBy\": \"owner (kit-facet-table.v3.md B, 'CATALOG not hit')\"\n },\n {\n \"id\": \"top-level-layout-key\",\n \"plane\": \"schema\",\n \"feature\": \"reserved name\",\n \"pattern\": \"^/fields/\\\\d+/name \",\n \"key\": \"layout\",\n \"reason\": \"A model's top-level field named `layout` (rich-blog-post, journalStory) collides with the API's address prefix (KEY_RESERVED): the key is stored as `layoutField`. Below the top level `layout` and `page` are kept (019141ffc).\",\n \"signedBy\": \"pending-owner\"\n }\n ],\n \"equivalences\": [\n {\n \"id\": \"variant\",\n \"plane\": \"value\",\n \"key\": \"_variant\",\n \"moves\": \"V2's block variant is the component itself in prod: one component per variant sharing a sectionType; a slot child names its variant's component in _type.\",\n \"recovery\": \"_variant is recovered from the component id: the family member the placement names is the V2 variant.\"\n },\n {\n \"id\": \"global\",\n \"plane\": \"value\",\n \"key\": \"_ref | _overrides\",\n \"moves\": \"A global block instance's reference and override map are the placement itself in prod (componentId + overrides), not props.\",\n \"recovery\": \"_ref / _overrides resolve to the placement value: the placement's component and its overrides are V2's _ref and _overrides.\"\n },\n {\n \"id\": \"asset\",\n \"plane\": \"value\",\n \"key\": \"image width | height\",\n \"moves\": \"An image's pixel size is kept on the media asset, never in the value (values.ts imageToProd).\",\n \"recovery\": \"width / height read back from the media asset (the kit's image control reads them through useMediaAsset).\"\n },\n {\n \"id\": \"zone\",\n \"plane\": \"value\",\n \"key\": \"datetime [Zone]\",\n \"moves\": \"A datetime on a field with no fixed zone is stored as the instant and its offset; V2's date control writes a [Zone] only for a fixed-zone field.\",\n \"recovery\": \"A datetime without a zone round-trips to the same instant, displayed in the site time zone (the stated display rule).\"\n },\n {\n \"id\": \"rel\",\n \"plane\": \"value\",\n \"key\": \"rel follow\",\n \"moves\": \"\\\"follow\\\" is no rel: the backend's rel list is nofollow, sponsored and ugc.\",\n \"recovery\": \"\\\"follow\\\" ⇔ no rel: the link and button controls show an unset rel as Do-follow and never write it.\"\n },\n {\n \"id\": \"item-open-mode\",\n \"plane\": \"schema\",\n \"feature\": \"item openMode\",\n \"key\": \"of[0].openMode\",\n \"moves\": \"A list of object items opens as the LIST says: prod keeps one openMode per list (the array field's, a table prop's), and V2's engine reads only that one.\",\n \"recovery\": \"V2 itemOpenMode(list) = list.openMode ?? (one small object item ? inline : drill); the item's own openMode never contributes, so the stored list openMode yields the same mode.\",\n \"proof\": \"bettercms-v2-demo-himanshu/src/components/kit/lib/schema.ts:42-46 (itemOpenMode)\",\n \"ruledBy\": \"bettercms-ff 2026-10-24 (G-REMAIN B1)\"\n },\n {\n \"id\": \"variant-group\",\n \"plane\": \"schema\",\n \"feature\": \"variants\",\n \"key\": \"variants\",\n \"moves\": \"A block's variants on the component side are its variant family: one component per V2 variant (sectionType = the block's title, name = the variant's, slug = the block's slug + '-' + the variant id) and a component_variant_groups row whose v2.variants lists the members in order with their description.\",\n \"recovery\": \"variantFamilyToTypeSchema: the group's members in v2.variants order; each variant's id is the member slug after the group slug, its name the member's name, its description the meta's.\",\n \"proof\": \"kit-roundtrip.test.ts props lane: each member through componentSchemas.create, the group's v2 through variantGroupV2Schema, read back in the stored order\",\n \"carriedBy\": \"variantFamilyFromTypeSchema\",\n \"ruledBy\": \"bettercms-ff 2026-10-24 (3c); bettercms-72 2026-10-24 (planner in the kit)\"\n },\n {\n \"id\": \"fieldset-derived\",\n \"plane\": \"schema\",\n \"feature\": \"fieldset (derived)\",\n \"key\": \"fieldset\",\n \"moves\": \"A field naming a fieldset the schema does not declare sits in a section of that name: a model section (kind group) or a prop group, which the read side declares.\",\n \"recovery\": \"The read declares the fieldset { name, title: name }, which is what V2's engine draws for an undeclared one.\",\n \"proof\": \"bettercms-v2-demo-himanshu/src/components/kit/engine/field-list.tsx (arrange: an undeclared fieldset is a section titled by its name)\",\n \"ruledBy\": \"bettercms-72 2026-10-24 (B3)\"\n },\n {\n \"id\": \"item-noun-derived\",\n \"plane\": \"schema\",\n \"feature\": \"itemNoun (derived)\",\n \"key\": \"itemNoun\",\n \"moves\": \"A list with no itemNoun keeps its item title in ui.itemLabel, and the read names the noun from it.\",\n \"recovery\": \"V2 itemNoun(list) falls back to the item title, the same noun the read side names.\",\n \"proof\": \"bettercms-v2-demo-himanshu/src/components/kit/lib/schema.ts (itemNoun: the item title when the list declares none)\",\n \"ruledBy\": \"bettercms-72 2026-10-24 (B3)\"\n }\n ]\n}\n"],"mappings":""}
1
+ {"version":3,"file":"exclusions.v1.js","names":[],"sources":["../../ledgers/exclusions.v1.json"],"sourcesContent":["{\n \"about\": \"What the V2 → prod mapping does not carry, and why that is no loss. `exclusions`: owner-signed losses (kit-facet-table.v3.md: row 12, row 9's Shopify subset, and B's two 'CATALOG not hit' rules); nothing goes here unsigned. `equivalences`: representation moves, where prod holds the same fact elsewhere; each names the recovery its proof checks (the dashboard's kitCorpusDock gate). A lost key the gate finds must match an exclusion or a proven equivalence, or it is a gap.\",\n \"version\": 1,\n \"exclusions\": [\n {\n \"id\": \"shopify-reference\",\n \"plane\": \"schema\",\n \"feature\": \"shopify reference\",\n \"reason\": \"A Shopify product reference: prod has no Shopify integration behind a reference yet (deferred:shopify); the backend refuses the target by name (reference_target_unsupported).\",\n \"signedBy\": \"owner, G0a (kit-facet-table.v3.md row 12)\"\n },\n {\n \"id\": \"reference-target-shopify\",\n \"plane\": \"schema\",\n \"feature\": \"reference target\",\n \"pattern\": \"shopify\",\n \"reason\": \"The Shopify subset of reference targets on any reference field (row 9): the rest of reference targets are stored natively (config.targets).\",\n \"signedBy\": \"owner, G0a (kit-facet-table.v3.md row 9)\"\n },\n {\n \"id\": \"reference_in_definition\",\n \"plane\": \"schema\",\n \"feature\": \"seeded instance\",\n \"key\": \"reference_in_definition\",\n \"reason\": \"A seeded instance's reference value in a component definition: deliberate backend rule; a definition names no entry, the placement does.\",\n \"signedBy\": \"owner (kit-facet-table.v3.md B, 'CATALOG not hit')\"\n },\n {\n \"id\": \"unique_prop_scope\",\n \"plane\": \"schema\",\n \"feature\": \"not applicable (props)\",\n \"key\": \"unique_prop_scope\",\n \"reason\": \"A uniqueness rule scoped to a component prop: deliberate backend rule; uniqueness is a collection's, not a placement's.\",\n \"signedBy\": \"owner (kit-facet-table.v3.md B, 'CATALOG not hit')\"\n },\n {\n \"id\": \"top-level-layout-key\",\n \"plane\": \"schema\",\n \"feature\": \"reserved name\",\n \"pattern\": \"^/fields/\\\\d+/name \",\n \"key\": \"layout\",\n \"reason\": \"A model's top-level field named `layout` (rich-blog-post, journalStory) collides with the API's address prefix (KEY_RESERVED): the key is stored as `layoutField`. Below the top level `layout` and `page` are kept (019141ffc).\",\n \"signedBy\": \"owner 2026-10-24\"\n },\n {\n \"id\": \"block-shaped-model-layout-key\",\n \"plane\": \"schema\",\n \"feature\": \"reserved name\",\n \"pattern\": \"^/fields/\\\\d+/of/\\\\d+/fields/\\\\d+/name \",\n \"key\": \"layout\",\n \"reason\": \"A modular item type's own top-level field named `layout` (polymorphic-modules galleryModule), when the item type is a model whose v2.shape is \\\"block\\\" (a field no block primitive renders keeps it one): such a model can hold entries, so the key stays KEY_RESERVED (bc9ba34a3) and is stored as `layoutField`. On a kind \\\"block\\\" model it is kept.\",\n \"signedBy\": \"owner 2026-10-24\"\n }\n ],\n \"equivalences\": [\n {\n \"id\": \"variant\",\n \"plane\": \"value\",\n \"key\": \"_variant\",\n \"moves\": \"V2's block variant is the component itself in prod: one component per variant sharing a sectionType; a slot child names its variant's component in _type.\",\n \"recovery\": \"_variant is recovered from the component id: the family member the placement names is the V2 variant.\"\n },\n {\n \"id\": \"global\",\n \"plane\": \"value\",\n \"key\": \"_ref | _overrides\",\n \"moves\": \"A global block instance's reference and override map are the placement itself in prod (componentId + overrides), not props.\",\n \"recovery\": \"_ref / _overrides resolve to the placement value: the placement's component and its overrides are V2's _ref and _overrides.\"\n },\n {\n \"id\": \"asset\",\n \"plane\": \"value\",\n \"key\": \"image width | height\",\n \"moves\": \"An image's pixel size is kept on the media asset, never in the value (values.ts imageToProd).\",\n \"recovery\": \"width / height read back from the media asset (the kit's image control reads them through useMediaAsset).\"\n },\n {\n \"id\": \"zone\",\n \"plane\": \"value\",\n \"key\": \"datetime [Zone]\",\n \"moves\": \"A datetime on a field with no fixed zone is stored as the instant and its offset; V2's date control writes a [Zone] only for a fixed-zone field.\",\n \"recovery\": \"A datetime without a zone round-trips to the same instant, displayed in the site time zone (the stated display rule).\"\n },\n {\n \"id\": \"rel\",\n \"plane\": \"value\",\n \"key\": \"rel follow\",\n \"moves\": \"\\\"follow\\\" is no rel: the backend's rel list is nofollow, sponsored and ugc.\",\n \"recovery\": \"\\\"follow\\\" ⇔ no rel: the link and button controls show an unset rel as Do-follow and never write it.\"\n },\n {\n \"id\": \"item-open-mode\",\n \"plane\": \"schema\",\n \"feature\": \"item openMode\",\n \"key\": \"of[0].openMode\",\n \"moves\": \"A list of object items opens as the LIST says: prod keeps one openMode per list (the array field's, a table prop's), and V2's engine reads only that one.\",\n \"recovery\": \"V2 itemOpenMode(list) = list.openMode ?? (one small object item ? inline : drill); the item's own openMode never contributes, so the stored list openMode yields the same mode.\",\n \"proof\": \"bettercms-v2-demo-himanshu/src/components/kit/lib/schema.ts:42-46 (itemOpenMode)\",\n \"ruledBy\": \"bettercms-ff 2026-10-24 (G-REMAIN B1)\"\n },\n {\n \"id\": \"variant-group\",\n \"plane\": \"schema\",\n \"feature\": \"variants\",\n \"key\": \"variants\",\n \"moves\": \"A block's variants on the component side are its variant family: one component per V2 variant (sectionType = the block's title, name = the variant's, slug = the block's slug + '-' + the variant id) and a component_variant_groups row whose v2.variants lists the members in order with their description.\",\n \"recovery\": \"variantFamilyToTypeSchema: the group's members in v2.variants order; each variant's id is the member slug after the group slug, its name the member's name, its description the meta's.\",\n \"proof\": \"kit-roundtrip.test.ts props lane: each member through componentSchemas.create, the group's v2 through variantGroupV2Schema, read back in the stored order\",\n \"carriedBy\": \"variantFamilyFromTypeSchema\",\n \"ruledBy\": \"bettercms-ff 2026-10-24 (3c); bettercms-72 2026-10-24 (planner in the kit)\"\n },\n {\n \"id\": \"fieldset-derived\",\n \"plane\": \"schema\",\n \"feature\": \"fieldset (derived)\",\n \"key\": \"fieldset\",\n \"moves\": \"A field naming a fieldset the schema does not declare sits in a section of that name: a model section (kind group) or a prop group, which the read side declares.\",\n \"recovery\": \"The read declares the fieldset { name, title: name }, which is what V2's engine draws for an undeclared one.\",\n \"proof\": \"bettercms-v2-demo-himanshu/src/components/kit/engine/field-list.tsx (arrange: an undeclared fieldset is a section titled by its name)\",\n \"ruledBy\": \"bettercms-72 2026-10-24 (B3)\"\n },\n {\n \"id\": \"item-noun-derived\",\n \"plane\": \"schema\",\n \"feature\": \"itemNoun (derived)\",\n \"key\": \"itemNoun\",\n \"moves\": \"A list with no itemNoun keeps its item title in ui.itemLabel, and the read names the noun from it.\",\n \"recovery\": \"V2 itemNoun(list) falls back to the item title, the same noun the read side names.\",\n \"proof\": \"bettercms-v2-demo-himanshu/src/components/kit/lib/schema.ts (itemNoun: the item title when the list declares none)\",\n \"ruledBy\": \"bettercms-72 2026-10-24 (B3)\"\n }\n ]\n}\n"],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bettercms-ai/kit",
3
- "version": "2.0.0-next.8",
3
+ "version": "2.0.1",
4
4
  "description": "The BetterCMS V2 Block Kit: schema language, form engine, controls and design tokens.",
5
5
  "license": "MIT",
6
6
  "type": "module",