@sonordev/site-kit 4.2.2 → 4.2.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.
Files changed (213) hide show
  1. package/agent-manifest.json +1 -1
  2. package/dist/AnalyticsProvider-NW3UZYL5.mjs +10 -0
  3. package/dist/{AnalyticsProvider-EQSG7FGL.mjs.map → AnalyticsProvider-NW3UZYL5.mjs.map} +1 -1
  4. package/dist/AnalyticsProvider-VSTTYP4W.js +31 -0
  5. package/dist/{AnalyticsProvider-4BQIFRWP.js.map → AnalyticsProvider-VSTTYP4W.js.map} +1 -1
  6. package/dist/ChatWidget-BJOE2OSI.js +20 -0
  7. package/dist/{ChatWidget-EXJD6YVW.js.map → ChatWidget-BJOE2OSI.js.map} +1 -1
  8. package/dist/ChatWidget-EWQ7LRD4.mjs +11 -0
  9. package/dist/{ChatWidget-ZTKWIKXR.mjs.map → ChatWidget-EWQ7LRD4.mjs.map} +1 -1
  10. package/dist/EngageWidget-CZMNLFWI.js +18 -0
  11. package/dist/{EngageWidget-HY523XM4.js.map → EngageWidget-CZMNLFWI.js.map} +1 -1
  12. package/dist/EngageWidget-F427CI6Y.mjs +9 -0
  13. package/dist/{EngageWidget-BJLSXG2V.mjs.map → EngageWidget-F427CI6Y.mjs.map} +1 -1
  14. package/dist/{FileField-5U4FYTLN.mjs → FileField-5RVBU3Z4.mjs} +5 -5
  15. package/dist/{FileField-5U4FYTLN.mjs.map → FileField-5RVBU3Z4.mjs.map} +1 -1
  16. package/dist/{FileField-FV46FKRM.js → FileField-Y4ZA7DST.js} +6 -6
  17. package/dist/{FileField-FV46FKRM.js.map → FileField-Y4ZA7DST.js.map} +1 -1
  18. package/dist/{FormSpotlight-W6BNVKNN.mjs → FormSpotlight-CJPI2MRJ.mjs} +3 -3
  19. package/dist/{FormSpotlight-W6BNVKNN.mjs.map → FormSpotlight-CJPI2MRJ.mjs.map} +1 -1
  20. package/dist/{FormSpotlight-TUHLSY3O.js → FormSpotlight-MAEV6SZK.js} +15 -15
  21. package/dist/{FormSpotlight-TUHLSY3O.js.map → FormSpotlight-MAEV6SZK.js.map} +1 -1
  22. package/dist/{FormStage-MNXNKSPP.js → FormStage-D42NAHSN.js} +13 -13
  23. package/dist/{FormStage-MNXNKSPP.js.map → FormStage-D42NAHSN.js.map} +1 -1
  24. package/dist/{FormStage-NKWP3C2S.mjs → FormStage-Z7WW3DNA.mjs} +3 -3
  25. package/dist/{FormStage-NKWP3C2S.mjs.map → FormStage-Z7WW3DNA.mjs.map} +1 -1
  26. package/dist/ManagedForm-A7BROQIN.mjs +14 -0
  27. package/dist/{ManagedForm-M3XW66FH.mjs.map → ManagedForm-A7BROQIN.mjs.map} +1 -1
  28. package/dist/ManagedForm-Z3Z5Z6OL.js +23 -0
  29. package/dist/{ManagedForm-K4UHRVYV.js.map → ManagedForm-Z3Z5Z6OL.js.map} +1 -1
  30. package/dist/{SignalCore-S6PCGTHS.mjs → SignalCore-77UH6PZ4.mjs} +5 -5
  31. package/dist/{SignalCore-S6PCGTHS.mjs.map → SignalCore-77UH6PZ4.mjs.map} +1 -1
  32. package/dist/{SignalCore-7PVCUG2S.js → SignalCore-NA6TJFVE.js} +11 -11
  33. package/dist/{SignalCore-7PVCUG2S.js.map → SignalCore-NA6TJFVE.js.map} +1 -1
  34. package/dist/SitemapSync-62F6HVAW.js +17 -0
  35. package/dist/{SitemapSync-66HQ4SG2.js.map → SitemapSync-62F6HVAW.js.map} +1 -1
  36. package/dist/SitemapSync-EY33A6P4.mjs +8 -0
  37. package/dist/{SitemapSync-2HLGUZES.mjs.map → SitemapSync-EY33A6P4.mjs.map} +1 -1
  38. package/dist/analytics/index.js +9 -9
  39. package/dist/analytics/index.mjs +4 -4
  40. package/dist/api-N5OLQXYN.js +202 -0
  41. package/dist/api-N5OLQXYN.js.map +1 -0
  42. package/dist/api-NTHZ6PAW.mjs +184 -0
  43. package/dist/api-NTHZ6PAW.mjs.map +1 -0
  44. package/dist/{chunk-F46DCSUI.js → chunk-2XRGCDDG.js} +9 -9
  45. package/dist/{chunk-F46DCSUI.js.map → chunk-2XRGCDDG.js.map} +1 -1
  46. package/dist/{chunk-UF33ENG6.js → chunk-3DSGMX7P.js} +3 -3
  47. package/dist/{chunk-UF33ENG6.js.map → chunk-3DSGMX7P.js.map} +1 -1
  48. package/dist/{chunk-SED7E3P5.mjs → chunk-3P4HJAZA.mjs} +4 -4
  49. package/dist/{chunk-SED7E3P5.mjs.map → chunk-3P4HJAZA.mjs.map} +1 -1
  50. package/dist/{chunk-W3QLA5MI.mjs → chunk-535HXGDU.mjs} +3 -3
  51. package/dist/{chunk-W3QLA5MI.mjs.map → chunk-535HXGDU.mjs.map} +1 -1
  52. package/dist/{chunk-CM5QUX2T.mjs → chunk-6D3HZKTZ.mjs} +3 -3
  53. package/dist/{chunk-CM5QUX2T.mjs.map → chunk-6D3HZKTZ.mjs.map} +1 -1
  54. package/dist/{chunk-XMZQUC2J.js → chunk-7BVZLSUJ.js} +8 -8
  55. package/dist/{chunk-XMZQUC2J.js.map → chunk-7BVZLSUJ.js.map} +1 -1
  56. package/dist/{chunk-645TOMKQ.js → chunk-BN4AL7XB.js} +4 -4
  57. package/dist/{chunk-645TOMKQ.js.map → chunk-BN4AL7XB.js.map} +1 -1
  58. package/dist/{chunk-YV2TG7JR.mjs → chunk-DZUOLOYS.mjs} +3 -3
  59. package/dist/{chunk-YV2TG7JR.mjs.map → chunk-DZUOLOYS.mjs.map} +1 -1
  60. package/dist/{chunk-SS5S43I4.mjs → chunk-EHNUPEFY.mjs} +7 -7
  61. package/dist/{chunk-SS5S43I4.mjs.map → chunk-EHNUPEFY.mjs.map} +1 -1
  62. package/dist/{chunk-L4ZLL6TE.mjs → chunk-FZAAQE4Y.mjs} +4 -4
  63. package/dist/{chunk-L4ZLL6TE.mjs.map → chunk-FZAAQE4Y.mjs.map} +1 -1
  64. package/dist/{chunk-2LU7BV5K.js → chunk-GDMOAGVS.js} +18 -18
  65. package/dist/{chunk-2LU7BV5K.js.map → chunk-GDMOAGVS.js.map} +1 -1
  66. package/dist/{chunk-LSW5QBW2.js → chunk-GJKO2TZN.js} +4 -4
  67. package/dist/{chunk-LSW5QBW2.js.map → chunk-GJKO2TZN.js.map} +1 -1
  68. package/dist/{chunk-DQO4UKFE.mjs → chunk-HTLWSCUQ.mjs} +76 -4
  69. package/dist/chunk-HTLWSCUQ.mjs.map +1 -0
  70. package/dist/{chunk-TWPLJ27S.js → chunk-HVDKAR77.js} +7 -7
  71. package/dist/{chunk-TWPLJ27S.js.map → chunk-HVDKAR77.js.map} +1 -1
  72. package/dist/{chunk-D6CPHVMV.mjs → chunk-I7ORAWYT.mjs} +3 -3
  73. package/dist/{chunk-D6CPHVMV.mjs.map → chunk-I7ORAWYT.mjs.map} +1 -1
  74. package/dist/{chunk-MOKM6STG.mjs → chunk-INA4NW3Y.mjs} +3 -3
  75. package/dist/{chunk-MOKM6STG.mjs.map → chunk-INA4NW3Y.mjs.map} +1 -1
  76. package/dist/{chunk-4E7NFYL5.mjs → chunk-J6HWSJT7.mjs} +3 -3
  77. package/dist/{chunk-4E7NFYL5.mjs.map → chunk-J6HWSJT7.mjs.map} +1 -1
  78. package/dist/{chunk-PLY5AP72.js → chunk-JJDY5XXG.js} +3 -3
  79. package/dist/{chunk-PLY5AP72.js.map → chunk-JJDY5XXG.js.map} +1 -1
  80. package/dist/{chunk-ZXVMP6SY.mjs → chunk-KL4MV6HK.mjs} +3 -3
  81. package/dist/{chunk-ZXVMP6SY.mjs.map → chunk-KL4MV6HK.mjs.map} +1 -1
  82. package/dist/{chunk-THBZCEA7.js → chunk-M2SEYO5J.js} +5 -5
  83. package/dist/{chunk-THBZCEA7.js.map → chunk-M2SEYO5J.js.map} +1 -1
  84. package/dist/{chunk-XBKNPBRB.js → chunk-MF6XLEX5.js} +15 -15
  85. package/dist/{chunk-XBKNPBRB.js.map → chunk-MF6XLEX5.js.map} +1 -1
  86. package/dist/{chunk-UEOGMRTL.js → chunk-MP7ZYKMM.js} +8 -8
  87. package/dist/{chunk-UEOGMRTL.js.map → chunk-MP7ZYKMM.js.map} +1 -1
  88. package/dist/{chunk-55FJN7VQ.js → chunk-N5RTJNMN.js} +6 -6
  89. package/dist/{chunk-55FJN7VQ.js.map → chunk-N5RTJNMN.js.map} +1 -1
  90. package/dist/{chunk-DEPDYVUH.js → chunk-NEIUWAAL.js} +5 -5
  91. package/dist/{chunk-DEPDYVUH.js.map → chunk-NEIUWAAL.js.map} +1 -1
  92. package/dist/{chunk-HYRKVST7.js → chunk-OHA43BNK.js} +14 -14
  93. package/dist/{chunk-HYRKVST7.js.map → chunk-OHA43BNK.js.map} +1 -1
  94. package/dist/{chunk-P37FFMOZ.mjs → chunk-PTZB4ES3.mjs} +8 -8
  95. package/dist/{chunk-P37FFMOZ.mjs.map → chunk-PTZB4ES3.mjs.map} +1 -1
  96. package/dist/{chunk-OB6DNGYK.js → chunk-QJK2X3UK.js} +12 -12
  97. package/dist/{chunk-OB6DNGYK.js.map → chunk-QJK2X3UK.js.map} +1 -1
  98. package/dist/{chunk-XFVI3SNM.mjs → chunk-RCRDDMUO.mjs} +3 -3
  99. package/dist/{chunk-XFVI3SNM.mjs.map → chunk-RCRDDMUO.mjs.map} +1 -1
  100. package/dist/{chunk-4MBD6PPV.js → chunk-RDISSFEH.js} +15 -15
  101. package/dist/{chunk-4MBD6PPV.js.map → chunk-RDISSFEH.js.map} +1 -1
  102. package/dist/{chunk-K7XOPTOE.mjs → chunk-RRR6Y6Y5.mjs} +4 -4
  103. package/dist/{chunk-K7XOPTOE.mjs.map → chunk-RRR6Y6Y5.mjs.map} +1 -1
  104. package/dist/chunk-S5L73KZQ.js +8 -0
  105. package/dist/{chunk-UUBW2NJZ.js.map → chunk-S5L73KZQ.js.map} +1 -1
  106. package/dist/{chunk-BUZSBUYJ.js → chunk-S5UATBC7.js} +14 -14
  107. package/dist/{chunk-BUZSBUYJ.js.map → chunk-S5UATBC7.js.map} +1 -1
  108. package/dist/{chunk-524SIFK7.js → chunk-SAR473OC.js} +12 -12
  109. package/dist/{chunk-524SIFK7.js.map → chunk-SAR473OC.js.map} +1 -1
  110. package/dist/{chunk-7723NZQW.mjs → chunk-SL6ZGJVN.mjs} +4 -4
  111. package/dist/{chunk-7723NZQW.mjs.map → chunk-SL6ZGJVN.mjs.map} +1 -1
  112. package/dist/{chunk-WARTV6ZP.mjs → chunk-T3HGONNE.mjs} +4 -4
  113. package/dist/{chunk-WARTV6ZP.mjs.map → chunk-T3HGONNE.mjs.map} +1 -1
  114. package/dist/{chunk-BEHHWRZM.mjs → chunk-T6T5IQMN.mjs} +3 -3
  115. package/dist/{chunk-BEHHWRZM.mjs.map → chunk-T6T5IQMN.mjs.map} +1 -1
  116. package/dist/{chunk-YN5WYGHK.mjs → chunk-TFAYDIWM.mjs} +3 -3
  117. package/dist/{chunk-YN5WYGHK.mjs.map → chunk-TFAYDIWM.mjs.map} +1 -1
  118. package/dist/{chunk-WHHBOYAW.mjs → chunk-TKVADZFD.mjs} +4 -4
  119. package/dist/{chunk-WHHBOYAW.mjs.map → chunk-TKVADZFD.mjs.map} +1 -1
  120. package/dist/{chunk-KJSYSRMD.mjs → chunk-UDNXM6RB.mjs} +3 -3
  121. package/dist/{chunk-KJSYSRMD.mjs.map → chunk-UDNXM6RB.mjs.map} +1 -1
  122. package/dist/{chunk-7YVFFQWH.js → chunk-WCTOQFAN.js} +14 -14
  123. package/dist/{chunk-7YVFFQWH.js.map → chunk-WCTOQFAN.js.map} +1 -1
  124. package/dist/{chunk-QQFWEHYU.js → chunk-XA7RBHKT.js} +4 -4
  125. package/dist/{chunk-QQFWEHYU.js.map → chunk-XA7RBHKT.js.map} +1 -1
  126. package/dist/chunk-XCFCG46K.mjs +6 -0
  127. package/dist/{chunk-NPCWPOCE.mjs.map → chunk-XCFCG46K.mjs.map} +1 -1
  128. package/dist/{chunk-3BXQP54K.js → chunk-XOJYGBYF.js} +3 -3
  129. package/dist/{chunk-3BXQP54K.js.map → chunk-XOJYGBYF.js.map} +1 -1
  130. package/dist/{chunk-WNK2OK5G.mjs → chunk-XR3MDDQT.mjs} +3 -3
  131. package/dist/{chunk-WNK2OK5G.mjs.map → chunk-XR3MDDQT.mjs.map} +1 -1
  132. package/dist/{chunk-4SJITKBL.mjs → chunk-XWFUQMU6.mjs} +3 -3
  133. package/dist/{chunk-4SJITKBL.mjs.map → chunk-XWFUQMU6.mjs.map} +1 -1
  134. package/dist/{chunk-UIKGLLTU.js → chunk-YWXZ4YLU.js} +4 -4
  135. package/dist/{chunk-UIKGLLTU.js.map → chunk-YWXZ4YLU.js.map} +1 -1
  136. package/dist/{chunk-2GUDSTNH.mjs → chunk-ZASFY4NR.mjs} +4 -4
  137. package/dist/{chunk-2GUDSTNH.mjs.map → chunk-ZASFY4NR.mjs.map} +1 -1
  138. package/dist/{chunk-6TAXXKMX.js → chunk-ZAVNGZJZ.js} +77 -3
  139. package/dist/chunk-ZAVNGZJZ.js.map +1 -0
  140. package/dist/cli/agent/checks.d.ts.map +1 -1
  141. package/dist/cli/commands/og.d.ts +46 -11
  142. package/dist/cli/commands/og.d.ts.map +1 -1
  143. package/dist/cli/index.js +516 -174
  144. package/dist/cli/index.js.map +1 -1
  145. package/dist/cli/index.mjs +514 -172
  146. package/dist/cli/index.mjs.map +1 -1
  147. package/dist/client/index.js +4 -4
  148. package/dist/client/index.mjs +3 -3
  149. package/dist/commerce/index.js +56 -56
  150. package/dist/commerce/index.mjs +5 -5
  151. package/dist/engage/index.js +10 -10
  152. package/dist/engage/index.mjs +7 -7
  153. package/dist/fleet/index.js +8 -8
  154. package/dist/fleet/index.mjs +4 -4
  155. package/dist/forms/index.js +16 -16
  156. package/dist/forms/index.mjs +9 -9
  157. package/dist/forms/server.js +10 -10
  158. package/dist/forms/server.mjs +8 -8
  159. package/dist/forms/static.js +7 -7
  160. package/dist/forms/static.mjs +6 -6
  161. package/dist/images/index.js +11 -11
  162. package/dist/images/index.mjs +4 -4
  163. package/dist/index.js +63 -63
  164. package/dist/index.mjs +9 -9
  165. package/dist/layout/client.js +8 -8
  166. package/dist/layout/client.mjs +7 -7
  167. package/dist/layout/index.js +10 -10
  168. package/dist/layout/index.mjs +8 -8
  169. package/dist/maps/index.js +5 -5
  170. package/dist/maps/index.mjs +3 -3
  171. package/dist/og/config.d.ts +36 -0
  172. package/dist/og/config.d.ts.map +1 -1
  173. package/dist/og/index.js +5 -5
  174. package/dist/og/index.mjs +1 -1
  175. package/dist/og/pages.d.ts +56 -0
  176. package/dist/og/pages.d.ts.map +1 -0
  177. package/dist/og/pages.test.d.ts +2 -0
  178. package/dist/og/pages.test.d.ts.map +1 -0
  179. package/dist/og/template.d.ts.map +1 -1
  180. package/dist/og/wiring.d.ts +56 -0
  181. package/dist/og/wiring.d.ts.map +1 -0
  182. package/dist/og/wiring.test.d.ts +2 -0
  183. package/dist/og/wiring.test.d.ts.map +1 -0
  184. package/dist/search/index.js +4 -4
  185. package/dist/search/index.mjs +3 -3
  186. package/dist/seo/client.js +5 -5
  187. package/dist/seo/client.mjs +4 -4
  188. package/dist/seo/index.js +5 -5
  189. package/dist/seo/index.mjs +4 -4
  190. package/dist/seo/register-sitemap-cli.js +1 -1
  191. package/dist/seo/register-sitemap-cli.mjs +1 -1
  192. package/dist/server/index.js +3 -3
  193. package/dist/server/index.mjs +2 -2
  194. package/dist/shared/version.d.ts +1 -1
  195. package/dist/signal/index.js +11 -11
  196. package/dist/signal/index.mjs +2 -2
  197. package/dist/sync/index.js +16 -16
  198. package/dist/sync/index.mjs +4 -4
  199. package/package.json +1 -1
  200. package/dist/AnalyticsProvider-4BQIFRWP.js +0 -31
  201. package/dist/AnalyticsProvider-EQSG7FGL.mjs +0 -10
  202. package/dist/ChatWidget-EXJD6YVW.js +0 -20
  203. package/dist/ChatWidget-ZTKWIKXR.mjs +0 -11
  204. package/dist/EngageWidget-BJLSXG2V.mjs +0 -9
  205. package/dist/EngageWidget-HY523XM4.js +0 -18
  206. package/dist/ManagedForm-K4UHRVYV.js +0 -23
  207. package/dist/ManagedForm-M3XW66FH.mjs +0 -14
  208. package/dist/SitemapSync-2HLGUZES.mjs +0 -8
  209. package/dist/SitemapSync-66HQ4SG2.js +0 -17
  210. package/dist/chunk-6TAXXKMX.js.map +0 -1
  211. package/dist/chunk-DQO4UKFE.mjs.map +0 -1
  212. package/dist/chunk-NPCWPOCE.mjs +0 -6
  213. package/dist/chunk-UUBW2NJZ.js +0 -8
package/dist/cli/index.js CHANGED
@@ -3,9 +3,10 @@
3
3
 
4
4
  var chunkJS75ORH7_js = require('../chunk-JS75ORH7.js');
5
5
  var chunkI7AZC5ZQ_js = require('../chunk-I7AZC5ZQ.js');
6
- var chunk6TAXXKMX_js = require('../chunk-6TAXXKMX.js');
6
+ var chunkZAVNGZJZ_js = require('../chunk-ZAVNGZJZ.js');
7
7
  var chunkNN2YE5WT_js = require('../chunk-NN2YE5WT.js');
8
- var chunkUUBW2NJZ_js = require('../chunk-UUBW2NJZ.js');
8
+ var chunkLOS5D6B3_js = require('../chunk-LOS5D6B3.js');
9
+ var chunkS5L73KZQ_js = require('../chunk-S5L73KZQ.js');
9
10
  var chunkSNAQBZPT_js = require('../chunk-SNAQBZPT.js');
10
11
  var events = require('events');
11
12
  var childProcess = require('child_process');
@@ -6233,10 +6234,10 @@ var require_lib2 = chunkSNAQBZPT_js.__commonJS({
6233
6234
  exports.analyse = analyse;
6234
6235
  var detectFile = (filepath, opts = {}) => new Promise((resolve, reject) => {
6235
6236
  let fd;
6236
- const fs26 = (0, node_1.default)();
6237
+ const fs27 = (0, node_1.default)();
6237
6238
  const handler = (err, buffer) => {
6238
6239
  if (fd) {
6239
- fs26.closeSync(fd);
6240
+ fs27.closeSync(fd);
6240
6241
  }
6241
6242
  if (err) {
6242
6243
  reject(err);
@@ -6248,9 +6249,9 @@ var require_lib2 = chunkSNAQBZPT_js.__commonJS({
6248
6249
  };
6249
6250
  const sampleSize = (opts === null || opts === void 0 ? void 0 : opts.sampleSize) || 0;
6250
6251
  if (sampleSize > 0) {
6251
- fd = fs26.openSync(filepath, "r");
6252
+ fd = fs27.openSync(filepath, "r");
6252
6253
  let sample = Buffer.allocUnsafe(sampleSize);
6253
- fs26.read(fd, sample, 0, sampleSize, opts.offset, (err, bytesRead) => {
6254
+ fs27.read(fd, sample, 0, sampleSize, opts.offset, (err, bytesRead) => {
6254
6255
  if (err) {
6255
6256
  handler(err, null);
6256
6257
  } else {
@@ -6262,22 +6263,22 @@ var require_lib2 = chunkSNAQBZPT_js.__commonJS({
6262
6263
  });
6263
6264
  return;
6264
6265
  }
6265
- fs26.readFile(filepath, handler);
6266
+ fs27.readFile(filepath, handler);
6266
6267
  });
6267
6268
  exports.detectFile = detectFile;
6268
6269
  var detectFileSync = (filepath, opts = {}) => {
6269
- const fs26 = (0, node_1.default)();
6270
+ const fs27 = (0, node_1.default)();
6270
6271
  if (opts && opts.sampleSize) {
6271
- const fd = fs26.openSync(filepath, "r");
6272
+ const fd = fs27.openSync(filepath, "r");
6272
6273
  let sample = Buffer.allocUnsafe(opts.sampleSize);
6273
- const bytesRead = fs26.readSync(fd, sample, 0, opts.sampleSize, opts.offset);
6274
+ const bytesRead = fs27.readSync(fd, sample, 0, opts.sampleSize, opts.offset);
6274
6275
  if (bytesRead < opts.sampleSize) {
6275
6276
  sample = sample.subarray(0, bytesRead);
6276
6277
  }
6277
- fs26.closeSync(fd);
6278
+ fs27.closeSync(fd);
6278
6279
  return (0, exports.detect)(sample);
6279
6280
  }
6280
- return (0, exports.detect)(fs26.readFileSync(filepath));
6281
+ return (0, exports.detect)(fs27.readFileSync(filepath));
6281
6282
  };
6282
6283
  exports.detectFileSync = detectFileSync;
6283
6284
  exports.default = {
@@ -13267,9 +13268,9 @@ Expecting one of '${allowedValues.join("', '")}'`);
13267
13268
  * @param {string} [path]
13268
13269
  * @return {(string|null|Command)}
13269
13270
  */
13270
- executableDir(path26) {
13271
- if (path26 === void 0) return this._executableDir;
13272
- this._executableDir = path26;
13271
+ executableDir(path27) {
13272
+ if (path27 === void 0) return this._executableDir;
13273
+ this._executableDir = path27;
13273
13274
  return this;
13274
13275
  }
13275
13276
  /**
@@ -13542,7 +13543,7 @@ function buildEnvelope(input, nowMs = Date.now()) {
13542
13543
  ok: exitCode === 0 /* OK */,
13543
13544
  command,
13544
13545
  schemaVersion: 1,
13545
- siteKitVersion: chunkUUBW2NJZ_js.SITE_KIT_VERSION,
13546
+ siteKitVersion: chunkS5L73KZQ_js.SITE_KIT_VERSION,
13546
13547
  exitCode,
13547
13548
  status: statusForCode(exitCode),
13548
13549
  summary,
@@ -20376,9 +20377,9 @@ function observableToAsyncIterable(source) {
20376
20377
 
20377
20378
  // node_modules/.pnpm/inquirer@14.0.2_@types+node@26.2.0/node_modules/inquirer/dist/ui/prompt.js
20378
20379
  var _ = {
20379
- set: (obj, path26 = "", value) => {
20380
+ set: (obj, path27 = "", value) => {
20380
20381
  let pointer = obj;
20381
- path26.split(".").forEach((key, index, arr) => {
20382
+ path27.split(".").forEach((key, index, arr) => {
20382
20383
  if (key === "__proto__" || key === "constructor")
20383
20384
  return;
20384
20385
  if (index === arr.length - 1) {
@@ -20389,8 +20390,8 @@ var _ = {
20389
20390
  pointer = pointer[key];
20390
20391
  });
20391
20392
  },
20392
- get: (obj, path26 = "", defaultValue) => {
20393
- const travel = (regexp) => String.prototype.split.call(path26, regexp).filter(Boolean).reduce(
20393
+ get: (obj, path27 = "", defaultValue) => {
20394
+ const travel = (regexp) => String.prototype.split.call(path27, regexp).filter(Boolean).reduce(
20394
20395
  // @ts-expect-error implicit any on res[key]
20395
20396
  (res, key) => res == null ? res : res[key],
20396
20397
  obj
@@ -20747,18 +20748,18 @@ function scanForForms(ast, content, filePath) {
20747
20748
  const forms = [];
20748
20749
  content.split("\n");
20749
20750
  chunkJS75ORH7_js.traverse(ast, {
20750
- JSXElement(path26) {
20751
- const opening = path26.node.openingElement;
20751
+ JSXElement(path27) {
20752
+ const opening = path27.node.openingElement;
20752
20753
  if (chunkJS75ORH7_js.isJSXIdentifier(opening.name) && opening.name.name === "form") {
20753
- const fields = extractFieldsFromForm(path26);
20754
+ const fields = extractFieldsFromForm(path27);
20754
20755
  const hasOnSubmit = opening.attributes.some(
20755
20756
  (attr) => chunkJS75ORH7_js.isJSXAttribute(attr) && chunkJS75ORH7_js.isJSXIdentifier(attr.name) && attr.name.name === "onSubmit"
20756
20757
  );
20757
20758
  if (hasOnSubmit && fields.length > 0) {
20758
- const startLine = path26.node.loc?.start.line || 0;
20759
- const endLine = path26.node.loc?.end.line || 0;
20759
+ const startLine = path27.node.loc?.start.line || 0;
20760
+ const endLine = path27.node.loc?.end.line || 0;
20760
20761
  let componentName = "UnknownForm";
20761
- let current = path26.parentPath;
20762
+ let current = path27.parentPath;
20762
20763
  while (current) {
20763
20764
  if (chunkJS75ORH7_js.isFunctionDeclaration(current.node) && current.node.id) {
20764
20765
  componentName = current.node.id.name;
@@ -20791,7 +20792,7 @@ function scanForForms(ast, content, filePath) {
20791
20792
  }
20792
20793
  if (chunkJS75ORH7_js.isJSXIdentifier(opening.name) && opening.name.name === "Form") {
20793
20794
  if (content.includes("Formik") || content.includes("formik")) {
20794
- const fields = extractFieldsFromFormik(path26);
20795
+ const fields = extractFieldsFromFormik(path27);
20795
20796
  if (fields.length > 0) {
20796
20797
  forms.push({
20797
20798
  filePath,
@@ -20802,8 +20803,8 @@ function scanForForms(ast, content, filePath) {
20802
20803
  submitsTo: null,
20803
20804
  complexity: "moderate",
20804
20805
  suggestedAction: "assisted",
20805
- startLine: path26.node.loc?.start.line || 0,
20806
- endLine: path26.node.loc?.end.line || 0
20806
+ startLine: path27.node.loc?.start.line || 0,
20807
+ endLine: path27.node.loc?.end.line || 0
20807
20808
  });
20808
20809
  }
20809
20810
  }
@@ -20821,8 +20822,8 @@ function extractFieldsFromForm(formPath) {
20821
20822
  const radioGroups = /* @__PURE__ */ new Map();
20822
20823
  const checkboxGroups = /* @__PURE__ */ new Map();
20823
20824
  formPath.traverse({
20824
- JSXElement(path26) {
20825
- const opening = path26.node.openingElement;
20825
+ JSXElement(path27) {
20826
+ const opening = path27.node.openingElement;
20826
20827
  const tagName = chunkJS75ORH7_js.isJSXIdentifier(opening.name) ? opening.name.name : null;
20827
20828
  if (["input", "textarea", "select"].includes(tagName || "")) {
20828
20829
  const attrs = opening.attributes;
@@ -20869,7 +20870,7 @@ function extractFieldsFromForm(formPath) {
20869
20870
  }
20870
20871
  if (tagName === "select") {
20871
20872
  const selectOptions = [];
20872
- path26.traverse({
20873
+ path27.traverse({
20873
20874
  JSXElement(optionPath) {
20874
20875
  const optOpening = optionPath.node.openingElement;
20875
20876
  const optTagName = chunkJS75ORH7_js.isJSXIdentifier(optOpening.name) ? optOpening.name.name : null;
@@ -20944,8 +20945,8 @@ function extractFieldsFromForm(formPath) {
20944
20945
  function extractFieldsFromFormik(formPath, content) {
20945
20946
  const fields = [];
20946
20947
  formPath.traverse({
20947
- JSXElement(path26) {
20948
- const opening = path26.node.openingElement;
20948
+ JSXElement(path27) {
20949
+ const opening = path27.node.openingElement;
20949
20950
  const tagName = chunkJS75ORH7_js.isJSXIdentifier(opening.name) ? opening.name.name : null;
20950
20951
  if (tagName === "Field" || tagName === "FastField") {
20951
20952
  const attrs = opening.attributes;
@@ -21064,11 +21065,11 @@ function scanForMetadata(ast, content, filePath) {
21064
21065
  }
21065
21066
  let hasHeadComponent = false;
21066
21067
  chunkJS75ORH7_js.traverse(ast, {
21067
- JSXElement(path26) {
21068
- const opening = path26.node.openingElement;
21068
+ JSXElement(path27) {
21069
+ const opening = path27.node.openingElement;
21069
21070
  if (chunkJS75ORH7_js.isJSXIdentifier(opening.name) && opening.name.name === "Head") {
21070
21071
  hasHeadComponent = true;
21071
- path26.stop();
21072
+ path27.stop();
21072
21073
  }
21073
21074
  }
21074
21075
  });
@@ -21103,8 +21104,8 @@ function scanForWidgets(ast, content, filePath) {
21103
21104
  for (const { pattern, type } of widgetPatterns) {
21104
21105
  if (pattern.test(content)) {
21105
21106
  chunkJS75ORH7_js.traverse(ast, {
21106
- JSXElement(path26) {
21107
- const opening = path26.node.openingElement;
21107
+ JSXElement(path27) {
21108
+ const opening = path27.node.openingElement;
21108
21109
  if (chunkJS75ORH7_js.isJSXIdentifier(opening.name) && (opening.name.name === "script" || opening.name.name === "Script")) {
21109
21110
  const srcAttr = opening.attributes.find(
21110
21111
  (attr) => chunkJS75ORH7_js.isJSXAttribute(attr) && chunkJS75ORH7_js.isJSXIdentifier(attr.name) && attr.name.name === "src"
@@ -21119,8 +21120,8 @@ function scanForWidgets(ast, content, filePath) {
21119
21120
  filePath,
21120
21121
  widgetType: type,
21121
21122
  scriptTag: src,
21122
- startLine: path26.node.loc?.start.line || 0,
21123
- endLine: path26.node.loc?.end.line || 0
21123
+ startLine: path27.node.loc?.start.line || 0,
21124
+ endLine: path27.node.loc?.end.line || 0
21124
21125
  });
21125
21126
  }
21126
21127
  }
@@ -21259,8 +21260,8 @@ function scanForSchemas(ast, content, filePath) {
21259
21260
  return schemas;
21260
21261
  }
21261
21262
  chunkJS75ORH7_js.traverse(ast, {
21262
- JSXElement(path26) {
21263
- const opening = path26.node.openingElement;
21263
+ JSXElement(path27) {
21264
+ const opening = path27.node.openingElement;
21264
21265
  if (chunkJS75ORH7_js.isJSXIdentifier(opening.name) && (opening.name.name === "script" || opening.name.name === "Script")) {
21265
21266
  const typeAttr = opening.attributes.find(
21266
21267
  (attr) => chunkJS75ORH7_js.isJSXAttribute(attr) && chunkJS75ORH7_js.isJSXIdentifier(attr.name) && attr.name.name === "type"
@@ -21287,8 +21288,8 @@ function scanForSchemas(ast, content, filePath) {
21287
21288
  filePath,
21288
21289
  type: detectedType,
21289
21290
  schemaType,
21290
- startLine: path26.node.loc?.start.line || 0,
21291
- endLine: path26.node.loc?.end.line || 0
21291
+ startLine: path27.node.loc?.start.line || 0,
21292
+ endLine: path27.node.loc?.end.line || 0
21292
21293
  });
21293
21294
  }
21294
21295
  }
@@ -21321,8 +21322,8 @@ function scanForFAQs(ast, content, filePath) {
21321
21322
  /questions?\s*(?:and|&)?\s*answers?/i
21322
21323
  ];
21323
21324
  chunkJS75ORH7_js.traverse(ast, {
21324
- JSXElement(path26) {
21325
- const opening = path26.node.openingElement;
21325
+ JSXElement(path27) {
21326
+ const opening = path27.node.openingElement;
21326
21327
  let tagName = "";
21327
21328
  if (chunkJS75ORH7_js.isJSXIdentifier(opening.name)) {
21328
21329
  tagName = opening.name.name;
@@ -21335,8 +21336,8 @@ function scanForFAQs(ast, content, filePath) {
21335
21336
  faqs.push({
21336
21337
  filePath,
21337
21338
  type: "details-summary",
21338
- startLine: path26.node.loc?.start.line || 0,
21339
- endLine: path26.node.loc?.end.line || 0,
21339
+ startLine: path27.node.loc?.start.line || 0,
21340
+ endLine: path27.node.loc?.end.line || 0,
21340
21341
  hasSchema: content.includes("FAQPage") || content.includes("application/ld+json")
21341
21342
  });
21342
21343
  return;
@@ -21344,7 +21345,7 @@ function scanForFAQs(ast, content, filePath) {
21344
21345
  for (const pattern of faqPatterns) {
21345
21346
  if (pattern.test(tagName)) {
21346
21347
  let itemCount = 0;
21347
- path26.traverse({
21348
+ path27.traverse({
21348
21349
  JSXElement(itemPath) {
21349
21350
  const itemOpening = itemPath.node.openingElement;
21350
21351
  if (chunkJS75ORH7_js.isJSXIdentifier(itemOpening.name)) {
@@ -21360,8 +21361,8 @@ function scanForFAQs(ast, content, filePath) {
21360
21361
  type: "accordion",
21361
21362
  componentName: tagName,
21362
21363
  itemCount: itemCount || void 0,
21363
- startLine: path26.node.loc?.start.line || 0,
21364
- endLine: path26.node.loc?.end.line || 0,
21364
+ startLine: path27.node.loc?.start.line || 0,
21365
+ endLine: path27.node.loc?.end.line || 0,
21365
21366
  hasSchema: content.includes("FAQPage") || content.includes("application/ld+json")
21366
21367
  });
21367
21368
  return;
@@ -21484,8 +21485,8 @@ function scanForImages(ast, content, filePath) {
21484
21485
  return images;
21485
21486
  }
21486
21487
  chunkJS75ORH7_js.traverse(ast, {
21487
- JSXElement(path26) {
21488
- const opening = path26.node.openingElement;
21488
+ JSXElement(path27) {
21489
+ const opening = path27.node.openingElement;
21489
21490
  if (!chunkJS75ORH7_js.isJSXIdentifier(opening.name)) return;
21490
21491
  const tagName = opening.name.name;
21491
21492
  if (tagName === "img" || tagName === "Image") {
@@ -21513,8 +21514,8 @@ function scanForImages(ast, content, filePath) {
21513
21514
  src: src || void 0,
21514
21515
  alt: alt || void 0,
21515
21516
  isLocal,
21516
- startLine: path26.node.loc?.start.line || 0,
21517
- endLine: path26.node.loc?.end.line || 0
21517
+ startLine: path27.node.loc?.start.line || 0,
21518
+ endLine: path27.node.loc?.end.line || 0
21518
21519
  });
21519
21520
  }
21520
21521
  }
@@ -22428,18 +22429,18 @@ async function migrateFile(filePath, options) {
22428
22429
  let componentName = "Form";
22429
22430
  const traverse2 = (await import('../lib-BGAWCSUH.js')).default;
22430
22431
  traverse2(ast, {
22431
- ExportNamedDeclaration(path26) {
22432
- const decl = path26.node.declaration;
22432
+ ExportNamedDeclaration(path27) {
22433
+ const decl = path27.node.declaration;
22433
22434
  if (decl && decl.type === "FunctionDeclaration" && decl.id) {
22434
22435
  componentName = decl.id.name;
22435
- path26.stop();
22436
+ path27.stop();
22436
22437
  }
22437
22438
  },
22438
- ExportDefaultDeclaration(path26) {
22439
- const decl = path26.node.declaration;
22439
+ ExportDefaultDeclaration(path27) {
22440
+ const decl = path27.node.declaration;
22440
22441
  if (decl && decl.type === "FunctionDeclaration" && decl.id) {
22441
22442
  componentName = decl.id.name;
22442
- path26.stop();
22443
+ path27.stop();
22443
22444
  }
22444
22445
  }
22445
22446
  });
@@ -22766,15 +22767,15 @@ var wslDefaultBrowser = async () => {
22766
22767
  const { stdout } = await executePowerShell(command, { powerShellPath: psPath });
22767
22768
  return stdout.trim();
22768
22769
  };
22769
- var convertWslPathToWindows = async (path26) => {
22770
- if (/^[a-z]+:\/\//i.test(path26)) {
22771
- return path26;
22770
+ var convertWslPathToWindows = async (path27) => {
22771
+ if (/^[a-z]+:\/\//i.test(path27)) {
22772
+ return path27;
22772
22773
  }
22773
22774
  try {
22774
- const { stdout } = await execFile2("wslpath", ["-aw", path26], { encoding: "utf8" });
22775
+ const { stdout } = await execFile2("wslpath", ["-aw", path27], { encoding: "utf8" });
22775
22776
  return stdout.trim();
22776
22777
  } catch {
22777
- return path26;
22778
+ return path27;
22778
22779
  }
22779
22780
  };
22780
22781
 
@@ -25193,8 +25194,8 @@ async function templateCommand(sourcePath, options, config2) {
25193
25194
  const slots = [];
25194
25195
  const componentNames = [];
25195
25196
  chunkJS75ORH7_js.traverse(ast, {
25196
- JSXElement(path26) {
25197
- const openingElement = path26.node.openingElement;
25197
+ JSXElement(path27) {
25198
+ const openingElement = path27.node.openingElement;
25198
25199
  if (chunkJS75ORH7_js.isJSXIdentifier(openingElement.name)) {
25199
25200
  const componentName = openingElement.name.name;
25200
25201
  if (componentName[0] === componentName[0].toUpperCase()) {
@@ -26398,6 +26399,98 @@ async function uploadSchemas(pages, globalSchema, config2) {
26398
26399
  }
26399
26400
  }
26400
26401
  }
26402
+ var APP_DIRS = ["app", path10__default.default.join("src", "app")];
26403
+ var CARD_FILE = /^(opengraph-image|twitter-image)\b.*\.(png|jpe?g|gif|webp)$/i;
26404
+ function safeExists(p) {
26405
+ try {
26406
+ return fs__namespace.default.existsSync(p);
26407
+ } catch {
26408
+ return false;
26409
+ }
26410
+ }
26411
+ function findPageCards(cwd) {
26412
+ const found = [];
26413
+ const walk = (dir) => {
26414
+ let entries;
26415
+ try {
26416
+ entries = fs__namespace.default.readdirSync(dir, { withFileTypes: true });
26417
+ } catch {
26418
+ return;
26419
+ }
26420
+ for (const entry of entries) {
26421
+ if (entry.name.startsWith(".") || entry.name === "node_modules") continue;
26422
+ const full = path10__default.default.join(dir, entry.name);
26423
+ if (entry.isDirectory()) walk(full);
26424
+ else if (CARD_FILE.test(entry.name)) found.push(full);
26425
+ }
26426
+ };
26427
+ for (const rel of APP_DIRS) walk(path10__default.default.join(cwd, rel));
26428
+ return found;
26429
+ }
26430
+ function readOgWiring(cwd) {
26431
+ const siteCard = ["public/og.png", "public/og.jpg", "public/opengraph.png"].some(
26432
+ (rel) => safeExists(path10__default.default.join(cwd, rel))
26433
+ );
26434
+ const layoutPath = ["app/layout.tsx", "src/app/layout.tsx"].map((rel) => path10__default.default.join(cwd, rel)).find(safeExists);
26435
+ let layout = "";
26436
+ if (layoutPath) {
26437
+ try {
26438
+ layout = fs__namespace.default.readFileSync(layoutPath, "utf-8");
26439
+ } catch {
26440
+ }
26441
+ }
26442
+ return {
26443
+ siteCard,
26444
+ pageCards: findPageCards(cwd),
26445
+ layoutDeclaresImages: /images:\s*\[/.test(layout),
26446
+ largeCard: /summary_large_image/.test(layout),
26447
+ referencesImage: /og\.png|opengraph-image|og:image|images:\s*\[/.test(layout),
26448
+ layoutFound: !!layoutPath
26449
+ };
26450
+ }
26451
+ function judgeOgWiring(facts) {
26452
+ const problems = [];
26453
+ if (!facts.layoutFound) {
26454
+ return [{ message: "no app/layout.tsx found to verify metadata", fix: "Run this from the site root." }];
26455
+ }
26456
+ if (!facts.siteCard && !facts.pageCards.length) {
26457
+ return [
26458
+ {
26459
+ message: "no OG card \u2014 shared links render as bare URLs",
26460
+ fix: "Run: sonor-setup og (add og.config.ts for the real brand palette)"
26461
+ }
26462
+ ];
26463
+ }
26464
+ if (facts.pageCards.length) {
26465
+ if (facts.layoutDeclaresImages) {
26466
+ problems.push({
26467
+ message: `openGraph/twitter images are declared in the root layout, which overrides all ${facts.pageCards.length} per-page cards`,
26468
+ fix: "Remove the images arrays from the root layout metadata and let Next serve each route its own opengraph-image file."
26469
+ });
26470
+ }
26471
+ problems.push({
26472
+ message: "seo_pages.managed_og_image (if set in Sonor) overrides per-page cards the same way",
26473
+ fix: "Clear managed_og_image for this project so each page serves its own card."
26474
+ });
26475
+ } else if (!facts.referencesImage) {
26476
+ problems.push({
26477
+ message: "card asset exists but layout metadata never references it",
26478
+ fix: "Add openGraph.images: ['/og.png'] (and twitter.images) to the root layout metadata."
26479
+ });
26480
+ }
26481
+ if (!facts.largeCard) {
26482
+ problems.push({
26483
+ message: "twitter.card is not 'summary_large_image' \u2014 previews render as a small square",
26484
+ fix: "Set twitter: { card: 'summary_large_image' } in the root layout metadata."
26485
+ });
26486
+ }
26487
+ return problems;
26488
+ }
26489
+ function checkOgWiring(cwd) {
26490
+ return judgeOgWiring(readOgWiring(cwd));
26491
+ }
26492
+
26493
+ // src/cli/agent/checks.ts
26401
26494
  var API_URL4 = process.env.SONOR_API_URL || "https://api.sonor.io";
26402
26495
  async function readFileOrNull(p) {
26403
26496
  try {
@@ -27060,58 +27153,19 @@ async function checkImageDimsDrift(cwd) {
27060
27153
  return { id: "images.dims-drift", title: "Image dims vs SVG", level: "ok", message: "Declared dims match SVG viewBoxes" };
27061
27154
  }
27062
27155
  async function checkOgCard(cwd) {
27063
- const staticCard = ["public/og.png", "public/og.jpg", "public/opengraph.png"].some(
27064
- (rel) => existsSyncSafe(path10__default.default.join(cwd, rel))
27065
- );
27066
- let fileConvention = false;
27067
- for (const appDir of ["app", "src/app"]) {
27068
- try {
27069
- const entries = await fs3__default.default.readdir(path10__default.default.join(cwd, appDir));
27070
- if (entries.some((e) => e.startsWith("opengraph-image") || e.startsWith("twitter-image"))) {
27071
- fileConvention = true;
27072
- }
27073
- } catch {
27074
- }
27075
- }
27076
- const layoutPath = ["app/layout.tsx", "src/app/layout.tsx"].map((rel) => path10__default.default.join(cwd, rel)).find(existsSyncSafe);
27077
- const layout = layoutPath ? await readFileOrNull(layoutPath) : null;
27078
- const referencesImage = !!layout && /og\.png|opengraph-image|og:image|images:\s*\[/.test(layout);
27079
- const largeCard = !!layout && /summary_large_image/.test(layout);
27080
- if (!staticCard && !fileConvention) {
27081
- return {
27082
- id: "og.card",
27083
- title: "Open Graph card",
27084
- level: "warn",
27085
- message: "No OG card \u2014 shared links render as bare URLs",
27086
- fix: "Run: sonor-setup og (add og.config.ts for the real brand palette)"
27087
- };
27088
- }
27089
- if (!referencesImage) {
27090
- return {
27091
- id: "og.card",
27092
- title: "Open Graph card",
27093
- level: "warn",
27094
- message: "Card asset exists but layout metadata never references it",
27095
- fix: "Add openGraph.images: ['/og.png'] (and twitter.images) to the root layout metadata."
27096
- };
27097
- }
27098
- if (!largeCard) {
27099
- return {
27100
- id: "og.card",
27101
- title: "Open Graph card",
27102
- level: "warn",
27103
- message: "twitter.card is not 'summary_large_image' \u2014 previews render as a small square",
27104
- fix: "Set twitter: { card: 'summary_large_image' } in the root layout metadata."
27105
- };
27106
- }
27107
- return { id: "og.card", title: "Open Graph card", level: "ok", message: "Card present and wired" };
27108
- }
27109
- function existsSyncSafe(p) {
27110
- try {
27111
- return chunkSNAQBZPT_js.__require("fs").existsSync(p);
27112
- } catch {
27113
- return false;
27156
+ const problems = judgeOgWiring(readOgWiring(cwd));
27157
+ if (!problems.length) {
27158
+ return { id: "og.card", title: "Open Graph card", level: "ok", message: "Cards present and wired" };
27114
27159
  }
27160
+ const [first, ...rest] = problems;
27161
+ return {
27162
+ id: "og.card",
27163
+ title: "Open Graph card",
27164
+ level: "warn",
27165
+ message: first.message,
27166
+ ...rest.length ? { detail: rest.map((p) => `${p.message} \u2014 ${p.fix}`).join("\n") } : {},
27167
+ fix: first.fix
27168
+ };
27115
27169
  }
27116
27170
  async function staticChecks(cwd) {
27117
27171
  return [
@@ -27194,7 +27248,64 @@ async function statusCommand(options) {
27194
27248
  const online = options.offline ? false : true;
27195
27249
  await runCommand(ctx, (c) => run2(c, online), renderChecksHuman("Site-Kit Integration Status"));
27196
27250
  }
27251
+
27252
+ // src/og/pages.ts
27253
+ function stripBrandSuffix(title, brand) {
27254
+ const cleaned = title.replace(/\s*[|–—-]\s*[^|–—-]+$/, "").trim();
27255
+ if (!cleaned) return title.trim();
27256
+ if (brand && cleaned.toLowerCase() === brand.toLowerCase()) return title.trim();
27257
+ return cleaned;
27258
+ }
27259
+ function titleFromPath(path27) {
27260
+ const last = path27.split("/").filter(Boolean).pop();
27261
+ if (!last) return "Home";
27262
+ return last.replace(/[-_]+/g, " ").replace(/\b\w/g, (c) => c.toUpperCase()).trim();
27263
+ }
27264
+ function kickerFromPath(path27, fallback) {
27265
+ const parts = path27.split("/").filter(Boolean);
27266
+ if (parts.length < 2) return fallback;
27267
+ return parts.slice(0, -1).join(" / ").replace(/[-_]+/g, " ");
27268
+ }
27269
+ function clampSubtitle(text, max = 100) {
27270
+ if (!text) return void 0;
27271
+ const flat = text.replace(/\s+/g, " ").trim();
27272
+ if (!flat) return void 0;
27273
+ if (flat.length <= max) return flat;
27274
+ const sentence = flat.slice(0, max + 1).match(/^.*[.!?](?=\s|$)/)?.[0];
27275
+ if (sentence && sentence.length >= 30) return sentence.trim();
27276
+ const cut = flat.slice(0, flat.lastIndexOf(" ", max) || max).trim();
27277
+ return `${cut.replace(/[.,;:!?…]+$/, "")}\u2026`;
27278
+ }
27279
+ function slugForPath(path27) {
27280
+ const trimmed = path27.replace(/^\/+|\/+$/g, "");
27281
+ if (!trimmed) return "home";
27282
+ return trimmed.replace(/[^a-zA-Z0-9]+/g, "-").replace(/^-+|-+$/g, "").toLowerCase();
27283
+ }
27284
+ function pageCardConfig(base, route, brand) {
27285
+ const override = base.cards?.[route.path] ?? base.cards?.[slugForPath(route.path)];
27286
+ const title = route.title ? stripBrandSuffix(route.title, brand) : titleFromPath(route.path);
27287
+ const derived = {
27288
+ ...base,
27289
+ // `cards` is a build-time instruction, not part of a rendered card.
27290
+ cards: void 0,
27291
+ content: {
27292
+ ...base.content,
27293
+ kicker: kickerFromPath(route.path, base.content.kicker),
27294
+ title,
27295
+ subtitle: clampSubtitle(route.description) ?? base.content.subtitle
27296
+ }
27297
+ };
27298
+ if (!override) return derived;
27299
+ return {
27300
+ ...derived,
27301
+ ...override,
27302
+ content: { ...derived.content, ...override.content }
27303
+ };
27304
+ }
27305
+
27306
+ // src/cli/commands/og.ts
27197
27307
  var execFileAsync5 = util.promisify(childProcess.execFile);
27308
+ var RENDER_CONCURRENCY = 4;
27198
27309
  var CHROME_CANDIDATES = [
27199
27310
  process.env.SONOR_CHROME_PATH,
27200
27311
  "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",
@@ -27269,32 +27380,139 @@ function inlinePublicPaths(html, cwd) {
27269
27380
  return fs.existsSync(full) ? `src="file://${full}"` : `src="${p}"`;
27270
27381
  });
27271
27382
  }
27272
- async function verifyMetadataWiring(cwd) {
27273
- const problems = [];
27274
- const layoutPath = ["app/layout.tsx", "src/app/layout.tsx"].map((r) => path10__default.default.join(cwd, r)).find(fs.existsSync);
27275
- if (!layoutPath) return ["no app/layout.tsx found to verify metadata"];
27276
- const layout = await fs3__default.default.readFile(layoutPath, "utf-8");
27277
- if (!/og\.png|opengraph-image|og:image|images:\s*\[/.test(layout)) {
27278
- problems.push("layout metadata never references the card \u2014 add openGraph.images: ['/og.png']");
27383
+ async function renderCard(config2, outPath, cwd, chrome, tmpSuffix) {
27384
+ const tmpHtml = path10__default.default.join(cwd, `.sonor-og-${tmpSuffix}.html`);
27385
+ try {
27386
+ await fs3__default.default.mkdir(path10__default.default.dirname(outPath), { recursive: true });
27387
+ await fs3__default.default.writeFile(tmpHtml, inlinePublicPaths(chunkZAVNGZJZ_js.buildOgHtml(config2), cwd));
27388
+ const { stdout } = await execFileAsync5(
27389
+ chrome,
27390
+ [
27391
+ "--headless=new",
27392
+ "--disable-gpu",
27393
+ "--hide-scrollbars",
27394
+ "--window-size=1200,630",
27395
+ "--virtual-time-budget=10000",
27396
+ `--screenshot=${outPath}`,
27397
+ "--dump-dom",
27398
+ `file://${tmpHtml}`
27399
+ ],
27400
+ { maxBuffer: 32 * 1024 * 1024 }
27401
+ );
27402
+ return parseReport(stdout);
27403
+ } finally {
27404
+ await fs3__default.default.rm(tmpHtml, { force: true });
27405
+ }
27406
+ }
27407
+ function parseReport(dom) {
27408
+ const raw = dom.match(new RegExp(`${chunkZAVNGZJZ_js.OG_REPORT_ATTR}="([^"]*)"`))?.[1];
27409
+ if (!raw) {
27410
+ return { fits: true, titlePx: chunkZAVNGZJZ_js.TITLE_MAX_PX, issues: ["card rendered but could not be measured (fitter did not run)"] };
27279
27411
  }
27280
- if (!/summary_large_image/.test(layout)) {
27281
- problems.push("twitter.card is not 'summary_large_image' \u2014 previews render as a small square");
27412
+ try {
27413
+ const decoded = raw.replace(/&quot;/g, '"').replace(/&amp;/g, "&").replace(/&lt;/g, "<").replace(/&gt;/g, ">");
27414
+ return JSON.parse(decoded);
27415
+ } catch {
27416
+ return { fits: true, titlePx: chunkZAVNGZJZ_js.TITLE_MAX_PX, issues: ["card rendered but the fit report was unreadable"] };
27282
27417
  }
27283
- const ogTitle = layout.match(/openGraph[\s\S]{0,400}?title:\s*['"`]([^'"`]+)/)?.[1];
27284
- if (ogTitle && ogTitle.length > 60) {
27285
- problems.push(`og:title is ${ogTitle.length} chars \u2014 iMessage/Facebook truncate around 60`);
27418
+ }
27419
+ async function compressCard(pngPath, cwd) {
27420
+ try {
27421
+ const require_ = (await import('module')).createRequire(path10__default.default.join(cwd, "package.json"));
27422
+ const sharp = require_("sharp");
27423
+ const jpgPath = pngPath.replace(/\.png$/, ".jpg");
27424
+ await sharp(pngPath).jpeg({ quality: 84, mozjpeg: true }).toFile(jpgPath);
27425
+ await fs3__default.default.rm(pngPath, { force: true });
27426
+ return jpgPath;
27427
+ } catch {
27428
+ return pngPath;
27429
+ }
27430
+ }
27431
+ function discoverDynamicSegments(appDir) {
27432
+ const found = [];
27433
+ const walk = (dir, urlSegments) => {
27434
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
27435
+ if (!entry.isDirectory()) continue;
27436
+ if (entry.name.startsWith("_") || entry.name.startsWith(".")) continue;
27437
+ if (entry.name === "api" || entry.name === "node_modules") continue;
27438
+ const full = path10__default.default.join(dir, entry.name);
27439
+ const isGroup = entry.name.startsWith("(") && entry.name.endsWith(")");
27440
+ const isDynamic = entry.name.startsWith("[") && entry.name.endsWith("]");
27441
+ const nextUrl = isGroup || isDynamic ? urlSegments : [...urlSegments, entry.name];
27442
+ if (isDynamic) {
27443
+ const hasPage = ["tsx", "jsx", "ts", "js"].some((ext2) => fs.existsSync(path10__default.default.join(full, `page.${ext2}`)));
27444
+ if (hasPage) found.push({ dir: full, urlish: `/${urlSegments.join("/")}` });
27445
+ }
27446
+ walk(full, nextUrl);
27447
+ }
27448
+ };
27449
+ walk(appDir, []);
27450
+ return found;
27451
+ }
27452
+ async function pooled(items, limit, fn) {
27453
+ const results = new Array(items.length);
27454
+ let cursor = 0;
27455
+ const workers = Array.from({ length: Math.min(limit, items.length) }, async () => {
27456
+ while (cursor < items.length) {
27457
+ const i = cursor++;
27458
+ results[i] = await fn(items[i], i);
27459
+ }
27460
+ });
27461
+ await Promise.all(workers);
27462
+ return results;
27463
+ }
27464
+ async function resolveRouteCopy(paths) {
27465
+ let getSEOPageData = null;
27466
+ try {
27467
+ if (process.env.SONOR_API_KEY) {
27468
+ ;
27469
+ ({ getSEOPageData } = await import('../api-N5OLQXYN.js'));
27470
+ }
27471
+ } catch {
27472
+ getSEOPageData = null;
27286
27473
  }
27287
- return problems;
27474
+ if (!getSEOPageData) return paths.map((p) => ({ path: p }));
27475
+ return pooled(paths, RENDER_CONCURRENCY, async (p) => {
27476
+ try {
27477
+ const page = await getSEOPageData("", p);
27478
+ const title = page?.managed_title ?? page?.managed_og_title;
27479
+ const description = page?.managed_meta_description ?? page?.managed_og_description;
27480
+ return { path: p, title: title || void 0, description: description || void 0 };
27481
+ } catch {
27482
+ return { path: p };
27483
+ }
27484
+ });
27485
+ }
27486
+ function reportCard(label, report) {
27487
+ if (report.fits && !report.issues.length) {
27488
+ const shrunk = report.titlePx < chunkZAVNGZJZ_js.TITLE_MAX_PX ? source_default.gray(` (title fitted to ${report.titlePx}px)`) : "";
27489
+ console.log(` ${source_default.green("\u2713")} ${label}${shrunk}`);
27490
+ return true;
27491
+ }
27492
+ console.log(` ${report.fits ? source_default.yellow("!") : source_default.red("\u2717")} ${label}`);
27493
+ for (const issue of report.issues) {
27494
+ console.log(source_default.gray(` ${issue}`));
27495
+ }
27496
+ return report.fits;
27288
27497
  }
27289
27498
  async function ogCommand(options) {
27499
+ const ctx = makeContext("og", options);
27500
+ await runCommand(ctx, () => runOg(options));
27501
+ }
27502
+ async function runOg(options) {
27290
27503
  console.log("");
27291
- console.log(source_default.bold(" Generate Open Graph card"));
27504
+ console.log(source_default.bold(" Generate Open Graph cards"));
27292
27505
  console.log("");
27293
27506
  const cwd = process.cwd();
27507
+ const checks = [];
27294
27508
  const chrome = findChrome();
27295
27509
  if (!chrome) {
27296
27510
  console.log(source_default.red(" \u2717 No Chrome/Chromium found. Set SONOR_CHROME_PATH or install Chrome."));
27297
- process.exit(1);
27511
+ return {
27512
+ exitCode: 1 /* FAILED */,
27513
+ summary: "No Chrome/Chromium found",
27514
+ errors: [{ code: "chrome_missing", message: "No Chrome or Chromium binary found", fix: "Install Chrome, or set SONOR_CHROME_PATH to its path." }]
27515
+ };
27298
27516
  }
27299
27517
  let config2 = await loadConfig4(cwd);
27300
27518
  let seeded = false;
@@ -27304,49 +27522,173 @@ async function ogCommand(options) {
27304
27522
  console.log(source_default.yellow(" ! No og.config.ts \u2014 generating a seed card from Sonor brand data."));
27305
27523
  console.log(source_default.gray(" The site owns its theme: add og.config.ts (defineOgCard) with the real palette."));
27306
27524
  }
27307
- const spinner = ora("Rendering with headless Chrome...").start();
27308
27525
  const outPath = path10__default.default.resolve(cwd, options.out || "public/og.png");
27309
- const tmpHtml = path10__default.default.join(cwd, ".sonor-og-tmp.html");
27526
+ let clean = true;
27527
+ let pageCardsWritten = 0;
27528
+ let totalCardBytes = 0;
27529
+ const spinner = ora("Rendering the site card...").start();
27310
27530
  try {
27311
- const html = inlinePublicPaths(chunk6TAXXKMX_js.buildOgHtml(config2), cwd);
27312
- await fs3__default.default.writeFile(tmpHtml, html);
27313
- await execFileAsync5(chrome, [
27314
- "--headless=new",
27315
- "--disable-gpu",
27316
- "--hide-scrollbars",
27317
- "--window-size=1200,630",
27318
- "--virtual-time-budget=10000",
27319
- `--screenshot=${outPath}`,
27320
- `file://${tmpHtml}`
27321
- ]);
27322
- spinner.succeed(`Wrote ${path10__default.default.relative(cwd, outPath)} (1200x630${seeded ? ", seed card" : ""})`);
27323
- if (options.preview !== false) {
27324
- try {
27325
- const require_ = (await import('module')).createRequire(path10__default.default.join(cwd, "package.json"));
27326
- const sharp = require_("sharp");
27327
- const previewPath = path10__default.default.join(cwd, "public/og-preview.png");
27328
- await sharp(outPath).resize(300).toFile(previewPath);
27329
- console.log(source_default.gray(` Preview at thumbnail size: ${path10__default.default.relative(cwd, previewPath)} \u2014 if text is mush there, fix the card.`));
27330
- } catch {
27331
- console.log(source_default.gray(" (sharp not resolvable \u2014 skipped the 300px preview)"));
27531
+ const report = await renderCard(config2, outPath, cwd, chrome, "site");
27532
+ spinner.stop();
27533
+ console.log(source_default.bold(` Site card${seeded ? source_default.gray(" (seed)") : ""}`));
27534
+ clean = reportCard(`${path10__default.default.relative(cwd, outPath)} \u2014 1200x630`, report) && clean;
27535
+ checks.push(cardCheck("site card", path10__default.default.relative(cwd, outPath), report));
27536
+ } catch (err) {
27537
+ const message = err instanceof Error ? err.message.split("\n")[0] : String(err);
27538
+ spinner.fail(`Render failed: ${message}`);
27539
+ return {
27540
+ exitCode: 1 /* FAILED */,
27541
+ summary: `Site card render failed: ${message}`,
27542
+ errors: [{ code: "render_failed", message, fix: "Check og.config.ts loads and the referenced assets exist under public/." }]
27543
+ };
27544
+ }
27545
+ if (options.pages !== false) {
27546
+ const appDir = chunkLOS5D6B3_js.findAppDirForDiscovery(cwd);
27547
+ if (!appDir) {
27548
+ console.log(source_default.yellow(" ! No app/ directory found \u2014 skipped per-page cards."));
27549
+ } else {
27550
+ const routes = [...new Set(chunkLOS5D6B3_js.discoverNextJsRoutes(appDir).map((r) => r.path))];
27551
+ if (!routes.length) {
27552
+ console.log(source_default.yellow(" ! No static routes discovered \u2014 skipped per-page cards."));
27553
+ } else {
27554
+ console.log("");
27555
+ console.log(source_default.bold(` Page cards`));
27556
+ const copySpinner = ora("Reading managed titles from Sonor...").start();
27557
+ const withCopy = await resolveRouteCopy(routes);
27558
+ const named = withCopy.filter((r) => r.title).length;
27559
+ copySpinner.stop();
27560
+ if (named) {
27561
+ console.log(source_default.gray(` ${named}/${routes.length} titled from Sonor, the rest from the route path`));
27562
+ } else {
27563
+ console.log(source_default.gray(" titled from route paths (no SONOR_API_KEY, or no managed titles yet)"));
27564
+ }
27565
+ const brand = config2.content.title.replace(/\n/g, " ").trim();
27566
+ const copyByPath = new Map(withCopy.map((r) => [r.path, r]));
27567
+ const dynamic = discoverDynamicSegments(appDir).map((seg) => ({
27568
+ ...copyByPath.get(seg.urlish) ?? { path: seg.urlish },
27569
+ path: `${seg.urlish}/*`,
27570
+ dir: seg.dir
27571
+ }));
27572
+ const targets = [...withCopy, ...dynamic];
27573
+ const reports = await pooled(targets, RENDER_CONCURRENCY, async (route, i) => {
27574
+ const pageConfig = pageCardConfig(config2, route, brand);
27575
+ const dir = route.dir ?? routeOutputDir(appDir, route.path);
27576
+ for (const ext2 of ["png", "jpg", "jpeg"]) {
27577
+ await fs3__default.default.rm(path10__default.default.join(dir, `opengraph-image.${ext2}`), { force: true });
27578
+ }
27579
+ const png = path10__default.default.join(dir, "opengraph-image.png");
27580
+ const report = await renderCard(pageConfig, png, cwd, chrome, `page-${i}`);
27581
+ const file = await compressCard(png, cwd);
27582
+ return { route, file, report };
27583
+ });
27584
+ for (const { route, file, report } of reports) {
27585
+ clean = reportCard(`${route.path} ${source_default.gray(path10__default.default.relative(cwd, file))}`, report) && clean;
27586
+ checks.push(cardCheck(route.path, path10__default.default.relative(cwd, file), report));
27587
+ }
27588
+ pageCardsWritten = reports.length;
27589
+ const bytes = await totalBytes(reports.map((r) => r.file));
27590
+ totalCardBytes = bytes;
27591
+ console.log(source_default.gray(` ${(bytes / 1024 / 1024).toFixed(1)} MB of cards. Next serves these automatically \u2014 no per-page metadata needed.`));
27332
27592
  }
27333
27593
  }
27334
- const problems = await verifyMetadataWiring(cwd);
27335
- if (problems.length) {
27594
+ }
27595
+ if (options.preview !== false) {
27596
+ try {
27597
+ const require_ = (await import('module')).createRequire(path10__default.default.join(cwd, "package.json"));
27598
+ const sharp = require_("sharp");
27599
+ const previewPath = path10__default.default.join(cwd, ".sonor", "og-preview.png");
27600
+ await fs3__default.default.mkdir(path10__default.default.dirname(previewPath), { recursive: true });
27601
+ await sharp(outPath).resize(300).toFile(previewPath);
27336
27602
  console.log("");
27337
- console.log(source_default.yellow(" Metadata wiring:"));
27338
- for (const p of problems) console.log(source_default.yellow(` ! ${p}`));
27339
- } else {
27340
- console.log(source_default.green(" \u2713 Metadata wiring looks right (og:image, summary_large_image, title length)"));
27603
+ console.log(source_default.gray(` Thumbnail check: ${path10__default.default.relative(cwd, previewPath)} \u2014 if text is mush there, fix the card.`));
27604
+ } catch {
27605
+ console.log(source_default.gray(" (sharp not resolvable \u2014 skipped the 300px preview)"));
27341
27606
  }
27342
- console.log(source_default.gray(" Reminder: Facebook caches cards \u2014 re-scrape at developers.facebook.com/tools/debug/"));
27607
+ }
27608
+ const problems = checkOgWiring(cwd);
27609
+ console.log("");
27610
+ if (problems.length) {
27611
+ console.log(source_default.yellow(" Metadata wiring:"));
27612
+ for (const p of problems) {
27613
+ console.log(source_default.yellow(` ! ${p.message}`));
27614
+ console.log(source_default.gray(` ${p.fix}`));
27615
+ }
27616
+ } else {
27617
+ console.log(source_default.green(" \u2713 Metadata wiring looks right (og:image, summary_large_image, title length)"));
27618
+ }
27619
+ const domain = await siteDomain(cwd);
27620
+ console.log(
27621
+ source_default.gray(
27622
+ ` Facebook caches cards \u2014 re-scrape at https://developers.facebook.com/tools/debug/${domain ? `?q=${encodeURIComponent(domain)}` : ""}`
27623
+ )
27624
+ );
27625
+ console.log("");
27626
+ if (!clean) {
27627
+ console.log(source_default.red(" \u2717 One or more cards do not fit. Fix the copy above and re-run."));
27343
27628
  console.log("");
27344
- } catch (err) {
27345
- spinner.fail(`Render failed: ${err instanceof Error ? err.message.split("\n")[0] : err}`);
27346
- process.exit(1);
27347
- } finally {
27348
- await fs3__default.default.rm(tmpHtml, { force: true });
27349
27629
  }
27630
+ for (const problem of problems) {
27631
+ checks.push({
27632
+ id: "og.wiring",
27633
+ title: "Metadata wiring",
27634
+ level: "warn",
27635
+ message: problem.message,
27636
+ fix: problem.fix
27637
+ });
27638
+ }
27639
+ const cards = 1 + pageCardsWritten;
27640
+ return {
27641
+ exitCode: clean ? 0 /* OK */ : 1 /* FAILED */,
27642
+ summary: clean ? `${cards} card${cards === 1 ? "" : "s"} rendered, all fitting` : `${cards} card${cards === 1 ? "" : "s"} rendered, some do not fit`,
27643
+ data: { cards, bytes: totalCardBytes },
27644
+ checks,
27645
+ nextSteps: problems.map((p) => p.fix)
27646
+ };
27647
+ }
27648
+ function cardCheck(label, file, report) {
27649
+ const clean = report.fits && !report.issues.length;
27650
+ return {
27651
+ id: "og.card",
27652
+ title: label,
27653
+ level: clean ? "ok" : report.fits ? "warn" : "error",
27654
+ message: clean ? `${file} (title ${report.titlePx}px)` : report.issues.join("; "),
27655
+ ...clean ? {} : { fix: "Shorten the copy for this card, or give it an override in og.config.ts `cards`." }
27656
+ };
27657
+ }
27658
+ function routeOutputDir(appDir, urlPath) {
27659
+ const segments = urlPath.split("/").filter(Boolean);
27660
+ let dir = appDir;
27661
+ for (const segment of segments) {
27662
+ const direct = path10__default.default.join(dir, segment);
27663
+ if (fs.existsSync(direct)) {
27664
+ dir = direct;
27665
+ continue;
27666
+ }
27667
+ const group = fs.existsSync(dir) ? fs.readdirSync(dir, { withFileTypes: true }).find(
27668
+ (e) => e.isDirectory() && e.name.startsWith("(") && e.name.endsWith(")") && fs.existsSync(path10__default.default.join(dir, e.name, segment))
27669
+ ) : void 0;
27670
+ dir = group ? path10__default.default.join(dir, group.name, segment) : direct;
27671
+ }
27672
+ return dir;
27673
+ }
27674
+ async function totalBytes(files) {
27675
+ let total = 0;
27676
+ for (const f of files) {
27677
+ try {
27678
+ total += (await fs3__default.default.stat(f)).size;
27679
+ } catch {
27680
+ }
27681
+ }
27682
+ return total;
27683
+ }
27684
+ async function siteDomain(cwd) {
27685
+ const envFile = path10__default.default.join(cwd, ".env.local");
27686
+ if (fs.existsSync(envFile)) {
27687
+ const env3 = await fs3__default.default.readFile(envFile, "utf-8").catch(() => "");
27688
+ const url = env3.match(/^NEXT_PUBLIC_SITE_URL=(.+)$/m)?.[1]?.trim();
27689
+ if (url) return url.replace(/\/+$/, "");
27690
+ }
27691
+ return null;
27350
27692
  }
27351
27693
  var execFileAsync6 = util.promisify(childProcess.execFile);
27352
27694
  async function next16Command() {
@@ -27465,14 +27807,14 @@ var hs = new RegExp(pe, "g");
27465
27807
  var as = /\\\\/g;
27466
27808
  var ls = /\\{/g;
27467
27809
  var cs = /\\}/g;
27468
- var fs19 = /\\,/g;
27810
+ var fs20 = /\\,/g;
27469
27811
  var us = /\\./g;
27470
27812
  var ds = 1e5;
27471
27813
  function Ht(n5) {
27472
27814
  return isNaN(n5) ? n5.charCodeAt(0) : parseInt(n5, 10);
27473
27815
  }
27474
27816
  function ps(n5) {
27475
- return n5.replace(as, fe).replace(ls, ue).replace(cs, qt).replace(fs19, de).replace(us, pe);
27817
+ return n5.replace(as, fe).replace(ls, ue).replace(cs, qt).replace(fs20, de).replace(us, pe);
27476
27818
  }
27477
27819
  function ms(n5) {
27478
27820
  return n5.replace(is, "\\").replace(rs, "{").replace(ns, "}").replace(os5, ",").replace(hs, ".");
@@ -32049,7 +32391,7 @@ async function geoCommand(options) {
32049
32391
  (0, import_dotenv.config)({ path: ".env.local", quiet: true });
32050
32392
  (0, import_dotenv.config)({ path: ".env", quiet: true });
32051
32393
  var program2 = new Command();
32052
- program2.name("sonor-setup").description("Setup + verification toolchain for @sonordev/site-kit").version(chunkUUBW2NJZ_js.SITE_KIT_VERSION);
32394
+ program2.name("sonor-setup").description("Setup + verification toolchain for @sonordev/site-kit").version(chunkS5L73KZQ_js.SITE_KIT_VERSION);
32053
32395
  withAgentFlags(
32054
32396
  program2.command("verify").description("Verify the integration actually works (health + key + SSR) \u2014 exit 0 = done").option("--url <url>", "Verify a running/deployed URL server-renders (recommended for agents)").option("--offline", "Skip the network key-validity ping").option("--strict", "Treat warnings as failures")
32055
32397
  ).action(verifyCommand);
@@ -32066,7 +32408,7 @@ withAgentFlags(
32066
32408
  program2.command("manifest").description("Print the machine-readable agent manifest (modules, env, patterns, failure modes)").option("--section <name>", "Print one section: env | modules | commands | blessedPatterns | failureModes")
32067
32409
  ).action(manifestCommand);
32068
32410
  withAgentFlags(
32069
- program2.command("og").description("Generate the Open Graph card (public/og.png) from og.config.ts via headless Chrome").option("--no-preview", "Skip the 300px thumbnail legibility preview").option("--out <path>", "Output path (default public/og.png)")
32411
+ program2.command("og").description("Generate Open Graph cards \u2014 the site card plus one per page \u2014 via headless Chrome").option("--no-preview", "Skip the 300px thumbnail legibility preview").option("--no-pages", "Only render the site card, skip the per-page cards").option("--out <path>", "Site card output path (default public/og.png)")
32070
32412
  ).action(ogCommand);
32071
32413
  withAgentFlags(
32072
32414
  program2.command("next16").description("Migrate middleware.ts to proxy.ts (official codemod) and verify")