@bettercms-ai/mcp 0.76.1 → 0.76.3

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.
@@ -81,7 +81,7 @@ Never let a component contain itself, directly or through a child.
81
81
 
82
82
  ## 3. Names and groups
83
83
 
84
- The import's kit entry (`kit: suggested <id> <score>`, the gate row's `hint`) is only a suggestion: nothing is recorded. For each component, read `bettercms://kit/entry/{id}`, check its `htmlSignals` against the section's own HTML and its pitfalls against the props, then confirm it or pick the right one from its category in `bettercms://kit` and name it with `update_component { kitEntry }`. Setting or changing `kitEntry` rebuilds the derived ui from that entry (ui you or a person set is kept). The `no-kit-match` exemption needs a note.
84
+ The import's kit entry (`kit: suggested <id> <score>`, the gate row's `hint`) is only a suggestion: nothing is recorded. For each component, read `bettercms://kit/entry/{id}`, check its `htmlSignals` against the section's own HTML and its pitfalls against the props, then confirm it or pick the right one from its category in `bettercms://kit` and name it with `update_component { kitEntry }`. Setting or changing `kitEntry` puts that entry's ui over the derived ui: where the entry specifies a tab, group, control or preview key for a prop, the entry wins; what it says nothing about stays as derived; ui you or a person set is kept. The `no-kit-match` exemption needs a note.
85
85
 
86
86
  Name a family by what it is (`Hero`, `CTA`, `Testimonials`) and each variant by how it looks
87
87
  (`Hero / Split`, `CTA / Centered`). Never put a page name in a reusable definition; which pages
@@ -109,7 +109,7 @@ The other rows name their fix the same way:
109
109
  | `rename-fields` | `get_page`, read the section's source, then name every listed field of the page in ONE `update_content_model` call (`pageId`, `fieldLabel` and `fieldHelpText` keyed by field path, `ifMatch` from `get_page`'s `backingModel`), or `update_field` for a single one; `update_component` for a component (`name`, and `propLabel` / `propHelpText` for its props in one call). See "Names" below |
110
110
  | `fill-seo` | `update_page` with `metaTitle` and `metaDescription` (`update_content_entry` with `meta` for an entry; `generate_seo_meta` drafts one from text you give it); a missing canonical is setup's to copy from the built head, so that row carries `editor_setup { force: true }`; the site-wide row wants the site's default share image, `update_seo` with `seoDefaults.ogImage` |
111
111
  | `import-structured-data` | `editor_setup { force: true }` imports the build's JSON-LD; `update_seo` when it has to be written by hand |
112
- | `model-collection` | `create_content_model` with the family's `urlPattern` (`/tags/:slug`), then its entries: one item template for the family ([content-modeling.md](content-modeling.md)) |
112
+ | `model-collection` | not a row any more. Setup derives a collection wherever a family's pages share one template, with its fields, its entries and their bodies. A family it left as pages is listed as advice in `receipt.gate.families`: every route in it is an editable page. **Never `create_content_model` for it on an imported site.** One hand-written model reads the whole project as hand-authored, and the import then registers no further page, derives no collection and adds no field, which is where "the model holds only title and description" comes from. Mention the family to the owner as something a collection could hold later, and go on |
113
113
  | `derive-buttons` | `editor_setup { force: true }` mints a Button for each look the build draws, retires one it no longer draws and maps each button to its look; rename a look with `update_component` ([components.md](components.md)) |
114
114
  | `componentize` | `set_authoring_preference` when nobody answered, then `get_componentize_plan` and `componentize_sections` ([componentize.md](componentize.md)) |
115
115
  | `set-form-recipient` | `update_form` with `notifyEmails` set to the address the owner gave when setup started (it is in your first prompt); `update_form { ignored: true }` when it is not one of their forms. Only a form the built site posts to BetterCMS is listed, and the release publishes it once it is wired. Never ask for an address at the end of a run |
@@ -126,7 +126,7 @@ it and an open row of these means run setup again: `run-setup`, `derive-buttons`
126
126
  the map), `import-structured-data`, `fill-seo` from the built head and the page's own copy,
127
127
  `rename-fields` for a field still carrying a derived name, `componentize` once the authoring
128
128
  answer is `components`, and `enable-in-place-structure` on a project it creates. What is left
129
- takes judgement and is yours: `bind-elements`, `model-collection`, `set-form-recipient` (the
129
+ takes judgement and is yours: `bind-elements`, `set-form-recipient` (the
130
130
  address given at the start), `run-sections-conversion`, a name a person gave, a title over its limit, a look named by a number, and
131
131
  the authoring answer itself (the user's). `rebuild` is the user's.
132
132
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bettercms-ai/mcp",
3
- "version": "0.76.1",
3
+ "version": "0.76.3",
4
4
  "type": "module",
5
5
  "description": "BetterCMS MCP server — schema, content, forms + components authoring tools over the Management API, authed via OAuth device-code.",
6
6
  "bin": {