sbuilder-mcp 0.58.0 → 0.59.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 CHANGED
@@ -6,6 +6,11 @@ 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.59.0] - 2026-09-15
10
+
11
+ ### Added
12
+ - `sb_review` now reports a `maintenancePage` readiness gap when a site has maintenance mode switched on but no published page of the `maintain` type, since every public address then answers a bare 503 sentence with no header, logo, or word about when the shop is back; the check reads the site's own maintenance flag and stays silent for a site that is not currently in maintenance.
13
+
9
14
  ## [0.58.0] - 2026-09-15
10
15
 
11
16
  ### Added
package/CHANGELOG.vi.md CHANGED
@@ -6,6 +6,11 @@ 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.59.0] - 2026-09-15
10
+
11
+ ### Added
12
+ - `sb_review` giờ báo lỗi sẵn sàng `maintenancePage` khi site đã bật chế độ bảo trì nhưng chưa có trang loại `maintain` nào được publish, vì khi đó mọi địa chỉ công khai sẽ chỉ trả về một câu 503 trơn, không header, không logo, không một dòng nào báo khi nào shop mở lại; việc kiểm tra đọc thẳng cờ bảo trì của site và im lặng nếu site hiện không ở chế độ bảo trì.
13
+
9
14
  ## [0.58.0] - 2026-09-15
10
15
 
11
16
  ### Added
@@ -24,7 +24,7 @@ export async function gatherReadiness(ctx, siteId, pageNodes) {
24
24
  }
25
25
  };
26
26
  const site = encodeURIComponent(siteId);
27
- const [pageList, gateways, shipping, globals, productList, categoryList, pageLinks, formList, articleList, blogCategoryList, courseList] = await Promise.all([
27
+ const [pageList, gateways, shipping, globals, productList, categoryList, pageLinks, formList, articleList, blogCategoryList, courseList, siteRecord] = await Promise.all([
28
28
  get(`/api/sites/${site}/pages`),
29
29
  get(`/api/sites/${site}/payment-gateways`),
30
30
  get(`/api/sites/${site}/shipping-methods`),
@@ -59,6 +59,11 @@ export async function gatherReadiness(ctx, siteId, pageNodes) {
59
59
  // the prefix at all.
60
60
  get(`/api/sites/${site}/blog-categories?limit=1`),
61
61
  get(`/api/sites/${site}/courses?limit=1`),
62
+ // THE SWITCH ITSELF. `maintain` is the one page type whose absence matters
63
+ // only while a flag is on — see maintenanceGap. Read here rather than
64
+ // guessed, because the alternative is telling every site on earth to build
65
+ // a page for an outage it is not having.
66
+ get(`/api/sites/${site}`),
62
67
  ]);
63
68
  // A gateway counts only when it is BOTH enabled and configured — the editor's
64
69
  // `live` getter also filters by the store's currency, which is a narrowing:
@@ -116,5 +121,8 @@ export async function gatherReadiness(ctx, siteId, pageNodes) {
116
121
  courses: Array.isArray(courseList?.courses)
117
122
  ? (courseList?.total ?? courseList.courses.length)
118
123
  : null,
124
+ maintenanceMode: typeof siteRecord?.site?.maintenanceMode === 'boolean'
125
+ ? siteRecord.site.maintenanceMode
126
+ : null,
119
127
  };
120
128
  }
@@ -96,6 +96,36 @@ export function readinessGaps(input) {
96
96
  'globalRef instead of a copy, and one edit reaches every page.',
97
97
  });
98
98
  }
99
+ // THE SITE IS DARK RIGHT NOW AND SAYING NOTHING IN ITS OWN VOICE.
100
+ //
101
+ // Reported FIRST, because it is the only finding here that is not about what
102
+ // a visitor might one day meet: with the switch on, every public address is
103
+ // answering 503 this second. `maintenance.go` serves the published `maintain`
104
+ // page as that body when there is one, and a PLAIN SENTENCE when there is
105
+ // not — and it FAILS CLOSED on purpose, so an unresolvable page does not
106
+ // reopen the shop. The owner gets the outage they asked for either way; what
107
+ // they lose is every word of it.
108
+ //
109
+ // ONLY WHILE THE SWITCH IS ON. Telling a site to build a page for an outage
110
+ // it is not having is advice about a page nobody will see, and it would
111
+ // arrive on every review of every site — the nag this file keeps warning
112
+ // about, at the widest possible scale. Silent when the site could not be
113
+ // read, like everything else.
114
+ if (pages && input.maintenanceMode === true && !published(pages, 'maintain')) {
115
+ const draft = drafted(pages, 'maintain');
116
+ gaps.push({
117
+ id: 'maintenancePage',
118
+ draft,
119
+ problem: 'This storefront is switched OFF right now and has no published page of the "maintain" ' +
120
+ 'type, so every address is answering a bare 503 sentence — no header, no logo, no word ' +
121
+ 'about when it is back, and nothing that looks like this shop.',
122
+ fix: draft
123
+ ? 'Publish the maintenance page that already exists.'
124
+ : 'Create a page of type "maintain" and publish it. It has no address of its own — the ' +
125
+ 'storefront serves it as the BODY of the 503 — so give it the shop\'s name and a line ' +
126
+ 'saying when you are back.',
127
+ });
128
+ }
99
129
  // A MISTYPED URL ANSWERS IN GO, NOT IN THE SHOP'S VOICE.
100
130
  //
101
131
  // storefront/errorpage.go: with no PUBLISHED page of type `error`, notFound
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sbuilder-mcp",
3
- "version": "0.58.0",
3
+ "version": "0.59.0",
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",