dsh-book-deconstruct 1.1.3 → 1.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -0
- package/index.js +33 -31
- package/locale/en.json +1 -1
- package/locale/zh.json +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
package/index.js
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* book-deconstruct — 输入书名 + 作者,直接输出成品级书籍解读。
|
|
3
3
|
*
|
|
4
4
|
* 输出只保留两部分:
|
|
5
|
-
* 1.
|
|
6
|
-
* 2.
|
|
5
|
+
* 1. 书籍的故事情节(讲清整本书,不要一句话短评,也不要灌水)
|
|
6
|
+
* 2. 一段有深度的思考(最后只写一段,不列条目)
|
|
7
7
|
*
|
|
8
8
|
* 两个入口共用同一套解读逻辑(工具 execute):
|
|
9
9
|
* - `/book …` 斜杠命令:解析后 followup/steer 用户消息,让模型调用 book_deconstruct
|
|
@@ -144,9 +144,15 @@ export function parseBookInput(raw) {
|
|
|
144
144
|
|
|
145
145
|
function buildSteerPrompt(parsed, raw) {
|
|
146
146
|
if (parsed !== null) {
|
|
147
|
-
return
|
|
147
|
+
return (
|
|
148
|
+
`必须调用 book_deconstruct 工具解读《${parsed.title}》,作者${parsed.author}。` +
|
|
149
|
+
'不要自己直接写短评或一两句话概括;完整解读由该工具产出。'
|
|
150
|
+
);
|
|
148
151
|
}
|
|
149
|
-
return
|
|
152
|
+
return (
|
|
153
|
+
`必须调用 book_deconstruct 工具处理用户的书籍解读请求:${raw}。` +
|
|
154
|
+
'不要自己直接写短评或一两句话概括;完整解读由该工具产出。'
|
|
155
|
+
);
|
|
150
156
|
}
|
|
151
157
|
|
|
152
158
|
/** 不依赖 @deepseek-ai/dsh-llm(本地 file: 插件 realpath 解析不到宿主包)。 */
|
|
@@ -176,39 +182,34 @@ function enqueueUserTurn(agent, message) {
|
|
|
176
182
|
// ---------------------------------------------------------------------------
|
|
177
183
|
|
|
178
184
|
const SYSTEM_PROMPT = [
|
|
179
|
-
'
|
|
185
|
+
'你是一位有洞察力的书籍解读者。只交付成品,不展示分析过程。',
|
|
186
|
+
'',
|
|
187
|
+
'输出有且仅有两部分:',
|
|
188
|
+
'1. 书籍的故事情节:把整本书讲清楚(小说讲清人物与情节推进;非虚构讲清主线内容与关键论点)。不要一句话短评,也不要灌水啰嗦。',
|
|
189
|
+
'2. 一段有深度的思考:全文最后只写一整段,不列条目、不加小标题。',
|
|
180
190
|
'',
|
|
181
191
|
'铁律:',
|
|
182
|
-
'1.
|
|
183
|
-
'2.
|
|
184
|
-
'3.
|
|
185
|
-
'4.
|
|
186
|
-
'5. 用中文 Markdown
|
|
187
|
-
'6. 如果对书名或作者没有可靠信息,直接说明「我无法可靠地解读这本书」,不要编造内容。',
|
|
192
|
+
'1. 只输出成品。不要写分析步骤、框架说明、知识边界、置信度、自我审校或元评论。',
|
|
193
|
+
'2. 不编造。不确定的事实、引文、页码、奖项、时间线不要写。',
|
|
194
|
+
'3. 你的推论须标明语气(如「由此可以推出」),勿冒充作者原话。',
|
|
195
|
+
'4. 禁止鸡汤短评、书腰简介、朋友圈文案;也禁止为凑字数而重复、注水。',
|
|
196
|
+
'5. 用中文 Markdown。若无法可靠解读该书,只写「我无法可靠地解读这本书」。',
|
|
188
197
|
].join('\n');
|
|
189
198
|
|
|
190
199
|
function buildAnalysisPrompt(title, author) {
|
|
191
200
|
return `书名:《${title}》
|
|
192
201
|
作者:${author}
|
|
193
202
|
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
## 这本书讲的是什么事
|
|
197
|
-
用 1000–1800 字,把整本书的内容讲透(这是主体部分):
|
|
198
|
-
- 这本书的核心主题,以及它在回答什么问题;
|
|
199
|
-
- 全书的结构与推进方式:大致分几部分/几条主线,每部分主要讲了什么;
|
|
200
|
-
- 关键概念、核心论点、重要方法或案例(用自己的话转述,不编造引文);
|
|
201
|
-
- 作者的基本立场与最终结论。
|
|
202
|
-
要求:按书的内容实际展开,让人读完这一段就基本掌握这本书讲了什么;不要只写一句概括,也不要写成目录清单。
|
|
203
|
+
请直接输出成品,只写下面两部分,标题必须原样使用。不要写分析过程或元信息。
|
|
203
204
|
|
|
204
|
-
##
|
|
205
|
-
|
|
206
|
-
-
|
|
207
|
-
-
|
|
208
|
-
|
|
209
|
-
只写这一段,不要再列多条结论。
|
|
205
|
+
## 故事情节
|
|
206
|
+
把整本书讲清楚即可:
|
|
207
|
+
- 小说:主要人物、起因—发展—转折—结局,关键情节线;
|
|
208
|
+
- 非虚构:主线问题、各部分分别讲什么、关键论点/案例如何推进到结论。
|
|
209
|
+
要求:读完能掌握全书在讲什么;禁止一句话短评;禁止灌水、重复、百科词条或目录清单。篇幅以讲清为准,通常大约 800–1500 字,够用就停。
|
|
210
210
|
|
|
211
|
-
|
|
211
|
+
## 一段有深度的思考
|
|
212
|
+
紧接着写**一整段**(约 200–350 字,不要分条、不要小标题):从全书提炼一个真正有深度的思考——它是什么、为何成立(扣住书中内容)、对读者意味着什么。除此之外不要再写别的部分。`;
|
|
212
213
|
}
|
|
213
214
|
|
|
214
215
|
// ---------------------------------------------------------------------------
|
|
@@ -310,7 +311,7 @@ export function apply(ctx, rawConfig) {
|
|
|
310
311
|
// 挂 input.hint:从 / 菜单选 book 时保留输入框,继续填「书名 | 作者」。
|
|
311
312
|
// 也可整行输入 /book 书名 | 作者 后直接发送。
|
|
312
313
|
name: 'book',
|
|
313
|
-
description: '
|
|
314
|
+
description: '书籍拆解:深度解读一本书。用法:/book 书名 | 作者',
|
|
314
315
|
input: { hint: '书名 | 作者' },
|
|
315
316
|
handler: async (invocation) => {
|
|
316
317
|
const raw = String(invocation.rawInput ?? '').trim();
|
|
@@ -321,6 +322,8 @@ export function apply(ctx, rawConfig) {
|
|
|
321
322
|
return { kind: 'error', text: USAGE };
|
|
322
323
|
}
|
|
323
324
|
|
|
325
|
+
// 桌面端:先 steer/followup 让会话调用工具(整行发送才有反应)。
|
|
326
|
+
// 不要在 handler 里长时间 await 模型,否则输入框像「点了没反应」。
|
|
324
327
|
const prompt = buildSteerPrompt(parsed, raw);
|
|
325
328
|
const agent = invocation.agent;
|
|
326
329
|
const ok = enqueueUserTurn(agent, makeUserMessage(prompt));
|
|
@@ -328,13 +331,12 @@ export function apply(ctx, rawConfig) {
|
|
|
328
331
|
if (parsed !== null) {
|
|
329
332
|
return {
|
|
330
333
|
kind: 'success',
|
|
331
|
-
text: `已提交解读:《${parsed.title}》 / ${parsed.author}
|
|
334
|
+
text: `已提交解读:《${parsed.title}》 / ${parsed.author}(请等待 book_deconstruct 产出完整解读,勿自行短评)`,
|
|
332
335
|
};
|
|
333
336
|
}
|
|
334
337
|
return { kind: 'success', text: '已提交书籍解读请求(将调用 book_deconstruct)' };
|
|
335
338
|
}
|
|
336
339
|
|
|
337
|
-
// followup/steer 不可用时,直接跑工具逻辑,保证斜杠有反馈
|
|
338
340
|
if (parsed === null) {
|
|
339
341
|
return { kind: 'error', text: USAGE };
|
|
340
342
|
}
|
|
@@ -355,7 +357,7 @@ export function apply(ctx, rawConfig) {
|
|
|
355
357
|
ctx.tools.register({
|
|
356
358
|
name: 'book_deconstruct',
|
|
357
359
|
description:
|
|
358
|
-
'
|
|
360
|
+
'深度解读一本书:先写「故事情节」(讲清整本书,勿一句话短评、勿灌水),再写「一段有深度的思考」。用户要求解读/拆解某书时必须调用本工具,禁止自己用短评代替。',
|
|
359
361
|
parameters: {
|
|
360
362
|
type: 'object',
|
|
361
363
|
properties: {
|
package/locale/en.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"meta": {
|
|
3
3
|
"title": "Book Deconstruct",
|
|
4
|
-
"description": "Host plugin: /book and book_deconstruct in any session.
|
|
4
|
+
"description": "Host plugin: /book and book_deconstruct in any session. Clear plot of the whole book, then one deep reflection."
|
|
5
5
|
}
|
|
6
6
|
}
|
package/locale/zh.json
CHANGED