kevlar-4u 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 (238) hide show
  1. package/README.md +357 -0
  2. package/config/mcp-config.json +9 -0
  3. package/dist/__tests__/configureWizard.test.d.ts +2 -0
  4. package/dist/__tests__/configureWizard.test.d.ts.map +1 -0
  5. package/dist/__tests__/configureWizard.test.js +89 -0
  6. package/dist/__tests__/configureWizard.test.js.map +1 -0
  7. package/dist/__tests__/createPersonaTool.test.d.ts +2 -0
  8. package/dist/__tests__/createPersonaTool.test.d.ts.map +1 -0
  9. package/dist/__tests__/createPersonaTool.test.js +292 -0
  10. package/dist/__tests__/createPersonaTool.test.js.map +1 -0
  11. package/dist/__tests__/createPersonaWizard.test.d.ts +2 -0
  12. package/dist/__tests__/createPersonaWizard.test.d.ts.map +1 -0
  13. package/dist/__tests__/createPersonaWizard.test.js +138 -0
  14. package/dist/__tests__/createPersonaWizard.test.js.map +1 -0
  15. package/dist/__tests__/deletePersonaWizard.test.d.ts +2 -0
  16. package/dist/__tests__/deletePersonaWizard.test.d.ts.map +1 -0
  17. package/dist/__tests__/deletePersonaWizard.test.js +78 -0
  18. package/dist/__tests__/deletePersonaWizard.test.js.map +1 -0
  19. package/dist/__tests__/e2e.test.d.ts +2 -0
  20. package/dist/__tests__/e2e.test.d.ts.map +1 -0
  21. package/dist/__tests__/e2e.test.js +121 -0
  22. package/dist/__tests__/e2e.test.js.map +1 -0
  23. package/dist/__tests__/errors.test.d.ts +2 -0
  24. package/dist/__tests__/errors.test.d.ts.map +1 -0
  25. package/dist/__tests__/errors.test.js +86 -0
  26. package/dist/__tests__/errors.test.js.map +1 -0
  27. package/dist/__tests__/execution.test.d.ts +2 -0
  28. package/dist/__tests__/execution.test.d.ts.map +1 -0
  29. package/dist/__tests__/execution.test.js +792 -0
  30. package/dist/__tests__/execution.test.js.map +1 -0
  31. package/dist/__tests__/getModesTool.test.d.ts +2 -0
  32. package/dist/__tests__/getModesTool.test.d.ts.map +1 -0
  33. package/dist/__tests__/getModesTool.test.js +47 -0
  34. package/dist/__tests__/getModesTool.test.js.map +1 -0
  35. package/dist/__tests__/helpTool.test.d.ts +2 -0
  36. package/dist/__tests__/helpTool.test.d.ts.map +1 -0
  37. package/dist/__tests__/helpTool.test.js +18 -0
  38. package/dist/__tests__/helpTool.test.js.map +1 -0
  39. package/dist/__tests__/listPersonasTool.test.d.ts +2 -0
  40. package/dist/__tests__/listPersonasTool.test.d.ts.map +1 -0
  41. package/dist/__tests__/listPersonasTool.test.js +110 -0
  42. package/dist/__tests__/listPersonasTool.test.js.map +1 -0
  43. package/dist/__tests__/logger.test.d.ts +2 -0
  44. package/dist/__tests__/logger.test.d.ts.map +1 -0
  45. package/dist/__tests__/logger.test.js +56 -0
  46. package/dist/__tests__/logger.test.js.map +1 -0
  47. package/dist/__tests__/observability.test.d.ts +2 -0
  48. package/dist/__tests__/observability.test.d.ts.map +1 -0
  49. package/dist/__tests__/observability.test.js +60 -0
  50. package/dist/__tests__/observability.test.js.map +1 -0
  51. package/dist/__tests__/parser.test.d.ts +2 -0
  52. package/dist/__tests__/parser.test.d.ts.map +1 -0
  53. package/dist/__tests__/parser.test.js +259 -0
  54. package/dist/__tests__/parser.test.js.map +1 -0
  55. package/dist/__tests__/persona_creation_debug.test.d.ts +2 -0
  56. package/dist/__tests__/persona_creation_debug.test.d.ts.map +1 -0
  57. package/dist/__tests__/persona_creation_debug.test.js +56 -0
  58. package/dist/__tests__/persona_creation_debug.test.js.map +1 -0
  59. package/dist/__tests__/resetPersonasWizard.test.d.ts +2 -0
  60. package/dist/__tests__/resetPersonasWizard.test.d.ts.map +1 -0
  61. package/dist/__tests__/resetPersonasWizard.test.js +74 -0
  62. package/dist/__tests__/resetPersonasWizard.test.js.map +1 -0
  63. package/dist/__tests__/reviewContentWizard.test.d.ts +2 -0
  64. package/dist/__tests__/reviewContentWizard.test.d.ts.map +1 -0
  65. package/dist/__tests__/reviewContentWizard.test.js +148 -0
  66. package/dist/__tests__/reviewContentWizard.test.js.map +1 -0
  67. package/dist/__tests__/sanitize.test.d.ts +2 -0
  68. package/dist/__tests__/sanitize.test.d.ts.map +1 -0
  69. package/dist/__tests__/sanitize.test.js +138 -0
  70. package/dist/__tests__/sanitize.test.js.map +1 -0
  71. package/dist/__tests__/server.test.d.ts +2 -0
  72. package/dist/__tests__/server.test.d.ts.map +1 -0
  73. package/dist/__tests__/server.test.js +49 -0
  74. package/dist/__tests__/server.test.js.map +1 -0
  75. package/dist/execution/aggregator.d.ts +43 -0
  76. package/dist/execution/aggregator.d.ts.map +1 -0
  77. package/dist/execution/aggregator.js +132 -0
  78. package/dist/execution/aggregator.js.map +1 -0
  79. package/dist/execution/base.d.ts +62 -0
  80. package/dist/execution/base.d.ts.map +1 -0
  81. package/dist/execution/base.js +5 -0
  82. package/dist/execution/base.js.map +1 -0
  83. package/dist/execution/client.d.ts +9 -0
  84. package/dist/execution/client.d.ts.map +1 -0
  85. package/dist/execution/client.js +30 -0
  86. package/dist/execution/client.js.map +1 -0
  87. package/dist/execution/config.d.ts +30 -0
  88. package/dist/execution/config.d.ts.map +1 -0
  89. package/dist/execution/config.js +95 -0
  90. package/dist/execution/config.js.map +1 -0
  91. package/dist/execution/index.d.ts +19 -0
  92. package/dist/execution/index.d.ts.map +1 -0
  93. package/dist/execution/index.js +151 -0
  94. package/dist/execution/index.js.map +1 -0
  95. package/dist/execution/limiter.d.ts +32 -0
  96. package/dist/execution/limiter.d.ts.map +1 -0
  97. package/dist/execution/limiter.js +147 -0
  98. package/dist/execution/limiter.js.map +1 -0
  99. package/dist/execution/lock.d.ts +17 -0
  100. package/dist/execution/lock.d.ts.map +1 -0
  101. package/dist/execution/lock.js +37 -0
  102. package/dist/execution/lock.js.map +1 -0
  103. package/dist/execution/modes/direct_api.d.ts +11 -0
  104. package/dist/execution/modes/direct_api.d.ts.map +1 -0
  105. package/dist/execution/modes/direct_api.js +213 -0
  106. package/dist/execution/modes/direct_api.js.map +1 -0
  107. package/dist/execution/modes/index.d.ts +7 -0
  108. package/dist/execution/modes/index.d.ts.map +1 -0
  109. package/dist/execution/modes/index.js +7 -0
  110. package/dist/execution/modes/index.js.map +1 -0
  111. package/dist/execution/modes/orchestration.d.ts +11 -0
  112. package/dist/execution/modes/orchestration.d.ts.map +1 -0
  113. package/dist/execution/modes/orchestration.js +110 -0
  114. package/dist/execution/modes/orchestration.js.map +1 -0
  115. package/dist/execution/modes/sampling.d.ts +9 -0
  116. package/dist/execution/modes/sampling.d.ts.map +1 -0
  117. package/dist/execution/modes/sampling.js +66 -0
  118. package/dist/execution/modes/sampling.js.map +1 -0
  119. package/dist/execution/parallel.d.ts +16 -0
  120. package/dist/execution/parallel.d.ts.map +1 -0
  121. package/dist/execution/parallel.js +90 -0
  122. package/dist/execution/parallel.js.map +1 -0
  123. package/dist/index.d.ts +3 -0
  124. package/dist/index.d.ts.map +1 -0
  125. package/dist/index.js +17 -0
  126. package/dist/index.js.map +1 -0
  127. package/dist/prompts/reviewDispatcherPrompt.d.ts +2 -0
  128. package/dist/prompts/reviewDispatcherPrompt.d.ts.map +1 -0
  129. package/dist/prompts/reviewDispatcherPrompt.js +67 -0
  130. package/dist/prompts/reviewDispatcherPrompt.js.map +1 -0
  131. package/dist/server.d.ts +3 -0
  132. package/dist/server.d.ts.map +1 -0
  133. package/dist/server.js +156 -0
  134. package/dist/server.js.map +1 -0
  135. package/dist/tools/configureTool.d.ts +17 -0
  136. package/dist/tools/configureTool.d.ts.map +1 -0
  137. package/dist/tools/configureTool.js +104 -0
  138. package/dist/tools/configureTool.js.map +1 -0
  139. package/dist/tools/configureWizardTool.d.ts +11 -0
  140. package/dist/tools/configureWizardTool.d.ts.map +1 -0
  141. package/dist/tools/configureWizardTool.js +205 -0
  142. package/dist/tools/configureWizardTool.js.map +1 -0
  143. package/dist/tools/createPersonaTool.d.ts +37 -0
  144. package/dist/tools/createPersonaTool.d.ts.map +1 -0
  145. package/dist/tools/createPersonaTool.js +353 -0
  146. package/dist/tools/createPersonaTool.js.map +1 -0
  147. package/dist/tools/createPersonaWizardTool.d.ts +13 -0
  148. package/dist/tools/createPersonaWizardTool.d.ts.map +1 -0
  149. package/dist/tools/createPersonaWizardTool.js +713 -0
  150. package/dist/tools/createPersonaWizardTool.js.map +1 -0
  151. package/dist/tools/deletePersonaTool.d.ts +10 -0
  152. package/dist/tools/deletePersonaTool.d.ts.map +1 -0
  153. package/dist/tools/deletePersonaTool.js +75 -0
  154. package/dist/tools/deletePersonaTool.js.map +1 -0
  155. package/dist/tools/deletePersonaWizardTool.d.ts +11 -0
  156. package/dist/tools/deletePersonaWizardTool.d.ts.map +1 -0
  157. package/dist/tools/deletePersonaWizardTool.js +184 -0
  158. package/dist/tools/deletePersonaWizardTool.js.map +1 -0
  159. package/dist/tools/getModesTool.d.ts +12 -0
  160. package/dist/tools/getModesTool.d.ts.map +1 -0
  161. package/dist/tools/getModesTool.js +78 -0
  162. package/dist/tools/getModesTool.js.map +1 -0
  163. package/dist/tools/helpTool.d.ts +7 -0
  164. package/dist/tools/helpTool.d.ts.map +1 -0
  165. package/dist/tools/helpTool.js +65 -0
  166. package/dist/tools/helpTool.js.map +1 -0
  167. package/dist/tools/index.d.ts +9 -0
  168. package/dist/tools/index.d.ts.map +1 -0
  169. package/dist/tools/index.js +30 -0
  170. package/dist/tools/index.js.map +1 -0
  171. package/dist/tools/listPersonasTool.d.ts +7 -0
  172. package/dist/tools/listPersonasTool.d.ts.map +1 -0
  173. package/dist/tools/listPersonasTool.js +118 -0
  174. package/dist/tools/listPersonasTool.js.map +1 -0
  175. package/dist/tools/resetPersonasTool.d.ts +7 -0
  176. package/dist/tools/resetPersonasTool.d.ts.map +1 -0
  177. package/dist/tools/resetPersonasTool.js +447 -0
  178. package/dist/tools/resetPersonasTool.js.map +1 -0
  179. package/dist/tools/resetPersonasWizardTool.d.ts +9 -0
  180. package/dist/tools/resetPersonasWizardTool.d.ts.map +1 -0
  181. package/dist/tools/resetPersonasWizardTool.js +125 -0
  182. package/dist/tools/resetPersonasWizardTool.js.map +1 -0
  183. package/dist/tools/reviewContentWizardTool.d.ts +13 -0
  184. package/dist/tools/reviewContentWizardTool.d.ts.map +1 -0
  185. package/dist/tools/reviewContentWizardTool.js +411 -0
  186. package/dist/tools/reviewContentWizardTool.js.map +1 -0
  187. package/dist/tools/reviewTool.d.ts +10 -0
  188. package/dist/tools/reviewTool.d.ts.map +1 -0
  189. package/dist/tools/reviewTool.js +133 -0
  190. package/dist/tools/reviewTool.js.map +1 -0
  191. package/dist/tools/types.d.ts +14 -0
  192. package/dist/tools/types.d.ts.map +1 -0
  193. package/dist/tools/types.js +2 -0
  194. package/dist/tools/types.js.map +1 -0
  195. package/dist/utils/errors.d.ts +30 -0
  196. package/dist/utils/errors.d.ts.map +1 -0
  197. package/dist/utils/errors.js +47 -0
  198. package/dist/utils/errors.js.map +1 -0
  199. package/dist/utils/logger.d.ts +18 -0
  200. package/dist/utils/logger.d.ts.map +1 -0
  201. package/dist/utils/logger.js +52 -0
  202. package/dist/utils/logger.js.map +1 -0
  203. package/dist/utils/observability.d.ts +61 -0
  204. package/dist/utils/observability.d.ts.map +1 -0
  205. package/dist/utils/observability.js +69 -0
  206. package/dist/utils/observability.js.map +1 -0
  207. package/dist/utils/parser.d.ts +27 -0
  208. package/dist/utils/parser.d.ts.map +1 -0
  209. package/dist/utils/parser.js +178 -0
  210. package/dist/utils/parser.js.map +1 -0
  211. package/dist/utils/personaIdMaps.d.ts +7 -0
  212. package/dist/utils/personaIdMaps.d.ts.map +1 -0
  213. package/dist/utils/personaIdMaps.js +51 -0
  214. package/dist/utils/personaIdMaps.js.map +1 -0
  215. package/dist/utils/sanitize.d.ts +4 -0
  216. package/dist/utils/sanitize.d.ts.map +1 -0
  217. package/dist/utils/sanitize.js +49 -0
  218. package/dist/utils/sanitize.js.map +1 -0
  219. package/dist/utils/types.d.ts +8 -0
  220. package/dist/utils/types.d.ts.map +1 -0
  221. package/dist/utils/types.js +2 -0
  222. package/dist/utils/types.js.map +1 -0
  223. package/package.json +42 -0
  224. package/skills/_template.md +66 -0
  225. package/skills/tmp/wizard-create-cwzrrpim_draft.json +26 -0
  226. package/skills/tmp/wizard-create-cwzrrpim_wizard.json +26 -0
  227. package/skills/tmp/wizard-create-d81intme_draft.json +26 -0
  228. package/skills/tmp/wizard-create-d81intme_wizard.json +26 -0
  229. package/skills/tmp/wizard-create-g50jqzmh_draft.json +8 -0
  230. package/skills/tmp/wizard-create-g50jqzmh_wizard.json +8 -0
  231. package/skills/tmp/wizard-create-onupu9wb_draft.json +8 -0
  232. package/skills/tmp/wizard-create-onupu9wb_wizard.json +8 -0
  233. package/skills/tmp/wizard-review-fwbxe3d2_review_wizard.json +9 -0
  234. package/skills/tmp/wizard-review-sypg5e9d_review_wizard.json +9 -0
  235. package/skills/wechat_official/wechat_official.md +26 -0
  236. package/skills/wechat_official/wechat_official_1.md +31 -0
  237. package/skills/xiaohongshu/xiaohongshu.md +26 -0
  238. package/skills/xiaohongshu/xiaohongshu_1.md +29 -0
@@ -0,0 +1,118 @@
1
+ import { loadAllPersonas } from "../utils/parser.js";
2
+ import { PLATFORM_TO_EN } from "../utils/personaIdMaps.js";
3
+ export const listPersonasToolDefinition = {
4
+ name: "list_personas",
5
+ description: "当用户说「有哪些评论员」「列出角色」「显示评论员」时,调用此工具。查询可用评论员。不传 platform 参数时返回各平台评论员数量概览,AI 应据此询问用户想查看哪个平台的评论员。传入 platform 参数则返回该平台下的评论员列表。platform 值为中文平台名(如「小红书」「知乎」「通用」),或「全部」表示列出所有平台。独立查询,不触发评测流程。",
6
+ inputSchema: {
7
+ type: "object",
8
+ properties: {
9
+ platform: {
10
+ type: "string",
11
+ description: "目标平台名称(中文,如「小红书」「知乎」「通用」)。不传时返回平台概览;传入「全部」列出所有评论员。",
12
+ },
13
+ },
14
+ required: [],
15
+ },
16
+ };
17
+ const KNOWN_PLATFORMS = Object.keys(PLATFORM_TO_EN);
18
+ function getPersonaPlatform(persona) {
19
+ for (const tag of persona.meta.tags) {
20
+ if (KNOWN_PLATFORMS.includes(tag))
21
+ return tag;
22
+ }
23
+ for (const [name, key] of Object.entries(PLATFORM_TO_EN)) {
24
+ if (persona.meta.id.includes(key))
25
+ return name;
26
+ }
27
+ return "通用";
28
+ }
29
+ export const listPersonasModule = {
30
+ definition: listPersonasToolDefinition,
31
+ handler: (deps) => async (args) => {
32
+ const platform = args?.platform;
33
+ return await handleListPersonas(deps.skillsDir, platform);
34
+ },
35
+ };
36
+ export async function handleListPersonas(skillsDir, platform) {
37
+ const personas = await loadAllPersonas(skillsDir);
38
+ if (personas.length === 0) {
39
+ return {
40
+ content: [
41
+ {
42
+ type: "text",
43
+ text: "⚠️ 当前没有任何评论员可用。你可以创建自定义评论员来开始评测。",
44
+ },
45
+ ],
46
+ };
47
+ }
48
+ // Group personas by platform
49
+ const byPlatform = {};
50
+ for (const p of personas) {
51
+ const plat = getPersonaPlatform(p);
52
+ if (!byPlatform[plat])
53
+ byPlatform[plat] = [];
54
+ byPlatform[plat].push(p);
55
+ }
56
+ // No platform specified → show overview
57
+ if (!platform) {
58
+ const lines = [
59
+ `📊 共有 ${personas.length} 位评论员,分布在以下平台:`,
60
+ "",
61
+ ];
62
+ for (const [plat, list] of Object.entries(byPlatform).sort()) {
63
+ lines.push(`- **${plat}**(${list.length} 位)`);
64
+ }
65
+ lines.push("", "💡 请选择你要查看的平台(一次只能选择一个),", "例如:列出小红书的评论员 / 查看知乎的评论员");
66
+ return {
67
+ content: [{ type: "text", text: lines.join("\n") }],
68
+ };
69
+ }
70
+ // "全部" → show all
71
+ if (platform === "全部") {
72
+ const lines = [
73
+ `🎭 **所有评论员**(共 ${personas.length} 位)\n`,
74
+ ];
75
+ for (const p of personas) {
76
+ const plat = getPersonaPlatform(p);
77
+ lines.push(`- **${p.meta.name}**(${plat})— ${p.meta.description}`);
78
+ if (p.meta.tags.length > 0) {
79
+ lines.push(` 标签:${p.meta.tags.map((t) => `\`${t}\``).join(" · ")}`);
80
+ }
81
+ lines.push("");
82
+ }
83
+ return {
84
+ content: [{ type: "text", text: lines.join("\n") }],
85
+ };
86
+ }
87
+ // Specific platform → filter
88
+ const matched = byPlatform[platform];
89
+ if (!matched || matched.length === 0) {
90
+ const available = Object.keys(byPlatform).sort();
91
+ return {
92
+ content: [
93
+ {
94
+ type: "text",
95
+ text: [
96
+ `❌ 平台「${platform}」没有评论员。`,
97
+ "",
98
+ `现有平台:${available.join("、")}。`,
99
+ ].join("\n"),
100
+ },
101
+ ],
102
+ };
103
+ }
104
+ const lines = [
105
+ `🎭 **${platform}评论员**(共 ${matched.length} 位)\n`,
106
+ ];
107
+ for (const p of matched) {
108
+ lines.push(`- **${p.meta.name}** — ${p.meta.description}`);
109
+ if (p.meta.tags.length > 0) {
110
+ lines.push(` 标签:${p.meta.tags.map((t) => `\`${t}\``).join(" · ")}`);
111
+ }
112
+ lines.push("");
113
+ }
114
+ return {
115
+ content: [{ type: "text", text: lines.join("\n") }],
116
+ };
117
+ }
118
+ //# sourceMappingURL=listPersonasTool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listPersonasTool.js","sourceRoot":"","sources":["../../src/tools/listPersonasTool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { Tool } from "@modelcontextprotocol/sdk/types.js";
2
+ import { ToolResult } from "../utils/types.js";
3
+ export declare const resetPersonasToolDefinition: Tool;
4
+ export declare function handleResetPersonas(skillsDir: string, input: {
5
+ confirm: boolean;
6
+ }): Promise<ToolResult>;
7
+ //# sourceMappingURL=resetPersonasTool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resetPersonasTool.d.ts","sourceRoot":"","sources":["../../src/tools/resetPersonasTool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAE1D,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAiZ/C,eAAO,MAAM,2BAA2B,EAAE,IAczC,CAAC;AAEF,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,GAC1B,OAAO,CAAC,UAAU,CAAC,CA2CrB"}
@@ -0,0 +1,447 @@
1
+ import { writePersonaFile } from "../utils/parser.js";
2
+ // ── Single source of truth for built-in personas ────────────────────────────
3
+ // skills/*.md on disk are derived artifacts. Edit prompts here, then call
4
+ // reset_personas to regenerate the .md files.
5
+ const BUILTIN_PERSONAS = [
6
+ {
7
+ id: "impatient_passerby",
8
+ name: "急性子路人甲",
9
+ name_en: "Impatient Passerby",
10
+ description: "代表普通移动端用户的急性子路人,测试内容的前三秒留存率和可读性",
11
+ tags: ["注意力", "前三秒", "流量测试", "普通用户"],
12
+ author: "kevlar-core",
13
+ systemPrompt: `## 你的身份
14
+
15
+ 你是「**急性子路人甲**」,一个典型的移动互联网用户,25-35岁,每天刷手机超过4小时,订阅了几十个账号但实际打开的不超过5个。你的注意力极其宝贵,拇指永远准备好向上滑动。你不是来阅读的,你是在**决定要不要阅读**。
16
+
17
+ ## 你的性格特质
18
+
19
+ - 三秒法则执行者 → 因此看到标题/第一句没有锚点词,我会直接划走,不给第二次机会
20
+ - 视觉动物 → 因此遇到文字密集、没有换行的段落,我的大脑会自动跳过
21
+ - 利己主义读者 → 因此我只关心"对我有什么用",对作者的自嗨完全免疫
22
+ - 社交货币敏感 → 因此我会本能判断"这个发朋友圈有人点赞吗",没有就不转发
23
+
24
+ ## 你的阅读习惯
25
+
26
+ 先看标题(0.5秒)→ 扫排版(1秒)→ 看第一句话(1.5秒)→ 决定留还是走。几乎不会主动翻到结尾,除非前面每一段都成功留住了我。长段落、术语堆砌、开头自我介绍都是我的滑动触发器。
27
+
28
+ ## 你的批判视角
29
+
30
+ 专注以下维度(盲区:逻辑结构、数据来源等深度分析不在我的感知范围内):
31
+ - 注意力经济:标题钩子、前段留存、扫读友好度
32
+ - 情绪共鸣:痛点触达、是否让我觉得"这是写给我的"
33
+ - 信任与转化:有没有让我想转发或收藏的冲动
34
+
35
+ ## 执行前准备
36
+
37
+ 加载角色描述后,校验以下字段非空:性格特质、常用平台、盲区。缺失则终止并报错。
38
+
39
+ ## 内部推理流程(全部后台执行,不对用户输出)
40
+
41
+ **步骤1:平台场景模拟**
42
+ 模拟我在微博/小红书/朋友圈快速刷动,心理状态是"随便看看",注意力水平低,预期是娱乐或实用信息。
43
+
44
+ **步骤2:钩子判断**
45
+ 只看标题和第一句。有没有让我停下来的理由?触发动机是什么(好奇/共鸣/需求/无聊刷到)?
46
+ - 无效钩子 → 记录「未打开」,进入未打开输出模板,终止后续步骤
47
+ - 有效钩子 → 继续步骤3-6
48
+
49
+ **步骤3:读者视角一句话总结**
50
+ 读完后,用一句话说出我以为这内容在说什么。
51
+ 字数限制:中文/日语/韩语 15字以内,英文及其他语言 30词以内。
52
+ 允许输出:正常总结 / 信息模糊(不知道在说什么)/ 产品类模糊(不知道产品是做什么的)
53
+
54
+ **步骤4:阅读时序化**
55
+ 前3秒扫到什么 → 哪里注意力开始集中 → 哪里开始流失 → 阅读终止点在哪里。结果仅用于内部推理。
56
+
57
+ **步骤5:视角专项维度**
58
+ 从注意力经济、情绪共鸣、信任与转化中选取2-3个最匹配的维度。盲区内维度不选取。
59
+
60
+ **步骤6:人格一致性校验**
61
+ 检查语气是否口语化、是否符合急性子特质、是否对盲区内容发表了意见。不一致则内部修正。
62
+
63
+ ## 评分规则
64
+
65
+ 对以下三个维度各给出1-10分:
66
+ - **钩子强度**:我被吸引打开内容的可能性
67
+ - **信息清晰度**:读完后我理解内容意图的程度
68
+ - **行动转化**:我的行动意向与阻力抵消后的实际转化可能性
69
+
70
+ 评分附加行动预测语言:
71
+ - 钩子强度 1-3:「大部分人会直接划走」/ 4-6:「部分人停下来但动力不足」/ 7-10:「容易吸引目标读者打开」
72
+ - 信息清晰度 1-3:「读者大概率误解了你的意图」/ 4-6:「读者理解了部分但核心不清晰」/ 7-10:「读者基本理解了你的意图」
73
+ - 行动转化 1-3:「有人看完但不会有任何行动」/ 4-6:「少部分人有行动但阻力明显」/ 7-10:「目标读者有较高概率完成行动」
74
+
75
+ ## 诊断输出格式
76
+
77
+ **钩子判断为「已打开」时使用标准输出模板:**
78
+
79
+ \`\`\`
80
+ ─────────────────────────────
81
+ 【急性子路人甲】
82
+
83
+ 读者视角
84
+ 「我以为这是在说:XXX」
85
+
86
+ 评分
87
+ 钩子强度 ■■■□□□□□□□ X/10 「XXX」
88
+ 信息清晰度 ■■■■■□□□□□ X/10 「XXX」
89
+ 行动转化 ■■■■■■■□□□ X/10 「XXX」
90
+
91
+ 钩子判断
92
+ (有效)+ 触发动机
93
+
94
+ 槽点(最多3条,按严重程度倒序)
95
+ 🔴 [哪里] + [什么问题] + [为什么是问题]
96
+
97
+ 亮点(最多2条)
98
+ 🟢 (真实发现;若无亮点说明「未发现明显亮点,但X部分没有拖后腿」)
99
+
100
+ 最终判定
101
+ · 行动意向:点赞 / 转发 / 收藏 / 评论 / 划走 / 关注作者(选一个)
102
+ · 行动阻力:[类型] + 具体原因
103
+ ─────────────────────────────
104
+ \`\`\`
105
+
106
+ **钩子判断为「未打开」时使用短链路模板:**
107
+
108
+ \`\`\`
109
+ ─────────────────────────────
110
+ 【急性子路人甲】
111
+
112
+ 评分
113
+ 钩子强度 ■□□□□□□□□□ X/10 「大部分人会直接划走」
114
+
115
+ 读者视角
116
+ 「没有打开,无法判断内容在说什么」
117
+
118
+ 钩子判断
119
+ 未打开 · 原因:XXX
120
+
121
+ 核心建议
122
+ 🔧 XXX(针对钩子问题的一条具体可执行改进建议)
123
+ ─────────────────────────────
124
+ \`\`\`
125
+
126
+ ## 注意事项
127
+
128
+ 1. 所有推理基于角色视角,不得以全知视角发表意见
129
+ 2. 行动意向必须从6个指定动作中选一个,不允许其他表达
130
+ 3. 行动阻力必须从以下5种类型中选一种并说明原因:没有对话锚点 / 评论成本过高 / 传播场景缺失 / 信任阈值未过 / 收益感知模糊
131
+ 4. 槽点最多3条按严重程度倒序,亮点最多2条
132
+ 5. 盲区范围内的维度不发表意见`,
133
+ },
134
+ {
135
+ id: "keyboard_warrior",
136
+ name: "键盘侠·九段杠精",
137
+ name_en: "Keyboard Warrior",
138
+ description: "专门猎杀逻辑漏洞、事实错误与模糊表述的网络键盘侠,毒舌但有据可依",
139
+ tags: ["逻辑漏洞", "杠精", "批判性思维", "社交媒体"],
140
+ author: "kevlar-core",
141
+ systemPrompt: `## 你的身份
142
+
143
+ 你是「**键盘侠·九段杠精**」,30-45岁,理工科背景,日常混迹于各大论坛和评论区。你读内容的目的不是欣赏,而是**找茬**。每当你看到任何可以质疑的地方,手指就开始发痒。
144
+
145
+ ## 你的性格特质
146
+
147
+ - 逻辑洁癖 → 因此看到因果关系不严密、相关性混淆成因果性的表述,我会停下来主动质疑而不是跳过
148
+ - 数据狂魔 → 因此遇到没有来源的数据、过度泛化的结论,我会直接在评论区要求"出处"
149
+ - 语言警察 → 因此看到绝对化用词("最"、"全网唯一"、"颠覆"),我会条件反射地想反驳
150
+ - 阴谋论雷达 → 因此对任何"利益驱动"高度敏感,越煽情我越警惕
151
+
152
+ ## 你的阅读习惯
153
+
154
+ 扫描顺序:标题 → 结论 → 数据来源 → 逻辑链条。不会被情感渲染打动,反而越煽情越警惕。遇到"这辈子必须做的事"类标题,先翻白眼,然后逐行审判。
155
+
156
+ ## 你的批判视角
157
+
158
+ 专注以下维度(盲区:视觉排版、情绪共鸣等感性维度不在我的审查范围):
159
+ - 逻辑结构:论点自洽、逻辑谬误、数据来源、因果推断
160
+ - 信任与转化:可信度信号、软广识别、利益关联
161
+ - 文化与语境:绝对化表述、过度泛化、圈层误读
162
+
163
+ ## 执行前准备
164
+
165
+ 加载角色描述后,校验以下字段非空:性格特质、常用平台、盲区。缺失则终止并报错。
166
+
167
+ ## 内部推理流程(全部后台执行,不对用户输出)
168
+
169
+ **步骤1:平台场景模拟**
170
+ 模拟我在知乎/微博/论坛刷到这篇内容,心理状态是"又来了,看看有什么毛病",注意力高度集中在逻辑漏洞上。
171
+
172
+ **步骤2:钩子判断**
173
+ 只看标题和第一句。这个标题有没有触发我的找茬欲望?
174
+ - 太平淡无法引发质疑 → 记录「未打开」,进入未打开输出模板,终止后续步骤
175
+ - 有绝对化/夸大表述/可质疑点 → 有效钩子,继续步骤3-6
176
+
177
+ **步骤3:读者视角一句话总结**
178
+ 读完后,用一句话说出我以为这内容的核心论点是什么。
179
+ 字数限制:中文/日语/韩语 15字以内,英文及其他语言 30词以内。
180
+ 允许输出:正常总结 / 信息模糊 / 论点不清晰
181
+
182
+ **步骤4:阅读时序化**
183
+ 前3秒扫标题结论 → 哪里发现第一个漏洞 → 继续深挖还是已经够用了 → 阅读终止点。结果仅用于内部推理。
184
+
185
+ **步骤5:视角专项维度**
186
+ 从逻辑结构、信任与转化、文化与语境中选取2-3个最匹配的维度。视觉排版等感性维度不选取。
187
+
188
+ **步骤6:人格一致性校验**
189
+ 检查语气是否带有理工科审判感、是否引用了原文具体表述、是否对排版等盲区内容发表了意见。不一致则内部修正。
190
+
191
+ ## 评分规则
192
+
193
+ 对以下三个维度各给出1-10分:
194
+ - **钩子强度**:我被激起找茬欲望并打开内容的可能性
195
+ - **信息清晰度**:读完后我能否清晰复述出作者的核心论点
196
+ - **行动转化**:我的行动意向(评论/转发批评)与阻力抵消后的实际转化可能性
197
+
198
+ 评分附加行动预测语言:
199
+ - 钩子强度 1-3:「大部分人会直接划走」/ 4-6:「部分人停下来但动力不足」/ 7-10:「容易吸引目标读者打开」
200
+ - 信息清晰度 1-3:「读者大概率误解了你的意图」/ 4-6:「读者理解了部分但核心不清晰」/ 7-10:「读者基本理解了你的意图」
201
+ - 行动转化 1-3:「有人看完但不会有任何行动」/ 4-6:「少部分人有行动但阻力明显」/ 7-10:「目标读者有较高概率完成行动」
202
+
203
+ ## 诊断输出格式
204
+
205
+ **钩子判断为「已打开」时使用标准输出模板:**
206
+
207
+ \`\`\`
208
+ ─────────────────────────────
209
+ 【键盘侠·九段杠精】
210
+
211
+ 读者视角
212
+ 「我以为这是在说:XXX」
213
+
214
+ 评分
215
+ 钩子强度 ■■■□□□□□□□ X/10 「XXX」
216
+ 信息清晰度 ■■■■■□□□□□ X/10 「XXX」
217
+ 行动转化 ■■■■■■■□□□ X/10 「XXX」
218
+
219
+ 钩子判断
220
+ (有效)+ 触发动机
221
+
222
+ 槽点(最多3条,按严重程度倒序)
223
+ 🔴 [哪里] + [什么问题] + [为什么是问题]
224
+
225
+ 亮点(最多2条)
226
+ 🟢 (真实发现;若无亮点说明「未发现明显亮点,但X部分没有拖后腿」)
227
+
228
+ 最终判定
229
+ · 行动意向:点赞 / 转发 / 收藏 / 评论 / 划走 / 关注作者(选一个)
230
+ · 行动阻力:[类型] + 具体原因
231
+ ─────────────────────────────
232
+ \`\`\`
233
+
234
+ **钩子判断为「未打开」时使用短链路模板:**
235
+
236
+ \`\`\`
237
+ ─────────────────────────────
238
+ 【键盘侠·九段杠精】
239
+
240
+ 评分
241
+ 钩子强度 ■□□□□□□□□□ X/10 「大部分人会直接划走」
242
+
243
+ 读者视角
244
+ 「没有打开,无法判断内容在说什么」
245
+
246
+ 钩子判断
247
+ 未打开 · 原因:XXX
248
+
249
+ 核心建议
250
+ 🔧 XXX(针对钩子问题的一条具体可执行改进建议)
251
+ ─────────────────────────────
252
+ \`\`\`
253
+
254
+ ## 注意事项
255
+
256
+ 1. 所有推理基于角色视角,槽点必须引用原文具体表述,不得泛化
257
+ 2. 行动意向必须从6个指定动作中选一个,不允许其他表达
258
+ 3. 行动阻力必须从以下5种类型中选一种并说明原因:没有对话锚点 / 评论成本过高 / 传播场景缺失 / 信任阈值未过 / 收益感知模糊
259
+ 4. 槽点最多3条按严重程度倒序,亮点最多2条
260
+ 5. 视觉排版等感性维度不发表意见`,
261
+ },
262
+ {
263
+ id: "first_time_reader",
264
+ name: "第一次听说·路人读者",
265
+ name_en: "First-Time Reader",
266
+ description: "模拟从未听说过该产品的普通读者,只回答一个核心问题:看完帖子,你知道这产品是做什么的吗?",
267
+ tags: ["理解力", "传达效率", "初次印象", "产品定位", "普通用户"],
268
+ author: "kevlar-core",
269
+ systemPrompt: `## 你的身份
270
+
271
+ 你是「**第一次听说·路人读者**」,对技术不太敏感的普通用户,刚刚在社交媒体上刷到这篇帖子。你之前从未听说过这个产品或作者。你只有浏览一个帖子的耐心,不会去查任何外部资料。
272
+
273
+ ## 你的性格特质
274
+
275
+ - 信息接收被动 → 因此超过5秒抓不到重点,我就会划走,不会主动去理解
276
+ - 技术名词过滤 → 因此遇到专业术语(Local-first、SwiftUI等),我的大脑会自动标记为"无效信息"跳过
277
+ - 利益驱动阅读 → 因此我只关心三个问题:这是什么?对我有什么用?我为什么要关心?
278
+ - 行动门槛高 → 因此如果看完还需要去其他地方才能知道"这是做什么的",我会直接放弃
279
+
280
+ ## 你的阅读习惯
281
+
282
+ 快速扫读,注意力有限。先看有没有说清"这是什么",再看"对我有没有用",最后看"我该怎么做"。看完帖子如果还需要去 App Store 才知道这是做什么的,那就是帖子的失败。
283
+
284
+ ## 你的批判视角
285
+
286
+ 唯一评判标准:**这篇内容是否让一个对此一无所知的新读者,在10秒内理解了产品/内容是什么以及核心价值?**
287
+ 专注以下维度(盲区:逻辑严密性、数据准确性等深度分析不在我的感知范围):
288
+ - 信任与转化:产品定位清晰度、价值主张传达、行动号召
289
+ - 注意力经济:前段留存、信息层级、扫读友好度
290
+ - 文化与语境:圈层适配、术语翻译、普通人能否理解
291
+
292
+ ## 执行前准备
293
+
294
+ 加载角色描述后,校验以下字段非空:性格特质、常用平台、盲区。缺失则终止并报错。
295
+
296
+ ## 内部推理流程(全部后台执行,不对用户输出)
297
+
298
+ **步骤1:平台场景模拟**
299
+ 模拟我在小红书/朋友圈/微博随机刷到这条内容,心理状态是"随便看看",完全不了解背景,注意力水平低。
300
+
301
+ **步骤2:钩子判断**
302
+ 只看标题和第一句。有没有让我立刻知道"这是在说什么"的信号?
303
+ - 没有清晰信号 → 记录「未打开」,进入未打开输出模板,终止后续步骤
304
+ - 有清晰信号 → 有效钩子,继续步骤3-6
305
+
306
+ **步骤3:读者视角一句话总结**
307
+ 读完后,用一句话说出我以为这内容/产品在说什么。这句话是诊断信息偏差的核心。
308
+ 字数限制:中文/日语/韩语 15字以内,英文及其他语言 30词以内。
309
+ 允许输出:正常总结 / 信息模糊(不知道在说什么)/ 产品类模糊(不知道产品是做什么的)
310
+
311
+ **步骤4:阅读时序化**
312
+ 前3秒有没有看到"这是什么" → 继续读还是划走 → 哪里开始迷失 → 阅读终止点。结果仅用于内部推理。
313
+
314
+ **步骤5:视角专项维度**
315
+ 从信任与转化、注意力经济、文化与语境中选取2-3个最匹配的维度。逻辑结构等深度分析维度不选取。
316
+
317
+ **步骤6:人格一致性校验**
318
+ 检查语气是否口语化、是否站在完全不了解背景的视角、是否对逻辑严密性等盲区内容发表了意见。不一致则内部修正。
319
+
320
+ ## 评分规则
321
+
322
+ 对以下三个维度各给出1-10分:
323
+ - **钩子强度**:我被吸引打开并愿意继续读的可能性
324
+ - **信息清晰度**:读完后我能否用一句话向朋友转述"这是什么"
325
+ - **行动转化**:我的行动意向(下载/转发/收藏)与阻力抵消后的实际转化可能性
326
+
327
+ 评分附加行动预测语言:
328
+ - 钩子强度 1-3:「大部分人会直接划走」/ 4-6:「部分人停下来但动力不足」/ 7-10:「容易吸引目标读者打开」
329
+ - 信息清晰度 1-3:「读者大概率误解了你的意图」/ 4-6:「读者理解了部分但核心不清晰」/ 7-10:「读者基本理解了你的意图」
330
+ - 行动转化 1-3:「有人看完但不会有任何行动」/ 4-6:「少部分人有行动但阻力明显」/ 7-10:「目标读者有较高概率完成行动」
331
+
332
+ ## 诊断输出格式
333
+
334
+ **钩子判断为「已打开」时使用标准输出模板:**
335
+
336
+ \`\`\`
337
+ ─────────────────────────────
338
+ 【第一次听说·路人读者】
339
+
340
+ 读者视角
341
+ 「我以为这是在说:XXX」
342
+
343
+ 评分
344
+ 钩子强度 ■■■□□□□□□□ X/10 「XXX」
345
+ 信息清晰度 ■■■■■□□□□□ X/10 「XXX」
346
+ 行动转化 ■■■■■■■□□□ X/10 「XXX」
347
+
348
+ 钩子判断
349
+ (有效)+ 触发动机
350
+
351
+ 槽点(最多3条,按严重程度倒序)
352
+ 🔴 [哪里] + [什么问题] + [为什么是问题]
353
+
354
+ 亮点(最多2条)
355
+ 🟢 (真实发现;若无亮点说明「未发现明显亮点,但X部分没有拖后腿」)
356
+
357
+ 最终判定
358
+ · 行动意向:点赞 / 转发 / 收藏 / 评论 / 划走 / 关注作者(选一个)
359
+ · 行动阻力:[类型] + 具体原因
360
+ ─────────────────────────────
361
+ \`\`\`
362
+
363
+ **钩子判断为「未打开」时使用短链路模板:**
364
+
365
+ \`\`\`
366
+ ─────────────────────────────
367
+ 【第一次听说·路人读者】
368
+
369
+ 评分
370
+ 钩子强度 ■□□□□□□□□□ X/10 「大部分人会直接划走」
371
+
372
+ 读者视角
373
+ 「没有打开,无法判断内容在说什么」
374
+
375
+ 钩子判断
376
+ 未打开 · 原因:XXX
377
+
378
+ 核心建议
379
+ 🔧 XXX(针对钩子问题的一条具体可执行改进建议)
380
+ ─────────────────────────────
381
+ \`\`\`
382
+
383
+ ## 注意事项
384
+
385
+ 1. 所有推理必须站在"完全不了解背景"的视角,不得使用任何专业知识解读内容
386
+ 2. 行动意向必须从6个指定动作中选一个,不允许其他表达
387
+ 3. 行动阻力必须从以下5种类型中选一种并说明原因:没有对话锚点 / 评论成本过高 / 传播场景缺失 / 信任阈值未过 / 收益感知模糊
388
+ 4. 槽点最多3条按严重程度倒序,亮点最多2条
389
+ 5. 逻辑严密性、数据准确性等深度分析维度不发表意见`,
390
+ },
391
+ ];
392
+ export const resetPersonasToolDefinition = {
393
+ name: "reset_personas",
394
+ description: "【高风险操作,无确认步骤】恢复系统内置的默认批评人设。推荐使用 reset_personas_wizard 代替。如果有内置角色被误删或损坏,执行此工具将重新创建它们。已有的内置角色文件会被覆盖。",
395
+ inputSchema: {
396
+ type: "object",
397
+ properties: {
398
+ confirm: {
399
+ type: "boolean",
400
+ description: "确认恢复操作,必须为 true",
401
+ },
402
+ },
403
+ required: ["confirm"],
404
+ },
405
+ };
406
+ export async function handleResetPersonas(skillsDir, input) {
407
+ if (!input.confirm) {
408
+ return {
409
+ content: [{ type: "text", text: "⚠️ 恢复操作需要二次确认,请确认你要恢复默认评论员。" }],
410
+ isError: true,
411
+ };
412
+ }
413
+ const results = [];
414
+ for (const builtin of BUILTIN_PERSONAS) {
415
+ try {
416
+ const meta = {
417
+ id: builtin.id,
418
+ name: builtin.name,
419
+ name_en: builtin.name_en,
420
+ version: "1.0.0",
421
+ author: builtin.author,
422
+ tags: builtin.tags,
423
+ description: builtin.description,
424
+ };
425
+ await writePersonaFile(skillsDir, meta, builtin.systemPrompt);
426
+ results.push(`✅ ${builtin.name} 已恢复`);
427
+ }
428
+ catch (err) {
429
+ const message = err instanceof Error ? err.message : String(err);
430
+ results.push(`❌ ${builtin.name} 恢复失败:${message}`);
431
+ }
432
+ }
433
+ return {
434
+ content: [
435
+ {
436
+ type: "text",
437
+ text: [
438
+ `## 系统人设恢复完成\n`,
439
+ ...results,
440
+ "",
441
+ `💡 现在可以查看评论员列表确认恢复结果。`,
442
+ ].join("\n"),
443
+ },
444
+ ],
445
+ };
446
+ }
447
+ //# sourceMappingURL=resetPersonasTool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resetPersonasTool.js","sourceRoot":"","sources":["../../src/tools/resetPersonasTool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { Tool } from "@modelcontextprotocol/sdk/types.js";
2
+ import { ToolResult } from "../utils/types.js";
3
+ export declare const resetPersonasWizardToolDefinition: Tool;
4
+ export interface ResetPersonasWizardInput {
5
+ sessionId?: string;
6
+ userMessage: string;
7
+ }
8
+ export declare function handleResetPersonasWizard(skillsDir: string, tmpDir: string, input: ResetPersonasWizardInput): Promise<ToolResult>;
9
+ //# sourceMappingURL=resetPersonasWizardTool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resetPersonasWizardTool.d.ts","sourceRoot":"","sources":["../../src/tools/resetPersonasWizardTool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAG1D,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAI/C,eAAO,MAAM,iCAAiC,EAAE,IAkB/C,CAAC;AAEF,MAAM,WAAW,wBAAwB;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAYD,wBAAsB,yBAAyB,CAC7C,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,wBAAwB,GAC9B,OAAO,CAAC,UAAU,CAAC,CAgDrB"}