ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

munder-difflin 的 /thisWeek 时间窗口技能:让 Agent 用源码级解析器获取“本周(周一至今天)“的精确日期范围

munder-difflin 的 /thisWeek 时间窗口技能:让 Agent 用源码级解析器获取“本周(周一至今天)“的精确日期范围 munder-difflin 的 /thisWeek 时间窗口技能让 Agent 用源码级解析器获取本周周一至今天的精确日期范围【免费下载链接】munder-difflinA local multi-agent harness that works with your existing Claude Code, Codex subscriptions, allows you to run an office of agents项目地址: https://gitcode.com/GitHub_Trending/mu/munder-difflin导读本文围绕 munder-difflin 开源仓库中随 worker 一起分发的thisWeek技能展开讲解如何让被派生的 AI Agent 不再手工推算日期而是通过一个只读的 Node 解析器把本周周一 → 今天解析为具体的 ISO 日期范围与精确 UTC 时刻。读完本文你将掌握thisWeek技能的调用方式、输出字段语义、底层计算规则与源码实现以及它在 hive 多 Agent 编排temporal 系列技能、capabilities 能力目录中的真实定位与分发机制可直接用于周报、本周活动统计、周度站会等场景。一、技能定义一段只读的时间上下文约定thisWeek技能本体位于 resources/skills/thisWeek/SKILL.md它是一份标准的 Claude Code 技能定义YAML frontmatter 声明技能元数据正文给出调用方法与输出说明。--- name: thisWeek description: | Resolve thisWeek to a concrete ISO date range relative to your run time — this week so far (Monday → today). Returns inclusive civil dates plus exact UTC instants so you have temporal context without computing dates by hand. Read-only: no writes, no network. Use before a week-to-date task (this weeks activity, weekly standups). allowed-tools: - Bash ---三个字段各司其职name: thisWeek技能的唯一标识。munder-difflin 的技能发现机制会在目录扫描时读取它src/main/skills.ts 中的parseSkillFrontmatter使用正则而非完整 YAML 解析器提取name与description其中description以|块标量形式给出解析器会按缩进行拼接——这正是多行描述能够完整进入 UI 的原因。description这是技能被选中的关键。它明确限定用途week-to-date task本周活动、周度站会并声明了两个硬约束——只读不写文件、不访问网络和运行期相对时间relative to your run time。allowed-tools: [Bash]技能只需通过 Bash 执行一个 Node 命令即可完成是典型的最小权限声明。值得注意仓库中today、lastWeek、last30Days等同级技能resources/skills/today/SKILL.md 等采用完全相同的结构只是把窗口关键字换掉——它们全部指向同一个底层解析器。二、快速上手一次调用拿到本周的全部时间信息按技能正文的约定在 Agent 的工作目录中执行node $AGENT_DIR/.claude/skills/temporal/when.mjs thisWeek其中$AGENT_DIR是 harness 注入的环境变量指向该 worker 的私有工作区包含identity.md、memory.md、inbox/、outbox/以及.claude/skills/技能目录。如果该变量未设置脚本也存在于~/.claude/skills/temporal/when.mjs。命令会先打印一行人类可读的结果随后附上完整的 JSON 记录This week (to date): 2026-09-14 → 2026-09-16 (inclusive, 3 days, Asia/Shanghai) { window: thisWeek, label: This week (to date), start: 2026-09-14, end: 2026-09-16, inclusive: true, startUtc: 2026-09-13T16:00:00.000Z, endExclusiveUtc: 2026-09-16T16:00:00.000Z, days: 3, asOf: 2026-09-16T07:00:00.000Z, timezone: Asia/Shanghai, tzOffsetMinutes: 480 }JSON 字段的语义如下字段含义start/end含首尾的民用日期YYYY-MM-DD基于执行时所在本地时区startUtc/endExclusiveUtc同一时间窗对应的半开区间[start, end)精确 UTC 时刻适合createdAt之类的时间戳查询days跨度天数半开区间按 86400000 毫秒换算inclusive恒为true表明start/end是含首尾的民用日期timezone/tzOffsetMinutes解析所用时区及其相对 UTC 的偏移分钟数东八区为 480asOf本次解析发生的时刻new Date()的 ISO 形式用于记录这个范围是什么时候算出来的拿到这些值之后直接把start/end民用日期或startUtc/endExclusiveUtcUTC 半开区间作为任务的时间边界即可。技能正文特别强调不要手工推导日期——该解析器是唯一事实来源Do not derive dates by hand — this resolver is the source of truth。三、语义约定本周到底指哪几天thisWeek的含义不是最近 7 天而是ISO 周周一起始的本周至今周一到今天。这是 temporal 系列技能的统一约定在父技能 resources/skills/temporal/SKILL.md 中明确定义Convention:this*windows areperiod-start → today(to-date);last*named periods are thefull prior complete period.即thisWeek 本周一 → 今天to-datelastWeek 上一个完整的周一到周日。该语义在源码中有精确对应。resources/skills/temporal/when.mjs 首先定义了周一偏移量// Days back from TODAY to the most recent Monday (ISO weeks start Monday). const mondayOffset (dt) (dt.getDay() 6) % 7;Date.prototype.getDay()返回 0周日到 6周六(getDay() 6) % 7将其映射为距本周一的天数周一为 0周日为 6。随后thisWeek窗口直接用今天减去该偏移得到起始日thisWeek: () ({ label: This week (to date), start: civ(Y, M, D - mondayOffset(TODAY)), end: civ(Y, M, D) }),这里civ(y, m, d)是new Date(y, m, d)的别名——JS 会把越界字段自动归一化如day 0变成上个月最后一天这正是月份、季度、年份算术所需的特性when.mjs 有注释说明。start/end都是本地时区的当日零点。四、源码级实现一个零依赖、只读的纯 Node 解析器thisWeek技能本身只是薄薄一层调用说明真正的计算逻辑在 resources/skills/temporal/when.mjs。该文件头部注释就定义了它的工程定位所有/today、/yesterday、/thisWeek、/last30Days… 技能的单一事实来源按 worker 运行时刻new Date()解析命名窗口从不手工重推日期纯 Node 标准库、零依赖只计算并输出到 stdout不写文件、不碰网络。值得拆解的实现要点本地民用日基准。TODAY取new Date(y, m, d)的本地零点TZ通过Intl.DateTimeFormat().resolvedOptions().timeZone探测失败则回退为localTZ_OFFSET_MIN按-getTimezoneOffset()计算常规符号UTC-7 → -420。窗口构建器表WINDOWSwhen.mjs。共 17 个命名窗口每个都是返回{ label, start, end }的函数其中end是窗口的含尾最后一天。除thisWeek外还有today、yesterday、lastWeek、last7Days、last30Days、last90Days、thisMonth、lastMonth、thisQuarter、lastQuarter、thisYear、lastYear、last12Months等。别名系统when.mjs。ytd/qtd/mtd/wtd与7d/30d/90d/12m等别名映射到规范键同时大小写不敏感thisweek也能解析。泛化窗口when.mjs。build()用正则^last(\d)days?$、^last(\d)weeks?$、^last(\d)months?$支持任意滚动窗口如last45days、last2weeks、last6months无需为每个 N 单独注册。UTC 半开区间与天数when.mjs。resolve()在含尾民用日期end基础上构造endExclusive civ(end 的次日零点)于是startUtc/endExclusiveUtc构成[start, end)半开区间days用(endExclusive - start) / 86400000四舍五入得到——这保证了跨时区、跨夏令时场景下天数计算的确定性。命令行入口when.mjs。main()支持无参数打印全部窗口、--json仅输出 JSON、--list列出全部支持的关键字与别名未知关键字写入 stderr 并以退出码 2 结束方便 Agent 检测错误。由于它零依赖凡是 Node 在 PATH 上的环境都能直接运行这也是技能allowed-tools只声明 Bash 的原因。五、命令行接口一览父技能 resources/skills/temporal/SKILL.md 给出的全部调用形式# 一次打印所有窗口快速时间上下文转储 node $AGENT_DIR/.claude/skills/temporal/when.mjs # 一次解析一个或多个指定窗口 node $AGENT_DIR/.claude/skills/temporal/when.mjs last30Days thisQuarter # 仅 JSON机器可读或列出支持的关键字 node $AGENT_DIR/.claude/skills/temporal/when.mjs --json last7Days node $AGENT_DIR/.claude/skills/temporal/when.mjs --list--list会输出规范窗口、泛化形式lastNdays/lastNweeks/lastNmonths与别名ytd/qtd/mtd/wtd/7d/30d/90d/12m。若需要比本周更宽的时间窗如last45days、last6monthsthisWeek技能正文明确指引转向/temporal技能——这正是thisWeek作为薄壳技能 共享解析器设计的意义所有时间窗口共享同一套计算与输出格式杜绝各技能各自实现导致的时间口径漂移。六、在 harness 中的真实分发bundled 技能如何进入每个 workerthisWeek并非只存在于仓库源码目录而是随 munder-difflin 分发的bundled 技能。在 src/main/index.ts 中skillsResourceDir()区分两种形态解析技能源目录function skillsResourceDir(): string { return app.isPackaged ? join(process.resourcesPath, skills) : join(app.getAppPath(), resources, skills); }即打包后从process.resourcesPath/skills读取开发态从app.getAppPath()/resources/skills读取。该目录会在每次派生 worker 时被复制进该 agent 的.claude/skills/正是技能正文里$AGENT_DIR/.claude/skills/temporal/when.mjs这条路径的来源。同时harness 在 worker 启动提示语中显式要求任何时间范围相关的任务先用这些技能解析日期而不是手工计算src/main/index.ts 的启动上下文会引导 agent 阅读/capabilities技能以发现/today、/last30Days、/lastQuarter等时间技能。worker 侧的能力目录 resources/skills/capabilities/SKILL.md 给出了更完整的视角它列出了全部 temporal 快捷技能及其解析范围并强调这些技能只读仅读时钟、写 stdout、无网络。能力目录还把时间技能与集成能力串成一条使用范式先解析出具体 ISO 时间边界再把边界传给对应的集成查询——例如给 Slack 线程回帖或做知识图谱检索时统一以解析出的日期为查询范围。七、技能生态与安装安全护栏补充阅读thisWeek所属的技能体系在 src/main/skills.ts 中被按三种 scope 扫描bundled随应用分发、user~/.claude/skills、project仓库内.claude/skills去重时按project user bundled优先级遮蔽与 CLI 自身的加载优先级一致。此外该文件对从外部目录安装/卸载技能设置了多层安全护栏src/main/skills.ts 的注释明确将外部技能视为潜在不可信内容目标目录名白名单校验、下载路径写后 containment 复查、文件数/总字节/嵌套深度上限、以及卸载时强制要求目录内存在SKILL.md才允许删除。这些约束在 test/skills-install.test.cjs 中有对应的测试覆盖如仓库根含 SKILL.md 即视为技能本身目录内无 SKILL.md 时卸载被拒绝等场景。理解这一点有助于判断thisWeek的信任边界作为 bundled 技能它随应用出厂、只读、零依赖agent 可以放心在任务开头调用它获取时间上下文。八、最佳实践何时用、怎么用综合技能文档与仓库实现将thisWeek正确用于实战的要点可以归纳为使用时机凡是任务需要本周至今的时间范围——本周活动汇总、周度站会材料、本周指标分析——在动手查询前先调用本技能取得边界周报类任务通常还需要配合/lastWeek完整上一周做环比。不要手工算日期Agent 自行推算本周一极易因时区、ISO 周起始日周日 vs 周一产生偏差解析器统一以 ISO 周周一起始与运行机器本地时区为准是唯一事实来源。查询语句写法面向数据库/日志的createdAt类查询优先使用startUtc/endExclusiveUtc半开区间含起点、不含终点天然避免边界重复统计面向人类可读报表使用start/end民用日期。时间敏感型报告把返回的asOf一并写入报告明确该统计截至何时计算这在跨日运行的长任务中尤其重要。需要更宽或任意窗口直接升级到/temporal技能同一解析器支持last90Days、last12Months以及last45days、last2weeks、last6months等任意 N 窗口。结语thisWeek技能是 munder-difflin temporal 技能族的一个切片技能本身简短背后却是统一的when.mjs解析器、ISO 周语义、UTC 半开区间输出以及 bundled 分发 能力目录引导 安全护栏的完整机制。对 Agent 而言它把本周是哪几天从一个容易出错的算术问题变成了一个可复现、可审计、只读的系统调用——这正是多 Agent 编排中让时间口径成为唯一事实来源的最小实现范式。【免费下载链接】munder-difflinA local multi-agent harness that works with your existing Claude Code, Codex subscriptions, allows you to run an office of agents项目地址: https://gitcode.com/GitHub_Trending/mu/munder-difflin创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表