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

任务看板 ttmouse/dsh-taskboard

DeepSeek Harnessv0.9.6
ttmouse23 天前有提交已提供中文文档扫描:含敏感能力

dsh-taskboard 截图

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

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

自动兼容检查有告警:npm 同名包「dsh-taskboard」归属 cloader/dsh-taskboard,装到的可能不是本插件。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add ttmouse/dsh-taskboard
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · other
装得上吗
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 23 天前
档位由哪些信号合成

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查⚠ 装前注意

npm 同名包「dsh-taskboard」归属 cloader/dsh-taskboard,装到的可能不是本插件

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✓npm 包dsh-taskboard @ 0.9.6
✓Node 引擎要求 >=22.5 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/11/1 08:19:41

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 110 处,展示前 72 条)
  • 写入本地文件
    plugin/lib/index.mjs:49
    await appendFile(PLUGIN_LOG_FILE, `${new Date().toISOString()} ${message}\n`)
  • 删除本地文件递归
    plugin/lib/index.mjs:75
    await rm(target, { recursive: true, force: true })
  • 写入本地文件
    plugin/lib/index.mjs:76
    await mkdir(path.dirname(target), { recursive: true })
  • 读取本地文件
    plugin/lib/index.mjs:187
    const parsed = JSON.parse(await readFile(file, 'utf8'))
  • 写入本地文件
    plugin/lib/index.mjs:206
    await writeFile(file, `${body}\n`, { encoding: 'utf8', mode: 0o600 })
  • 发起网络请求
    plugin/lib/index.mjs:243
    const listRes = await fetch(`${baseUrl}/api/projects`)
  • 发起网络请求
    plugin/lib/index.mjs:256
    const res = await fetch(`${baseUrl}/api/projects`, {
  • 发起网络请求
    plugin/lib/index.mjs:270
    const res = await fetch(`${baseUrl}/api/projects/${encodeURIComponent(ws.id)}`, {
  • 发起网络请求
    plugin/lib/index.mjs:290
    const res = await fetch(`${baseUrl}/api/projects/${encodeURIComponent(project.id)}`, { method: 'DELETE' })
  • 发起网络请求
    plugin/lib/index.mjs:386
    const res = await fetch(`${baseUrl}/api/projects`)
  • 发起网络请求
    plugin/lib/index.mjs:413
    const res = await fetch(`${baseUrl}/api/projects/${encodeURIComponent(project.id)}/automation`)
  • 写入本地文件
    plugin/lib/index.mjs:955
    await writeFile(path.join(dataDirectory, 'models.json'), JSON.stringify(catalog, null, 2), 'utf8')
  • 写入本地文件
    plugin/lib/index.mjs:1085
    await mkdir(dataDirectory, { recursive: true })
  • 删除本地文件
    plugin/lib/claim-routines.mjs:224
    await unlink(file)
  • 读取本地文件
    plugin/lib/claim-routines.mjs:237
    const currentText = await readFile(file, 'utf8').catch(() => '')
  • 写入本地文件
    plugin/lib/claim-routines.mjs:244
    await mkdir(routinesDir(), { recursive: true })
  • 写入本地文件
    plugin/lib/claim-routines.mjs:245
    await writeFile(file, next, 'utf8')
  • 读取本地文件
    plugin/lib/claim-routines.mjs:267
    files = await readdir(routinesDir())
  • 删除本地文件
    plugin/lib/claim-routines.mjs:276
    await unlink(path.join(routinesDir(), file))
  • 写入本地文件
    plugin/lib/claim-executor.mjs:110
    await mkdir(runsDir, { recursive: true })
  • 写入本地文件
    plugin/lib/claim-executor.mjs:111
    await writeFile(path.join(runsDir, `${record.runId}.json`), JSON.stringify(record, null, 2), 'utf8')
  • 写入本地文件
    plugin/lib/claim-executor.mjs:120
    await mkdir(runsDir, { recursive: true })
  • 写入本地文件
    plugin/lib/claim-executor.mjs:121
    await writeFile(path.join(runsDir, `${runId}.json`), JSON.stringify(run, null, 2), 'utf8')
  • 读取本地文件
    plugin/lib/claim-executor.mjs:145
    files = await readdir(runsDir)
  • 读取本地文件
    plugin/lib/claim-executor.mjs:154
    record = JSON.parse(await readFile(recordPath, 'utf8'))
  • 写入本地文件
    plugin/lib/claim-executor.mjs:172
    await writeFile(recordPath, JSON.stringify(final, null, 2), 'utf8')
  • 执行外部命令固定命令
    plugin/lib/check-gate.mjs:44
    spawn('taskkill', ['/pid', String(child.pid), '/T', '/F'], { stdio: 'ignore' })
  • 读取本地文件
    plugin/lib/check-gate.mjs:68
    await access(path.join(cwd, ...DEFAULT_CHECK_RELATIVE.split('/')))
  • 执行外部命令来自配置/变量
    plugin/lib/check-gate.mjs:94
    const child = spawn(command.trim(), {
  • 读取本地文件
    plugin/lib/dsh-chat-engine.mjs:133
    entries = await readdir(root, { withFileTypes: true });
  • 读取本地文件
    plugin/lib/dsh-chat-engine.mjs:143
    markdown = await readFile(skillPath, "utf8");
  • 发起网络请求
    index.js:111
    async fetch(request, signal) {
  • 发起网络请求
    index.js:115
    }).fetch(request, signal);
  • 读取本地文件
    server/ai-chat-catalog.mjs:37
    const resolved = await realpath(value.trim());
  • 读取本地文件
    server/ai-chat-catalog.mjs:38
    return (await stat(resolved)).isDirectory() ? resolved : null;
  • 读取本地文件
    server/ai-chat-catalog.mjs:48
    const state = JSON.parse(await readFile(codexStatePath, "utf8"));
  • 执行外部命令来自配置/变量
    server/ai-chat-catalog.mjs:142
    const child = spawn(codexExecutable, ["app-server", "--stdio"], {
  • 执行外部命令来自配置/变量
    server/ai-chat-process.mjs:365
    const child = spawn(executable, args, {
  • 删除本地文件递归
    server/ai-chat.mjs:377
    await rm(temporaryDirectory, { recursive: true, force: true });
  • 写入本地文件
    server/ai-chat.mjs:529
    await writeFile(attachmentPath, attachment.data, { flag: "wx", mode: 0o600 });
  • 删除本地文件递归
    server/ai-chat.mjs:535
    await rm(temporaryDirectory, { recursive: true, force: true });
  • 删除本地文件递归
    server/ai-chat.mjs:604
    await rm(active.temporaryDirectory, { recursive: true, force: true });
  • 执行外部命令来自配置/变量
    server/ai-turn-owner.mjs:7
    const child = spawn(executable, JSON.parse(encodedArgs), {
  • 读取本地文件
    server/app.mjs:1118
    fileStats = await stat(filename);
  • 读取本地文件
    server/app.mjs:1125
    fileStats = await stat(filename);
  • 读取本地文件
    server/app.mjs:1132
    const body = await readFile(filename);
  • 读取本地文件
    server/app.mjs:1158
    const state = JSON.parse(await readFile(codexStatePath, "utf8"));
  • 读取本地文件
    server/app.mjs:1187
    const state = JSON.parse(await readFile(codexStatePath, "utf8"));
  • 读取本地文件
    server/app.mjs:1198
    const processes = JSON.parse(await readFile(codexProcessesPath, "utf8"));
  • 执行外部命令来自配置/变量
    server/app.mjs:1253
    const child = spawn(codexExecutable, ["app-server", "--stdio"], {
  • 写入本地文件
    server/app.mjs:1687
    await mkdir(path.dirname(statePath), { recursive: true });
  • 写入本地文件
    server/app.mjs:1689
    await writeFile(tmp, `${JSON.stringify(state, null, 2)}\n`, "utf8");
  • 写入本地文件
    server/app.mjs:1691
    await rename(tmp, statePath);
  • 删除本地文件
    server/app.mjs:1693
    await unlink(tmp).catch(() => {});
  • 执行外部命令固定命令
    server/app.mjs:1704
    const child = spawn("launchctl", ["kickstart", "-k", `${domain}/${daemonLabel}`], {
  • 执行外部命令固定命令
    server/app.mjs:1724
    const child = spawn("dsh", ["--profile", "ops", "routines", "run", name], {
  • 写入本地文件
    server/app.mjs:2370
    await mkdir(resolved.routinesDirectory, { recursive: true });
  • 写入本地文件
    server/app.mjs:2371
    await writeFile(file, serializeRoutine(routine), "utf8");
  • 写入本地文件
    server/app.mjs:2480
    await writeFile(file, body.raw, "utf8");
  • 删除本地文件
    server/app.mjs:2524
    await unlink(file);
  • 删除本地文件
    server/app.mjs:2721
    await unlink(path.join(resolved.attachmentsDirectory, attachment.id));
  • 删除本地文件
    server/app.mjs:2763
    await unlink(storagePath);
  • 删除本地文件
    server/app.mjs:2803
    await unlink(storagePath);
  • 删除本地文件
    server/app.mjs:2874
    await unlink(path.join(resolved.attachmentsDirectory, attachment.id));
  • 读取本地文件
    server/cloud-config.mjs:123
    return parseConfig(JSON.parse(await readFile(configPath, "utf8")));
  • 写入本地文件
    server/cloud-config.mjs:131
    await mkdir(path.dirname(configPath), { recursive: true });
  • 写入本地文件
    server/cloud-config.mjs:133
    await writeFile(temporaryPath, `${JSON.stringify(config, null, 2)}\n`, { mode: 0o600 });
  • 写入本地文件
    server/cloud-config.mjs:134
    await rename(temporaryPath, configPath);
  • 写入本地文件
    server/database.mjs:339
    mkdirSync(path.dirname(filename), { recursive: true });
  • 发起网络请求
    web/src/api.ts:86
    response = await fetch(resolveTaskboardUrl(path), { ...init, headers });
  • 发起网络请求
    web/src/storage.ts:15
    const response = await fetch(new URL("api/client-storage", document.baseURI), {
  • 发起网络请求
    web/src/storage.ts:42
    const response = await fetch(new URL("api/client-storage", document.baseURI));
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 GitHub 仓库

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

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

README

由 DeepSeek 最新模型翻译生成
dsh-taskboard 截图 dsh-taskboard 面向 DeepSeek Harness(dsh)的本地优先任务看板插件:把完整任务看板——看板/列表/Gantt/工作流/仪表盘视图 + 任务级 AI 对话——挂进 DSH Web GUI。数据存本地 SQLite(~/.dsh/storages/dsh-taskboard/taskboard.sqlite),无外部服务、无云端依赖。 安装 dsh plugin --profile web add @ttmouse/dsh-taskboard 装完重启 dsh web。权限、配置、关闭与卸载说明见 plugin/README.md。
展开完整文档(README 剩余 1 节)
dsh-taskboard 截图

dsh-taskboard

面向 DeepSeek Harness(dsh)的本地优先任务看板插件:把完整任务看板——看板/列表/Gantt/工作流/仪表盘视图 + 任务级 AI 对话——挂进 DSH Web GUI。数据存本地 SQLite(~/.dsh/storages/dsh-taskboard/taskboard.sqlite),无外部服务、无云端依赖。

安装

dsh plugin --profile web add @ttmouse/dsh-taskboard

装完重启 dsh web。权限、配置、关闭与卸载说明见 plugin/README.md。

功能特性

- 多视图任务看板:看板 / 列表 / Gantt / 工作流 / 仪表盘
- 任务详情:关系、附件、标签、过滤器、任务级 AI 对话
- 自动认领:每个映射工作区的项目自动认领最早的 todo 议题,经 dsh-routines 以无头会话执行并把进度回写为评论——无心跳文件、无长驻作业
- 工作区即项目:DSH 工作区自动同步为看板项目
- 会话链接:「在对话中打开」以真实 DSH 会话处理任务并回写会话 ID
- 对话内任务卡:看板派发的回合开场收进官方触发卡,回合尾挂议题卡直达右栏任务侧栏;用户自己发的消息保持普通样式

看板任务长在对话里

从源码构建

1) 构建 SPA
npm install
npm run build

2) 组装插件产物(vendor/ + lib/client.js)
cd plugin && npm install && npm run build

衍生与致谢

本项目为 dashi-taskboard(Codex Taskboard)(chuspeeism/dashi-taskboard,Apache-2.0)的开源衍生项目;Web UI、server 与数据模型源自于此。上游 Apache-2.0 部分继续以 Apache License 2.0 授权(见 NOTICE);新增与改造部分以 MIT License 授权(见 LICENSE)。
预览分享卡片长什么样 ↓ttmouse/dsh-taskboard
分享 · DeepSeek Harness Hub
ttmouse/dsh-taskboard

dsh-taskboard 截图

这是你的仓库?认领条目

回到顶部