@zlooks.cn/blog-server 1.0.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 (265) hide show
  1. package/dist/blog/blog-application.d.ts +153 -0
  2. package/dist/blog/blog-application.d.ts.map +1 -0
  3. package/dist/blog/blog-application.js +115 -0
  4. package/dist/blog/blog-application.js.map +1 -0
  5. package/dist/blog/comment-client-metadata.d.ts +19 -0
  6. package/dist/blog/comment-client-metadata.d.ts.map +1 -0
  7. package/dist/blog/comment-client-metadata.js +78 -0
  8. package/dist/blog/comment-client-metadata.js.map +1 -0
  9. package/dist/blog/errors.d.ts +12 -0
  10. package/dist/blog/errors.d.ts.map +1 -0
  11. package/dist/blog/errors.js +21 -0
  12. package/dist/blog/errors.js.map +1 -0
  13. package/dist/blog/micro-user-directory.d.ts +11 -0
  14. package/dist/blog/micro-user-directory.d.ts.map +1 -0
  15. package/dist/blog/micro-user-directory.js +18 -0
  16. package/dist/blog/micro-user-directory.js.map +1 -0
  17. package/dist/blog/post-content-audit.d.ts +34 -0
  18. package/dist/blog/post-content-audit.d.ts.map +1 -0
  19. package/dist/blog/post-content-audit.js +190 -0
  20. package/dist/blog/post-content-audit.js.map +1 -0
  21. package/dist/blog/post-view-cache.d.ts +15 -0
  22. package/dist/blog/post-view-cache.d.ts.map +1 -0
  23. package/dist/blog/post-view-cache.js +23 -0
  24. package/dist/blog/post-view-cache.js.map +1 -0
  25. package/dist/blog/public-blog-micro.d.ts +291 -0
  26. package/dist/blog/public-blog-micro.d.ts.map +1 -0
  27. package/dist/blog/public-blog-micro.js +71 -0
  28. package/dist/blog/public-blog-micro.js.map +1 -0
  29. package/dist/blog/public-blog-service.d.ts +104 -0
  30. package/dist/blog/public-blog-service.d.ts.map +1 -0
  31. package/dist/blog/public-blog-service.js +341 -0
  32. package/dist/blog/public-blog-service.js.map +1 -0
  33. package/dist/browser-api/dispatch-stream.d.ts +5 -0
  34. package/dist/browser-api/dispatch-stream.d.ts.map +1 -0
  35. package/dist/browser-api/dispatch-stream.js +4 -0
  36. package/dist/browser-api/dispatch-stream.js.map +1 -0
  37. package/dist/browser-api/dispatcher.d.ts +15 -0
  38. package/dist/browser-api/dispatcher.d.ts.map +1 -0
  39. package/dist/browser-api/dispatcher.js +145 -0
  40. package/dist/browser-api/dispatcher.js.map +1 -0
  41. package/dist/browser-api/provider-publisher.d.ts +24 -0
  42. package/dist/browser-api/provider-publisher.d.ts.map +1 -0
  43. package/dist/browser-api/provider-publisher.js +107 -0
  44. package/dist/browser-api/provider-publisher.js.map +1 -0
  45. package/dist/command/index.d.ts +3 -0
  46. package/dist/command/index.d.ts.map +1 -0
  47. package/dist/command/index.js +24 -0
  48. package/dist/command/index.js.map +1 -0
  49. package/dist/config/schema.d.ts +25 -0
  50. package/dist/config/schema.d.ts.map +1 -0
  51. package/dist/config/schema.js +19 -0
  52. package/dist/config/schema.js.map +1 -0
  53. package/dist/contracts/identity.d.ts +2 -0
  54. package/dist/contracts/identity.d.ts.map +1 -0
  55. package/dist/contracts/identity.js +2 -0
  56. package/dist/contracts/identity.js.map +1 -0
  57. package/dist/contracts/mcp.d.ts +69 -0
  58. package/dist/contracts/mcp.d.ts.map +1 -0
  59. package/dist/contracts/mcp.js +41 -0
  60. package/dist/contracts/mcp.js.map +1 -0
  61. package/dist/contracts/public-api.d.ts +3 -0
  62. package/dist/contracts/public-api.d.ts.map +1 -0
  63. package/dist/contracts/public-api.js +2 -0
  64. package/dist/contracts/public-api.js.map +1 -0
  65. package/dist/mcp/blog-prompts.d.ts +135 -0
  66. package/dist/mcp/blog-prompts.d.ts.map +1 -0
  67. package/dist/mcp/blog-prompts.js +107 -0
  68. package/dist/mcp/blog-prompts.js.map +1 -0
  69. package/dist/mcp/blog-provider.d.ts +4 -0
  70. package/dist/mcp/blog-provider.d.ts.map +1 -0
  71. package/dist/mcp/blog-provider.js +27 -0
  72. package/dist/mcp/blog-provider.js.map +1 -0
  73. package/dist/mcp/blog-theme-authoring-prompt.d.ts +19 -0
  74. package/dist/mcp/blog-theme-authoring-prompt.d.ts.map +1 -0
  75. package/dist/mcp/blog-theme-authoring-prompt.js +171 -0
  76. package/dist/mcp/blog-theme-authoring-prompt.js.map +1 -0
  77. package/dist/mcp/category-tools.d.ts +45 -0
  78. package/dist/mcp/category-tools.d.ts.map +1 -0
  79. package/dist/mcp/category-tools.js +14 -0
  80. package/dist/mcp/category-tools.js.map +1 -0
  81. package/dist/mcp/comment-tools.d.ts +44 -0
  82. package/dist/mcp/comment-tools.d.ts.map +1 -0
  83. package/dist/mcp/comment-tools.js +15 -0
  84. package/dist/mcp/comment-tools.js.map +1 -0
  85. package/dist/mcp/friend-link-tools.d.ts +63 -0
  86. package/dist/mcp/friend-link-tools.d.ts.map +1 -0
  87. package/dist/mcp/friend-link-tools.js +16 -0
  88. package/dist/mcp/friend-link-tools.js.map +1 -0
  89. package/dist/mcp/page-tools.d.ts +67 -0
  90. package/dist/mcp/page-tools.d.ts.map +1 -0
  91. package/dist/mcp/page-tools.js +36 -0
  92. package/dist/mcp/page-tools.js.map +1 -0
  93. package/dist/mcp/post-tools.d.ts +114 -0
  94. package/dist/mcp/post-tools.d.ts.map +1 -0
  95. package/dist/mcp/post-tools.js +122 -0
  96. package/dist/mcp/post-tools.js.map +1 -0
  97. package/dist/mcp/tag-tools.d.ts +37 -0
  98. package/dist/mcp/tag-tools.d.ts.map +1 -0
  99. package/dist/mcp/tag-tools.js +14 -0
  100. package/dist/mcp/tag-tools.js.map +1 -0
  101. package/dist/mcp/theme-tools.d.ts +16 -0
  102. package/dist/mcp/theme-tools.d.ts.map +1 -0
  103. package/dist/mcp/theme-tools.js +71 -0
  104. package/dist/mcp/theme-tools.js.map +1 -0
  105. package/dist/mcp/tool-descriptions.d.ts +5 -0
  106. package/dist/mcp/tool-descriptions.d.ts.map +1 -0
  107. package/dist/mcp/tool-descriptions.js +51 -0
  108. package/dist/mcp/tool-descriptions.js.map +1 -0
  109. package/dist/mcp/tool-support.d.ts +242 -0
  110. package/dist/mcp/tool-support.d.ts.map +1 -0
  111. package/dist/mcp/tool-support.js +127 -0
  112. package/dist/mcp/tool-support.js.map +1 -0
  113. package/dist/messages/browser/dispatch.msg.d.ts +3 -0
  114. package/dist/messages/browser/dispatch.msg.d.ts.map +1 -0
  115. package/dist/messages/browser/dispatch.msg.js +9 -0
  116. package/dist/messages/browser/dispatch.msg.js.map +1 -0
  117. package/dist/messages/public/categories/list.msg.d.ts +3 -0
  118. package/dist/messages/public/categories/list.msg.d.ts.map +1 -0
  119. package/dist/messages/public/categories/list.msg.js +8 -0
  120. package/dist/messages/public/categories/list.msg.js.map +1 -0
  121. package/dist/messages/public/comments/list.msg.d.ts +3 -0
  122. package/dist/messages/public/comments/list.msg.d.ts.map +1 -0
  123. package/dist/messages/public/comments/list.msg.js +8 -0
  124. package/dist/messages/public/comments/list.msg.js.map +1 -0
  125. package/dist/messages/public/comments/recent.msg.d.ts +3 -0
  126. package/dist/messages/public/comments/recent.msg.d.ts.map +1 -0
  127. package/dist/messages/public/comments/recent.msg.js +8 -0
  128. package/dist/messages/public/comments/recent.msg.js.map +1 -0
  129. package/dist/messages/public/friend-links/list.msg.d.ts +3 -0
  130. package/dist/messages/public/friend-links/list.msg.d.ts.map +1 -0
  131. package/dist/messages/public/friend-links/list.msg.js +8 -0
  132. package/dist/messages/public/friend-links/list.msg.js.map +1 -0
  133. package/dist/messages/public/pages/list.msg.d.ts +3 -0
  134. package/dist/messages/public/pages/list.msg.d.ts.map +1 -0
  135. package/dist/messages/public/pages/list.msg.js +8 -0
  136. package/dist/messages/public/pages/list.msg.js.map +1 -0
  137. package/dist/messages/public/pages/read.msg.d.ts +3 -0
  138. package/dist/messages/public/pages/read.msg.d.ts.map +1 -0
  139. package/dist/messages/public/pages/read.msg.js +8 -0
  140. package/dist/messages/public/pages/read.msg.js.map +1 -0
  141. package/dist/messages/public/posts/archive.msg.d.ts +3 -0
  142. package/dist/messages/public/posts/archive.msg.d.ts.map +1 -0
  143. package/dist/messages/public/posts/archive.msg.js +8 -0
  144. package/dist/messages/public/posts/archive.msg.js.map +1 -0
  145. package/dist/messages/public/posts/connections.msg.d.ts +3 -0
  146. package/dist/messages/public/posts/connections.msg.d.ts.map +1 -0
  147. package/dist/messages/public/posts/connections.msg.js +8 -0
  148. package/dist/messages/public/posts/connections.msg.js.map +1 -0
  149. package/dist/messages/public/posts/list.msg.d.ts +3 -0
  150. package/dist/messages/public/posts/list.msg.d.ts.map +1 -0
  151. package/dist/messages/public/posts/list.msg.js +8 -0
  152. package/dist/messages/public/posts/list.msg.js.map +1 -0
  153. package/dist/messages/public/posts/open.msg.d.ts +3 -0
  154. package/dist/messages/public/posts/open.msg.d.ts.map +1 -0
  155. package/dist/messages/public/posts/open.msg.js +8 -0
  156. package/dist/messages/public/posts/open.msg.js.map +1 -0
  157. package/dist/messages/public/posts/read.msg.d.ts +3 -0
  158. package/dist/messages/public/posts/read.msg.d.ts.map +1 -0
  159. package/dist/messages/public/posts/read.msg.js +8 -0
  160. package/dist/messages/public/posts/read.msg.js.map +1 -0
  161. package/dist/messages/public/tags/list.msg.d.ts +3 -0
  162. package/dist/messages/public/tags/list.msg.d.ts.map +1 -0
  163. package/dist/messages/public/tags/list.msg.js +8 -0
  164. package/dist/messages/public/tags/list.msg.js.map +1 -0
  165. package/dist/migrations/index.d.ts +3 -0
  166. package/dist/migrations/index.d.ts.map +1 -0
  167. package/dist/migrations/index.js +2 -0
  168. package/dist/migrations/index.js.map +1 -0
  169. package/dist/persistence/category-store.d.ts +23 -0
  170. package/dist/persistence/category-store.d.ts.map +1 -0
  171. package/dist/persistence/category-store.js +86 -0
  172. package/dist/persistence/category-store.js.map +1 -0
  173. package/dist/persistence/comment-store.d.ts +41 -0
  174. package/dist/persistence/comment-store.d.ts.map +1 -0
  175. package/dist/persistence/comment-store.js +146 -0
  176. package/dist/persistence/comment-store.js.map +1 -0
  177. package/dist/persistence/entities.d.ts +103 -0
  178. package/dist/persistence/entities.d.ts.map +1 -0
  179. package/dist/persistence/entities.js +188 -0
  180. package/dist/persistence/entities.js.map +1 -0
  181. package/dist/persistence/friend-link-store.d.ts +26 -0
  182. package/dist/persistence/friend-link-store.d.ts.map +1 -0
  183. package/dist/persistence/friend-link-store.js +80 -0
  184. package/dist/persistence/friend-link-store.js.map +1 -0
  185. package/dist/persistence/page-store.d.ts +35 -0
  186. package/dist/persistence/page-store.d.ts.map +1 -0
  187. package/dist/persistence/page-store.js +125 -0
  188. package/dist/persistence/page-store.js.map +1 -0
  189. package/dist/persistence/post-engagement-store.d.ts +23 -0
  190. package/dist/persistence/post-engagement-store.d.ts.map +1 -0
  191. package/dist/persistence/post-engagement-store.js +85 -0
  192. package/dist/persistence/post-engagement-store.js.map +1 -0
  193. package/dist/persistence/post-store.d.ts +87 -0
  194. package/dist/persistence/post-store.d.ts.map +1 -0
  195. package/dist/persistence/post-store.js +465 -0
  196. package/dist/persistence/post-store.js.map +1 -0
  197. package/dist/persistence/tag-store.d.ts +21 -0
  198. package/dist/persistence/tag-store.d.ts.map +1 -0
  199. package/dist/persistence/tag-store.js +82 -0
  200. package/dist/persistence/tag-store.js.map +1 -0
  201. package/dist/services/application.service.d.ts +4 -0
  202. package/dist/services/application.service.d.ts.map +1 -0
  203. package/dist/services/application.service.js +22 -0
  204. package/dist/services/application.service.js.map +1 -0
  205. package/dist/services/blog-runtime.service.d.ts +10 -0
  206. package/dist/services/blog-runtime.service.d.ts.map +1 -0
  207. package/dist/services/blog-runtime.service.js +32 -0
  208. package/dist/services/blog-runtime.service.js.map +1 -0
  209. package/dist/services/blog.boot.d.ts +6 -0
  210. package/dist/services/blog.boot.d.ts.map +1 -0
  211. package/dist/services/blog.boot.js +13 -0
  212. package/dist/services/blog.boot.js.map +1 -0
  213. package/dist/services/browser-api-provider.service.d.ts +4 -0
  214. package/dist/services/browser-api-provider.service.d.ts.map +1 -0
  215. package/dist/services/browser-api-provider.service.js +25 -0
  216. package/dist/services/browser-api-provider.service.js.map +1 -0
  217. package/dist/services/config.service.d.ts +3 -0
  218. package/dist/services/config.service.d.ts.map +1 -0
  219. package/dist/services/config.service.js +22 -0
  220. package/dist/services/config.service.js.map +1 -0
  221. package/dist/services/database.service.d.ts +3 -0
  222. package/dist/services/database.service.d.ts.map +1 -0
  223. package/dist/services/database.service.js +16 -0
  224. package/dist/services/database.service.js.map +1 -0
  225. package/dist/services/logger.service.d.ts +4 -0
  226. package/dist/services/logger.service.d.ts.map +1 -0
  227. package/dist/services/logger.service.js +8 -0
  228. package/dist/services/logger.service.js.map +1 -0
  229. package/dist/services/mcp-provider.service.d.ts +3 -0
  230. package/dist/services/mcp-provider.service.d.ts.map +1 -0
  231. package/dist/services/mcp-provider.service.js +17 -0
  232. package/dist/services/mcp-provider.service.js.map +1 -0
  233. package/dist/services/redis.service.d.ts +4 -0
  234. package/dist/services/redis.service.d.ts.map +1 -0
  235. package/dist/services/redis.service.js +18 -0
  236. package/dist/services/redis.service.js.map +1 -0
  237. package/dist/services/theme-control.service.d.ts +4 -0
  238. package/dist/services/theme-control.service.d.ts.map +1 -0
  239. package/dist/services/theme-control.service.js +53 -0
  240. package/dist/services/theme-control.service.js.map +1 -0
  241. package/dist/themes/theme-catalog.d.ts +40 -0
  242. package/dist/themes/theme-catalog.d.ts.map +1 -0
  243. package/dist/themes/theme-catalog.js +164 -0
  244. package/dist/themes/theme-catalog.js.map +1 -0
  245. package/dist/themes/theme-control.d.ts +16 -0
  246. package/dist/themes/theme-control.d.ts.map +1 -0
  247. package/dist/themes/theme-control.js +57 -0
  248. package/dist/themes/theme-control.js.map +1 -0
  249. package/dist/themes/theme-discovery-runtime.d.ts +41 -0
  250. package/dist/themes/theme-discovery-runtime.d.ts.map +1 -0
  251. package/dist/themes/theme-discovery-runtime.js +109 -0
  252. package/dist/themes/theme-discovery-runtime.js.map +1 -0
  253. package/dist/themes/theme-generation-store.d.ts +14 -0
  254. package/dist/themes/theme-generation-store.d.ts.map +1 -0
  255. package/dist/themes/theme-generation-store.js +49 -0
  256. package/dist/themes/theme-generation-store.js.map +1 -0
  257. package/dist/themes/theme-selection-publisher.d.ts +28 -0
  258. package/dist/themes/theme-selection-publisher.d.ts.map +1 -0
  259. package/dist/themes/theme-selection-publisher.js +92 -0
  260. package/dist/themes/theme-selection-publisher.js.map +1 -0
  261. package/dist/themes/theme-selection-store.d.ts +22 -0
  262. package/dist/themes/theme-selection-store.d.ts.map +1 -0
  263. package/dist/themes/theme-selection-store.js +84 -0
  264. package/dist/themes/theme-selection-store.js.map +1 -0
  265. package/package.json +74 -0
@@ -0,0 +1,135 @@
1
+ export declare function createBlogPrompts(): {
2
+ "review-and-publish-post": import("@hile/mcp").McpPromptDefinition<{
3
+ postId: string;
4
+ }, {
5
+ postId: string;
6
+ }>;
7
+ "moderate-pending-comments": import("@hile/mcp").McpPromptDefinition<{
8
+ postId?: string | undefined;
9
+ }, {
10
+ postId?: string | undefined;
11
+ }>;
12
+ "switch-blog-theme": import("@hile/mcp").McpPromptDefinition<{
13
+ themeId: string;
14
+ }, {
15
+ themeId: string;
16
+ }>;
17
+ "create-blog-theme": import("@hile/mcp").McpPromptDefinition<{
18
+ themeId: string;
19
+ displayName: string;
20
+ description: string;
21
+ }, {
22
+ themeId: string;
23
+ displayName: string;
24
+ description: string;
25
+ }>;
26
+ "create-blog-theme-structure": import("@hile/mcp").McpPromptDefinition<{
27
+ themeId: string;
28
+ displayName: string;
29
+ description: string;
30
+ }, {
31
+ themeId: string;
32
+ displayName: string;
33
+ description: string;
34
+ }>;
35
+ "create-blog-theme-runtime": import("@hile/mcp").McpPromptDefinition<{
36
+ themeId: string;
37
+ displayName: string;
38
+ description: string;
39
+ }, {
40
+ themeId: string;
41
+ displayName: string;
42
+ description: string;
43
+ }>;
44
+ "create-blog-theme-shell": import("@hile/mcp").McpPromptDefinition<{
45
+ themeId: string;
46
+ displayName: string;
47
+ description: string;
48
+ }, {
49
+ themeId: string;
50
+ displayName: string;
51
+ description: string;
52
+ }>;
53
+ "create-blog-theme-home-page": import("@hile/mcp").McpPromptDefinition<{
54
+ themeId: string;
55
+ displayName: string;
56
+ description: string;
57
+ }, {
58
+ themeId: string;
59
+ displayName: string;
60
+ description: string;
61
+ }>;
62
+ "create-blog-theme-post-page": import("@hile/mcp").McpPromptDefinition<{
63
+ themeId: string;
64
+ displayName: string;
65
+ description: string;
66
+ }, {
67
+ themeId: string;
68
+ displayName: string;
69
+ description: string;
70
+ }>;
71
+ "create-blog-theme-archive-page": import("@hile/mcp").McpPromptDefinition<{
72
+ themeId: string;
73
+ displayName: string;
74
+ description: string;
75
+ }, {
76
+ themeId: string;
77
+ displayName: string;
78
+ description: string;
79
+ }>;
80
+ "create-blog-theme-content-page": import("@hile/mcp").McpPromptDefinition<{
81
+ themeId: string;
82
+ displayName: string;
83
+ description: string;
84
+ }, {
85
+ themeId: string;
86
+ displayName: string;
87
+ description: string;
88
+ }>;
89
+ "create-blog-theme-category-page": import("@hile/mcp").McpPromptDefinition<{
90
+ themeId: string;
91
+ displayName: string;
92
+ description: string;
93
+ }, {
94
+ themeId: string;
95
+ displayName: string;
96
+ description: string;
97
+ }>;
98
+ "create-blog-theme-tag-page": import("@hile/mcp").McpPromptDefinition<{
99
+ themeId: string;
100
+ displayName: string;
101
+ description: string;
102
+ }, {
103
+ themeId: string;
104
+ displayName: string;
105
+ description: string;
106
+ }>;
107
+ "create-blog-theme-friends-page": import("@hile/mcp").McpPromptDefinition<{
108
+ themeId: string;
109
+ displayName: string;
110
+ description: string;
111
+ }, {
112
+ themeId: string;
113
+ displayName: string;
114
+ description: string;
115
+ }>;
116
+ "create-blog-theme-interactions": import("@hile/mcp").McpPromptDefinition<{
117
+ themeId: string;
118
+ displayName: string;
119
+ description: string;
120
+ }, {
121
+ themeId: string;
122
+ displayName: string;
123
+ description: string;
124
+ }>;
125
+ "create-blog-theme-verification": import("@hile/mcp").McpPromptDefinition<{
126
+ themeId: string;
127
+ displayName: string;
128
+ description: string;
129
+ }, {
130
+ themeId: string;
131
+ displayName: string;
132
+ description: string;
133
+ }>;
134
+ };
135
+ //# sourceMappingURL=blog-prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blog-prompts.d.ts","sourceRoot":"","sources":["../../src/mcp/blog-prompts.ts"],"names":[],"mappings":"AAqCA,wBAAgB,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqChC"}
@@ -0,0 +1,107 @@
1
+ import { defineMcpPrompt } from '@hile/mcp';
2
+ import { blogThemeIdSchema } from '@zlooks.cn/blog-shared';
3
+ import { z } from 'zod';
4
+ import { BLOG_MCP_MODERATE_SCOPE, BLOG_MCP_PROMPTS, BLOG_MCP_PROVIDER_ID, BLOG_MCP_READ_SCOPE, BLOG_MCP_TOOLS, BLOG_MCP_WRITE_SCOPE, } from '../contracts/mcp.js';
5
+ import { createBlogThemeArchivePageMessage, createBlogThemeCategoryPageMessage, createBlogThemeContentPageMessage, createBlogThemeFriendsPageMessage, createBlogThemeHomePageMessage, createBlogThemeInteractionsMessage, createBlogThemeMessage, createBlogThemePostPageMessage, createBlogThemeRuntimeMessage, createBlogThemeShellMessage, createBlogThemeStructureMessage, createBlogThemeTagPageMessage, createBlogThemeVerificationMessage, } from './blog-theme-authoring-prompt.js';
6
+ const postPromptInput = z.strictObject({ postId: z.uuid() });
7
+ const commentPromptInput = z.strictObject({ postId: z.uuid().optional() });
8
+ const themePromptInput = z.strictObject({ themeId: blogThemeIdSchema });
9
+ const themeAuthoringPromptInput = z.strictObject({
10
+ themeId: blogThemeIdSchema,
11
+ displayName: z.string().trim().min(1).max(100),
12
+ description: z.string().trim().min(1).max(500),
13
+ });
14
+ export function createBlogPrompts() {
15
+ return {
16
+ [BLOG_MCP_PROMPTS.reviewAndPublishPost]: defineMcpPrompt({
17
+ name: BLOG_MCP_PROMPTS.reviewAndPublishPost,
18
+ title: '审查并发布文章',
19
+ description: '读取最新文章,完成内容审查和必要修复后发布。',
20
+ argsSchema: postPromptInput,
21
+ access: { scopes: [BLOG_MCP_READ_SCOPE, BLOG_MCP_WRITE_SCOPE] },
22
+ }, ({ postId }, context) => promptResult(context, '审查、修复并发布一篇博客文章', reviewAndPublishPostMessage(postId))),
23
+ [BLOG_MCP_PROMPTS.moderatePendingComments]: defineMcpPrompt({
24
+ name: BLOG_MCP_PROMPTS.moderatePendingComments,
25
+ title: '审查待处理评论',
26
+ description: '列出待处理评论,给出审查摘要并在获得用户决定后执行。',
27
+ argsSchema: commentPromptInput,
28
+ access: { scopes: [BLOG_MCP_MODERATE_SCOPE] },
29
+ }, ({ postId }, context) => promptResult(context, '审查待处理评论并在获得用户决定后执行操作', moderatePendingCommentsMessage(postId))),
30
+ [BLOG_MCP_PROMPTS.switchBlogTheme]: defineMcpPrompt({
31
+ name: BLOG_MCP_PROMPTS.switchBlogTheme,
32
+ title: '切换博客主题',
33
+ description: '检查目标主题健康状态,确认影响后切换并验证结果。',
34
+ argsSchema: themePromptInput,
35
+ access: { scopes: [BLOG_MCP_READ_SCOPE, BLOG_MCP_WRITE_SCOPE] },
36
+ }, ({ themeId }, context) => promptResult(context, '检查并切换博客主题', switchBlogThemeMessage(themeId))),
37
+ ...createBlogThemeAuthoringPrompts(),
38
+ };
39
+ }
40
+ function createBlogThemeAuthoringPrompts() {
41
+ return {
42
+ [BLOG_MCP_PROMPTS.createBlogTheme]: themeAuthoringPrompt(BLOG_MCP_PROMPTS.createBlogTheme, '创建博客主题', '串联全部主题开发阶段,从零创建并验证一个可运行主题。', '从零构建并验证一个博客主题', createBlogThemeMessage, true),
43
+ [BLOG_MCP_PROMPTS.createBlogThemeStructure]: themeAuthoringPrompt(BLOG_MCP_PROMPTS.createBlogThemeStructure, '创建主题结构与配置', '创建主题包目录、构建配置、路由清单和包级开发说明。', '创建博客主题的文件结构与配置', createBlogThemeStructureMessage),
44
+ [BLOG_MCP_PROMPTS.createBlogThemeRuntime]: themeAuthoringPrompt(BLOG_MCP_PROMPTS.createBlogThemeRuntime, '创建主题服务端运行时', '创建主题定义和唯一 Hile boot,并复用公共 Blog 主题运行时。', '创建博客主题的服务端定义与运行时', createBlogThemeRuntimeMessage),
45
+ [BLOG_MCP_PROMPTS.createBlogThemeShell]: themeAuthoringPrompt(BLOG_MCP_PROMPTS.createBlogThemeShell, '创建主题公共壳层', '创建远程 UI Provider、导航、页头、页脚和主题样式。', '创建博客主题的公共页面壳层', createBlogThemeShellMessage),
46
+ [BLOG_MCP_PROMPTS.createBlogThemeHomePage]: themeAuthoringPrompt(BLOG_MCP_PROMPTS.createBlogThemeHomePage, '创建博客首页', '使用统一首页 ViewModel 实现博客首页。', '创建博客主题首页', createBlogThemeHomePageMessage),
47
+ [BLOG_MCP_PROMPTS.createBlogThemePostPage]: themeAuthoringPrompt(BLOG_MCP_PROMPTS.createBlogThemePostPage, '创建文章详情页', '使用统一文章 ViewModel 实现文章、关联内容和评论区域。', '创建博客主题文章详情页', createBlogThemePostPageMessage),
48
+ [BLOG_MCP_PROMPTS.createBlogThemeArchivePage]: themeAuthoringPrompt(BLOG_MCP_PROMPTS.createBlogThemeArchivePage, '创建文章归档页', '使用统一归档 ViewModel 实现筛选和分页。', '创建博客主题文章归档页', createBlogThemeArchivePageMessage),
49
+ [BLOG_MCP_PROMPTS.createBlogThemeContentPage]: themeAuthoringPrompt(BLOG_MCP_PROMPTS.createBlogThemeContentPage, '创建独立内容页', '使用统一页面 ViewModel 实现 Blog 独立内容页。', '创建博客主题独立内容页', createBlogThemeContentPageMessage),
50
+ [BLOG_MCP_PROMPTS.createBlogThemeCategoryPage]: themeAuthoringPrompt(BLOG_MCP_PROMPTS.createBlogThemeCategoryPage, '创建分类页', '使用统一分类 ViewModel 实现分类文章列表。', '创建博客主题分类页', createBlogThemeCategoryPageMessage),
51
+ [BLOG_MCP_PROMPTS.createBlogThemeTagPage]: themeAuthoringPrompt(BLOG_MCP_PROMPTS.createBlogThemeTagPage, '创建标签页', '使用统一标签 ViewModel 实现标签文章列表。', '创建博客主题标签页', createBlogThemeTagPageMessage),
52
+ [BLOG_MCP_PROMPTS.createBlogThemeFriendsPage]: themeAuthoringPrompt(BLOG_MCP_PROMPTS.createBlogThemeFriendsPage, '创建友情链接页', '使用统一友情链接 ViewModel 实现安全的站点目录。', '创建博客主题友情链接页', createBlogThemeFriendsPageMessage),
53
+ [BLOG_MCP_PROMPTS.createBlogThemeInteractions]: themeAuthoringPrompt(BLOG_MCP_PROMPTS.createBlogThemeInteractions, '创建主题浏览器交互', '通过统一 Client API 实现搜索、评论等用户触发交互。', '创建博客主题浏览器交互', createBlogThemeInteractionsMessage),
54
+ [BLOG_MCP_PROMPTS.createBlogThemeVerification]: themeAuthoringPrompt(BLOG_MCP_PROMPTS.createBlogThemeVerification, '验证博客主题', '闭环验证构建、RSC 产物、运行时发现、页面和交互。', '验证并修复博客主题', createBlogThemeVerificationMessage, true),
55
+ };
56
+ }
57
+ function themeAuthoringPrompt(name, title, description, resultDescription, message, requiresWrite = false) {
58
+ return defineMcpPrompt({
59
+ name,
60
+ title,
61
+ description,
62
+ argsSchema: themeAuthoringPromptInput,
63
+ access: {
64
+ scopes: requiresWrite
65
+ ? [BLOG_MCP_READ_SCOPE, BLOG_MCP_WRITE_SCOPE]
66
+ : [BLOG_MCP_READ_SCOPE],
67
+ },
68
+ }, (input, invocation) => promptResult(invocation, resultDescription, message(input)));
69
+ }
70
+ function promptResult(context, description, text) {
71
+ context.signal.throwIfAborted();
72
+ return {
73
+ description,
74
+ messages: [{ role: 'user', content: { type: 'text', text } }],
75
+ };
76
+ }
77
+ function tool(name) {
78
+ return `${BLOG_MCP_PROVIDER_ID}.${name}`;
79
+ }
80
+ function reviewAndPublishPostMessage(postId) {
81
+ return `请对文章 ${postId} 执行发布前审查,并严格按以下顺序工作:
82
+ 1. 调用 ${tool(BLOG_MCP_TOOLS.readPost)} 读取最新文章,后续更新必须基于这份最新值。
83
+ 2. 发布前尽可能完整填写文章字段,检查 title、slug、categoryId、summary、content、tagIds 和 coverUrl;尤其补齐能从文章可靠确定的摘要、1 至 5 个准确标签和封面图。标签应先通过 ${tool(BLOG_MCP_TOOLS.listTags)} 复用现有项;只能使用用户提供或经验证可用的封面图 URL,无法可靠补齐时向用户说明,不得编造信息、标签或 URL。
84
+ 3. 使用文章的 categoryId、tagIds、title、summary 和 content 调用 ${tool(BLOG_MCP_TOOLS.auditPostContent)}。
85
+ 4. 只自动修复 severity=block 的问题;保留作者原意,不得编造事实、数字、引用或链接。warning 和 info 只需报告,除非用户明确要求继续优化。
86
+ 5. 如有更新,调用 ${tool(BLOG_MCP_TOOLS.updatePost)} 提交完整文章字段,再重新读取并审查。最多自动修复 3 轮;需要作者补充信息或仍未通过时停止并说明原因。
87
+ 6. publishable=true 后调用 ${tool(BLOG_MCP_TOOLS.publishPost)}。若返回 code=POST_CONTENT_BLOCKED,使用返回的最新 audit 重复上述受限修复流程。
88
+ 7. 最后报告发布结果、未能补齐的字段和仍存在的 warning/info;不要把 Prompt 当作已经完成发布的证明。`;
89
+ }
90
+ function moderatePendingCommentsMessage(postId) {
91
+ const filter = postId ? `,并限定 postId=${postId}` : '';
92
+ return `请审查博客待处理评论:
93
+ 1. 调用 ${tool(BLOG_MCP_TOOLS.listComments)},使用 status=pending、order=asc、limit=20${filter}。
94
+ 2. 对每条结果按评论 ID 汇总正文、所属文章和审计信息;不要仅凭 IP、地区、客户端或语言风格推断恶意。
95
+ 3. 给出 approve、reject、reply 或保留 pending 的建议及简短理由,但不得自行决定或直接执行审核结果。
96
+ 4. 等用户明确决定后,逐条调用 ${tool(BLOG_MCP_TOOLS.approveComment)}、${tool(BLOG_MCP_TOOLS.rejectComment)} 或 ${tool(BLOG_MCP_TOOLS.replyComment)}。只有用户明确要求永久删除时才调用 ${tool(BLOG_MCP_TOOLS.deleteComment)}。
97
+ 5. 汇总成功、失败和仍待处理的评论;单条失败不得被描述为整批成功。`;
98
+ }
99
+ function switchBlogThemeMessage(themeId) {
100
+ return `请将博客主题切换为 ${themeId}:
101
+ 1. 调用 ${tool(BLOG_MCP_TOOLS.listThemes)} 获取当前目录,并调用 ${tool(BLOG_MCP_TOOLS.readThemeSelection)} 读取当前选择。
102
+ 2. 调用 ${tool(BLOG_MCP_TOOLS.readThemeStatus)} 检查目标主题 ${themeId} 的健康状态、构建和实例数。目标不存在、冲突或不可用时停止。
103
+ 3. 向用户说明从当前主题切换到目标主题的变化,并在执行写操作前取得明确确认。
104
+ 4. 确认后调用 ${tool(BLOG_MCP_TOOLS.selectTheme)},不得在失败时猜测已经切换。
105
+ 5. 再次调用 ${tool(BLOG_MCP_TOOLS.readThemeSelection)} 和 ${tool(BLOG_MCP_TOOLS.readThemeStatus)} 验证选中修订与激活状态,并准确报告已激活、激活中或传播待完成。`;
106
+ }
107
+ //# sourceMappingURL=blog-prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blog-prompts.js","sourceRoot":"","sources":["../../src/mcp/blog-prompts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { BlogApplication } from '../blog/blog-application.js';
2
+ import type { BlogThemeControl } from '../themes/theme-control.js';
3
+ export declare function createBlogMcpProvider(blog: BlogApplication, themes: BlogThemeControl): import("@hile/mcp").McpProviderDefinition;
4
+ //# sourceMappingURL=blog-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blog-provider.d.ts","sourceRoot":"","sources":["../../src/mcp/blog-provider.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAQnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAGnE,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,gBAAgB,6CAepF"}
@@ -0,0 +1,27 @@
1
+ import { defineMcpProvider } from '@hile/mcp';
2
+ import { BLOG_MCP_PROVIDER_ID } from '../contracts/mcp.js';
3
+ import { createCategoryTools } from './category-tools.js';
4
+ import { createCommentTools } from './comment-tools.js';
5
+ import { createFriendLinkTools } from './friend-link-tools.js';
6
+ import { createPostTools } from './post-tools.js';
7
+ import { createPageTools } from './page-tools.js';
8
+ import { createTagTools } from './tag-tools.js';
9
+ import { createThemeTools } from './theme-tools.js';
10
+ import { createBlogPrompts } from './blog-prompts.js';
11
+ export function createBlogMcpProvider(blog, themes) {
12
+ return defineMcpProvider({
13
+ id: BLOG_MCP_PROVIDER_ID,
14
+ displayName: '博客管理',
15
+ tools: {
16
+ ...createCategoryTools(blog),
17
+ ...createTagTools(blog),
18
+ ...createPostTools(blog),
19
+ ...createPageTools(blog),
20
+ ...createCommentTools(blog),
21
+ ...createFriendLinkTools(blog),
22
+ ...createThemeTools(themes),
23
+ },
24
+ prompts: createBlogPrompts(),
25
+ });
26
+ }
27
+ //# sourceMappingURL=blog-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blog-provider.js","sourceRoot":"","sources":["../../src/mcp/blog-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,UAAU,qBAAqB,CAAC,IAAqB,EAAE,MAAwB;IACnF,OAAO,iBAAiB,CAAC;QACvB,EAAE,EAAE,oBAAoB;QACxB,WAAW,EAAE,MAAM;QACnB,KAAK,EAAE;YACL,GAAG,mBAAmB,CAAC,IAAI,CAAC;YAC5B,GAAG,cAAc,CAAC,IAAI,CAAC;YACvB,GAAG,eAAe,CAAC,IAAI,CAAC;YACxB,GAAG,eAAe,CAAC,IAAI,CAAC;YACxB,GAAG,kBAAkB,CAAC,IAAI,CAAC;YAC3B,GAAG,qBAAqB,CAAC,IAAI,CAAC;YAC9B,GAAG,gBAAgB,CAAC,MAAM,CAAC;SAC5B;QACD,OAAO,EAAE,iBAAiB,EAAE;KAC7B,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,19 @@
1
+ export interface BlogThemeAuthoringInput {
2
+ readonly themeId: string;
3
+ readonly displayName: string;
4
+ readonly description: string;
5
+ }
6
+ export declare function createBlogThemeMessage(input: BlogThemeAuthoringInput): string;
7
+ export declare function createBlogThemeStructureMessage(input: BlogThemeAuthoringInput): string;
8
+ export declare function createBlogThemeRuntimeMessage(input: BlogThemeAuthoringInput): string;
9
+ export declare function createBlogThemeShellMessage(input: BlogThemeAuthoringInput): string;
10
+ export declare function createBlogThemeHomePageMessage(input: BlogThemeAuthoringInput): string;
11
+ export declare function createBlogThemePostPageMessage(input: BlogThemeAuthoringInput): string;
12
+ export declare function createBlogThemeArchivePageMessage(input: BlogThemeAuthoringInput): string;
13
+ export declare function createBlogThemeContentPageMessage(input: BlogThemeAuthoringInput): string;
14
+ export declare function createBlogThemeCategoryPageMessage(input: BlogThemeAuthoringInput): string;
15
+ export declare function createBlogThemeTagPageMessage(input: BlogThemeAuthoringInput): string;
16
+ export declare function createBlogThemeFriendsPageMessage(input: BlogThemeAuthoringInput): string;
17
+ export declare function createBlogThemeInteractionsMessage(input: BlogThemeAuthoringInput): string;
18
+ export declare function createBlogThemeVerificationMessage(input: BlogThemeAuthoringInput): string;
19
+ //# sourceMappingURL=blog-theme-authoring-prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blog-theme-authoring-prompt.d.ts","sourceRoot":"","sources":["../../src/mcp/blog-theme-authoring-prompt.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAkBD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,uBAAuB,GAAG,MAAM,CA2B7E;AAED,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,uBAAuB,GAAG,MAAM,CA8BtF;AAED,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,uBAAuB,GAAG,MAAM,CAmBpF;AAED,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,uBAAuB,GAAG,MAAM,CAYlF;AAED,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,uBAAuB,GAAG,MAAM,CAGrF;AAED,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,uBAAuB,GAAG,MAAM,CAKrF;AAED,wBAAgB,iCAAiC,CAAC,KAAK,EAAE,uBAAuB,GAAG,MAAM,CAGxF;AAED,wBAAgB,iCAAiC,CAAC,KAAK,EAAE,uBAAuB,GAAG,MAAM,CAGxF;AAED,wBAAgB,kCAAkC,CAAC,KAAK,EAAE,uBAAuB,GAAG,MAAM,CAGzF;AAED,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,uBAAuB,GAAG,MAAM,CAGpF;AAED,wBAAgB,iCAAiC,CAAC,KAAK,EAAE,uBAAuB,GAAG,MAAM,CAGxF;AAgBD,wBAAgB,kCAAkC,CAAC,KAAK,EAAE,uBAAuB,GAAG,MAAM,CAYzF;AAED,wBAAgB,kCAAkC,CAAC,KAAK,EAAE,uBAAuB,GAAG,MAAM,CAczF"}
@@ -0,0 +1,171 @@
1
+ import { BLOG_MCP_PROMPTS, BLOG_MCP_PROVIDER_ID } from '../contracts/mcp.js';
2
+ function prompt(name) {
3
+ return `${BLOG_MCP_PROVIDER_ID}.${name}`;
4
+ }
5
+ function packageName(themeId) {
6
+ return `zlooks-blog-theme-${themeId}-server`;
7
+ }
8
+ function packageRoot(themeId) {
9
+ return `blog-theme-${themeId}`;
10
+ }
11
+ function context(input) {
12
+ return `主题 ID:${input.themeId}\n显示名:${input.displayName}\n描述:${input.description}\n包:${packageName(input.themeId)}\n目录:${packageRoot(input.themeId)}`;
13
+ }
14
+ export function createBlogThemeMessage(input) {
15
+ const args = JSON.stringify(input);
16
+ return `请直接从零创建一个独立、可单独安装依赖、构建和部署的 Blog 主题项目,不要只给方案或代码片段。\n${context(input)}
17
+
18
+ 按下面顺序逐个获取并执行 MCP Prompt;每次都传入相同参数 ${args}。前一步未落盘并通过其验证时,不得进入下一步:
19
+ 1. ${prompt(BLOG_MCP_PROMPTS.createBlogThemeStructure)}
20
+ 2. ${prompt(BLOG_MCP_PROMPTS.createBlogThemeRuntime)}
21
+ 3. ${prompt(BLOG_MCP_PROMPTS.createBlogThemeShell)}
22
+ 4. ${prompt(BLOG_MCP_PROMPTS.createBlogThemeHomePage)}
23
+ 5. ${prompt(BLOG_MCP_PROMPTS.createBlogThemePostPage)}
24
+ 6. ${prompt(BLOG_MCP_PROMPTS.createBlogThemeArchivePage)}
25
+ 7. ${prompt(BLOG_MCP_PROMPTS.createBlogThemeContentPage)}
26
+ 8. ${prompt(BLOG_MCP_PROMPTS.createBlogThemeCategoryPage)}
27
+ 9. ${prompt(BLOG_MCP_PROMPTS.createBlogThemeTagPage)}
28
+ 10. ${prompt(BLOG_MCP_PROMPTS.createBlogThemeFriendsPage)}
29
+ 11. ${prompt(BLOG_MCP_PROMPTS.createBlogThemeInteractions)}
30
+ 12. ${prompt(BLOG_MCP_PROMPTS.createBlogThemeVerification)}
31
+
32
+ 执行规则:
33
+ - 在用户指定的空目录中工作;未指定目录时,新建 ${packageRoot(input.themeId)}。不要假设主站源码、monorepo、workspace 包或 default 主题存在,也不要把它们的路径写进新项目。
34
+ - 只根据已发布 npm 包的 metadata、类型声明和随包文档使用 @zlooks.cn/blog-theme;不得从主站 Git 仓库复制内部代码或引用 file:/link:/workspace: 依赖。
35
+ - 严格按公开子入口分层:@zlooks.cn/blog-theme 根入口只用于主题定义和通用模型,/rsc 只用于 Server Component 数据加载,/runtime 只用于 Node/Hile boot,/client 只用于以 'use client' 开头的浏览器交互。主题项目不得绕过主题 SDK 直接依赖底层 @zlooks.cn/blog-client。
36
+ - 每个阶段都检查当前文件状态,保留用户已有修改;使用测试驱动实现实际文件。
37
+ - 主题只自由决定 JSX、Ant Design 组合、交互和 CSS。数据、路由输入、Context、Micro、Registry、选择发布和生命周期必须使用 @zlooks.cn/blog-theme。
38
+ - 不创建 public HTTP/Next/MCP 监听器,不直接访问 Blog 数据库、Redis、Registry 或 @zlooks.cn/blog-shared Micro 客户端。
39
+ - 遇到缺少视觉决策时采用一个克制、可访问、响应式的明确方案继续实现;只有会改变业务语义或需要外部凭据时才停下来询问。
40
+ - 最终必须留下可构建、可启动、能被 ${prompt('list-theme')} 发现的独立项目,并报告真实验证结果。若 @zlooks.cn/blog-theme 尚未发布到当前 npm Registry,立即报告这个外部依赖阻塞;不要退回主站源码路径。`;
41
+ }
42
+ export function createBlogThemeStructureMessage(input) {
43
+ return `请直接创建主题的文件结构与构建配置。\n${context(input)}
44
+
45
+ 目标目录至少包含:
46
+ ${packageRoot(input.themeId)}/
47
+ AGENTS.md
48
+ package.json
49
+ hile-rsc.json
50
+ tsconfig.json
51
+ tsconfig.runtime.json
52
+ src/identity.ts
53
+ src/command/index.ts
54
+ src/services/blog-theme.boot.ts
55
+ src/plugin/page.tsx
56
+ src/plugin/blog-frame.tsx
57
+ src/plugin/theme.css
58
+ src/plugin/styles.d.ts
59
+ test/theme-boundary.test.ts
60
+ test/plugin/
61
+
62
+ 逐项执行:
63
+ 1. 先运行 pnpm view @zlooks.cn/blog-theme version peerDependencies dependencies exports engines --json 和 pnpm view @zlooks.cn/service-command version peerDependencies dependencies exports engines --json,确认公共 SDK 与标准服务命令包在当前 npm Registry 可安装;再读取安装包导出的类型声明、package.json 和随包文档。必须实际确认根入口、./rsc、./runtime、./client 四个主题 export,以及 defineBlogTheme、createServiceBackedBlogThemeDataLoader、createBlogThemeBootService、createBlogThemeClient、runServiceCommand 五个 API。404、兼容 tuple 未声明或任一入口/API 缺失时停止并报告,不得猜 API、绕过主题 SDK 改用底层 @zlooks.cn/blog-client 或引用主站源码。
64
+ 2. 初始化独立 package 和 Git 项目。package.json 默认使用名称 ${packageName(input.themeId)};用户使用自己的 npm scope 时只能变为 @scope/${packageName(input.themeId)},必须保留 zlooks- 前缀和 -server 后缀。设置 private=false、type=module、Node >=24、files=["dist", ".hile-rsc"],并将唯一 bin 声明为 ${packageName(input.themeId)} -> dist/command/index.js。声明 zlooks.kind=theme、description、dependsOn=[]、nodeConditions=["react-server"];主题不拥有数据库表,因此不得声明 zlooks.commands.db。提供 build:rsc、verify:rsc、build:runtime、build、dev、start、test、typecheck 脚本。所有依赖来自 npm 精确版本,不得出现 workspace:*、file: 或 link:。
65
+ 3. 根据 @zlooks.cn/blog-theme 及 Hile RSC 包实际声明的 peerDependencies 安装完全兼容的 React/Hile tuple。生产 dependencies 只放主题源码直接导入的包;@hile/cli、@hile/rsc-build、TypeScript、类型和 Vitest 放 devDependencies。使用 pnpm install 生成项目自己的 pnpm-lock.yaml,绝不手工编辑。
66
+ 4. tsconfig.json 负责 plugin/RSC 源码并排除 test、dist、.hile-rsc;tsconfig.runtime.json 只编译非 plugin 的 boot TypeScript 到 dist。它们必须自包含,不 extends 主站路径。不要新增自定义构建脚本。
67
+ 5. hile-rsc.json 的 pluginId 固定为 blog,entry 为 src/plugin/page.tsx,styles 必须包含 npm 导出 @zlooks.cn/ui/antd.css,使 Hile 将共享 Ant Design 静态样式作为一份构建级 immutable artifact 提前交给 Host;并完整声明 /、/posts/[slug]、/archives、/pages/[slug]、/categories/[slug]、/tags/[slug]、/friends 七条路由及对应导出。metadata 写入本主题展示信息,但不要伪造额外业务能力。
68
+ 6. 创建项目 AGENTS.md,记录职责、非职责、公共路由、文件边界、依赖、Hile 生命周期、错误行为、验证命令和已知陷阱;它是当前设计地图,不是变更日志,也不继承主站私有规则。
69
+ 7. test/theme-boundary.test.ts 必须约束:包可发布且不是 private;唯一 bin、files 和 zlooks 部署元数据符合上述协议且没有数据库命令;services 目录只有 blog-theme.boot.ts;没有主题本地 runtime 实现;页面通过 @zlooks.cn/blog-theme/rsc 获取包含 seo 的 ViewModel,并通过 @zlooks.cn/ui/seo 输出标准 head 标签;Client 交互只通过 @zlooks.cn/blog-theme/client;Server Component 和 boot 不导入 /client,Client Boundary 不导入 /runtime、/rsc、@hile/* 或底层 @zlooks.cn/blog-client。
70
+
71
+ 本阶段不要实现页面视觉。完成后运行该包 typecheck;如果页面占位导致编译失败,创建最小合法导出,后续页面 Prompt 再替换。`;
72
+ }
73
+ export function createBlogThemeRuntimeMessage(input) {
74
+ const displayName = JSON.stringify(input.displayName);
75
+ const description = JSON.stringify(input.description);
76
+ return `请直接实现主题的服务端定义和唯一 boot。\n${context(input)}
77
+
78
+ 只创建或修改以下服务端文件:
79
+ - src/identity.ts:调用 defineBlogTheme({ id: '${input.themeId}', displayName: ${displayName}, description: ${description} });只有用户明确指定该主题为站点灾备默认时才设置 fallback=true。可在 query 中覆盖有真实展示需要的有界分页值。
80
+ - src/command/index.ts:使用 @zlooks.cn/service-command 的 runServiceCommand,packageRoot 指向包根,requiresReactServer=true;它只注册标准 start 命令,不增加数据库命令,构建后必须与 package.json 的唯一 bin 对应。
81
+ - src/services/blog-theme.boot.ts:这是 services 目录唯一文件和唯一环境边界。development 与 production start 都通过 Hile --env-file 加载同一个项目根 .env;使用 createBlogThemeBootService,传入 definition、指向 ../../.hile-rsc 的 artifactBuildRoot、REGISTRY_HOST/REGISTRY_PORT、由 NODE_ENV 计算的 development;HILE_ADVERTISE_HOST 是两种模式共用的可选覆盖值,有值时传入,没有时省略。
82
+
83
+ 必须遵守:
84
+ - 从 @zlooks.cn/blog-theme 导入 defineBlogTheme;从 @zlooks.cn/blog-theme/runtime 导入 createBlogThemeBootService。
85
+ - boot 保持最小组合根,不创建 application/logger/data/runtime 的主题本地 service 文件;这些由公共包包装。
86
+ - 除这个 boot 外,任何主题文件都不得读 process.env;不要增加端口配置或调用 detect-port。
87
+ - 不创建公开监听器、MCP Provider、Browser API、Micro 数据客户端、Registry 订阅或主题选择逻辑。
88
+ - 不在模块顶层调用 loadService;boot 默认导出 Hile service definition。
89
+ - 服务端 boot 不得导入 @zlooks.cn/blog-theme/client;浏览器交互也不得导入 @zlooks.cn/blog-theme/runtime。
90
+
91
+ 完成后运行该包 runtime typecheck,并运行 theme-boundary 测试确认只有一个 boot 文件。`;
92
+ }
93
+ export function createBlogThemeShellMessage(input) {
94
+ return `请直接实现 ${input.displayName} 的公共页面壳层,视觉必须体现“${input.description}”,不得复制 default 主题布局。\n${context(input)}
95
+
96
+ 文件职责:
97
+ - src/plugin/blog-frame.tsx:作为远程 Client Boundary,以 'use client' 开头;在该独立 RSC build 内依次组合 ZlooksUiProvider、ZlooksShellProvider(initialContext)、ZlooksSiteConfigProvider(initialConfig),再渲染主题自己的 Header、main 和 Footer。Gateway React Context 不会跨 build,不能省略这些 Provider。
98
+ - src/plugin/theme.css:只放本主题布局、排版和响应式规则;优先使用 Ant Design 组件、props、布局 API 与语义 token,CSS 不得硬编码只适用于亮色模式的颜色。
99
+ - src/plugin/styles.d.ts:声明 *.css。
100
+ - 可拆分 header、footer、navigation 等纯主题文件,但不得把数据请求或生命周期放进去。
101
+
102
+ 壳层输入只能来自 BlogThemeFrameModel:navigationPages、shell、site。site 是 Host 注入并由公共 SDK 验证的 site.presentation v2:identity 可提供 name、homeHref、logoUrl、faviconUrl、description,legal.registrations 是由 id、kind、number、可选 verificationUrl/iconUrl 组成的结构化备案数组,legal.copyright 是可选版权文案。主题可以决定是否及如何展示这些字段,但不得查询 Global Config、编造备案信息、恢复旧的 registration/registrationHref 字段、代理 favicon 资源或持久化副本;site.profile 只属于 Gateway 首页,不是 BlogThemeFrameModel 输入。shell.origin 是 Host 校验并注入的公共 Origin,只用于公共 URL、canonical 和展示语义,不得替代服务发现或发起跨服务请求。账户展示使用共享 Shell 能力,不解析 Session;导航路径统一位于 /blog 下。每个独立编译的主题只能拥有一层 ZlooksUiProvider,使用 App.useApp() 获取 message/notification/modal,不调用 Ant Design 静态反馈 API。
103
+
104
+ 实现可访问的 landmark、键盘导航、焦点态、窄屏布局和 light/dark/default 三态可读性。完成后为 Provider 组合、导航与主题模式写组件测试并运行。`;
105
+ }
106
+ export function createBlogThemeHomePageMessage(input) {
107
+ return pageMessage(input, '/', 'data.home(props)', 'BlogHomePage', `
108
+ 使用 model.frame、model.posts.items、model.posts.total、model.page、model.pageSize、model.categories、model.tags、model.sidebarPages 和 model.archive.months。首页列表、热门内容、分类、标签和归档月份必须来自这些真实值,不得制造文章、计数或分类。分页必须保留 /blog 路径和 page 查询参数。首页应有一个清晰的页面级 H1;文章卡标题从 H2 开始。为空结果提供真实空状态。`);
109
+ }
110
+ export function createBlogThemePostPageMessage(input) {
111
+ return pageMessage(input, '/posts/[slug]', 'data.post(props)', 'BlogPostPage', `
112
+ 处理 model.kind=not-found 的 invalid/missing 状态;成功时使用 model.post、model.connections、model.comments、model.nextCommentCursor、model.viewerStatus。文章标题是页面唯一 H1,Markdown 正文只渲染 H2 及以下层级,不把标题再渲染一次。原始 HTML 保持禁用,外链使用 noopener noreferrer。若 Markdown 渲染库依赖客户端 React hooks,必须放入 'use client' 边界。
113
+
114
+ 上一篇/下一篇/相关文章和评论必须来自 ViewModel。评论框只对 authenticated 显示;anonymous 显示登录提示,unavailable 显示不可用提示。服务端授权仍由 Blog Server 负责,UI 状态不能替代权限检查。`);
115
+ }
116
+ export function createBlogThemeArchivePageMessage(input) {
117
+ return pageMessage(input, '/archives', 'data.archive(props)', 'BlogArchivePage', `
118
+ 使用 model.archive.items、model.archive.total、model.archive.months、model.filter、model.page 和 model.pageSize。实现全部、年、月、起止月份过滤与编号分页,URL 查询参数必须可分享和刷新恢复。不要在浏览器重新抓取初始数据,不重新计算服务端总数或月份计数。`);
119
+ }
120
+ export function createBlogThemeContentPageMessage(input) {
121
+ return pageMessage(input, '/pages/[slug]', 'data.page(props)', 'BlogSinglePagePage', `
122
+ 区分 invalid/missing;成功时只使用 model.page 和 model.frame。独立内容页展示真实 title、summary、content、updatedAt 等已有字段,不添加评论、文章分类、标签或虚构目录。页面标题是唯一 H1,Markdown 从 H2 开始并禁用 raw HTML。`);
123
+ }
124
+ export function createBlogThemeCategoryPageMessage(input) {
125
+ return pageMessage(input, '/categories/[slug]', 'data.category(props)', 'BlogCategoryPage', `
126
+ 区分 invalid/missing;成功时使用 model.taxonomy、model.posts、model.total、model.page、model.pageSize 和 model.path。显示持久化的分类名称与真实过滤总数,编号分页必须使用 model.path;不得在客户端再次按分类过滤或伪造数量。页面级分类名称使用 H1,文章条目标题从 H2 开始。`);
127
+ }
128
+ export function createBlogThemeTagPageMessage(input) {
129
+ return pageMessage(input, '/tags/[slug]', 'data.tag(props)', 'BlogTagPage', `
130
+ 区分 invalid/missing;成功时使用 model.taxonomy、model.posts、model.total、model.page、model.pageSize 和 model.path。标签是内容发现维度,不把标签名猜成关键词质量结论。显示真实过滤结果与编号分页;页面级标签名称使用 H1,文章条目标题从 H2 开始。`);
131
+ }
132
+ export function createBlogThemeFriendsPageMessage(input) {
133
+ return pageMessage(input, '/friends', 'data.friends(props)', 'BlogFriendLinksPage', `
134
+ 只使用 model.links 和 model.frame,展示 enabled 的真实友情链接数据。链接使用验证后的 url、name、description、logoUrl;logo 缺失时可以做纯展示 fallback,但不得伪造站点图标或描述。外链新窗口打开时必须带 noopener noreferrer,并提供可见焦点态与长文本处理。`);
135
+ }
136
+ function pageMessage(input, route, loader, exportedPage, details) {
137
+ return `请直接实现 ${input.displayName} 的 ${route} 页面。\n${context(input)}
138
+
139
+ 在 src/plugin/page.tsx 中复用模块级 createServiceBackedBlogThemeDataLoader({ definition }),通过 ${loader} 获取统一、已验证、与传输无关的 ViewModel,并导出 ${exportedPage}(props: BlogThemeRouteProps)。每个成功模型都必须通过 @zlooks.cn/ui/seo 渲染 <ZlooksSeo seo={model.seo} />;受控 missing/invalid 页面使用 data.notFound(props, resource) 取得公共 noindex SEO,不得自己猜 canonical。页面及其组件不得导入 @hile/*、@zlooks.cn/blog-shared、loadService 或直接 Blog 客户端。${details}
140
+
141
+ 视觉结构和组件拆分由主题自由决定,但优先使用 Ant Design;Server Component 不访问 Typography.Title、Select.Option 等 compound Client 属性,需要交互时拆 focused Client Boundary。为正常、空数据、not-found/非法参数和关键响应式结构补测试,然后运行该包测试与 typecheck。`;
142
+ }
143
+ export function createBlogThemeInteractionsMessage(input) {
144
+ return `请直接实现 ${input.displayName} 所需的浏览器交互,并保持初始数据仍由 RSC ViewModel 提供。\n${context(input)}
145
+
146
+ 规则:
147
+ 1. 只有搜索、评论翻页/排序、评论提交等用户触发交互可以从 @zlooks.cn/blog-theme/client 导入 createBlogThemeClient;不得绕过主题 SDK 直接依赖底层 @zlooks.cn/blog-client,也不得直接导入 @zlooks.cn/browser-api 或 @zlooks.cn/blog-shared。
148
+ 2. 每个交互文件以 'use client' 开头并保持 focused boundary。Server Component、page.tsx 和 boot 不得导入 /client;Client Boundary 不得导入 @zlooks.cn/blog-theme/rsc、@zlooks.cn/blog-theme/runtime 或 @hile/*。使用 @zlooks.cn/ui/request 的 useRequest 处理统一 Browser envelope、AbortSignal 和主题化错误;反馈通过 App.useApp()。
149
+ 3. 初始文章、页面、分类、标签、归档、友情链接与首屏评论禁止 hydration 后重新请求。
150
+ 4. 评论提交必须同步拒绝重复提交、卸载时 abort、成功后只在编辑器仍等于提交快照时清空;未登录和用户状态不可用时不渲染可提交表单。
151
+ 5. 搜索只使用真实 API 结果;输入、limit、游标和展示文本保持有界。任何 HTML/Markdown 预览禁用 raw HTML。
152
+ 6. 不把 opaque Session 放入 props、Flight、浏览器状态或业务 DTO;公共包已在服务端处理 viewer Context。
153
+
154
+ 为成功、协议错误、取消、快速重复操作、卸载和匿名状态写测试,运行该包测试与 typecheck。`;
155
+ }
156
+ export function createBlogThemeVerificationMessage(input) {
157
+ return `请对 ${packageName(input.themeId)} 做最终闭环验证并直接修复发现的问题。\n${context(input)}
158
+
159
+ 按顺序执行:
160
+ 1. 确认当前 Git 根就是独立主题项目,不位于主站 monorepo 的 packages 目录;检查 git diff,避免覆盖用户无关修改。services 只有 blog-theme.boot.ts,没有 src/runtime 实现,没有公开 listener、数据库/Redis/Registry/Micro 直连。
161
+ 2. 重新执行 npm Registry 可用性检查和 pnpm install --frozen-lockfile;依赖中不得出现 workspace:*、file:、link: 或主站绝对路径。
162
+ 3. 在项目根运行 pnpm test、pnpm typecheck、pnpm build、pnpm verify:rsc、pnpm pack --dry-run 和 git diff --check;确认包不是 private,唯一 bin 指向已构建的 dist/command/index.js,zlooks.kind=theme 且没有 zlooks.commands.db;确认 verify 输出 valid=true、pluginId=blog、七条路由存在。检查生成的浏览器 artifact:必须包含 /client 的交互实现,不得包含 @hile/*、/runtime 或 boot 模块;主题源码和直接依赖中不得出现 @zlooks.cn/blog-client。每次修复后从失败检查重新开始。
163
+ 4. 明确报告发布版本和目标通道,但没有用户明确授权、npm 凭据和发布权限时不得执行发布。测试版本使用可按 SemVer 排序的 -test.N 预发布号并通过 npm publish --tag test 发布,不得用 +build.N 表达测试版本顺序;正式稳定版本进入 latest。Zlooks CLI 会先从当前机器环境对应的 test 或 latest dist-tag 查询准确版本、展示版本计划并取得用户确认,再用该准确版本安装;主题包不得要求直接安装 @test 或 @latest。
164
+ 5. 用项目自己的 dev 脚本连接用户提供的 Registry 启动主题服务,确认 boot、runtime、application、data、logger 都 ready,且进程使用新构建产物。没有 Registry 地址时停止在本地 build/verify 完成状态并准确报告。
165
+ 6. 通过当前 MCP 连接调用 ${prompt('list-theme')},确认 ${input.themeId} 被发现;调用 ${prompt('read-theme-status')} 检查无 conflict、实例健康、build 与刚验证的产物一致。
166
+ 7. 未得到用户明确确认不得切换当前主题。用户确认后才调用 ${prompt('select-theme')},随后调用 ${prompt('read-theme-selection')} 与 ${prompt('read-theme-status')} 验证修订和激活状态。
167
+ 8. 通过用户提供的 Gateway Origin 实际请求 /blog、/blog/posts/<真实-slug>、/blog/archives、一个内容页、分类、标签和 /blog/friends;检查 HTTP、原始 SSR 样式、hydration warning、浏览器控制台、交互、暗色/亮色和窄屏。逐页检查 head 中只有一个有效 title、description、robots、absolute canonical、Open Graph 和 Twitter 集合;文章页还要核对真实封面及 published/modified 时间,缺失页面必须 noindex。没有 Origin 或真实内容 slug 时报告缺失输入,不得伪造验证。
168
+
169
+ 最终报告必须列出创建文件、主题自由设计点、复用的公共能力、所有真实命令结果、运行 URL、发现/激活状态和任何未完成项。不得用“应该可用”代替验证。`;
170
+ }
171
+ //# sourceMappingURL=blog-theme-authoring-prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blog-theme-authoring-prompt.js","sourceRoot":"","sources":["../../src/mcp/blog-theme-authoring-prompt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import type { BlogApplication } from '../blog/blog-application.js';
2
+ export declare function createCategoryTools(blog: BlogApplication): {
3
+ "list-category": import("@hile/mcp").McpToolDefinition<{
4
+ limit?: number | undefined;
5
+ cursor?: string | undefined;
6
+ }, {
7
+ limit: number;
8
+ cursor?: string | undefined;
9
+ }>;
10
+ "read-category": import("@hile/mcp").McpToolDefinition<{
11
+ id: string;
12
+ }, {
13
+ id: string;
14
+ }>;
15
+ "create-category": import("@hile/mcp").McpToolDefinition<{
16
+ name: string;
17
+ slug: string;
18
+ description: string | null;
19
+ sortOrder: number;
20
+ }, {
21
+ name: string;
22
+ slug: string;
23
+ description: string | null;
24
+ sortOrder: number;
25
+ }>;
26
+ "update-category": import("@hile/mcp").McpToolDefinition<{
27
+ name: string;
28
+ slug: string;
29
+ description: string | null;
30
+ sortOrder: number;
31
+ id: string;
32
+ }, {
33
+ name: string;
34
+ slug: string;
35
+ description: string | null;
36
+ sortOrder: number;
37
+ id: string;
38
+ }>;
39
+ "delete-category": import("@hile/mcp").McpToolDefinition<{
40
+ id: string;
41
+ }, {
42
+ id: string;
43
+ }>;
44
+ };
45
+ //# sourceMappingURL=category-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"category-tools.d.ts","sourceRoot":"","sources":["../../src/mcp/category-tools.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAInE,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAMrD"}
@@ -0,0 +1,14 @@
1
+ import { BLOG_MCP_TOOLS } from '../contracts/mcp.js';
2
+ import { z } from 'zod';
3
+ import { categorySchema, categoryView, databaseInteger, deletedSchema, idInput, listInput, nullableText, readTool, slug, writeTool } from './tool-support.js';
4
+ const input = z.strictObject({ name: z.string().trim().min(1).max(100), slug: slug(120), description: nullableText(500), sortOrder: databaseInteger });
5
+ export function createCategoryTools(blog) {
6
+ return {
7
+ [BLOG_MCP_TOOLS.listCategories]: readTool(BLOG_MCP_TOOLS.listCategories, '分页列出博客分类', listInput, z.strictObject({ items: z.array(categorySchema).max(100), nextCursor: z.uuid().nullable() }), async ({ limit, cursor }, signal) => { const page = await blog.listCategoryPage(limit, cursor, signal); return { items: page.items.map(categoryView), nextCursor: page.nextCursor }; }),
8
+ [BLOG_MCP_TOOLS.readCategory]: readTool(BLOG_MCP_TOOLS.readCategory, '读取博客分类', idInput, z.strictObject({ item: categorySchema }), async ({ id }, signal) => ({ item: categoryView(await blog.readCategory(id, signal)) })),
9
+ [BLOG_MCP_TOOLS.createCategory]: writeTool(BLOG_MCP_TOOLS.createCategory, '创建博客分类', input, z.strictObject({ item: categorySchema }), async (value, signal) => ({ item: categoryView(await blog.createCategory(value, signal)) })),
10
+ [BLOG_MCP_TOOLS.updateCategory]: writeTool(BLOG_MCP_TOOLS.updateCategory, '修改博客分类', input.extend({ id: z.uuid() }), z.strictObject({ item: categorySchema }), async ({ id, ...value }, signal) => ({ item: categoryView(await blog.updateCategory(id, value, signal)) })),
11
+ [BLOG_MCP_TOOLS.deleteCategory]: writeTool(BLOG_MCP_TOOLS.deleteCategory, '删除博客分类', idInput, deletedSchema, async ({ id }, signal) => { await blog.deleteCategory(id, signal); return { deleted: true, id }; }, true),
12
+ };
13
+ }
14
+ //# sourceMappingURL=category-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"category-tools.js","sourceRoot":"","sources":["../../src/mcp/category-tools.ts"],"names":[],"mappings":"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"}