원클릭으로
siyuan-roaming-dev
为漫游式渐进阅读 SiYuan 插件的后续修改、优化、调试和开发提供项目背景、代码结构、关键入口与注意事项。
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
为漫游式渐进阅读 SiYuan 插件的后续修改、优化、调试和开发提供项目背景、代码结构、关键入口与注意事项。
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
| name | siyuan-roaming-dev |
| description | 为漫游式渐进阅读 SiYuan 插件的后续修改、优化、调试和开发提供项目背景、代码结构、关键入口与注意事项。 |
当用户要修改、优化、调试、扩展本仓库时,先使用本 skill 建立上下文。本项目是 SiYuan 笔记插件 roaming-mode-incremental-reading,中文名“漫游式渐进阅读”。核心目标不是闪卡复习或对抗遗忘,而是解决渐进阅读第一步:在大量已有文档中按优先级、筛选范围和推荐算法选择下一篇“稍后阅读”的文档。
plugin.json,当前插件支持 desktop、browser-desktop、mobile、browser-mobile,以及 windows/linux/darwin/docker/ios/harmony/android 后端。README.md 和 README_zh_CN.md,中文 README 更适合理解产品语义。pnpm@9.13.2。pnpm dev:vite build --watch。pnpm dev:siyuan:读取 .env 中的 SIYUAN_PLUGIN_DIR,watch 构建到 SiYuan 插件目录。pnpm build:普通构建。pnpm build:release:生产构建。pnpm test:Vitest watch。pnpm package:运行 scripts/package.py 打包。vite.config.ts:入口 src/index.ts,输出 CommonJS,外部化 siyuan,静态复制 README、LICENSE、icon、preview、plugin.json、src/i18n/**。watch/dev 模式下如果有 SIYUAN_PLUGIN_DIR 会输出到 ${SIYUAN_PLUGIN_DIR}/roaming-mode-incremental-reading。src/index.ts:插件主入口,导出 RandomDocPlugin extends Plugin;负责加载配置、初始化顶栏、命令、移动端浮动按钮、右侧 dock 侧栏、日志开关、配置归一化和卸载清理。src/topbar.ts:顶栏按钮、右键设置弹窗、快捷命令。左键通常调用侧栏实例 triggerRoam();右键打开 RandomDocSetting.svelte。src/floatingButton.ts:移动端浮动按钮,保存位置到 localStorage,点击优先调用侧栏 triggerRoam(),侧栏未就绪时有移动端直接漫游兜底。src/api/base-api.ts:基础 SiYuan API POST/SQL 请求封装。src/api/kernel-api.ts:SiYuan kernel API 封装,如 SQL、块属性、文档 Markdown、笔记本、根文档、最近文档等。src/service/IncrementalReviewer.ts:最核心业务服务,负责筛选、随机漫游、优先级、指标、访问记录、漫游次数、最近漫游时间、修复指标、清空插件数据等。src/service/RecommendationService.ts:智能推荐服务,负责多锚点 TF-IDF 推荐。src/models/RandomDocConfig.ts:主配置模型和筛选模式。src/models/IncrementalConfig.ts:指标、文档优先级数据、优先级计算模型。src/models/RecommendationConfig.ts:推荐配置类型和默认值。src/libs/PluginSidebar.svelte:当前最重要的桌面侧栏 UI,包含筛选、指标、漫游、点状图、优先级列表、已漫游列表、漫游次数列表、推荐列表和优先级对齐。src/libs/RandomDocSetting.svelte:设置弹窗,包含基本配置、文档指标配置、批量优先级重置、智能推荐设置和清空数据等功能。src/libs/MetricsPanel.svelte:当前文档指标和总优先级编辑面板。src/libs/PriorityBarChart.svelte:优先级 SVG 点状图,支持拖动调整和右键打开文档。src/libs/MobileSidebarDialog.svelte:移动端侧栏浮窗,复用 PluginSidebar.svelte。src/libs/MobileFloatingActions.svelte:移动端浮动操作按钮组。src/utils/textUtil.ts:推荐算法用 Markdown 采样、清理和分词。src/utils/pageUtil.ts:当前文档 ID 获取,部分逻辑依赖 SiYuan DOM。src/utils/svg.ts:图标 SVG。src/stores/lockStore.ts:锁定编辑状态。RandomDocConfig文件:src/models/RandomDocConfig.ts。
重要字段:
filterMode:notebook、root、tag、sql。notebookId、rootId、rootDocTitle、tags、sqlQuery:筛选范围。incrementalConfigId:渐进指标配置存储 ID,默认 incremental_config。excludeVisited:是否排除已访问文档,默认 true。recentAnchorCount:最近漫游锚点数,默认 3。topAnchorCount:漫游次数最多锚点数,默认 2。recommendTopK:推荐输出数量,默认 8。recommendMaxCandidates:推荐候选上限,默认 120。recommendMaxParagraphs:采样段落上限,默认 8。autoAlignRecommendationPriority:是否自动对齐推荐文档优先级。autoResetOnStartup、autoReloadWhenEmpty、enableDebugLog。absolutePriorityProb:直接选择最高优先级文档的概率,0 到 1。src/index.ts 会用 normalizeMainConfig() 对历史配置和非法值做归一化。新增配置字段时通常要同时改 RandomDocConfig.ts、RandomDocSetting.svelte 和 index.ts 的归一化逻辑。
IncrementalConfig文件:src/models/IncrementalConfig.ts。
Metric:id、name、value、weight、description。importance 权重 40,紧急度 urgency 权重 30,难度 difficulty 权重 30,默认值均为 5。sum(metricValue * metric.weight) / sum(metric.weight)。插件把文档级数据写入块属性:
custom-metric-${metric.id}:某文档某指标值。custom-priority:文档总优先级。custom-visit-count:访问记录,用于 excludeVisited。custom-roaming-count:漫游次数。custom-roaming-last:最近漫游时间,ISO 字符串。修改指标、总优先级、批量重置或推荐对齐时,必须保持 custom-metric-* 与 custom-priority 一致。
核心在 src/service/IncrementalReviewer.ts 的 getRandomDoc(config?),UI 入口主要在 src/libs/PluginSidebar.svelte 的 doIncrementalRandomDoc()。
流程:
buildFilterCondition(config?) 根据筛选模式构造 SQL 条件。excludeVisited 开启,排除已有 custom-visit-count 的文档。autoReloadWhenEmpty 开启,调用 resetVisited() 后重试。custom-priority,缺失或异常时用默认/修复逻辑。absolutePriorityProb 决定是否直接取最高优先级文档;否则按优先级权重轮盘赌选择。{ docId, isAbsolutePriority }。核心方法:IncrementalReviewer.buildFilterCondition(config?)。
box IN (...)。path LIKE '%rootId%' 限制文档树。blocks 表按 tag 查 root_id。id IN (...)。这里 SQL 字符串拼接很多。涉及用户输入、标签、rootId、notebookId、id 列表时要特别注意转义、空列表、单引号和 LIKE 语义。
核心在 src/service/RecommendationService.ts,文本工具在 src/utils/textUtil.ts。
推荐算法:
custom-roaming-last)和漫游次数最多 M 篇(custom-roaming-count)作为 anchors,合并去重。updated DESC 取最多 maxCandidates 个 candidates。kernelApi.getDocMarkdown() 获取 Markdown。sampleMarkdown() 使用标题 + 头/中/尾段落采样。tokenize() 英文按词、中文按字,并过滤停用词。recordVisitAndRoam(docId) 更新访问和漫游记录。推荐刷新可能较重,默认候选 120 篇,长文和移动端可能有性能压力。优化推荐时优先考虑缓存、降低刷新频率、改进采样/分词、BM25 或多样性重排。
主要实现位于 src/libs/PluginSidebar.svelte。
逻辑大意:读取推荐文档当前优先级,计算优先级 min/max;把推荐 score 归一化后映射回优先级区间;按新旧优先级比例调整所有指标值,并更新 custom-metric-* 和 custom-priority。配置开关是 autoAlignRecommendationPriority。
修改这块时重点确认:极值保护、优先级范围过窄时的扩展、指标值边界、批量更新失败时的一致性。
src/libs/PluginSidebar.svelte。src/libs/RandomDocSetting.svelte。src/libs/MetricsPanel.svelte。src/libs/PriorityBarChart.svelte。src/topbar.ts。src/floatingButton.ts。src/libs/MobileSidebarDialog.svelte。src/libs/MobileFloatingActions.svelte。src/libs/RandomDocContent.svelte 可能是旧版或历史 UI,改 UI 前先 grep 引用,不要直接删除。
RandomDocConfig.ts、index.ts normalizeMainConfig()、RandomDocSetting.svelte,必要时同步 PluginSidebar.svelte。RandomDocConfig.ts 的 FilterMode、IncrementalReviewer.buildFilterCondition()、PluginSidebar.svelte 筛选 UI 和历史记录逻辑。IncrementalReviewer.getRandomDoc()、轮盘赌选择和 calculateSelectionProbability()。IncrementalConfig.ts、IncrementalReviewer 指标更新/修复、MetricsPanel.svelte 总优先级编辑。RecommendationService.ts、textUtil.ts、RecommendationConfig.ts、PluginSidebar.svelte 推荐刷新/展示。IncrementalReviewer.repairAllDocumentMetrics()、clearAllDocumentData()、RandomDocSetting.svelte。pageUtil.ts、PluginSidebar.svelte、floatingButton.ts。vite.config.ts、scripts/*.py、package.json。IncrementalReviewer.ts、RecommendationService.ts、kernel-api.ts 中有大量拼接;不要把未经处理的用户输入直接拼入 SQL。index.ts 的 normalize 方法是为了兼容旧配置,新增字段时要设置合理默认值并处理旧数据。textUtil.ts 的 Markdown 清理正则建议用测试覆盖,尤其是代码块、链接、图片、标题、引用和横线。pageUtil.ts 的当前页面获取依赖 SiYuan DOM,SiYuan 前端结构变化可能导致失效。IncrementalReadingConfig.ts、IncrementalConfigPanel.svelte 可能是旧实现或备用实现;清理前必须查引用。MobileFloatingActions.svelte 中部分拖动逻辑不完整,移动端优化前先确认实际调用链。clearAllDocumentData() 会清空所有插件写入的文档属性,是不可逆危险操作;改相关 UI 时保留明确确认。vite.config.ts 中 emptyOutDir: false 可避免误删插件目录,但发布前要注意旧产物残留。