🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

阿碳日报 artaniszhou/dsh-atan-daily

DeepSeek Harness
artaniszhou12 天前有提交已提供中文文档扫描:含敏感能力

按计划自动生成选题日报并推送到飞书

30.8/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/23 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add artaniszhou/dsh-atan-daily
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:需留意
是什么[目录]—
dsh 原生插件 · market
暂无时间戳·判据 →
装得上吗[实装验证]!
实装验证未通过(unknown),装前请到仓库确认最近更新与 issue
L4 · 真实安装等级说明 →
数据截至 2026/10/24·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/03·判据 →
还在维护吗[仓库]✓
活跃:最近一次提交在 12 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →

可信度证据

⚠︎ 实装验证未通过(unknown · 2026/10/24) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件
查看扫描证据(共 72 处,展示前 52 条)
  • 写入本地文件
    src/core/fs.ts:20
    await mkdir(dirname(path), { recursive: true })
  • 写入本地文件
    src/core/fs.ts:22
    await writeFile(temp, content, 'utf8')
  • 写入本地文件
    src/core/fs.ts:24
    await rename(temp, path)
  • 删除本地文件
    src/core/fs.ts:29
    await rm(temp, { force: true }).catch(() => {})
  • 写入本地文件
    src/core/fs.ts:39
    await rename(path, previous)
  • 写入本地文件
    src/core/fs.ts:45
    await rename(temp, path)
  • 写入本地文件
    src/core/fs.ts:47
    if (hadPrevious) await rename(previous, path).catch(() => {})
  • 删除本地文件
    src/core/fs.ts:48
    await rm(temp, { force: true }).catch(() => {})
  • 删除本地文件
    src/core/fs.ts:51
    if (hadPrevious) await rm(previous, { force: true }).catch(() => {})
  • 读取本地文件
    src/core/rule.ts:93
    const text = readFileSync(path, 'utf8')
  • 读取本地文件
    src/core/rule.ts:272
    return parseRuleContent(await readFile(join(folder, 'meta', 'rule.md'), 'utf8'))
  • 读取本地文件
    src/core/runs.ts:81
    const parsed: unknown = JSON.parse(await readFile(file, 'utf8'))
  • 读取本地文件
    src/core/runs.ts:113
    entries = await readdir(root, { withFileTypes: true })
  • 读取本地文件
    src/core/runs.ts:126
    names = (await readdir(directory)).filter(name => name.endsWith('.json'))
  • 读取本地文件
    src/core/runs.ts:142
    return (await stat(file)).mtimeMs
  • 删除本地文件
    src/core/runs.ts:151
    await rm(file, { force: true })
  • 读取本地文件
    src/core/runs.ts:267
    entries = await readdir(root, { withFileTypes: true })
  • 读取本地文件
    src/core/runs.ts:284
    names = (await readdir(directory)).filter(name => name.endsWith('.json'))
  • 删除本地文件
    src/core/runs.ts:294
    await rmdir(directory).catch(() => {})
  • 读取本地文件
    src/core/task-list.ts:408
    if ((await stat(join(this.workDir, record.id))).isDirectory()) kept.push(record)
  • 读取本地文件
    src/core/task-list.ts:438
    text = await readFile(this.path, 'utf8')
  • 写入本地文件
    src/core/task-list.ts:471
    await copyFile(this.path, `${this.path}.bak`).catch(() => {})
  • 读取本地文件
    src/core/task-list.ts:507
    legacyMarkdown = await readFile(this.legacyPath, 'utf8')
  • 读取本地文件
    src/core/task-list.ts:525
    return await readFile(path, 'utf8')
  • 写入本地文件
    src/core/task-list.ts:611
    if (backup !== undefined) await copyFile(this.path, backup).catch(() => {})
  • 读取本地文件
    src/core/task-list.ts:626
    birth = (await stat(folder)).birthtime.toISOString()
  • 读取本地文件
    src/core/task-list.ts:632
    text = await readFile(join(folder, 'meta', 'rule.md'), 'utf8')
  • 写入本地文件
    src/core/task-list.ts:721
    await copyFile(join(folder, 'meta', 'rule.md'), join(folder, 'meta', 'rule.md.v1.bak')).catch(() => {})
  • 写入本地文件
    src/core/task-list.ts:744
    await rename(this.legacyPath, `${this.legacyPath}.bak`)
  • 写入本地文件
    src/core/task-list.ts:746
    await rename(this.legacyPath, `${this.legacyPath}.bak-${Date.now()}`).catch(() => {})
  • 读取本地文件
    src/host/migration.ts:38
    return await readFile(join(folder, META_DIR, RULE_NAME), 'utf8')
  • 读取本地文件
    src/host/migration.ts:43
    const names = await readdir(folder)
  • 读取本地文件
    src/host/migration.ts:46
    return await readFile(join(folder, legacy), 'utf8')
  • 读取本地文件
    src/host/migration.ts:62
    names = (await readdir(folder, { withFileTypes: true }))
  • 读取本地文件
    src/host/migration.ts:68
    await stat(rulePath)
  • 写入本地文件
    src/host/migration.ts:77
    await mkdir(metaDir, { recursive: true })
  • 写入本地文件
    src/host/migration.ts:78
    await rename(join(folder, legacyRule), rulePath)
  • 写入本地文件
    src/host/migration.ts:86
    await rename(join(folder, from), join(metaDir, to))
  • 读取本地文件
    src/host/migration.ts:102
    entries = await readdir(legacy, { withFileTypes: true })
  • 写入本地文件
    src/host/migration.ts:135
    await rename(source, destination)
  • 删除本地文件
    src/host/migration.ts:142
    if (moved > 0) await rmdir(legacy).catch(() => {})
  • 写入本地文件
    src/host/migration.ts:161
    await mkdir(join(folder, META_DIR), { recursive: true })
  • 写入本地文件
    src/host/migration.ts:162
    await rename(source, target)
  • 删除本地文件递归
    src/host/migration.ts:190
    if (!failed) await rm(source, { recursive: true, force: true }).catch(() => {})
  • 删除本地文件
    src/host/migration.ts:219
    await rm(legacy, { force: true })
  • 删除本地文件
    src/host/migration.ts:257
    await rmdir(legacy).catch(() => {})
  • 读取本地文件
    src/host/plugin.ts:89
    return (await stat(path)).isDirectory()
  • 读取本地文件
    src/host/repository.ts:55
    names = await readdir(folder)
  • 读取本地文件
    src/host/repository.ts:61
    archived = await readdir(join(folder, HISTORY_DIR))
  • 读取本地文件
    src/host/repository.ts:109
    if (!(await stat(folder)).isDirectory()) continue
  • 读取本地文件
    src/host/repository.ts:124
    if (!(await stat(folder)).isDirectory()) return undefined
  • 读取本地文件
    src/host/repository.ts:137
    if (!(await stat(join(workDir(), meta.id))).isDirectory()) continue
扫描于 2026/11/3(1 天前) · 范围 全包扫描(包内未声明入口) · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

社区实装还没有人打卡 · 装过的第一个就是你
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

README

由 DeepSeek 最新模型翻译生成
阿碳日报 把选题变成按计划自动执行的日报,每期一份带时间戳的报告 MIT 阿碳日报是社区维护的 DeepSeek Harness(DSH)插件,并非 DeepSeek AI 官方产品。 本文描述 1.1.0,涵盖功能、安装、使用方式与任务目录结构。 功能概览 给每个选题一个目录和一份规则,剩下的事按计划自动发生。 - 定时执行:执行时间可以用日常说法(「每天 9 点」「每周一和周四 8 点」)、五段 cron 表达式,或者干脆只手动执行;每个任务单独设置 IANA 时区。 - 报告推到飞书:页面标题行进入「机器人管理」,手机扫码即可创建飞书机器人;每个任务卡片右下角显示目标机器人图标与「推送管理」,可以只推一个机器人,也可以同时推给多个。 - 一任务一目录:每个选题就是一个文件夹,规则写在 meta/rule.md,任务清单存在 task-list.jsonl;改规则不用改代码。 - 每期一份报告:报告按本次开始时间命名(如 2026-10-17-090000.md),固定宽度便于排序,同一秒内重跑自动加 -2、-3,不覆盖旧报告。任务根目录只留最新一份:每次运行开始前,上一份完成的报告会被移进与 meta/ 同级的 history/,文件名保持不变。 - 独立会话:每次执行都由 Host 新建一个普通会话,旧会话自动归档;侧栏里能点进去看完整过程。
展开完整文档(README 剩余 1 节)
阿碳日报

把选题变成按计划自动执行的日报,每期一份带时间戳的报告

MIT

阿碳日报是社区维护的 DeepSeek Harness(DSH)插件,并非 DeepSeek AI 官方产品。

本文描述 1.1.0,涵盖功能、安装、使用方式与任务目录结构。

功能概览

给每个选题一个目录和一份规则,剩下的事按计划自动发生。

- 定时执行:执行时间可以用日常说法(「每天 9 点」「每周一和周四 8 点」)、五段 cron 表达式,或者干脆只手动执行;每个任务单独设置 IANA 时区。
- 报告推到飞书:页面标题行进入「机器人管理」,手机扫码即可创建飞书机器人;每个任务卡片右下角显示目标机器人图标与「推送管理」,可以只推一个机器人,也可以同时推给多个。
- 一任务一目录:每个选题就是一个文件夹,规则写在 meta/rule.md,任务清单存在 task-list.jsonl;改规则不用改代码。
- 每期一份报告:报告按本次开始时间命名(如 2026-10-17-090000.md),固定宽度便于排序,同一秒内重跑自动加 -2、-3,不覆盖旧报告。任务根目录只留最新一份:每次运行开始前,上一份完成的报告会被移进与 meta/ 同级的 history/,文件名保持不变。
- 独立会话:每次执行都由 Host 新建一个普通会话,旧会话自动归档;侧栏里能点进去看完整过程。
- 运行历史:每次执行的状态、耗时、报告、会话与错误都有记录,可按任务设置保留天数(默认 7 天,0 = 永久)。
- 并行执行:不同任务的运行同时进行,一个长任务不会挡住其他任务的到点执行;同一个任务仍然互斥(重叠的那次记为跳过),补跑只补最近一次错过的执行。
- 统计与搜索:列表顶部显示任务总数、已启用、执行中、异常任务;搜索按名称或详情实时过滤,每页 10 条。
- 跟随 DSH 主题:颜色、圆角、阴影、动效全部来自 --dsw- 语义令牌,浅色与深色模式零改动。

界面预览

截图存放于 assets/screenshots/,把图片放进去并保持下列文件名一致即可正常显示。

任务列表:统计、搜索与调度状态

任务列表:统计条、搜索与任务行

新建 / 编辑:用日常说法或 cron 设置执行时间

新建任务:设置执行时间与时区

运行历史:每次执行的状态、耗时与报告

运行历史抽屉

工作目录:修改路径并自动注册为 DSH 工作区

工作目录设置

安装

需要已安装并能正常运行 DeepSeek Harness,版本 0.2.1 及以上(插件要求 dsh >=0.2.1-0 <0.3.0)。

让 Agent 帮你安装

把这段话发给能够操作本机终端的 Agent:

请把 dsh-atan-daily 最新版安装到我的 DSH web profile,使用官方 npm 源,安装后重启宿主并确认侧栏「自动化任务」下方出现「阿碳日报」。

手动安装

dsh plugin --profile web add dsh-atan-daily

也可以打开 Web UI:「设置 → 插件 → 添加插件」,输入包名 dsh-atan-daily 安装。

安装或升级后重启宿主并刷新页面,侧栏「自动化任务」下方即出现「阿碳日报」。

npm 官方源较慢时可指定镜像:

dsh plugin --profile web add dsh-atan-daily --registry=https://registry.npmmirror.com/

从源码或本地目录试用:

git clone https://github.com/artaniszhou/dsh-atan-daily.git
cd dsh-atan-daily
npm install
npm run build
dsh plugin --profile web add .

以 link: 方式安装时:Client 改动重新构建后刷新页面即生效;Host 改动需要重启宿主。
仓库不包含构建产物 lib/,克隆后必须先执行 npm run build。因此本插件不支持直接用 Git 地址安装,请使用 npm 包,或构建后按上面的本地目录方式安装。

若你之前用本地 link: 装过旧包名 @artanis/atan-daily,请先用 dsh plugin --profile web remove @artanis/atan-daily 移除,避免同一个插件 id 出现两次。

使用说明

| 你想做什么 | 如何操作 |
| 新建选题 | 点「新建任务」,填写名称与任务详情(目标、数据来源、输出要求),再设置执行时间。 |
| 设置执行时间 | 「按说法」写日常表达,「按 cron」写五段表达式,「仅手动」则只能点「执行一次」。 |
| 临时跑一轮 | 点任务行上的「执行一次」,完成后会跳到它新建的会话。 |
| 查看报告 | 最新一份写在任务目录下;「历史」抽屉里每轮记录都列出对应的报告名。 |
| 看历次报告 | 任务目录根下只有最新一份,更早的都在 history/ 里,文件名(时间戳)不变。 |
| 看执行过程 | 点「会话」进入该任务的会话;已有会话会直接打开。 |
| 改工作目录 | 页面顶部点「修改」,保存时会创建目录并注册为 DSH 工作区;运行中不允许切换。 |
| 接入机器人 | 标题行「机器人管理」→「接入机器人」→ 填名称(接入后不可改)→ 生成二维码 → 手机扫码。接入后会给扫码人发一条欢迎消息,用来验证发送链路。 |
| 把报告发到飞书 | 任务卡片右下角点「推送管理」打开抽屉,一行一个机器人,逐个开启/关闭;卡片上显示目标机器人的平台图标(最多 5 个)。抽屉顶部的「报告推送」总开关可以暂停发送,机器人选择会保留;从一个都没选变成有选中时,推送会自动打开。 |
| 断开机器人 | 机器人卡片「移除」。飞书里的应用不会跟着删;确认框里给出两步路径:先由企业管理员在管理后台停用,再由应用所有者在开发者后台删除(从未发布过的应用可直接删)。 |
| 停掉某个选题 | 关闭任务行上的开关;不会删除文件和历史。 |

任务目录长这样:

<工作目录>/ ├── task-list.jsonl 任务元数据(唯一权威) └── A股 银行股息收集/ 任务目录 = 任务名称 ├── meta/ │ ├── rule.md 任务规则(缓存与脚本清单也在这里) │ ├── cache/ script/ 稳定数据与脚本 │ └── runs/ 每次运行的 JSON 记录 ├── history/ 历次报告:每轮开始前上一份报告移到这里 └── 2026-10-17-090000.md 最新一份报告,留在任务目录下

飞书机器人

- 只发不收:只调用飞书的「发消息」与「上传文件」两个接口;不订阅事件、不建长连接、不需要公网地址。
- 权限只有两条:im:message:send_as_bot(发消息)与 im:resource(上传文件)——扫码后的确认页上就这两项。
- 密钥只在本机:App Secret 存进 DSH 凭据库,bots.json 只记掩码后的 app_id 与扫码人 open_id;任何接口响应都不会回传 secret。
- 发送目标只有一个:扫码人的私聊。要让别人接收,就让对方扫码接入自己的机器人。
- 每条报告带任务名:每条报告先在对话里发一行「任务名 · 报告名」,紧随其后才是报告文件;文件名(也是飞书里的文档名)保持不变。
- 推送失败不影响任务:报告照常落盘,失败原因写进运行日志(事件 im.push)。
- 移除只管本机:卡片上的「移除」只删本机记录与凭据,飞书里的应用还在,需要手动停用/删除。

手动停用与删除应用

| 想做什么 | 路径 | 谁来做 |
| 停用应用 | 管理后台 → 工作台 → 应用管理 → 找到该应用 → 配置 → 基本信息 → 把「已启用」改成「停用」 | 企业管理员 |
| 删除应用 | 开发者后台 → 打开该应用 → 凭证与基础信息 → 页面底部「删除应用」 | 应用所有者 |

飞书开放平台没有给「扫码接入」这类应用留自动停用的口子:停用要走 admin:app.enable:write 管理员权限,而本插件只申请发消息与上传文件两条权限,所以这一步只能在后台手动完成。已发布的应用要先停用才能删除;删除不可恢复。

工作方式

浏览器(列表 / 新建 / 启停 / 执行一次) │ HTTP ▼ Host:cron 定时 → 到点 → 归档上一份报告 → 新建会话 → 送入指令 → 等待完成 → 写运行记录与报告

执行发生在 Host 侧,所以关掉页面不影响定时任务。每次执行固定使用 deepseek-flash 模型,并以完全权限、免审批方式自动运行,请先在测试选题上验证规则再交给定时任务。

- 到点判断允许晚触发:机器休眠后迟到仍算这一次;重启只补最近一次错过的执行。
- 无执行时间的任务只能手动执行;停用的任务不参与定时。
- 不同任务同时到点会同时开跑,不设并发上限;模型配额、机器负载和飞书推送频率请自行评估,再决定同时启用多少任务。
- 同一个任务不会重叠执行:上一轮还没结束时到点的那次记为跳过。
- 执行失败不自动重试,错误写入 lastError,下次按计划继续;单轮默认超时 1800 秒。

更新日志

1.1.0(2026-10-23)

新增

- 机器人管理:标题行「机器人管理」→ 扫码接入飞书 / Lark 机器人;手机扫码即可创建,接入后会给扫码人发一条欢迎消息验证发送链路。
- 报告推送:任务卡片右下角「推送管理」按任务选择目标机器人,可多选;抽屉顶部的总开关只暂停发送,选择保留。
- 报告归档:每次运行开始前,上一份报告移入任务目录的 history/,任务根目录只留最新一份。
- 列表体验:统计条、搜索、分页,以及统一的运行历史抽屉与编辑弹窗。

修复

- 弹层焦点不再逃到背景:Tab / Shift+Tab 在弹层内循环,Esc 改为文档层处理,焦点被点到背景后也能关闭。
- 时区选择器只把合法 IANA 时区列为选项,输入半截词不会再被当成可选项;新建与编辑在提交前先做本地校验。
- 运行历史抽屉的保留期说明跟随任务设置:按天数或「永久保留」,不再固定写 7 天。
- 「无法连接 Host」不再拼接浏览器原文(Failed to fetch),提示保持中文可读。
- 编辑弹窗切到「仅手动」时说明该任务会置为未启用,避免误以为任务被停掉。
- 新建任务时名称为空会给出提示,不再静默无反应。

1.0.0(2026-10-20)

首个公开版本:定时执行、口语与 cron 两种时间表达、一任务一目录、每期一份带时间戳的报告、独立会话与运行历史。

反馈与贡献

遇到问题或有建议,欢迎提交 Issue。请附上 DSH 与插件版本、复现步骤,以及相关截图或日志;涉及选题规则时可先删去敏感内容。

源码位于 src,使用严格 TypeScript,Host 与 Client 分开构建。改动后请执行:

npm test # 类型检查 + 单元与组件测试
npm run build # 构建 lib/
npm run check # test + build + 两个 smoke,提交前跑一遍

界面文案同时维护 locale/zh.json 与 locale/en.json,两边键集合需一致;颜色只用 --dsw- 语义令牌,不要引入独立调色板。欢迎提交改进。

许可证

MIT © 2026 Artanis Zhou
预览分享卡片长什么样 ↓artaniszhou/dsh-atan-daily
分享 · DeepSeek Harness Hub
artaniszhou/dsh-atan-daily

按计划自动生成选题日报并推送到飞书

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部