@canonry/canonry 7.99.0 → 7.100.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.
Files changed (182) hide show
  1. package/README.md +18 -16
  2. package/assets/agent-workspace/AGENTS.md +13 -6
  3. package/assets/agent-workspace/skills/aero/SKILL.md +45 -26
  4. package/assets/agent-workspace/skills/aero/references/agent-operations.md +47 -12
  5. package/assets/agent-workspace/skills/aero/references/memory-patterns.md +1 -1
  6. package/assets/agent-workspace/skills/aero/references/orchestration.md +9 -9
  7. package/assets/agent-workspace/skills/aero/references/reporting.md +8 -4
  8. package/assets/agent-workspace/skills/aero/references/seo-analysis.md +2 -2
  9. package/assets/agent-workspace/skills/aero/references/site-health.md +23 -22
  10. package/assets/agent-workspace/skills/aero/soul.md +2 -2
  11. package/assets/agent-workspace/skills/canonry/SKILL.md +37 -7
  12. package/assets/agent-workspace/skills/canonry/references/aeo-analysis.md +14 -11
  13. package/assets/agent-workspace/skills/canonry/references/canonry-cli.md +122 -53
  14. package/assets/assets/AccessControls-DzO5Y8v9.js +2 -0
  15. package/assets/assets/AgentSetupPage-DWWovaCw.js +36 -0
  16. package/assets/assets/AuditHistoryPanel-BG-n1i8c.js +1 -0
  17. package/assets/assets/BacklinksPage-D6wdOMXt.js +1 -0
  18. package/assets/assets/ChartPrimitives-CtKdkn64.js +3 -0
  19. package/assets/assets/Hint-3TTi0MgX.js +1 -0
  20. package/assets/assets/{HistoryPage-DNE76LNh.js → HistoryPage-B_ReWHbL.js} +1 -1
  21. package/assets/assets/InfoTooltip-D29JcNMW.js +1 -0
  22. package/assets/assets/MeasurementPropertyPage-zdyLL-kl.js +4 -0
  23. package/assets/assets/ProjectPage-KZNKXR4w.js +15 -0
  24. package/assets/assets/RunsPage-DxN0xXQh.js +1 -0
  25. package/assets/assets/ServerTrafficSection-CvISj5pf.js +40 -0
  26. package/assets/assets/SettingsPage-CpRpBlMV.js +1 -0
  27. package/assets/assets/ToneBadge-DcwPruHr.js +60 -0
  28. package/assets/assets/TrafficPage-zk6zMZyz.js +1 -0
  29. package/assets/assets/TrafficSourceDetailPage-DJtsI06Z.js +1 -0
  30. package/assets/assets/{account-context-j3asaevn.js → account-context-CoJVqEXZ.js} +1 -1
  31. package/assets/assets/{agent-trust-copy--U_DFYQE.js → agent-trust-copy-BIXDMtBm.js} +1 -1
  32. package/assets/assets/{card-CQAQ-c3g.js → card-Dwmc7Srx.js} +1 -1
  33. package/assets/assets/index-fh1T5JQY.css +1 -0
  34. package/assets/assets/index-mqc2mWUR.js +42 -0
  35. package/assets/assets/query-client-Tg1fZu4i.js +1 -0
  36. package/assets/assets/react-query-BqcEEfEO.js +1 -0
  37. package/assets/assets/{react-sigma_core.esm.min-BAq_-iP1.js → react-sigma_core.esm.min-D1q0DR_j.js} +3 -3
  38. package/assets/assets/{server-traffic-jKXLZyeC.js → server-traffic-Djnh_9f0.js} +1 -1
  39. package/assets/assets/service-BQjBdN4O.js +1 -0
  40. package/assets/assets/use-tooltip-position-BOzm-6Wy.js +1 -0
  41. package/assets/assets/vendor-lucide-iE5MEh2-.js +1 -0
  42. package/assets/assets/{vendor-markdown-BDQ1GKGP.js → vendor-markdown-BBGbNklj.js} +1 -1
  43. package/assets/assets/{vendor-radix-BGYlvS2l.js → vendor-radix-DKCt5Z_h.js} +1 -1
  44. package/assets/assets/{vendor-recharts-DhEHcK3G.js → vendor-recharts-D3MLFU3q.js} +1 -1
  45. package/assets/assets/{vendor-tanstack-BNuZ37rE.js → vendor-tanstack-B90HW50P.js} +2 -2
  46. package/assets/index.html +16 -15
  47. package/dist/{ads-EYDUTG4U.js → ads-FVPZ6R6Z.js} +3 -3
  48. package/dist/{agent-KTK2IDB3.js → agent-2LPU2E5I.js} +7 -7
  49. package/dist/{agent-ask-KPZOH6RY.js → agent-ask-5ODREK6D.js} +3 -3
  50. package/dist/{agent-conversations-BCWA4JJL.js → agent-conversations-SNLOOJEM.js} +3 -3
  51. package/dist/{agent-journeys-UBVLQ7JV.js → agent-journeys-XDXVL6PK.js} +3 -3
  52. package/dist/{agent-memory-24SYEGEX.js → agent-memory-NKAI2S3U.js} +3 -3
  53. package/dist/{agent-providers-E7EWFE5P.js → agent-providers-R5L7A72X.js} +3 -3
  54. package/dist/{agent-transcript-QGJ45NW5.js → agent-transcript-C5WAGYVC.js} +3 -3
  55. package/dist/{analytics-GHVG5CCT.js → analytics-EJVOLIQL.js} +33 -13
  56. package/dist/{apply-7YLB2DPH.js → apply-I6JOM247.js} +3 -3
  57. package/dist/{backfill-WNQ6O5WP.js → backfill-UVUR36IB.js} +10 -10
  58. package/dist/{backlinks-ZBZR4D27.js → backlinks-3VMVACWN.js} +3 -3
  59. package/dist/{bing-4VBSKPSX.js → bing-R5RL3PW2.js} +3 -3
  60. package/dist/{bootstrap-7ESCLP2G.js → bootstrap-GMMSDTNO.js} +12 -12
  61. package/dist/{cdp-WBL6FZTL.js → cdp-FJKUXHEY.js} +7 -7
  62. package/dist/{chunk-L53ZSQN5.js → chunk-2DV7F6XA.js} +91 -2
  63. package/dist/{chunk-MTW37GXF.js → chunk-2FWYWGIR.js} +2 -2
  64. package/dist/{chunk-DMPSA7ZS.js → chunk-56VVRWJM.js} +14 -5
  65. package/dist/{chunk-YACKJGY4.js → chunk-7BEGCVVB.js} +1 -1
  66. package/dist/{chunk-YMHN4UIT.js → chunk-7BH53MOB.js} +27 -2
  67. package/dist/{chunk-XPIMVXAI.js → chunk-7J2RIIYU.js} +1366 -1033
  68. package/dist/{chunk-UY6SKAKW.js → chunk-7SNMIXEQ.js} +2 -2
  69. package/dist/{chunk-C55P75G4.js → chunk-AMGM55CP.js} +2 -2
  70. package/dist/{chunk-ZN2TEBBX.js → chunk-AYKTVQF7.js} +13 -5
  71. package/dist/{chunk-74V5EPZH.js → chunk-BKDRT4VS.js} +7 -7
  72. package/dist/{chunk-O6RXNSNW.js → chunk-COHSL6KW.js} +1 -1
  73. package/dist/{chunk-3WDQ5GPO.js → chunk-DGDLLRS4.js} +1 -1
  74. package/dist/{chunk-VADVPARO.js → chunk-DHIB7EIA.js} +4 -4
  75. package/dist/{chunk-3MFYM2IS.js → chunk-EE3QTCLS.js} +18 -6
  76. package/dist/{chunk-DLOWRO5R.js → chunk-F46TBLXK.js} +204 -94
  77. package/dist/{chunk-P764TJKQ.js → chunk-FBO25TA3.js} +1 -1
  78. package/dist/{chunk-SY3CWJR4.js → chunk-FZ3MUTU3.js} +2 -2
  79. package/dist/{chunk-WA6APXI6.js → chunk-G6QN4VFS.js} +16 -10
  80. package/dist/{chunk-YBWATBX4.js → chunk-HBHLYWKE.js} +9 -6
  81. package/dist/{chunk-5ZOM5BJS.js → chunk-HL2LGRTI.js} +8 -6
  82. package/dist/chunk-J6536OL6.js +31 -0
  83. package/dist/{chunk-3MKJ4LP6.js → chunk-KVRX7YIH.js} +20 -10
  84. package/dist/{chunk-3VPBRGPN.js → chunk-LJO2BKWU.js} +1 -1
  85. package/dist/{chunk-YEUULP44.js → chunk-LNVFERI4.js} +1 -1
  86. package/dist/{chunk-WXAF7AMC.js → chunk-NQYJHKML.js} +39 -7
  87. package/dist/{chunk-UPHHKO3L.js → chunk-O5UFAXUI.js} +646 -588
  88. package/dist/{chunk-XQP3XHLJ.js → chunk-O6APBEJE.js} +2 -2
  89. package/dist/{chunk-47X24IJG.js → chunk-O7S7OHLE.js} +9393 -8394
  90. package/dist/{chunk-2RW5D55K.js → chunk-QS5DWJDI.js} +2 -2
  91. package/dist/{chunk-TVBOK4P2.js → chunk-RBG2QXQM.js} +4 -4
  92. package/dist/{chunk-LM7HTNUO.js → chunk-SWZXHHAG.js} +16 -8
  93. package/dist/{chunk-AY7SDX6G.js → chunk-T7UDY7W3.js} +26 -11
  94. package/dist/{chunk-AJD252SX.js → chunk-UGO2FO6V.js} +119 -55
  95. package/dist/{chunk-PT5HNVCM.js → chunk-VHULVUDL.js} +1 -1
  96. package/dist/{chunk-ZGBLNKFN.js → chunk-YGAQQSCL.js} +56303 -54933
  97. package/dist/{chunk-RRXLJPBN.js → chunk-YIIRS7V7.js} +98 -65
  98. package/dist/{chunk-VOVT2H25.js → chunk-YU2WX7RD.js} +3 -3
  99. package/dist/{citations-N5MGNKJN.js → citations-LOEQRDUB.js} +21 -10
  100. package/dist/{cli-catalog-FFU7PHW7.js → cli-catalog-5RXNUFBS.js} +3 -3
  101. package/dist/{cli-commands-AMIDEUO2.js → cli-commands-HE2BQY3Y.js} +7 -7
  102. package/dist/cli.js +22 -17
  103. package/dist/{competitor-GRA2GMZR.js → competitor-PIX2BHJW.js} +3 -3
  104. package/dist/{content-YVAPTIV4.js → content-PJGW4WZF.js} +3 -3
  105. package/dist/{dashboard-33ACBR5A.js → dashboard-7OKBD4MG.js} +6 -6
  106. package/dist/{demo-AGXWBMR6.js → demo-SCOFAWFM.js} +1 -1
  107. package/dist/{demo-server-W4YAC7GT.js → demo-server-SJPI6RSL.js} +38 -36
  108. package/dist/{discover-BH33TO4Z.js → discover-I3WL2QUN.js} +10 -8
  109. package/dist/{discover-eval-3CEA6DEE.js → discover-eval-YRECOIP5.js} +3 -3
  110. package/dist/{doctor-ZAYTD5PC.js → doctor-F4J6LILX.js} +3 -3
  111. package/dist/{evidence-247GL7UK.js → evidence-MYQTCY4V.js} +25 -10
  112. package/dist/{export-cmd-HLKWFI5Q.js → export-cmd-3SUFOJM6.js} +3 -3
  113. package/dist/{ga-BMING57Z.js → ga-VA6FYK4L.js} +3 -3
  114. package/dist/{gbp-MIB5CXSD.js → gbp-DI6ZVFHL.js} +3 -3
  115. package/dist/{google-5JP6RYAW.js → google-UVKWJCD2.js} +4 -4
  116. package/dist/{google-marketing-25OBMPS6.js → google-marketing-S63HN733.js} +1 -1
  117. package/dist/{health-cmd-D5XSEL7H.js → health-cmd-DOZXGI46.js} +16 -9
  118. package/dist/{history-6MDRFPQ3.js → history-UTJTUDYK.js} +3 -3
  119. package/dist/index.d.ts +211 -19
  120. package/dist/index.js +26 -26
  121. package/dist/{init-RDR75N2Y.js → init-IVJSS33J.js} +19 -19
  122. package/dist/{insights-QZVMBGVM.js → insights-UHCVCZ76.js} +3 -3
  123. package/dist/intelligence-service-3EENJ5DS.js +16 -0
  124. package/dist/{journeys-TABTZDFZ.js → journeys-XIT7WDM2.js} +3 -3
  125. package/dist/{keys-SL5YF7NQ.js → keys-MQKW4JUI.js} +3 -3
  126. package/dist/{keyword-OCDEXRSW.js → keyword-EASMKYZ3.js} +3 -3
  127. package/dist/{logs-CSC7O364.js → logs-ZHZ6XM55.js} +3 -3
  128. package/dist/{mcp-P725OHAJ.js → mcp-ECVT2YGU.js} +4 -4
  129. package/dist/mcp.js +10 -10
  130. package/dist/{measurement-plan-Z42GBJBO.js → measurement-plan-7FQKUOMR.js} +5 -5
  131. package/dist/{notify-E5JBES4I.js → notify-TC7ARC6W.js} +3 -3
  132. package/dist/{organic-evidence-CUA3T64O.js → organic-evidence-M34MWJXE.js} +7 -4
  133. package/dist/overview-P6BRMXJN.js +314 -0
  134. package/dist/{project-2ULM64TV.js → project-WZ2YXFPJ.js} +4 -4
  135. package/dist/project-setup-WV6SPGIV.js +176 -0
  136. package/dist/{query-Y47IEFKJ.js → query-WAFJKDHG.js} +3 -3
  137. package/dist/{research-DPFQZ3TE.js → research-B5ZPQX7R.js} +3 -3
  138. package/dist/{results-export-KBHOBQAH.js → results-export-NIZV6R3K.js} +3 -3
  139. package/dist/{run-4CYHVIIU.js → run-ICLPZ7QT.js} +7 -4
  140. package/dist/{schedule-GY4P3RON.js → schedule-4C44LQ7R.js} +22 -3
  141. package/dist/{search-AGVNZMJQ.js → search-UJM7KII3.js} +11 -4
  142. package/dist/{serve-5LFKIXNL.js → serve-A6UIO6WP.js} +30 -29
  143. package/dist/{session-YAYEDM3P.js → session-RTE22GQT.js} +14 -14
  144. package/dist/settings-BOF5Z7ML.js +211 -0
  145. package/dist/{sitemaps-APTY7U6H.js → sitemaps-BM7S76H2.js} +4 -4
  146. package/dist/{skills-4BUONEIZ.js → skills-X5SR4HRO.js} +2 -2
  147. package/dist/{snapshot-BXCWSF5P.js → snapshot-KLKE37VY.js} +4 -4
  148. package/dist/{src-R7XZUX3D.js → src-EKLG5A6O.js} +4 -2
  149. package/dist/{status-SB6HPBYJ.js → status-OYG57DWU.js} +6 -5
  150. package/dist/{technical-aeo-G7UEMWZD.js → technical-aeo-KWVWOOTI.js} +23 -23
  151. package/dist/{telemetry-H4S4Y7YV.js → telemetry-KGE6FF3Y.js} +4 -4
  152. package/dist/{tools-46XX6I4R.js → tools-4R33AZQ3.js} +11 -11
  153. package/dist/{traffic-I6WRJN3W.js → traffic-SVMOKCSS.js} +7 -11
  154. package/dist/{trends-AQK3GLWF.js → trends-RGAKGX3L.js} +4 -4
  155. package/dist/{users-SNTVY6OB.js → users-47WKA2TO.js} +3 -3
  156. package/dist/{visibility-stats-44QAD2XS.js → visibility-stats-DTGQJPNV.js} +9 -5
  157. package/dist/{wordpress-N7LTOW46.js → wordpress-2CNUX4UE.js} +3 -3
  158. package/package.json +1 -1
  159. package/assets/assets/AgentSetupPage-yOqSVJ-e.js +0 -18
  160. package/assets/assets/AuditHistoryPanel-CiTzFgbw.js +0 -1
  161. package/assets/assets/BacklinksPage-DmRdQsFQ.js +0 -1
  162. package/assets/assets/ChartPrimitives-CvK6CQrj.js +0 -1
  163. package/assets/assets/Hint-c4a4W87X.js +0 -1
  164. package/assets/assets/InfoTooltip-Drnst4ML.js +0 -1
  165. package/assets/assets/MeasurementPropertyPage-Cx64Fnmz.js +0 -4
  166. package/assets/assets/ProjectPage-DNfgC82V.js +0 -11
  167. package/assets/assets/RunsPage-BmPKBKKr.js +0 -1
  168. package/assets/assets/SettingsPage-Dl0TNeVK.js +0 -1
  169. package/assets/assets/SiteHealthSection-DxQPaR--.js +0 -2
  170. package/assets/assets/ToneBadge-BhjTBHi-.js +0 -60
  171. package/assets/assets/TrafficPage-CJp0pS01.js +0 -40
  172. package/assets/assets/TrafficSourceDetailPage-DKE8tSw5.js +0 -1
  173. package/assets/assets/format-helpers-BPugHeIX.js +0 -3
  174. package/assets/assets/index-BAxHW-1G.css +0 -1
  175. package/assets/assets/index-xlDLvgRC.js +0 -60
  176. package/assets/assets/query-client-CwZpfiiD.js +0 -1
  177. package/assets/assets/react-query-CBpNFR4t.js +0 -1
  178. package/assets/assets/service-DFumlmXt.js +0 -1
  179. package/assets/assets/vendor-lucide-DuOM7wVi.js +0 -1
  180. package/dist/intelligence-service-KQE7RO5I.js +0 -16
  181. package/dist/overview-UKQ52I72.js +0 -213
  182. package/dist/settings-HUKMWRHY.js +0 -119
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  createApiClient
3
- } from "./chunk-AJD252SX.js";
4
- import "./chunk-3MFYM2IS.js";
3
+ } from "./chunk-UGO2FO6V.js";
4
+ import "./chunk-EE3QTCLS.js";
5
5
  import {
6
6
  emitJsonl
7
7
  } from "./chunk-Z7IUAJOF.js";
@@ -10,7 +10,7 @@ import {
10
10
  CliError,
11
11
  isMachineFormat
12
12
  } from "./chunk-HGMYEDAQ.js";
13
- import "./chunk-47X24IJG.js";
13
+ import "./chunk-O7S7OHLE.js";
14
14
  import "./chunk-MLKGABMK.js";
15
15
 
16
16
  // src/commands/keyword.ts
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  createApiClient
3
- } from "./chunk-AJD252SX.js";
4
- import "./chunk-3MFYM2IS.js";
3
+ } from "./chunk-UGO2FO6V.js";
4
+ import "./chunk-EE3QTCLS.js";
5
5
  import "./chunk-AOJU5LKX.js";
6
6
  import {
7
7
  isMachineFormat,
@@ -9,7 +9,7 @@ import {
9
9
  } from "./chunk-HGMYEDAQ.js";
10
10
  import {
11
11
  logQuerySchema
12
- } from "./chunk-47X24IJG.js";
12
+ } from "./chunk-O7S7OHLE.js";
13
13
  import "./chunk-MLKGABMK.js";
14
14
 
15
15
  // src/commands/logs.ts
@@ -3,13 +3,13 @@ import {
3
3
  printMcpConfig,
4
4
  renderClientSnippet,
5
5
  showMcpProfile
6
- } from "./chunk-2RW5D55K.js";
6
+ } from "./chunk-QS5DWJDI.js";
7
7
  import "./chunk-VJWDBFSL.js";
8
- import "./chunk-AJD252SX.js";
9
- import "./chunk-3MFYM2IS.js";
8
+ import "./chunk-UGO2FO6V.js";
9
+ import "./chunk-EE3QTCLS.js";
10
10
  import "./chunk-AOJU5LKX.js";
11
11
  import "./chunk-HGMYEDAQ.js";
12
- import "./chunk-47X24IJG.js";
12
+ import "./chunk-O7S7OHLE.js";
13
13
  import "./chunk-MLKGABMK.js";
14
14
  export {
15
15
  installMcp,
package/dist/mcp.js CHANGED
@@ -1,25 +1,25 @@
1
1
  import {
2
2
  autoSyncSkills
3
- } from "./chunk-VOVT2H25.js";
3
+ } from "./chunk-YU2WX7RD.js";
4
4
  import {
5
5
  createCanonryMcpServer
6
- } from "./chunk-WA6APXI6.js";
7
- import "./chunk-MTW37GXF.js";
6
+ } from "./chunk-G6QN4VFS.js";
7
+ import "./chunk-2FWYWGIR.js";
8
8
  import {
9
9
  createApiClient
10
- } from "./chunk-AJD252SX.js";
11
- import "./chunk-3MFYM2IS.js";
12
- import "./chunk-P764TJKQ.js";
13
- import "./chunk-DLOWRO5R.js";
14
- import "./chunk-3WDQ5GPO.js";
15
- import "./chunk-YACKJGY4.js";
10
+ } from "./chunk-UGO2FO6V.js";
11
+ import "./chunk-EE3QTCLS.js";
12
+ import "./chunk-FBO25TA3.js";
13
+ import "./chunk-F46TBLXK.js";
14
+ import "./chunk-DGDLLRS4.js";
15
+ import "./chunk-7BEGCVVB.js";
16
16
  import "./chunk-AOJU5LKX.js";
17
17
  import "./chunk-HGMYEDAQ.js";
18
18
  import {
19
19
  describeError,
20
20
  isReadOnlyKey,
21
21
  updateCheckEnvOptOut
22
- } from "./chunk-47X24IJG.js";
22
+ } from "./chunk-O7S7OHLE.js";
23
23
  import "./chunk-MLKGABMK.js";
24
24
 
25
25
  // src/mcp/cli.ts
@@ -14,14 +14,14 @@ import {
14
14
  showMeasurementProperty,
15
15
  showMeasurementPropertyEvidence,
16
16
  showMeasurementReport
17
- } from "./chunk-ZN2TEBBX.js";
18
- import "./chunk-AJD252SX.js";
19
- import "./chunk-3MFYM2IS.js";
17
+ } from "./chunk-AYKTVQF7.js";
18
+ import "./chunk-UGO2FO6V.js";
19
+ import "./chunk-EE3QTCLS.js";
20
20
  import "./chunk-Z7IUAJOF.js";
21
- import "./chunk-YACKJGY4.js";
21
+ import "./chunk-7BEGCVVB.js";
22
22
  import "./chunk-AOJU5LKX.js";
23
23
  import "./chunk-HGMYEDAQ.js";
24
- import "./chunk-47X24IJG.js";
24
+ import "./chunk-O7S7OHLE.js";
25
25
  import "./chunk-MLKGABMK.js";
26
26
  export {
27
27
  ADVANCED_MEASUREMENT_OPERATIONS,
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  createApiClient
3
- } from "./chunk-AJD252SX.js";
4
- import "./chunk-3MFYM2IS.js";
3
+ } from "./chunk-UGO2FO6V.js";
4
+ import "./chunk-EE3QTCLS.js";
5
5
  import {
6
6
  emitJsonl
7
7
  } from "./chunk-Z7IUAJOF.js";
@@ -12,7 +12,7 @@ import {
12
12
  } from "./chunk-HGMYEDAQ.js";
13
13
  import {
14
14
  notificationEventSchema
15
- } from "./chunk-47X24IJG.js";
15
+ } from "./chunk-O7S7OHLE.js";
16
16
  import "./chunk-MLKGABMK.js";
17
17
 
18
18
  // src/commands/notify.ts
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  createApiClient
3
- } from "./chunk-AJD252SX.js";
4
- import "./chunk-3MFYM2IS.js";
3
+ } from "./chunk-UGO2FO6V.js";
4
+ import "./chunk-EE3QTCLS.js";
5
5
  import "./chunk-AOJU5LKX.js";
6
6
  import {
7
7
  isMachineFormat
8
8
  } from "./chunk-HGMYEDAQ.js";
9
- import "./chunk-47X24IJG.js";
9
+ import "./chunk-O7S7OHLE.js";
10
10
  import "./chunk-MLKGABMK.js";
11
11
 
12
12
  // src/commands/organic-evidence.ts
@@ -37,7 +37,10 @@ function printOrganicEvidence(project, data) {
37
37
  }
38
38
  if (data.visibility) {
39
39
  const v = data.visibility;
40
- console.log(`Latest AI visibility: ${v.mentionedPairs}/${v.answerPairs} mentioned, ${v.citedPairs}/${v.answerPairs} cited (${Math.floor(v.ageDays)}d old)`);
40
+ const notMeasured = v.citationNotMeasuredPairs ?? 0;
41
+ const citedBase = v.answerPairs - notMeasured;
42
+ const cited = citedBase === 0 && notMeasured > 0 ? "citations not measured (no answer carries sources)" : `${v.citedPairs}/${citedBase} cited${notMeasured > 0 ? ` (${notMeasured} not measured, no sources)` : ""}`;
43
+ console.log(`Latest AI visibility: ${v.mentionedPairs}/${v.answerPairs} mentioned, ${cited} (${Math.floor(v.ageDays)}d old)`);
41
44
  }
42
45
  if (data.findings.length > 0) {
43
46
  console.log("\nFindings:");
@@ -0,0 +1,314 @@
1
+ import {
2
+ runAdmissionLines
3
+ } from "./chunk-NQYJHKML.js";
4
+ import {
5
+ citedBase
6
+ } from "./chunk-J6536OL6.js";
7
+ import {
8
+ createApiClient
9
+ } from "./chunk-UGO2FO6V.js";
10
+ import "./chunk-EE3QTCLS.js";
11
+ import "./chunk-Z7IUAJOF.js";
12
+ import "./chunk-AOJU5LKX.js";
13
+ import {
14
+ CliError,
15
+ EXIT_SYSTEM_ERROR,
16
+ EXIT_USER_ERROR,
17
+ isMachineFormat
18
+ } from "./chunk-HGMYEDAQ.js";
19
+ import {
20
+ RatioUnits,
21
+ WHAT_CHANGED_ALL_CLEAR_DETAIL,
22
+ describeError,
23
+ formatPercent,
24
+ portfolioWhatChangedItems
25
+ } from "./chunk-O7S7OHLE.js";
26
+ import "./chunk-MLKGABMK.js";
27
+
28
+ // src/commands/overview.ts
29
+ async function showOverview(project, opts) {
30
+ const client = createApiClient();
31
+ const overview = await client.getProjectOverview(project, {
32
+ location: opts.location,
33
+ since: opts.since
34
+ });
35
+ if (isMachineFormat(opts.format)) {
36
+ console.log(JSON.stringify(overview, null, 2));
37
+ return;
38
+ }
39
+ renderHuman(overview);
40
+ }
41
+ function readFailure(err) {
42
+ return err instanceof CliError ? { code: err.code, message: err.message, system: err.exitCode === EXIT_SYSTEM_ERROR } : { code: "CLI_ERROR", message: describeError(err), system: true };
43
+ }
44
+ async function showAllOverviews(opts) {
45
+ const client = createApiClient();
46
+ const projects = await client.listProjects();
47
+ if (projects.length === 0) {
48
+ if (isMachineFormat(opts.format)) {
49
+ console.log("[]");
50
+ return;
51
+ }
52
+ console.log("No projects configured. Add one with `canonry project create`.");
53
+ return;
54
+ }
55
+ const settled = await Promise.allSettled(
56
+ projects.map(
57
+ (p) => client.getProjectOverview(p.name, { location: opts.location, since: opts.since })
58
+ )
59
+ );
60
+ const reads = projects.map((project, index) => {
61
+ const outcome = settled[index];
62
+ return outcome.status === "fulfilled" ? { project, overview: outcome.value } : { project, failure: readFailure(outcome.reason) };
63
+ });
64
+ if (isMachineFormat(opts.format)) {
65
+ const entries = reads.map((read) => "overview" in read ? read.overview : { project: read.project, error: { code: read.failure.code, message: read.failure.message } });
66
+ console.log(JSON.stringify(entries, null, 2));
67
+ } else {
68
+ renderPortfolio(reads);
69
+ }
70
+ throwIfAnyUnread(reads);
71
+ }
72
+ function renderPortfolio(reads) {
73
+ console.log(`
74
+ Overviews (${reads.length} project${reads.length === 1 ? "" : "s"}):
75
+ `);
76
+ const cols = { project: 20, mention: 30, branded: 30, cited: 22, share: 42, queries: 22 };
77
+ console.log(` ${cell("Project", cols.project)}${cell("Mention \xB7 non-brand", cols.mention)}${cell("Mention \xB7 branded", cols.branded)}${cell("Cited \xB7 all queries", cols.cited)}${cell("Mention share \xB7 scope", cols.share)}${cell("Queries cited \xB7 all", cols.queries)}Latest run`);
78
+ for (const read of reads) {
79
+ const project = read.project.displayName || read.project.name;
80
+ if (!("overview" in read)) {
81
+ console.log(` ${cell(project, cols.project)}Couldn't be loaded: ${read.failure.message}`);
82
+ continue;
83
+ }
84
+ const ov = read.overview;
85
+ const queries = `${ov.queryCounts.citedQueries}/${citedBase(ov.queryCounts.totalQueries, ov.queryCounts.citationNotMeasuredQueries)}`;
86
+ const latest = ov.latestRun.run?.finishedAt ?? ov.latestRun.run?.createdAt ?? "\u2014";
87
+ console.log(
88
+ ` ${cell(project, cols.project)}${cell(mentionCoverageText(ov.mentionCoverage?.populations.find((population) => population.queryClass === "non-brand")?.mentionCoverage), cols.mention)}${cell(mentionCoverageText(ov.mentionCoverage?.populations.find((population) => population.queryClass === "branded")?.mentionCoverage), cols.branded)}${cell(ov.scores.visibility.value, cols.cited)}${cell(`${ov.scores.mentionShare.value} \xB7 ${ov.scores.mentionShare.scope} queries`, cols.share)}${cell(queries, cols.queries)}${latest}`
89
+ );
90
+ }
91
+ const overviews = reads.flatMap((read) => "overview" in read ? [read.overview] : []);
92
+ if (overviews.length === 0 || overviews.some((ov) => ov.whatChanged !== void 0)) {
93
+ console.log("\nWhat changed:");
94
+ const entries = reads.map((read) => ({
95
+ project: read.project,
96
+ whatChanged: "overview" in read ? read.overview.whatChanged ?? null : null
97
+ }));
98
+ for (const item of portfolioWhatChangedItems(entries)) {
99
+ console.log(` ${item.title}: ${item.detail}`);
100
+ }
101
+ }
102
+ console.log();
103
+ }
104
+ function throwIfAnyUnread(reads) {
105
+ const unread = reads.flatMap((read) => "failure" in read ? [read] : []);
106
+ if (unread.length === 0) return;
107
+ const names = unread.map((read) => read.project.name);
108
+ throw new CliError({
109
+ code: "OVERVIEW_INCOMPLETE",
110
+ message: `${unread.length} of ${reads.length} project overviews couldn't be loaded: ${names.join(", ")}`,
111
+ details: { projects: names },
112
+ exitCode: unread.some((read) => read.failure.system) ? EXIT_SYSTEM_ERROR : EXIT_USER_ERROR
113
+ });
114
+ }
115
+ var COMPARISON_UNAVAILABLE_TEXT = {
116
+ "not-measured": "not measured yet.",
117
+ "no-previous-check": "nothing earlier to compare the latest check with.",
118
+ "definition-changed": "not compared: the previous sweep measured another plan definition.",
119
+ "model-changed": "not compared: the previous sweep asked other engines or models.",
120
+ "partial-run": "not compared: the latest or previous sweep is partial.",
121
+ "legacy-plan": "not compared: a schema v1 plan freezes no Property definition. Republish setup.",
122
+ "unreadable": "not compared: the previous sweep could not be read."
123
+ };
124
+ function lostQueryLine(row) {
125
+ const where = [row.providers.join(", ")];
126
+ const locations = row.locations.filter((location) => location !== null);
127
+ if (locations.length > 0) where.push(`at ${locations.join(", ")}`);
128
+ if (row.properties.length > 0) where.push(`Properties: ${row.properties.map((property) => property.label).join(", ")}`);
129
+ if (row.markets.length > 0) where.push(`markets: ${row.markets.map((market) => market.label).join(", ")}`);
130
+ const queryClass = row.queryClass === null ? "" : ` (${row.queryClass})`;
131
+ return ` - ${row.query}${queryClass} \u2014 ${where.join(" \xB7 ")}`;
132
+ }
133
+ function printLostQueries(label, signal) {
134
+ if (signal.queryCount === 0) return;
135
+ console.log(` ${label}:`);
136
+ for (const row of signal.queries) console.log(lostQueryLine(row));
137
+ if (signal.truncated) console.log(` \u2026 ${signal.queryCount - signal.queries.length} more not listed`);
138
+ }
139
+ function printWhatChanged(whatChanged) {
140
+ const { comparison, items } = whatChanged;
141
+ const status = comparison.state === "unavailable" ? COMPARISON_UNAVAILABLE_TEXT[comparison.reason] : items.length === 0 ? WHAT_CHANGED_ALL_CLEAR_DETAIL : null;
142
+ console.log(status === null ? "\n What changed:" : `
143
+ What changed: ${status}`);
144
+ for (const item of items) console.log(` ${item.title}: ${item.detail}`);
145
+ printLostQueries("Lost mentions", whatChanged.lostMentions);
146
+ printLostQueries("Lost citations", whatChanged.lostCitations);
147
+ }
148
+ function cell(value, width) {
149
+ if (value.length >= width) return `${value.slice(0, width - 1)} `;
150
+ return value.padEnd(width);
151
+ }
152
+ function mentionCoverageText(value) {
153
+ if (value?.rate === void 0 || value.rate === null) return "Not measured";
154
+ return `${formatPercent(value.rate, RatioUnits.fraction)} (${value.numerator}/${value.denominator} answers)`;
155
+ }
156
+ function renderHuman(overview) {
157
+ const {
158
+ project: meta,
159
+ latestRun,
160
+ health,
161
+ topInsights,
162
+ queryCounts,
163
+ providers,
164
+ transitions,
165
+ scores,
166
+ citationMovement,
167
+ mentionMovement,
168
+ movementComparison,
169
+ competitors,
170
+ providerScores,
171
+ attentionItems,
172
+ runHistory,
173
+ suggestedQueries,
174
+ dateRangeLabel,
175
+ contextLabel
176
+ } = overview;
177
+ console.log(`Overview: ${meta.displayName ?? meta.name} (${meta.name})`);
178
+ console.log(` Domain: ${meta.canonicalDomain}`);
179
+ console.log(` Context: ${contextLabel} \xB7 ${dateRangeLabel}`);
180
+ if (latestRun.run) {
181
+ const finished = latestRun.run.finishedAt ?? "\u2014";
182
+ console.log(`
183
+ Latest run: ${latestRun.run.id} (${latestRun.run.status}, ${finished})`);
184
+ console.log(` Total runs: ${latestRun.totalRuns}`);
185
+ } else {
186
+ console.log("\n No runs yet.");
187
+ }
188
+ const admission = runAdmissionLines(meta.name, latestRun.admission, latestRun.manualAdmission);
189
+ if (admission.length > 0) console.log(`
190
+ ${admission.map((line) => ` ${line}`).join("\n")}`);
191
+ if (overview.whatChanged) printWhatChanged(overview.whatChanged);
192
+ console.log("\nScores:");
193
+ const coverage = overview.mentionCoverage;
194
+ const nonBrand = coverage?.populations.find((population) => population.queryClass === "non-brand");
195
+ console.log(` Mention \xB7 non-brand queries: ${mentionCoverageText(nonBrand?.mentionCoverage)}`);
196
+ for (const population of coverage?.populations ?? []) {
197
+ if (population.queryClass === "non-brand" || population.queryCount === 0) continue;
198
+ console.log(` Mention \xB7 ${population.queryClass === "unknown" ? "unclassified" : population.queryClass} queries: ${mentionCoverageText(population.mentionCoverage)}`);
199
+ }
200
+ if (coverage?.selection.measurement.state === "partial") console.log(" Incomplete sweep; missing answers are not negative results.");
201
+ printScore("Cited \xB7 all queries", scores.visibility);
202
+ printScore("Mention share ", scores.mentionShare);
203
+ printMentionShareBreakdown(scores.mentionShare);
204
+ printScore("Mention gaps ", scores.mentionGaps);
205
+ printScore("Gap queries ", scores.gapQueries);
206
+ printScore("Index coverage ", scores.indexCoverage);
207
+ printScore("Competitor press.", scores.competitorPressure);
208
+ printScore("Run status ", scores.runStatus);
209
+ const brandedSentiment = overview.sentiment?.branded;
210
+ if (overview.sentiment?.configured && brandedSentiment && brandedSentiment.coverage.judged > 0 && brandedSentiment.score.favorableRate !== null) {
211
+ console.log(`
212
+ Sentiment: ${brandedSentiment.score.favorableDisplay} favorable \xB7 branded queries`);
213
+ console.log(` ${brandedSentiment.coverage.counts.favorable} favorable / ${brandedSentiment.coverage.judged} judged${brandedSentiment.provisional ? " \xB7 provisional" : ""}`);
214
+ }
215
+ const notMeasuredQueries = queryCounts.citationNotMeasuredQueries;
216
+ const notMeasuredNote = notMeasuredQueries > 0 ? `, ${notMeasuredQueries} not measured (no sources)` : "";
217
+ console.log(queryCounts.citedRate === null ? `
218
+ Queries cited: not measured (${notMeasuredQueries} queries, no answer carries sources)` : `
219
+ Queries cited: ${queryCounts.citedQueries}/${citedBase(queryCounts.totalQueries, notMeasuredQueries)} (${formatPercent(queryCounts.citedRate)})${notMeasuredNote}`);
220
+ console.log(` Queries mentioned: ${queryCounts.mentionedQueries}/${queryCounts.totalQueries} (${formatPercent(queryCounts.mentionRate)})`);
221
+ if (movementComparison.hasPreviousRun) {
222
+ const comparisonLabel = movementComparison.querySetChanged ? `changed (+${movementComparison.addedQueryCount} added, -${movementComparison.removedQueryCount} removed); movement compares ${movementComparison.comparableQueryCount} shared` : `unchanged; ${movementComparison.comparableQueryCount} comparable`;
223
+ console.log(` Query basket: ${comparisonLabel}`);
224
+ console.log(` Citation movement: +${citationMovement.gained} gained, -${citationMovement.lost} lost (${citationMovement.tone})`);
225
+ console.log(` Mention movement: +${mentionMovement.gained} gained, -${mentionMovement.lost} lost (${mentionMovement.tone})`);
226
+ } else {
227
+ console.log(" Movement: first sweep; no comparison yet");
228
+ }
229
+ if (providers.length > 0) {
230
+ console.log("\n Providers:");
231
+ for (const p of providers) {
232
+ console.log(p.citedRate === null ? ` ${p.provider.padEnd(12)} not measured (${p.total} answers without sources)` : ` ${p.provider.padEnd(12)} ${p.cited}/${citedBase(p.total, p.citationNotMeasured)} (${formatPercent(p.citedRate)})`);
233
+ }
234
+ }
235
+ if (providerScores.length > 0) {
236
+ console.log("\n Models:");
237
+ for (const m of providerScores) {
238
+ const label = `${m.provider}/${m.model ?? "unknown"}`.padEnd(28);
239
+ console.log(m.score === null ? ` ${label} not measured (${m.total} answers without sources)` : ` ${label} ${m.cited}/${citedBase(m.total, m.citationNotMeasured)} (${formatPercent(m.score, "percent")})`);
240
+ }
241
+ }
242
+ if (transitions.since) {
243
+ console.log(`
244
+ Transitions since ${transitions.since}: +${transitions.gained} gained, -${transitions.lost} lost, ${transitions.emerging} emerging`);
245
+ }
246
+ if (competitors.length > 0) {
247
+ console.log("\n Competitors:");
248
+ for (const c of competitors) {
249
+ console.log(` ${c.domain.padEnd(28)} ${c.citationCount}/${c.totalQueries} ${c.pressureLabel}`);
250
+ }
251
+ }
252
+ if (attentionItems.length > 0) {
253
+ console.log("\n Attention:");
254
+ for (const item of attentionItems) {
255
+ console.log(` [${item.actionLabel}] ${item.title}`);
256
+ if (item.detail) console.log(` ${item.detail}`);
257
+ }
258
+ }
259
+ if (health) {
260
+ console.log(health.overallCitedRate === null ? "\n Health: citations not measured (no answer carries sources)" : `
261
+ Health: ${formatPercent(health.overallCitedRate)} cited (${health.citedPairs}/${citedBase(health.totalPairs, health.citationNotMeasuredPairs)} pairs)`);
262
+ }
263
+ if (topInsights.length > 0) {
264
+ console.log("\n Top insights:");
265
+ for (const insight of topInsights) {
266
+ console.log(` [${insight.severity.toUpperCase()}] ${insight.type} \u2014 ${insight.title}`);
267
+ }
268
+ }
269
+ if (runHistory.length > 0) {
270
+ console.log(`
271
+ Run history (last ${runHistory.length}):`);
272
+ for (const point of runHistory) {
273
+ if (point.citationRate === null) {
274
+ console.log(` ${point.createdAt.slice(0, 10)} citations not measured (no answer carries sources)`);
275
+ continue;
276
+ }
277
+ const bar = "\u2588".repeat(Math.round(point.citationRate / 10));
278
+ console.log(` ${point.createdAt.slice(0, 10)} ${formatPercent(point.citationRate, "percent").padStart(6)} ${bar}`);
279
+ }
280
+ }
281
+ if (suggestedQueries.rows.length > 0) {
282
+ const moreLabel = suggestedQueries.totalCandidates > suggestedQueries.rows.length ? ` (showing ${suggestedQueries.rows.length} of ${suggestedQueries.totalCandidates})` : "";
283
+ console.log(`
284
+ Suggested queries to track${moreLabel}:`);
285
+ for (const s of suggestedQueries.rows) {
286
+ console.log(` + ${s.query}`);
287
+ console.log(` ${s.reason}`);
288
+ }
289
+ console.log(` (add via: canonry query add ${meta.name} "<query>")`);
290
+ }
291
+ }
292
+ function printScore(prefix, score) {
293
+ const tone = `[${score.tone}]`.padEnd(11);
294
+ const value = score.value.padEnd(8);
295
+ console.log(` ${prefix} ${tone} ${value} ${score.delta}`);
296
+ }
297
+ function printMentionShareBreakdown(mentionShare) {
298
+ const legacyCompatible = mentionShare.breakdown;
299
+ const ranking = legacyCompatible.ranking ?? [];
300
+ const project = ranking.find((row) => row.kind === "project");
301
+ if (!project) return;
302
+ const competitors = ranking.filter((row) => row.kind === "competitor");
303
+ console.log(` you${" ".repeat(28)} ${project.mentionSnapshots} mentions (${formatPercent(project.share)} of combined)`);
304
+ for (const row of competitors.slice(0, 3)) {
305
+ console.log(` ${(row.domain ?? "").padEnd(30)} ${row.mentionSnapshots} mentions (${formatPercent(row.share)} of combined)`);
306
+ }
307
+ if (competitors.length > 3) {
308
+ console.log(` + ${competitors.length - 3} more competitor${competitors.length - 3 === 1 ? "" : "s"} (--format json for full breakdown)`);
309
+ }
310
+ }
311
+ export {
312
+ showAllOverviews,
313
+ showOverview
314
+ };
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  createApiClient
3
- } from "./chunk-AJD252SX.js";
4
- import "./chunk-3MFYM2IS.js";
3
+ } from "./chunk-UGO2FO6V.js";
4
+ import "./chunk-EE3QTCLS.js";
5
5
  import {
6
6
  emitJsonl
7
7
  } from "./chunk-Z7IUAJOF.js";
@@ -24,7 +24,7 @@ import {
24
24
  normalizeProjectDomain,
25
25
  resolveNegativeReviewMaxStars,
26
26
  resolveProjectQualifiedAliases
27
- } from "./chunk-47X24IJG.js";
27
+ } from "./chunk-O7S7OHLE.js";
28
28
  import "./chunk-MLKGABMK.js";
29
29
 
30
30
  // src/commands/project.ts
@@ -131,7 +131,7 @@ async function showProject(name, format) {
131
131
  console.log(` Dispatch modes: ${dispatchModes.length > 0 ? `${dispatchModes.map(([provider, mode]) => `${provider}=${mode}`).join(", ")} (scheduled sweeps; others sync)` : "(none; every provider runs sync)"}`);
132
132
  console.log(` Negative reviews: ${resolveNegativeReviewMaxStars(project.negativeReviewMaxStars)} stars or fewer${project.negativeReviewMaxStars == null ? " (default)" : ""}`);
133
133
  if (project.siteAuditMaxPages !== void 0) {
134
- console.log(` Site Health page budget: ${formatSiteAuditPageBudget(project.siteAuditMaxPages)}`);
134
+ console.log(` Agent Readiness page budget: ${formatSiteAuditPageBudget(project.siteAuditMaxPages)}`);
135
135
  }
136
136
  if (project.competitorAutoAliases !== void 0) {
137
137
  console.log(` Competitor auto aliases: ${formatCompetitorAutoAliasMode(project.competitorAutoAliases)}`);