用月周列表看板四种视图管理任务并同步日历
30.8/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/26 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add yzsuki-afk/ticklist-calendar该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
是什么
dsh 原生插件 · tool
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 8 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 49 处,展示前 48 条)
- 读取本地文件index.js:16
const value = JSON.parse(readFileSync(join(DATA_DIR, 'connection.json'), 'utf8')) - 写入本地文件index.js:74
await readBody(req);await mkdir(DATA_DIR,{recursive:true});return sendJson(res,200,await bridge.authorize()) - 读取本地文件index.js:84
const content=await readFile(target);res.writeHead(200,{'Content-Type':type,'Cache-Control':'no-store'});res.end(content) - 发起网络请求client.js:129
const response = await fetch(`${ROUTE_PREFIX}/config`, { cache: 'no-store' }) - 写入本地文件sync/store.js:48
await mkdir(directory,{recursive:true}) - 写入本地文件sync/store.js:51
try { await mkdir(lock); break } - 删除本地文件sync/store.js:58
try { return await fn() } finally { await rmdir(lock) } - 读取本地文件sync/store.js:63
try {raw=await readFile(file,'utf8')} catch(error){if(error.code!=='ENOENT')throw error;raw=''} - 写入本地文件sync/store.js:70
validate(state); await mkdir(directory,{recursive:true}) - 写入本地文件sync/store.js:72
await writeFile(temp,JSON.stringify(state,null,2)+'\n',{mode:0o600});await rename(temp,file) - 写入本地文件sync/store.js:72
await writeFile(temp,JSON.stringify(state,null,2)+'\n',{mode:0o600});await rename(temp,file) - 写入本地文件sync/store.js:75
await mkdir(directory,{recursive:true}) - 读取本地文件sync/bridge.js:12
async function exists(path) { try { await access(path); return true } catch { return false } } - 读取本地文件sync/bridge.js:15
try { await access(binary) } catch { throw new Error('请先构建并安装日历桥接:scripts/build-calendar-bridge.sh 和 scripts/install-calendar-bridge.sh。') } - 写入本地文件sync/bridge.js:16
await mkdir(ipcRoot, { recursive: true, mode: 0o700 }); await chmod(ipcRoot, 0o700) - 写入本地文件sync/bridge.js:16
await mkdir(ipcRoot, { recursive: true, mode: 0o700 }); await chmod(ipcRoot, 0o700) - 读取本地文件sync/bridge.js:17
const parent = await realpath(ipcRoot) - 读取本地文件sync/bridge.js:21
const prior = JSON.parse(await readFile(pendingPath, 'utf8')) - 删除本地文件sync/bridge.js:23
await unlink(pendingPath) - 写入本地文件sync/bridge.js:25
const directory = await mkdtemp(join(parent, 'request-')); await chmod(directory, 0o700) - 写入本地文件sync/bridge.js:27
await writeFile(requestFile, JSON.stringify({ command, ...input }), { mode: 0o600, flag: 'wx' }) - 写入本地文件sync/bridge.js:28
if (mutating) await writeFile(pendingPath, JSON.stringify({ command, resultFile }), { mode: 0o600, flag: 'wx' }) - 执行外部命令固定命令sync/bridge.js:34
const child = spawn('/usr/bin/open', ['-n', '-W', app, '--args', 'run', '--request-file', requestFile, '--result-file', resultFile], { stdio: ['ignore - 读取本地文件sync/bridge.js:45
const text = await readFile(resultFile, 'utf8') - 删除本地文件sync/bridge.js:51
if (mutating && knownResult && await exists(pendingPath)) await unlink(pendingPath) - 删除本地文件递归sync/bridge.js:53
if (knownResult && directory.startsWith(parent + sep + 'request-')) await rm(directory, { recursive: true }) - 读取本地文件sync/bridge.js:61
await access(binary); await mkdir(dataDir, { recursive: true }) - 写入本地文件sync/bridge.js:61
await access(binary); await mkdir(dataDir, { recursive: true }) - 执行外部命令固定命令sync/bridge.js:64
const child = spawn('/usr/bin/open', ['-n', app, '--args', 'authorize', '--status-file', statusFile], { stdio: 'ignore' }) - 读取本地文件sync/controller.js:14
try { return JSON.parse(await readFile(settingsFile, 'utf8')) } - 写入本地文件sync/controller.js:18
await mkdir(store.directory, { recursive: true }) - 写入本地文件sync/controller.js:20
await writeFile(temp, JSON.stringify(value, null, 2) + '\n', { mode: 0o600 }) - 写入本地文件sync/controller.js:21
await rename(temp, settingsFile) - 发起网络请求sync/controller.js:26
try { native = await bridge.request('status') } - 发起网络请求sync/controller.js:40
const native = await bridge.request('status') - 发起网络请求sync/controller.js:45
const initialized = await bridge.request('initialize', { sourceID }) - 发起网络请求sync/controller.js:74
const snapshot = await bridge.request('snapshot', snapshotArgs(config, windowStart, windowEnd)) - 发起网络请求sync/controller.js:104
const applied = await bridge.request('apply', { calendarID: config.calendarID, operations: operations.slice(offset, offset + 500) }) - 发起网络请求sync/controller.js:121
const after = await bridge.request('snapshot', snapshotArgs(config, windowStart, windowEnd)) - 执行外部命令固定命令ssh-backend.mjs:8
const child = spawn('/usr/bin/ssh', ['-T', '-i', config.sshIdentity, - 发起网络请求app/apple-sync.js:37
const response = await fetch('api/apple/' + path, data === undefined ? { cache: 'no-store' } : { - 读取本地文件store.mjs:23
try { raw = await readFile(file, 'utf8') } - 写入本地文件store.mjs:34
await mkdir(dirname(file), { recursive: true }) - 写入本地文件store.mjs:38
try { await mkdir(lock); break } - 写入本地文件store.mjs:50
await writeFile(temp, raw, { flag: 'wx', mode: 0o600 }) - 写入本地文件store.mjs:51
await rename(temp, file) - 删除本地文件store.mjs:55
try { await unlink(temp) } catch (error) { if (error.code !== 'ENOENT') throw error } - 删除本地文件store.mjs:56
finally { await rmdir(lock) }
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
日历清单 · DeepSeek Harness 插件:月/周/列表/看板四视图 + 独立 AI 对话
README
由 DeepSeek 最新模型翻译生成日历清单 · DeepSeek Harness 插件
在 DeepSeek Harness 左侧栏加一个日历清单入口,主区是完整的个人任务管理器:月 / 周 / 列表 / 看板四种视图,右侧还带一条独立 AI 对话。
界面参考 macOS 日历与滴答清单。
周视图
更多截图
月视图 — 农历、节气、传统节日
月视图
列表视图 — 左侧清单导航、中间任务、右侧详情
列表视图
任务详情 — 标题、日期、时间段、备注
任务详情
功能
四种视图
| 视图 | 特点 |
| 周 | 0:00–24:00 时间轴,每小时 56px,视口约 13 小时,其余滚动;拖选空白创建任务;拖动事件改时间/日期 |
| 月 | 农历、节气、传统节日;周数栏;每天显示任务条;点某一天直接在格子里输入标题新建任务(回车保存、Esc 取消) |
| 列表 | 三列结构(清单导航 / 任务列表 / 详情),按状态分组 |
| 看板 | 自定义分组列,拖动卡片切换分组 |
任务
- 点任务打开右侧详情编辑:标题、完成、日期、开始/结束时间、备注(任意长文本)、清单、删除
- 输入即保存(防抖),失焦后才重绘,打字不闪
- 优先级(普通 / 高)
- 深链 ?
展开完整文档(README 剩余 1 节)
日历清单 · DeepSeek Harness 插件
在 DeepSeek Harness 左侧栏加一个日历清单入口,主区是完整的个人任务管理器:月 / 周 / 列表 / 看板四种视图,右侧还带一条独立 AI 对话。
界面参考 macOS 日历与滴答清单。
周视图
更多截图
月视图 — 农历、节气、传统节日
月视图
列表视图 — 左侧清单导航、中间任务、右侧详情
列表视图
任务详情 — 标题、日期、时间段、备注
任务详情
功能
四种视图
| 视图 | 特点 |
| 周 | 0:00–24:00 时间轴,每小时 56px,视口约 13 小时,其余滚动;拖选空白创建任务;拖动事件改时间/日期 |
| 月 | 农历、节气、传统节日;周数栏;每天显示任务条;点某一天直接在格子里输入标题新建任务(回车保存、Esc 取消) |
| 列表 | 三列结构(清单导航 / 任务列表 / 详情),按状态分组 |
| 看板 | 自定义分组列,拖动卡片切换分组 |
任务
- 点任务打开右侧详情编辑:标题、完成、日期、开始/结束时间、备注(任意长文本)、清单、删除
- 输入即保存(防抖),失焦后才重绘,打字不闪
- 优先级(普通 / 高)
- 深链 ?task=<id> 直接打开某条任务
清单
- 默认四个:工作 / 生活 / 学习 / 收集箱
- 可增删改:+ 新建、双击改名、右键删除(删除时任务自动转移到第一个清单)
- 每个清单有独立颜色
AI 对话
右侧是一条独立的 DSH 会话,用 sessions 服务创建并持久化。
中间的拖动分隔条可调整宽度,双击恢复默认。
Apple 日历双向同步(0.2.0,macOS)
通过原生 EventKit 桥接,在指定的 iCloud/CalDAV 账户中使用独立的「日历清单」日历。不需要 Apple 账号密码,也不把 DSH 端口暴露到公网。
首次启用
此功能需要 macOS 13+、Swift Command Line Tools。在插件目录执行:
bash scripts/build-calendar-bridge.sh
bash scripts/install-calendar-bridge.sh
桥接程序安装到固定的 ~/Library/Application Support/TicklistCalendarBridge/,避免文稿目录的云同步扩展属性破坏应用签名。构建是本机临时签名,不是经过 Apple 公证的通用发行版;换机器需重新构建,系统也可能要求重新授权。
刷新 DSH,点日历左侧「Apple 日历同步」:
1. 点「授权日历访问」,在 macOS 弹窗亲自允许完整日历访问。
2. 点「刷新状态」,在账户中选择 iCloud。若没有账户,先在系统设置中开启 iCloud 日历。
3. 点「启用双向同步」。此时才创建/绑定独立日历并同步,首次启用前自动备份任务。
4. iPhone/iPad 登录同一 Apple 账户,在系统日历里勾选「日历清单」。在手机新建事件时也要选中这个日历。
同步范围与安全策略
- 同步标题、日期、起止时间、备注;有日期无时间的任务变成全天事件,无日期任务不导出。
- 完成状态、清单分类、看板分组仍只属于插件,不借删除日程来表示完成。
- 原生日历的全天结束日期为排他边界;跨日任务与事件时区会保留。暂不修改/导入重复事件。
- 每 30 秒尝试一次同步;只在 Mac 开机且 DSH 运行时桥接。Mac 关闭后 Apple 设备之间仍通过 iCloud 同步,DSH 要等 Mac 恢复运行后才能收到修改。
- 首次导入专用日历中过去 1 年至未来 2 年的事件;已关联事件按 ID 跟踪,不把超出查询窗口视为删除。
- 字段级三方合并;两端同时改同一字段时保留两份内容并显示冲突,不静默覆盖。Apple 日历实际写入前再校验旧值。
- 手机删除事件时先保留插件任务并标记冲突,不自动重新创建;在插件删除未冲突的已关联任务会删除相应事件。
- 专用日历里带自定义网址的未关联事件会跳过,避免同步标记覆盖网址。
- 最多跟踪 10000 个关联事件;写入按每批最多 500 个分批处理。
- EventKit 不提供原子条件写入,因此 iCloud 尚未传到本机的修改,以及最终校验和系统提交之间极小的竞态不能完全消除。重要内容仍建议定期备份。
若已有 Mini/SSH 连接配置,保留 Mini 为唯一任务数据源;同步在 Mini 上设置,远程客户端不建立本机任务副本。Apple 同步和 SSH 写入共用文件锁与原始文件版本号,旧页面或另一台电脑不会直接覆盖刚同步的数据。
验证
node --test tests/sync-*.test.js
python3 native/test_bridge.py
自动测试覆盖双向创建/修改、重试幂等、删除保护、字段冲突、全天/跨日/夏令时、旧页面合并、Mini SSH 兼容和批量写入。真实 iCloud 端到端验收仍需用户完成系统授权后,用专用测试事件验证。
安装
需要先装好 DeepSeek Harness(DSH)。
git clone https://github.com/yzsuki-afk/ticklist-calendar.git
然后在 DSH 里对 Agent 说:
帮我安装 /你克隆到的路径/ticklist-calendar 这个插件
Agent 会调用 install_bundle 完成安装,左侧栏随即出现「日历清单」。
插件通过绝对路径安装,不需要发布到 npm。
安装前自检
仓库带了一个自检脚本,装之前跑一遍能拦住会让 DSH 起不来的错误:
node scripts/check.js
它检查两类问题:
- client.js 里 __ModuleLoader__.load({ id }) 的 id 与 package.json 的 name 是否一致
- index.js / client.js 的语法、cordis.patch.yml 是否引用了正确的包名
这两项任一不对,装上后 DSH 会直接无法启动。
⚠️ 启动失败怎么办
先说清楚风险:DSH 的 web boot 要求每个插件 entry 都激活成功,任何插件出错都会让整个应用起不来,而弹窗里只有一个「禁用第三方插件」按钮。
那个按钮的代价比文案说的大得多——它会清空整个 dsh.profile.bundles(实测从 15 个变成 2 个),并把 patch 里的配置项一起丢掉,等于所有第三方插件陪葬。
所以如果 DSH 起不来,先别点它,改用仓库自带的急救脚本(在终端里跑,不需要打开 DSH):
1) 看当前挂了哪些插件,并打印最新崩溃日志
python3 scripts/recover.py status
2) 从日志里找到出问题的插件名,只停用它
python3 scripts/recover.py disable ticklist-calendar
3) 重启 DSH —— 其他插件全部保留
4) 问题修好后恢复
python3 scripts/recover.py enable ticklist-calendar
日志里的线索长这样:
ticklist-calendar: import failed (see console for the import error)
client-modules: duplicate factory registration for "@local/ticklist-calendar"
冒号前面那个名字就是 disable 的参数。
脚本做的事就是往 profile 的 cordis.patch.yml 追加两行:
- id: ticklist-calendar
disabled: true
每次改动前都会自动备份成 cordis.patch.yml.bak-recover-<时间戳>。
数据存哪
~/.dsh/storages/ticklist-calendar/tasks.json
一份 JSON,包含 lists(清单)、groups(看板分组)、tasks(任务)三段。
写入用「临时文件 + 原子重命名」,避免写一半断电损坏。
文件损坏时会自动备份成 tasks.json.corrupt-<时间戳> 再重置,不会静默吞掉数据。
想备份或迁移,直接复制这个文件即可。
技术实现
ticklist-calendar/
├── package.json # bundle 清单 + dsh.client 声明 ├── cordis.patch.yml # 插入一行插件 ├── index.js # Host:页面路由 + GET/PUT /api/state + JSON 文件存储 ├── client.js # Client:左侧栏入口 + 主区(iframe + AI 对话 + 分隔条) ├── app/index.html # 全部 UI(单文件 HTML/CSS/JS,无构建步骤) ├── locale/{zh,en}.json ├── icon.svg ├── scripts/check.js # 安装前自检(防 id/包名不一致) ├── scripts/recover.py # 启动失败急救:精确停用单个插件 └── docs/ # 截图
几个值得记的点:
- UI 是单个 HTML 文件,没有打包步骤,改完刷新即生效;Host 只负责静态托管和数据接口。
- 右侧 AI 对话借助会话作用域的子槽位拿到 SessionProvider,再用
renderFactorySlot('conversation.content', …) 渲染原生对话界面。
- 时间轴用固定小时高度而不是百分比铺满:窗口拉伸时事件块尺寸稳定,且不需要监听 resize 重排。
- 窗口拖拽的坑:-webkit-app-region: drag 只在顶层文档生效, iframe 内部的元素拖不动窗口。所以顶栏由宿主侧 client.js 用 React 渲染, iframe 只承载内容区。
- 改包名要同步改客户端模块 id:client.js 顶部的
window.__ModuleLoader__.load({ id }) 里的 id 必须与 package.json 的 name
完全一致。只改其一会导致启动时报 duplicate factory registration / import failed,整个 DSH 起不来。
已知限制
- 只做了个人使用的核心功能:没有提醒通知、重复任务、标签、子任务、附件
- 清单/分组没有排序拖拽
- 数据是单机 JSON 文件,没有多端同步
许可
MIT预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
yzsuki-afk/ticklist-calendar
用月周列表看板四种视图管理任务并同步日历
相关插件 · 工具 / 效率
破甲管控台kingcharleslzy-ai/dsh-purge
dsh-purge Community · DeepSeek Harness 社区维护版:宿主兼容、状态诊断、提示词管理、更新与本机备份回滚。基于小杨 / YuJunZhiXue 的 dsh-purge。
★ 4,330已汉化DeepSeek 客户端
74.5
网文长卷lingfengQAQ/webnovel-writer
基于 Claude Code 的长篇网文辅助创作系统,解决 AI 写作中的「遗忘」和「幻觉」问题,支持 200…
★ 7,636已汉化DSH
72.2
多智能体协作HKUDS/AutoSwarm
AutoSwarm: Unify Your Agents. Unify Your Context (Codex · Claude Code · DeepSeek Harness · Muse · Grok · WorkBuddy· nanobot · and more)
★ 2,349已汉化DSH
71.6
Vox 拼贴视频生成Alisa0808/vox-director
🎬 Vox Director拼贴动效导演
★ 2,129已汉化DSH
71.4
Agent 演化引擎Q00/ouroboros
智能体 OS:智能体自己变聪明,我们只守住底线:面试准入、分阶段评估、带预算的进化循环。MCP 服务器,14 种运行时:Claude Code、Codex CLI、Gemini CLI、OpenCode、Copilot、Kiro 等。
★ 6,311已汉化DSH
71.4
智能体运行框架路由HarnessRouter/harnessrouter
智能体 harness 的统一接口。
★ 3,984已汉化DSH
71.3
这是你的仓库?认领条目