メインコンテンツへスキップ
S

daily-question

scienmicroit/daily-question

考研每日一题 — DSH 插件:每科每天一道独立校验过的考研题,含倒计时、错题本、收藏与按题隔离的追问。

インストール

dsh plugin --profile web add github:scienmicroit/daily-question

README

考研每日一题

面向 DeepSeek Harness(DSH) 的考研练习插件。按科目每天分配一道题,把作答、答案解析、收藏、错题整理和针对本题的追问放在同一个页面中。

发布版本及历史改动见更新记录。

安装

环境要求

  • 已安装并能运行的 DSH,宿主需提供 Connection Fetch 路由接口。
  • Node.js 20.3.0 或更新版本(由运行宿主的环境提供)。
  • 在线出题、答案修订和追问需要宿主配置可用的默认模型。
  • 公式引擎随包提供,无需单独下载字体或公式依赖。

安装本地安装包

在 GitHub Releases 选择所需版本,下载对应的 daily-question-<版本号>.tgz 附件。

在 DSH Desktop 的插件安装入口填写该文件的绝对路径。命令行使用与你运行宿主一致的 profile,例如:

dsh plugin --profile web add "./下载的安装包.tgz"

Desktop 管理的 desktop profile 请通过 Desktop 插件界面操作。安装完成后重启相应宿主或刷新客户端,左侧栏出现「考研每日一题」入口。

从 npm 安装

安装 npm 上的最新版本:

dsh plugin --profile web add daily-question

DSH Desktop 可在插件安装入口填写 daily-question。命令行安装还需满足宿主对包管理器的要求;若提示缺少 pnpm,先安装或启用 pnpm。

从 GitHub 或源码安装

此方式需要 Git。将命令中的 版本号 换成所需发布标签的版本号:

dsh plugin --profile web add "github:Scienmicroit/Daily-Question#v版本号"

本地开发也可以直接安装源码目录:

dsh plugin --profile web add ./Daily-Question

升级时重新安装目标版本即可。卸载命令为:

dsh plugin --profile web remove daily-question

卸载插件不会自动删除保存在数据目录中的学习记录。

开始练习

  1. 打开「科目管理」,选择需要练习的科目并设置出题来源,点击「完成」。关闭或取消弹窗会放弃尚未保存的修改。
  2. 选择目标考研年份,核对倒计时与日期来源。
  3. 在「今日题目」开始作答。在线出题包括生成和独立校验,首次加载可能需要几十秒。
  4. 需要题库时,在「题库管理」导入文件,检查预览和解析提示,再确认入库。
  5. 查看答案后,可收藏题目、整理错题,或打开「本题追问」继续讨论。

内置学习科目包括思想政治理论、数学一、数学二和数学三。自定义科目支持内置题型和自行命名的题型。参考考试目录还提供「计算机学科专业基础(408)」。

自定义科目可填写练习范围,或选择已有科目作为范围参考。大纲和真题分别通过大纲管理与真题管理按科目导入。科目修改在点击「完成」后统一保存。

可以在科目管理为自定义科目填写「练习范围」,每行一个知识点。科目名称中可以注明院校,方便区分考试代码相同的自命题科目。

出题与作答规则

左侧「真题管理」下方显示当前插件版本和「检查更新」。打开插件页面时自动查询 npm 官方仓库的 daily-question 包,成功结果缓存6小时。点击按钮可立即重查。发现新版本时显示版本号与 npm 链接。

缺少有效参考选项的选择题提交后保持「待判定」,可自行判断,不会仅因没有参考答案就自动加入错题本。出题、答案修订和追问支持取消;总等待上限分别为15、10、5分钟,单次模型阶段最多5分钟。超时或取消后可重试,迟到结果不会继续发布。重启中断的追问显示为失败,可使用原消息重试;清空后不会恢复旧回复。

每日分配

每个启用科目每天分配一道固定题目。再次进入同一科目的今日题目会复用该日的分配;新的自然日按宿主本地日期计算。

页面保持打开时,会按宿主的下一次零点自动检查日期并为当前科目请求当天题目;切到其他栏目时不强制跳走,列表和数量会同步更新。今日题生成成功后,「全部」等计数和「今日已出」状态自动更新。从后台或休眠恢复时会补查日期;宿主未运行或页面已关闭时不会执行后台出题,重新打开后再加载当天题目。

来源行为
在线出题命题后进行真正盲解,再比对答案与解析,分歧交主裁
题库出题从已导入且符合科目题型的题库中抽题
自动优先题库,没有可用题目时尝试在线出题

题库优先使用未出过的题,新题用完后选择最久未出的题;只有少量可用题目时允许重复。删除已出题目不等于删除原题库,未来仍可能重新抽到该题。

在线出题分为以下独立调用,均沿用宿主默认模型:

  1. 命题:生成题干、选项、答案与解析,先通过程序结构检查。
  2. 盲解:另起请求,只传题干与选项,不传命题答案、解析、科目大纲或上一题反馈。
  3. 比对:盲解完成后,检查双方答案是否一致、解析是否成立。选择题的正确选项不一致时,程序会强制进入主裁。
  4. 分歧主裁:检查双方解答,最多裁决两轮。必须明确选择命题方或盲解方、确认题目有效并给出理由,才采用胜方原有的答案与解析;不允许用模糊结论或第三种答案发布。

主裁两轮仍无法判断时,带反馈重新命题一次,新题重新盲解、比对和裁决。新题仍无法通过则终止,不保存为正式题目。答案校验后还要进行独立范围与难度评审。正常一致且评审通过时,命题与校验需要四次模型调用;两轮命题均走满主裁及评审时最多十二次逻辑调用。搜索服务、图片转录另外产生调用,空回复还可能重试。宿主使用最高推理强度时,每次命题、校验调用至少预留 24000 tokens 的输出上限,避免预算全部耗在推理而没有正文;这是上限而非固定消耗。图片转录关闭推理。答案修订同样经过盲解、比对与主裁,但胜方答案只生成候选版本,仍需用户确认替换。模型校验不等同于官方审定,不能保证绝对正确。

判分与历史

  • 选择题提交后按参考选项判分,并展示答案与解析。
  • 主观题可选择「作答完毕」或「未能作答」。前者先记为待判定,查看答案后由用户判断正确或错误;后者记为错误。
  • 打开题目不增加作答次数,提交并查看答案才记一次;同一作答 ID 的重复请求不会重复计数。
  • 人工判分必须对应具体的作答 ID。多标签页分别作答时,各自只更新自己的记录;相同判定可安全重试,已完成的记录不能被迟到请求覆盖或改判。
  • 手动加入错题本不会生成一条虚假的错误作答记录;移出错题本也不会删除历史作答。

从列表打开历史题时,默认进入新一轮作答并隐藏答案。属于本科目今日题且在当天已经查看答案时,默认保留已完成状态。题库旧题在新一天再次分配时,不会沿用以往的已完成状态;历史记录和累计作答次数保留。当天查看答案后,刷新或重启仍保留已完成状态。主动点击「重新作答」会隐藏答案、解析和追问入口,直到本轮再次查看答案;同一页面会话内切换栏目再返回,也会保留这轮重新作答状态。

答案版本与追问

正式答案与解析保存为固定版本,重新打开不会再次生成。用户请求修订时,候选答案必须通过校验并经用户确认,才会替换正式版本;旧版保留在版本历史中。

追问按题目 ID 隔离,使用本题资料和该线程近期历史。生成失败会保留输入并支持重试;清空对话只影响当前题目。查看答案后才显示追问按钮,默认不自动展开面板。

宽屏下可拖动题目和追问之间的分隔线,或聚焦分隔线后用方向键调整;窄屏使用侧边浮层,不提供比例拖动。发送方式为 Enter,换行为 Shift+Enter。

列表与批量管理

全部、收藏和错题本默认每页50道,显示栏目总量并支持上一页、下一页;查看详情后返回保留页码和滚动位置。批量「全选」作用于当前栏目的全部题目,包含其他页;翻页保留选择,「全不选」清空跨页选择。统计使用按题目建立的作答索引,避免每道题重复扫描所有作答。学习数据仍采用单文件JSON原子保存,超大规模数据仍有全量复制和写入成本。

今日题目、全部、收藏和错题本使用同一题目记录,各科目分别管理。

在「全部 / 收藏 / 错题本」点击「批量管理」后,可以逐题选择、全选或全不选,并执行:

  • 收藏、取消收藏。
  • 加入错题本、移出错题本。
  • 永久删除所选题目。

删除题目会同时清理该题的作答、追问和今日分配引用。包含收藏或错题时,会在普通删除确认之后再要求一次确认。删除不可恢复。

停用科目后,主界面会隐藏该科目。已出题目、作答、收藏、错题和追问会保留,在科目管理重新启用后可以继续查看。删除科目需要确认两次,再点击「完成」。保存时会永久删除该科目及其已出题目和关联记录。导入的题库由题库管理单独维护。历史列表按最近出题日期排序。

在线出题的范围与难度依据

要按大纲出题,请打开「大纲管理」,选择科目并导入文本型 PDF、TXT 或 Markdown。每科可保存一份大纲,替换和移除会影响之后新生成的题目。题目详情记录当时使用的依据。未导入时仍可在线出题,插件会参考内置范围、用户填写的练习范围或科目名称,题目可能与正式大纲范围有差异。

发布前检查全部已保存历史中的归一化重复题、相同长题干,以及近期高度相似题;拒绝仅调整排版、选项顺序或少量参数的重复练习,反馈重新命题。保存时还会复检最新历史,阻止并发发布重复题。文本相似度检查不能保证发现所有语义重复,覆盖安排也不等同于官方整卷权重或完整考试蓝图。

难度对照用的真题从「真题管理」手动导入。支持文本型 PDF、TXT 和 Markdown。每个科目每年保存一份,重复导入同一年会替换旧文件。整卷请保留各题型标题。仅有一种题型且缺少标题的文件可以在导入时指定题型。

盲解只接收题干与选项。答案核验完成后,有范围资料时由独立评审核对题目和解法。难度评分还需对照至少两个年份的同题型真题,比较推导步骤和计算量等。资料不足时保留计划题型,题目详情和列表显示「未进行真题难度校验」。

扫描版 PDF 需要先转成可提取文字的文件,再导入大纲或真题。

导入题库

支持 .md、.txt 和文本型 .pdf。扫描件或图片型 PDF 不提供 OCR;提取效果受 PDF 的字体、编码与排版影响,导入前必须核对预览。

在线 PDF 和题库 PDF 均按实际页树顺序提取,在受限工作线程中解析,单份解析含排队最多20秒;限制单流展开8MiB、累计展开32MiB、1000页及400万量级字符。最多同时解析2份,排队最多8份且总大小不超过64MiB;达到限制会明确报错,可缩小文件或稍后重试。

建议按下面的结构组织 Markdown,以「第 N 题」或分隔线区分题目。解析中的普通编号列表会随解析保留。

## 第 1 题
设函数 $f(x)=x^2$,求 $f'(1)$。

A. 1
B. 2
C. 3
D. 4

答案:B
解析:由 $f'(x)=2x$,得 $f'(1)=2$。
知识点:导数计算
难度:2

---

## 第 2 题
证明闭区间上连续函数的最值性质。

答案:闭区间上的连续函数能取得最大值和最小值。
解析:结合闭区间紧致性与连续函数的性质说明结论。

导入答案标记为「待核验」,缺少答案的题目标记为「缺少答案」。题干缺失或过短、选择题有效选项不足时,预览会标记「不入库」。确认前可以逐题取消勾选。导入成功只表示解析完成,参考答案仍需核对。

公式、代码与日期

题干、选项、答案、解析和追问支持 Markdown,包括代码围栏、表格、图片、行内公式和独立公式。MathJax 4.1.3 采用 New Computer Modern 字形并输出 SVG,引擎和所需资源随包提供。题目列表只预览前两行,完整内容进入详情查看。

公式基准字号固定,长公式可横向滚动,保留上下标和分式的正常排版比例。代码块保留缩进与换行。界面包含轻量动效,并尊重系统的「减少动态效果」设置。

考研年份使用入学年份口径,例如 2028 考研对应 2027 年末的初试。日期区分官方公布、估算和尚未核实,估算日期标注「约」。联网核验按考研届次和实际考试年份检索教育部、研招网和教育考试院,只采用官方公告正文明确给出的完整初试起止日期。

倒计时第一行显示剩余总天数,中间一行按 365 天为一年、30 天为一个月拆分,并省略数值为零的单位,例如「1年23天」「3个月」「2年」;剩余不超过 30 天时隐藏中间一行。这一拆分是显示换算,不是自然月的日历差。

数据与隐私

追问上下文区分已核验、未核验和缺失的参考答案。模型生成或修订的答案即使通过独立校验,也不标为官方认证;导入的未核验答案会提示可能有误。

学习数据使用本机单文件 JSON 保存。默认路径按以下顺序解析:

  1. 设置了 DSH_DAILY_QUESTION_DATA_DIR:直接使用该目录。
  2. 否则设置了 DSH_PROFILE_DIR:使用其下的 daily-question/。
  3. 否则使用 DSH_HOME/daily-question/;未设置 DSH_HOME 时为用户主目录下的 .dsh/daily-question/。

数据文件名为 data.json。单个服务实例内串行更新,通过临时文件写入后替换正式文件;保存失败不会把未保存的修改提交到内存状态。不要让多个宿主进程同时写入同一份数据文件。升级前建议备份数据目录。

题库文件在本机解析;在线出题、答案修订和追问使用宿主配置的模型服务。题目或题库内容参与修订、追问时,相关资料会发送给该模型服务。Markdown 中的远程图片和用户主动打开的链接可能访问外部网站。公式渲染本身无需联网。

开发与验证

本项目使用原生 JavaScript ES Modules,没有独立的前端构建步骤。

npm ci
npm run build:client
npm run check:client
npm test
npm run test:coverage

覆盖率命令使用 Node 自带统计,报告行、分支与函数覆盖率。历史验收与修复记录存放在 docs/history。

离线测试覆盖日期换算、题库解析、持久化、业务状态、并发作答、批量管理、科目草稿和渲染组件。不需要真实模型或联网;这些测试不能替代实际 DSH 宿主中的安装与模型联调。

本机已安装并配置 DSH 时,可手动执行会消耗真实 API 调用的验收:

npm run test:live
npm run test:live -- cs408
# 验收手动导入的大纲和两个不同年份的单选题真题
npm run test:live -- math1 "./大纲.pdf" "2025:./2025-单选.txt" "2024:./2024-单选.txt"

脚本使用本机 DSH web profile 的默认模型与凭据,在临时目录验收出题、盲解、答案比对与分歧主裁。提供大纲时会验收手动导入和范围评审,提供两个不同年份的单选题真题时也会验收难度评审。默认目录可通过 DSH_HOME 和 DQ_DSH_PROFILE 指定。

可以额外使用自己的文本型 PDF 检查提取效果:

node test/pdf-check.mjs <PDF文件路径>

主要文件:

路径用途
index.js宿主入口与服务注册
ui/页面、界面组件、样式、Markdown 与文件导入源码
client.js由 npm run build:client 生成的 DSH 前端入口
lib/service.js出题、作答、列表、题库与追问业务
lib/store.js数据目录与原子持久化
lib/generate.js模型出题、盲解、比对、主裁和修订
lib/references.js独立范围与难度评审
lib/reference-cache.js整理手动导入资料和本地练习范围
lib/bank.js、lib/pdf.js题库解析与 PDF 文本提取
lib/exam-dates.js日期来源、核验和倒计时
lib/routes.js同源接口与 MathJax 静态资源
test/离线回归检查、手动联网验收
vendor/mathjax/随包公式引擎及许可

维护者发布

更新版本及锁文件,重新生成前端入口并通过测试后,再生成安装包:

npm ci
npm run build:client
npm test
mkdir -p dist
npm pack --pack-destination dist

将验证后的安装包上传为 GitHub Release 附件,并将同一份文件发布到 npm。以下命令从 package.json 读取版本:

npm login --registry=https://registry.npmjs.org/
npm whoami --registry=https://registry.npmjs.org/
version=$(node -p "require('./package.json').version")
npm publish "./dist/daily-question-$version.tgz" --access public --registry=https://registry.npmjs.org/
npm view "daily-question@$version" version --registry=https://registry.npmjs.org/

按 npm 提示完成浏览器登录与发布验证。发布账号需要拥有 daily-question 包的发布权限;若该版本已经发布,不可用相同版本号覆盖。GitHub 标签、npm 版本和安装包版本应保持一致。

许可与反馈

插件代码采用 MIT License。随包 MathJax 采用 Apache License 2.0,详见 vendor/mathjax/LICENSE。

问题反馈与建议:GitHub Issues。

関連プラグイン