Bladeren bron

refactor(light-skills): slim learn/dashboard/doctor; dashboard prompt-on-missing deps; doctor description -> Chinese trigger

lingfengQAQ 2 weken geleden
bovenliggende
commit
16284e7b4b

+ 19 - 32
webnovel-writer/skills/webnovel-dashboard/SKILL.md

@@ -8,10 +8,9 @@ allowed-tools: Bash Read
 
 ## 目标
 
-- 在本地启动只读 Web 面板。
-- 实时查看创作进度、设定词典、关系图谱、章节内容与追读力数据。
-- 显式查看 Story Runtime 主链状态,包括 `story-runtime/health`、latest commit 与 fallback 情况。
-- 允许监听 `.webnovel/` 变化,但不得修改项目内容。
+- 在本地启动只读 Web 面板,查看创作进度、设定词典、关系图谱、章节内容与追读力数据。
+- 暴露 Story Runtime 主链状态:`/api/story-runtime/health`、latest commit、fallback 情况。
+- 可监听 `.webnovel/` 变化,但不修改任何项目文件。
 
 ## 执行流程
 
@@ -26,22 +25,19 @@ if [ -z "${CLAUDE_PLUGIN_ROOT}" ] || [ ! -d "${CLAUDE_PLUGIN_ROOT}/dashboard" ];
 fi
 
 export DASHBOARD_DIR="${CLAUDE_PLUGIN_ROOT}/dashboard"
+export SCRIPTS_DIR="${CLAUDE_PLUGIN_ROOT}/scripts"
 ```
 
-### Step 2:安装依赖并解析项目根目录
+### Step 2:解析项目根目录
 
 ```bash
-python -m pip install -r "${DASHBOARD_DIR}/requirements.txt" --quiet
-export SCRIPTS_DIR="${CLAUDE_PLUGIN_ROOT}/scripts"
 export PROJECT_ROOT="$(python "${SCRIPTS_DIR}/webnovel.py" --project-root "${WORKSPACE_ROOT}" where)"
 echo "项目路径: ${PROJECT_ROOT}"
 ```
 
-补充要求:
-- `PROJECT_ROOT` 必须解析成功
-- 若依赖已安装,可重复执行,不视为错误
+`PROJECT_ROOT` 必须解析成功。
 
-### Step 3:准备 Python 模块路径并校验前端产物
+### Step 3:校验前端产物与依赖
 
 ```bash
 if [ -n "${PYTHONPATH:-}" ]; then
@@ -51,51 +47,42 @@ else
 fi
 
 if [ ! -f "${DASHBOARD_DIR}/frontend/dist/index.html" ]; then
-  echo "ERROR: 缺少前端构建产物 ${DASHBOARD_DIR}/frontend/dist/index.html" >&2
+  echo "ERROR: 缺少前端构建产物 ${DASHBOARD_DIR}/frontend/dist/index.html(dist 应随插件打包,确认插件完整安装)" >&2
   exit 1
 fi
 ```
 
-### Step 4:启动 Dashboard
+不默认安装依赖。仅当 Step 4 因缺依赖启动失败时,提示用户手动执行:
 
 ```bash
-python -m dashboard.server --project-root "${PROJECT_ROOT}"
+python -m pip install -r "${DASHBOARD_DIR}/requirements.txt"
 ```
 
-如不需要自动打开浏览器:
+### Step 4:启动 Dashboard
 
 ```bash
-python -m dashboard.server --project-root "${PROJECT_ROOT}" --no-browser
+python -m dashboard.server --project-root "${PROJECT_ROOT}"
 ```
 
-启动后优先确认以下接口可用:
-- `/api/story-runtime/health`
-- `/api/preflight`
-
-## 注意事项
+不自动打开浏览器时加 `--no-browser`;自定义端口加 `--port 9000`。
 
-- Dashboard 为纯只读面板,不提供修改接口。
-- 文件读取必须限制在 `PROJECT_ROOT` 范围内。
-- 如需自定义端口,使用 `--port 9000`。
+启动后优先确认接口可用:`/api/story-runtime/health`、`/api/preflight`。
 
 ## 成功标准
 
-- Dashboard 进程已启动且输出了可访问的 URL
-- 浏览器可正常打开页面(或 `--no-browser` 模式下 URL 可手动访问)
-- 页面显示项目数据(章节列表、实体图谱等)
+- Dashboard 进程已启动并输出可访问 URL;页面显示项目数据(章节列表、实体图谱等)。
 
 ## 失败恢复
 
 | 故障 | 恢复方式 |
 |------|---------|
-| 依赖安装失败 | 检查 Python 版本和网络,手动 `pip install -r requirements.txt` |
+| 启动报缺依赖 | 手动 `pip install -r "${DASHBOARD_DIR}/requirements.txt"`,检查 Python 版本与网络 |
 | 前端 `dist/` 缺失 | 确认插件完整安装,dist 应随插件打包 |
 | 项目根解析失败 | 检查 `.webnovel/state.json` 是否存在,确认 `WORKSPACE_ROOT` 正确 |
-| 端口占用 | 使用 `--port <其他端口>` 或关闭占用进程 |
+| 端口占用 | 用 `--port <其他端口>` 或关闭占用进程 |
 | 页面空白/数据缺失 | 确认 `.webnovel/` 下有 state.json、index.db 等数据文件 |
 
 ## 安全边界
 
-- 只读操作,不修改任何项目文件
-- 文件访问限制在 `PROJECT_ROOT` 范围内
-- 不暴露外部网络(默认 localhost)
+- 纯只读面板,不提供修改接口,不修改任何项目文件。
+- 文件访问限制在 `PROJECT_ROOT` 范围内,默认仅监听 localhost。

+ 9 - 30
webnovel-writer/skills/webnovel-doctor/SKILL.md

@@ -1,6 +1,6 @@
 ---
 name: webnovel-doctor
-description: This skill should be used when the user asks to "/webnovel-doctor", "检查项目环境", "体检网文项目", "排查 RAG 配置", "检查缺失文件", "项目状态不对", or needs a read-only diagnosis of webnovel-writer project files, databases, dependencies, and runtime configuration.
+description: 对网文项目做只读体检/诊断(/webnovel-doctor)——检查目录、文件、JSON、SQLite、RAG 配置、依赖与 Dashboard 构建产物是否完整。
 version: 0.1.0
 allowed-tools: Read Bash
 argument-hint: "[--chapter N] [--deep]"
@@ -10,15 +10,14 @@ argument-hint: "[--chapter N] [--deep]"
 
 ## 目标
 
-运行只读项目体检,确认当前书项目在所处阶段应该具备的目录、文件、JSON、SQLite、RAG 配置、Python 依赖和 Dashboard 构建产物是否完整。
+只读诊断当前书项目:确认所处阶段应有的目录、文件、JSON、SQLite、RAG 配置、Python 依赖与 Dashboard 构建产物是否完整。
 
 ## 原则
 
-1. 只读诊断,不写入项目文件,不自动修复,不安装依赖,不启动 Dashboard。
-2. 先运行 `project-status` 获取短状态,再运行 `doctor` 获取详细检查。
-3. 使用 `python -X utf8`,避免 Windows 中文路径和中文文件名编码问题。
-4. 保留旧 `status` 命令语义;需要短状态时使用 `project-status`,需要宏观创作健康报告时才使用 `status`。
-5. 根据 doctor 输出说明影响和修复建议;缺失项不要自行猜测为终态要求,阶段由 runtime 推导。
+1. 只读诊断:不写项目文件、不自动修复、不安装依赖、不启动 Dashboard。
+2. 先 `project-status` 取短状态,再 `doctor` 做阶段感知检查。
+3. 统一用 `python -X utf8`,避免中文路径编码问题。
+4. 缺失项按 runtime 推导的阶段解释影响与修复建议,不把 init 刚结束的项目按已写多章项目检查。
 
 ## 执行
 
@@ -41,30 +40,10 @@ python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "${WORKSPACE_ROOT}" p
 python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "${WORKSPACE_ROOT}" doctor --format text
 ```
 
-指定章节:
-
-```bash
-python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "${WORKSPACE_ROOT}" doctor --chapter {chapter_num} --format text
-```
-
-深度体检:
-
-```bash
-python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "${WORKSPACE_ROOT}" doctor --deep --format text
-```
+指定章节加 `--chapter {chapter_num}`,深度体检加 `--deep`。
 
 ## 输出方式
 
-汇报时包含:
-
-- 当前 `phase` 和 `target_chapter`。
-- 是否有 blocker。
-- 缺失或异常文件的路径。
-- RAG / Python / Dashboard 配置是否缺失。
-- 每个问题的影响和建议修复动作。
-
-避免输出:
+汇报包含:当前 `phase` 与 `target_chapter`、是否有 blocker、缺失或异常文件路径、RAG / Python / Dashboard 配置是否缺失、每个问题的影响和建议修复动作。
 
-- 不执行真实修复。
-- 不展示或要求用户粘贴 API key。
-- 不把 init 刚结束的项目按已写多章项目检查。
+不执行真实修复,不展示或要求粘贴 API key。

+ 14 - 40
webnovel-writer/skills/webnovel-learn/SKILL.md

@@ -1,6 +1,6 @@
 ---
 name: webnovel-learn
-description: 从当前会话提取成功模式并写入 project_memory.json
+description: 从当前会话提取成功写作模式并写入 project_memory.json
 allowed-tools: Read Bash
 argument-hint: "[要记住的写作经验]"
 ---
@@ -10,7 +10,7 @@ argument-hint: "[要记住的写作经验]"
 ## Project Root Guard(必须先确认)
 
 - 必须在项目根目录执行(需存在 `.webnovel/state.json`)
-- 使用统一入口解析项目根,避免写错目录:
+- 用统一入口解析项目根,避免写错目录:
 
 ```bash
 export WORKSPACE_ROOT="${CLAUDE_PROJECT_DIR:-$PWD}"
@@ -19,31 +19,14 @@ export PROJECT_ROOT="$(python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-roo
 ```
 
 ## 目标
-- 提取可复用的写作模式(钩子/节奏/对话/微兑现等)
-- 追加到 `.webnovel/project_memory.json`
 
-## 输入
-```bash
-/webnovel-learn "本章的危机钩设计很有效,悬念拉满"
-```
-
-## 输出
-```json
-{
-  "status": "success",
-  "learned": {
-    "pattern_type": "hook",
-    "description": "危机钩设计:悬念拉满",
-    "source_chapter": 100,
-    "learned_at": "2026-02-02T12:00:00Z"
-  }
-}
-```
+提取可复用的写作模式(钩子/节奏/对话/微兑现等),追加到 `.webnovel/project_memory.json`。
 
 ## 执行流程
-1. 读取 `"$PROJECT_ROOT/.webnovel/state.json"`,获取当前章节号(progress.current_chapter)
-2. 解析用户输入(即 `/webnovel-learn` 后附带的经验文本;若为空则取本次对话中用户认可的写法),归类 pattern_type(hook/pacing/dialogue/payoff/emotion/format/other)
-3. 必须调用脚本写入,不得手写或拼接 JSON:
+
+1. 读取 `"$PROJECT_ROOT/.webnovel/state.json"` 的 `progress.current_chapter` 作为当前章节号;缺失则用 `source_chapter: null`,不阻断。
+2. 解析用户输入(`/webnovel-learn` 后的经验文本;为空则取本次对话中用户认可的写法),归类 `pattern_type`(hook/pacing/dialogue/payoff/emotion/format/other,无法归类用 `other`)。
+3. 调用 `project-memory add-pattern` 写入,不得手写或拼接 JSON:
 
 ```bash
 python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "${PROJECT_ROOT}" project-memory add-pattern \
@@ -53,30 +36,21 @@ python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "${PROJECT_ROOT}" pro
   --importance "{high|medium|low}"
 ```
 
-脚本会自动读取/初始化 `.webnovel/project_memory.json`,并用 JSON 序列化写回,自动转义英文双引号、换行等字符。
-
 ## 约束
-- 不删除旧记录,仅追加
-- 避免完全重复的 description(可去重)
-- 禁止使用 `Write` 或手工编辑 `.webnovel/project_memory.json`
-
-## 去重规则
 
-- 追加前扫描已有 `patterns` 数组
-- 若存在 `pattern_type` + `description` 完全相同的记录,跳过并告知用户
-- 部分相似不去重,由用户判断
+- 不删除旧记录,仅追加。
+- 追加前扫描已有 `patterns`;`pattern_type` + `description` 完全相同则跳过并告知用户,部分相似不去重。
+- 禁止使用 `Write` 或手工编辑 `.webnovel/project_memory.json`。
 
 ## 成功标准
 
-- `project_memory.json` 存在且格式合法
-- 新 pattern 已追加到 `patterns` 数组
-- 输出包含 `status: success` 和完整 `learned` 对象
+- `project_memory.json` 存在且格式合法,新 pattern 已追加到 `patterns` 数组。
+- 输出包含 `status: success` 和完整 `learned` 对象。
 
 ## 失败恢复
 
 | 故障 | 恢复方式 |
 |------|---------|
-| `project_memory.json` 不存在 | 自动初始化 `{"patterns": []}` 后继续 |
+| `project_memory.json` 不存在 | 脚本自动初始化 `{"patterns": []}` 后继续 |
 | JSON 解析失败 | 不写入脏数据,告知用户文件损坏并建议手动修复 |
-| `state.json` 缺失导致无法获取章节号 | 使用 `source_chapter: null`,不阻断 |
-| 用户输入无法归类 | 使用 `pattern_type: "other"`,不阻断 |
+| `state.json` 缺失无法取章节号 | 用 `source_chapter: null`,不阻断 |