sbuilder-mcp 0.95.0 → 0.95.2

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 CHANGED
@@ -6,6 +6,16 @@ All notable changes to this project are documented in this file.
6
6
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
7
7
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
8
8
 
9
+ ## [0.95.2] - 2026-10-27
10
+
11
+ ### Fixed
12
+ - `sb_page_open` reviews a record detail page with its page type, so record-bound tiles and the page's own relation list are no longer reported as `no_data_context` or `record_relation_orphan`.
13
+
14
+ ## [0.95.1] - 2026-10-27
15
+
16
+ ### Fixed
17
+ - `sb_review` no longer reports `empty_container` for the empty `dropdown-trigger` and `dropdown-panel` of a `select` or a `selectMode: "select"` dropdown, because the host fills them, while empty zones of a panel-mode dropdown are still reported.
18
+
9
19
  ## [0.95.0] - 2026-10-27
10
20
 
11
21
  ### Changed
package/CHANGELOG.vi.md CHANGED
@@ -6,6 +6,16 @@ Mọi thay đổi đáng chú ý của dự án được ghi lại trong file n
6
6
  Định dạng dựa trên [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
7
7
  và dự án tuân theo [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
8
8
 
9
+ ## [0.95.2] - 2026-10-27
10
+
11
+ ### Fixed
12
+ - `sb_page_open` review trang chi tiết record theo đúng loại trang, nên các tile gắn record và danh sách quan hệ của chính trang không còn bị báo `no_data_context` hay `record_relation_orphan`.
13
+
14
+ ## [0.95.1] - 2026-10-27
15
+
16
+ ### Fixed
17
+ - `sb_review` không còn báo `empty_container` cho `dropdown-trigger` và `dropdown-panel` rỗng của `select` hoặc dropdown `selectMode: "select"`, vì host tự điền các vùng này, còn vùng rỗng của dropdown ở chế độ panel vẫn được báo.
18
+
9
19
  ## [0.95.0] - 2026-10-27
10
20
 
11
21
  ### Changed
@@ -1140,8 +1140,14 @@ opts = {}) {
1140
1140
  // dropdown an author MAY compose under it; with no children it still renders
1141
1141
  // its `<input>` (render/nodes/search-input/html.go). The platform's own
1142
1142
  // search seed ships it childless, so every seeded search page was flagged.
1143
- // Not `select`: its face lives in its trigger/panel children.
1144
- const drawsOwnControl = type === 'search-input';
1143
+ // Not `select`: its face lives in its trigger/panel children — and THOSE
1144
+ // zones are filled by the host (render/nodes/dropdown WriteSelect: the
1145
+ // panel prints one row per filterValues, the trigger the chosen one), so a
1146
+ // select's or a selectMode:"select" dropdown's empty zone is correct.
1147
+ const host = d.nodes[n.data.parent ?? '']?.data;
1148
+ const filledByHost = (type === 'dropdown-trigger' || type === 'dropdown-panel') &&
1149
+ (host?.type === 'select' || (host?.type === 'dropdown' && d.nodes[n.data.parent]?.specials?.selectMode === 'select'));
1150
+ const drawsOwnControl = type === 'search-input' || filledByHost;
1145
1151
  const isReference = (n.specials ?? {})[SPEC_GLOBAL_REF] !== undefined ||
1146
1152
  (n.specials ?? {})[SPEC_APP_BLOCK_REF] !== undefined;
1147
1153
  if (meta.isContainer &&
@@ -1227,7 +1227,20 @@ export function registerPageTools(server, ctx) {
1227
1227
  'Republish the page placing the form to show an edit.');
1228
1228
  return text({ form: form_id, outline, ...(note ? { note } : {}), ...reviewField(ctx, session.current(), undefined, undefined, session.formType()) });
1229
1229
  }
1230
- const outline = await session.open(siteFor(ctx, given), page_id);
1230
+ const siteId = siteFor(ctx, given);
1231
+ // The page TYPE says which record the page itself supplies — a `record`
1232
+ // detail page binds its tiles outside any list. The source read does not
1233
+ // carry it, and without it the open-time review flagged every tile of a
1234
+ // correctly rendering detail page. A failed read reviews as before.
1235
+ const typeRead = request({
1236
+ base: ctx.base,
1237
+ method: 'GET',
1238
+ path: `/api/sites/${encodeURIComponent(siteId)}/pages/${encodeURIComponent(page_id)}`,
1239
+ token: siteToken(ctx),
1240
+ fetchImpl: ctx.fetchImpl,
1241
+ }).then((r) => r?.page?.type, () => undefined);
1242
+ const outline = await session.open(siteId, page_id);
1243
+ const pageType = await typeRead;
1231
1244
  // `open` joined the room on the way through — this only reports what it did.
1232
1245
  const live = session.liveStatus();
1233
1246
  const doc = session.current();
@@ -1267,7 +1280,7 @@ export function registerPageTools(server, ctx) {
1267
1280
  ...(blank_page_repair ? { blank_page_repair } : {}),
1268
1281
  ...(seeded_empty ? { seeded_empty } : {}),
1269
1282
  ...(warnings.length ? { compose_warnings: warnings } : {}),
1270
- ...reviewField(ctx, doc),
1283
+ ...reviewField(ctx, doc, undefined, typeof pageType === 'string' ? pageType : undefined),
1271
1284
  });
1272
1285
  });
1273
1286
  server.registerTool('sb_page_repair', {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sbuilder-mcp",
3
- "version": "0.95.0",
3
+ "version": "0.95.2",
4
4
  "description": "MCP server that designs and operates a Store Builder site — pages, data, theme and publish — through the platform's own API and live-edit protocol.",
5
5
  "mcpName": "io.github.vuluu2k/sbuilder-mcp",
6
6
  "type": "module",