@sendevia/pi-ask-author 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.
- package/LICENSE +9 -0
- package/README.md +212 -0
- package/package.json +48 -0
- package/src/component.ts +1219 -0
- package/src/format.ts +201 -0
- package/src/index.ts +419 -0
- package/src/model.ts +748 -0
- package/src/novel-markdown.ts +673 -0
- package/src/sanitize.ts +279 -0
- package/src/schema.ts +108 -0
- package/src/texts.ts +636 -0
- package/src/theme.ts +15 -0
- package/src/view-rows.ts +217 -0
- package/src/view-summary.ts +110 -0
- package/tsconfig.json +16 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 sendevia
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
6
|
+
|
|
7
|
+
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
8
|
+
|
|
9
|
+
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
# pi-ask-author
|
|
2
|
+
|
|
3
|
+
[](https://pi.dev/packages)
|
|
4
|
+
[](https://www.typescriptlang.org/)
|
|
5
|
+
[](https://opensource.org/licenses/MIT)
|
|
6
|
+
|
|
7
|
+
专为作家、轻小说创作者与 AI 协同写作设计的 [Pi](https://github.com/earendil-works/pi-coding-agent) 终端交互式请示扩展。
|
|
8
|
+
|
|
9
|
+
通过 Markdown 正文草稿预览、剧情因果推演、题目与选项两级批注以及结构化的返回封套,让创作分歧在同一次询问内得到确认。
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## 🌟 核心特性 (Key Features)
|
|
14
|
+
|
|
15
|
+
- 🖥️ **双栏响应式 TUI 交互**
|
|
16
|
+
- **左栏选项决策**:直观展示单选/多选状态、完成度指示徽标、选项标签与专属批注标识。
|
|
17
|
+
- **右栏实时预览**:光标移动时即时联动渲染当前选项的**剧情因果推导**与 **Markdown 正文草稿预览**。
|
|
18
|
+
- **自适应视口**:终端宽度不小于 72 列时启用双栏,窄屏下改为单栏内联展开与折叠。
|
|
19
|
+
- 📖 **小说级富文本与草稿高亮**
|
|
20
|
+
- 内置紧凑轻量的终端 Markdown 渲染与小说语法高亮,完整支持 bold、italic、删除线、行内代码、引用区块。
|
|
21
|
+
- 对中文小说台词(引号内对话高亮)与分段排版做了专门处理,作者可以在终端内直接检视行文节奏与语感。
|
|
22
|
+
- 📝 **题目与选项两级批注体系 (Notes & Annotations)**
|
|
23
|
+
- **题目级补充说明 (Question Note)**:对该题整体提出全局创作指令或氛围补充。
|
|
24
|
+
- **选项专属补充说明 (Option Note)**:光标位于选项行时按 `n` 即可为特定选项追加细化批注(**未勾选的选项同样可以填写补充说明**,便于模型借鉴未选方案中的可取之处)。
|
|
25
|
+
- 📋 **单题平铺与批量问卷双模式**
|
|
26
|
+
- **单题平铺模式**:快速发起单点决策(如重要剧情分歧、结局走向)。
|
|
27
|
+
- **多题批量问卷模式**:支持在单次弹窗内汇集多个关联决策(如脱离路线 + 战利品搜刮 + 下章基调),配有顶部 Tab 标签栏与完成度总览页(Summary Tab),作者在一处完成全部确认。
|
|
28
|
+
- 🎯 **确定性 LLM 封套与指令蒸馏 (Deterministic Envelopes)**
|
|
29
|
+
- 工具返回给 LLM 的文本采用固定的结构化 Markdown 封套(`[Author Decision Finalized]` / `[Author Decision Cancelled]` / `[Author Consultation Error]`),前缀稳定,便于 Prompt Cache 命中。
|
|
30
|
+
- **草稿指令提取 (Draft Directives)**:选中的选项草稿预览会自动提炼为紧凑的单行 `[Draft directive: ...]` 指令,直接供 LLM 在后续正文执笔中原样复用或参考。
|
|
31
|
+
- 尾部附带执行指令,要求模型不再寒暄,直接进入下一步正文写作。
|
|
32
|
+
- ⚡ **高性能与极简依赖**
|
|
33
|
+
- 严格遵守 Pi 官方扩展生态规范,核心依赖 `@earendil-works/pi-coding-agent`、`@earendil-works/pi-tui` 与 `typebox` 均列为 `peerDependencies`,不引入其他第三方依赖。
|
|
34
|
+
- 资源回收:生命周期严格绑定 AbortSignal,定时器与事件监听幂等清理,渲染缓存按尺寸与状态键失效。
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## 📦 安装与加载 (Installation)
|
|
39
|
+
|
|
40
|
+
### 方式一:通过 Pi 包管理器安装(推荐)
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
# 从 GitHub 仓库安装
|
|
44
|
+
pi install git:github.com/sendevia/pi-ask-author
|
|
45
|
+
|
|
46
|
+
# 或从 npm 安装(发布后)
|
|
47
|
+
pi install npm:pi-ask-author
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
添加到全局或项目配置后,每次启动 `pi` 时将自动加载该扩展。
|
|
51
|
+
|
|
52
|
+
### 方式二:临时体验
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
pi -e git:github.com/sendevia/pi-ask-author
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### 方式三:本地开发加载
|
|
59
|
+
|
|
60
|
+
将仓库克隆至本地后,在项目 `.pi/extensions/` 或全局 `~/.pi/agent/extensions/` 中添加引用,或在运行时通过 `-e` 引入:
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
pi -e ./path/to/pi-ask-author
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## ⌨️ 终端快捷键指南 (Keybindings)
|
|
69
|
+
|
|
70
|
+
| 按键 | 功能说明 |
|
|
71
|
+
| :-------------------------------------------- | :--------------------------------------------------------------------------- |
|
|
72
|
+
| `Tab` / `Shift+Tab` 或 `←` / `→` 或 `h` / `l` | 在题目页与提交总览页之间循环切换 |
|
|
73
|
+
| `1`~`9` | 直接跳转到第 N 题 |
|
|
74
|
+
| `↑` / `↓` 或 `k` / `j` | 作答页移动菜单光标;总览页上下滚动 |
|
|
75
|
+
| `Home` / `End` | 作答页跳到菜单首项 / 末项;总览页跳到顶部 / 底部 |
|
|
76
|
+
| `Space` | 作答页勾选或取消勾选当前选项;总览页向下滚动 |
|
|
77
|
+
| `Enter` / `Ctrl+S` | 作答页确认本题并前进;总览页提交答卷 |
|
|
78
|
+
| `n` / `e` | 编辑当前聚焦选项的专属补充说明(光标位于题目补充说明入口时编辑题目补充说明) |
|
|
79
|
+
| `N` | 直接编辑题目整体补充说明 |
|
|
80
|
+
| `x` / `Delete` | 清空当前聚焦选项的补充说明,其次清空题目补充说明 |
|
|
81
|
+
| `a` | 多选模式下全选或清空已选项 |
|
|
82
|
+
| `PgUp` / `[` / `Alt+↑` | 作答页向上滚动预览区;总览页向上滚动 |
|
|
83
|
+
| `PgDn` / `]` / `Alt+↓` | 作答页向下滚动预览区;总览页向下滚动 |
|
|
84
|
+
| `Esc` / `Ctrl+C` | 取消本次请示(编辑器中首次按下需再次确认丢弃修改) |
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## 🤖 智能体提示词与调用规范 (Agent Guidelines)
|
|
89
|
+
|
|
90
|
+
在系统提示词或 Skill 中声明以下规则,可以引导 LLM 按预期调用该工具:
|
|
91
|
+
|
|
92
|
+
```markdown
|
|
93
|
+
Whenever plot branches, character decisions, scene atmosphere, or outline directions need confirmation:
|
|
94
|
+
|
|
95
|
+
- Call `ask_author` directly without conversational preambles.
|
|
96
|
+
- Always provide a concise `formTitle`.
|
|
97
|
+
- Use the `questions` array to batch interrelated decisions into ONE invocation; avoid consecutive single calls.
|
|
98
|
+
- Include causal plot deductions in `description` and scene draft excerpts in `preview`.
|
|
99
|
+
- Omit optional default fields (`id`, `description`, `minSelect`, `maxSelect`, `allowEmpty`, `allowCustom`) to maximize token economy and prompt caching.
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### 参数示例:多题批量问卷
|
|
103
|
+
|
|
104
|
+
```json
|
|
105
|
+
{
|
|
106
|
+
"formTitle": "第七幕逃生抉择与伏笔分配",
|
|
107
|
+
"questions": [
|
|
108
|
+
{
|
|
109
|
+
"title": "第一幕脱离路线选择",
|
|
110
|
+
"options": [
|
|
111
|
+
{
|
|
112
|
+
"label": "炸毁地下蒸汽管网断后",
|
|
113
|
+
"description": "引爆管网阻断追兵,代价是彻底暴露行踪并波及城区管线。",
|
|
114
|
+
"preview": "“听着,艾略特,”雷恩咬紧牙关按下阀门,“我数到三,你往排污井跳!”\n蒸汽在接缝处发出濒临极限的尖啸,暗红警示灯将二人面孔映得如同凝血。"
|
|
115
|
+
},
|
|
116
|
+
{ "label": "遁入旧排水暗渠迂回脱离", "description": "周旋于暗渠迷宫,隐匿行踪但有遭遇感染体风险。" }
|
|
117
|
+
]
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
"title": "主角搜刮战利品与剧情伏笔(多选)",
|
|
121
|
+
"multiSelect": true,
|
|
122
|
+
"options": [
|
|
123
|
+
{ "label": "过载超频模块", "description": "战斗中可触发高热熔毁,但易过载自伤。" },
|
|
124
|
+
{ "label": "加密军方识别铭牌", "description": "揭示军方秘密人体实验编号,引发信任危机。" }
|
|
125
|
+
]
|
|
126
|
+
}
|
|
127
|
+
]
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### 返回封套示例
|
|
132
|
+
|
|
133
|
+
```text
|
|
134
|
+
[Author Decision Finalized]
|
|
135
|
+
1. [第一幕脱离路线选择]: 【炸毁地下蒸汽管网断后】引爆管网阻断追兵,代价是彻底暴露行踪并波及城区管线。 [Author note: 注意描写气压表的指针爆表碎裂细节] [Draft directive: '听着,艾略特,'雷恩咬紧牙关按下阀门,'我数到三,你往排污井跳!' / 蒸汽在接缝处发出濒临极限的尖啸,暗红警示灯将二人面孔映得如同凝血。]
|
|
136
|
+
2. [主角搜刮战利品与剧情伏笔(多选)]: 【过载超频模块】战斗中可触发高热熔毁,但易过载自伤。; 【加密军方识别铭牌】揭示军方秘密人体实验编号,引发信任危机。
|
|
137
|
+
Execute workflow and writing strictly according to the author decisions and draft directives above without conversational acknowledgments.
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## 🏗️ 架构与模块设计 (Architecture)
|
|
143
|
+
|
|
144
|
+
插件采用严格的单向无环依赖图分层构建,保证各个组件职责清晰、高内聚且易于测试:
|
|
145
|
+
|
|
146
|
+
```mermaid
|
|
147
|
+
flowchart LR
|
|
148
|
+
theme --> texts
|
|
149
|
+
theme --> novel-markdown
|
|
150
|
+
theme --> view-rows
|
|
151
|
+
theme --> view-summary
|
|
152
|
+
theme --> component
|
|
153
|
+
texts --> format
|
|
154
|
+
texts --> schema
|
|
155
|
+
texts --> model
|
|
156
|
+
texts --> novel-markdown
|
|
157
|
+
texts --> view-rows
|
|
158
|
+
texts --> view-summary
|
|
159
|
+
texts --> component
|
|
160
|
+
texts --> index
|
|
161
|
+
format --> sanitize
|
|
162
|
+
format --> model
|
|
163
|
+
format --> novel-markdown
|
|
164
|
+
format --> view-rows
|
|
165
|
+
format --> view-summary
|
|
166
|
+
format --> component
|
|
167
|
+
format --> index
|
|
168
|
+
schema --> sanitize
|
|
169
|
+
schema --> model
|
|
170
|
+
schema --> index
|
|
171
|
+
model --> novel-markdown
|
|
172
|
+
model --> view-rows
|
|
173
|
+
model --> view-summary
|
|
174
|
+
model --> component
|
|
175
|
+
model --> index
|
|
176
|
+
sanitize --> index
|
|
177
|
+
novel-markdown --> component
|
|
178
|
+
view-rows --> component
|
|
179
|
+
view-summary --> component
|
|
180
|
+
component --> index
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
箭头由被依赖模块指向依赖它的模块(`A --> B` 表示 `B` 导入 `A`)。
|
|
184
|
+
|
|
185
|
+
- **`index.ts`**:扩展主入口,注册 `ask_author` 工具与 `/ask-author` 命令,负责结果工厂构造与卡片记忆化渲染。
|
|
186
|
+
- **`component.ts`**:TUI 状态机核心组件,自行维护按键派生、光标记忆、视口滑动窗口与双栏排版。
|
|
187
|
+
- **`model.ts`**:问卷表单数据模型,负责规范化题目前期推导、选项校验与答案序列化。
|
|
188
|
+
- **`schema.ts`**:基于 TypeBox 构建的静态类型与运行时 Schema 单一数据源。
|
|
189
|
+
- **`texts.ts`**:常量、终端图标、小说语法表与面向作者/LLM 双向文案的集中字典。
|
|
190
|
+
- **`novel-markdown.ts`**:小说语法终端高亮层,在原生 Markdown 引擎解析前注入语义标记。
|
|
191
|
+
- **`sanitize.ts`**:入参防御性清洗与别名兼容。
|
|
192
|
+
- **`view-rows.ts` / `view-summary.ts`**:列表行与总览页的排版生成器。
|
|
193
|
+
|
|
194
|
+
---
|
|
195
|
+
|
|
196
|
+
## 🧪 开发与质量验证 (Development)
|
|
197
|
+
|
|
198
|
+
本项目开启 TypeScript 严格模式:
|
|
199
|
+
|
|
200
|
+
```bash
|
|
201
|
+
# 安装开发依赖
|
|
202
|
+
pnpm install
|
|
203
|
+
|
|
204
|
+
# 严格类型检查(要求零错误、零警告)
|
|
205
|
+
pnpm run check
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
---
|
|
209
|
+
|
|
210
|
+
## 📄 开源许可证 (License)
|
|
211
|
+
|
|
212
|
+
本项目基于 [MIT License](LICENSE) 开源发布。欢迎贡献代码或提出改进建议!
|
package/package.json
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@sendevia/pi-ask-author",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "面向文字创作者的创作决策询问 Pi 扩展:交互式双栏 TUI 问卷、Markdown 草稿预览与题目/选项两级批注",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"pi-package",
|
|
7
|
+
"pi-extension",
|
|
8
|
+
"tui",
|
|
9
|
+
"creative-writing",
|
|
10
|
+
"novel",
|
|
11
|
+
"author-consultation"
|
|
12
|
+
],
|
|
13
|
+
"repository": {
|
|
14
|
+
"type": "git",
|
|
15
|
+
"url": "ssh://git@git.sendevia.top:26621/sendevia/pi-ask-author.git"
|
|
16
|
+
},
|
|
17
|
+
"license": "MIT",
|
|
18
|
+
"author": "sendevia",
|
|
19
|
+
"type": "module",
|
|
20
|
+
"main": "./src/index.ts",
|
|
21
|
+
"types": "./src/index.ts",
|
|
22
|
+
"files": [
|
|
23
|
+
"src",
|
|
24
|
+
"package.json",
|
|
25
|
+
"README.md",
|
|
26
|
+
"LICENSE",
|
|
27
|
+
"tsconfig.json"
|
|
28
|
+
],
|
|
29
|
+
"scripts": {
|
|
30
|
+
"check": "tsc --noEmit -p tsconfig.json"
|
|
31
|
+
},
|
|
32
|
+
"devDependencies": {
|
|
33
|
+
"@earendil-works/pi-coding-agent": "^0.85.1",
|
|
34
|
+
"@earendil-works/pi-tui": "^0.85.1",
|
|
35
|
+
"typebox": "^1.3.31",
|
|
36
|
+
"typescript": "^7.0.2"
|
|
37
|
+
},
|
|
38
|
+
"peerDependencies": {
|
|
39
|
+
"@earendil-works/pi-coding-agent": "*",
|
|
40
|
+
"@earendil-works/pi-tui": "*",
|
|
41
|
+
"typebox": "*"
|
|
42
|
+
},
|
|
43
|
+
"pi": {
|
|
44
|
+
"extensions": [
|
|
45
|
+
"./src/index.ts"
|
|
46
|
+
]
|
|
47
|
+
}
|
|
48
|
+
}
|