sbuilder-mcp 0.94.0 → 0.95.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.
package/CHANGELOG.md CHANGED
@@ -6,6 +6,17 @@ 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.1] - 2026-10-27
10
+
11
+ ### Fixed
12
+ - `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.
13
+
14
+ ## [0.95.0] - 2026-10-27
15
+
16
+ ### Changed
17
+ - `sb_review` accepts a record-list filter key of the form `f.record.fld_<16 hex>[~<node>]` as an `hrefParams` name, so a card in one record list can link to another list narrowed to its record, and reserved names apply only to plain names.
18
+ - The API catalog is synced with web_builder v1.0.175.
19
+
9
20
  ## [0.94.0] - 2026-10-27
10
21
 
11
22
  ### Added
package/CHANGELOG.vi.md CHANGED
@@ -6,6 +6,17 @@ 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.1] - 2026-10-27
10
+
11
+ ### Fixed
12
+ - `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.
13
+
14
+ ## [0.95.0] - 2026-10-27
15
+
16
+ ### Changed
17
+ - `sb_review` chấp nhận khoá lọc danh sách record dạng `f.record.fld_<16 hex>[~<node>]` làm tên `hrefParams`, để thẻ trong một danh sách record liên kết tới danh sách khác đã lọc theo record của nó, và tên dành riêng chỉ áp dụng cho tên thường.
18
+ - Catalog API được đồng bộ với web_builder v1.0.175.
19
+
9
20
  ## [0.94.0] - 2026-10-27
10
21
 
11
22
  ### Added
@@ -1,6 +1,6 @@
1
1
  export const DEAD_KEY_SOURCE = {
2
2
  "files": 6012,
3
- "identifiers": 110435,
3
+ "identifiers": 110443,
4
4
  "seededKeys": 460,
5
5
  "dead": 0
6
6
  };
@@ -1,7 +1,7 @@
1
1
  // GENERATED by scripts/gen-catalog.ts — do not edit by hand.
2
2
  // The platform commit every other generated file here describes.
3
3
  export const PLATFORM_SOURCE = {
4
- "commit": "db78bb5204d20a8f3dd9abf6d6a42fbfb7e58daf",
5
- "committedAt": "2026-10-26T21:17:55+07:00",
4
+ "commit": "41847d6540bdc1151bc3b780001a11e1713db217",
5
+ "committedAt": "2026-10-27T09:30:41+07:00",
6
6
  "dirty": false
7
7
  };
@@ -31,6 +31,8 @@ export const RECORD_REF_TARGET_TYPES = new Set(['text', 'select', 'url', 'date',
31
31
  * `specials.href`; every malformed entry is DROPPED at render, never repaired.
32
32
  */
33
33
  export const HREF_PARAM_NAME = /^[a-z][a-z0-9_]{0,23}$/;
34
+ /** A record-list filter key as a name (v1.0.175): `/?f.record.<fld>~<list node>=<record.id>` narrows that list. */
35
+ export const HREF_PARAM_FILTER_KEY = /^f\.record\.fld_[0-9a-f]{16}(?:~[A-Za-z0-9_-]{1,64})?$/;
34
36
  export const HREF_PARAM_SOURCE = /^record\.(?:id|url|fld_[0-9a-f]{16})$/;
35
37
  export const HREF_PARAM_RESERVED = new Set(['lang', 's', 't', 'lesson']);
36
38
  export const MAX_HREF_PARAMS = 8;
@@ -61,9 +63,10 @@ export function hrefParamProblems(raw) {
61
63
  continue;
62
64
  }
63
65
  seen.add(name);
64
- if (!HREF_PARAM_NAME.test(name))
65
- out.push(`name "${name}" is not ^[a-z][a-z0-9_]{0,23}$`);
66
- else if (HREF_PARAM_RESERVED.has(name))
66
+ const filterKey = HREF_PARAM_FILTER_KEY.test(name);
67
+ if (!filterKey && !HREF_PARAM_NAME.test(name))
68
+ out.push(`name "${name}" is neither ^[a-z][a-z0-9_]{0,23}$ nor a filter key f.record.fld_<16 hex>[~<node>]`);
69
+ else if (!filterKey && HREF_PARAM_RESERVED.has(name))
67
70
  out.push(`name "${name}" is reserved (lang, s, t, lesson are read by the platform)`);
68
71
  else if (typeof source !== 'string' || !HREF_PARAM_SOURCE.test(source))
69
72
  out.push(`"${name}"'s source "${String(source)}" is not record.id, record.url or record.fld_<16 hex>`);
@@ -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 &&
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sbuilder-mcp",
3
- "version": "0.94.0",
3
+ "version": "0.95.1",
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",