每周见闻(85):用 SkillCat 管理你的 Skill 吧
约 1903 字大约 6 分钟
2026-09-20
每周见闻:2026-09-14 - 2026-09-20
用 SkillCat 管理你的 Skill 吧

在这个周末我让“蓝色大肥鱼”做出了这个 Skill 的管理工具。
Agent skill(SKILL.md 资源包)装起来容易,理清楚很难。它们散落在全局目录、各项目目录和十几个 agent 各自的原生目录里;彼此遮蔽;与锁文件记录的版本发生漂移;触发条件互相重叠,直到两个 skill 抢同一个请求时才被发现。
SkillCat 把它们全部扫出来,逐个解释,标出具体问题,并通过官方 skills CLI(随应用内置)完成 安装 / 更新 / 删除 / 搜索 —— 全程不背着你对文件做任何事。
- 读取本地、离线可用。 扫描只依赖文件系统与锁文件。
- 写入全部委托。 所有变更走官方
skillsCLI,只有一条安装路径,不重造逻辑。 - 分析可解释。 确定性规则与启发式规则分开标注,每条问题都附带证据。
- AI 可选。 自带模型密钥即可为 skill 评分,并判定重复 / 冲突候选对。

项目已经在 Github 上开源:https://github.com/Konata9/skillcat
这是我第一次制作一个完整的工具,遇到 bug 也请多多包涵。欢迎大家使用和反馈 issue。
工具
1、jaskirat1616/mactap-app: MacTap — knock your MacBook to run shortcuts[^1]
标签:Tools,Mac
一个小巧的工具,可以让你的 Mac 拥有和 iPhone 一样的轻触功能。可以设置单击、双击、三击三种方式。如果分开给左右两边设计,可以将模式拓展到 6 种。由于是要敲击 Mac,对于使用外接键盘或者将 Mac 当做主机合上用的朋友就几乎没有用处了。
这个软件的思路很有意思。不过使用下来,体验上还有待优化。比如单边模式下,左右的识别并不准确;灵敏度也很讲究,轻了容易误触;重了又很迟钝。

技术
1、Your Modules Are Lying to You[^2]
标签:JavaScript,Node.js
一篇把 ESM 和 CommonJS 的语义差异讲透的文章。作者以一段 import 和 requrie 代码为契机引出问题:
// state.mjs
export let status = starting
export function start() {
status = ready
}
// app.mjs
import { status, start } from ./state.mjs
start()
console.log(status) // ready
// state.cjs
module.exports.status = starting
module.exports.start = function () {
module.exports.status = ready
}
// app.cjs
const { status, start } = require(./state.cjs)
start()
console.log(status) // starting同一个 start() 改状态,ESM 里 import 的 status 跟着变,CommonJS 解构出来的 status 却还是旧值——因为 ESM 导出的是活绑定,而 require 返回的是 module.exports 这个普通对象,解构只是拷了当时的快照。
文章还展开讲了求值顺序、缓存、循环依赖和互操作。非常有收获,尤其是结构,我之前在项目里遇到过这个问题。当时找了半天没弄明白,现在终于知道原因了。
2、Half Past Fetch[^3]
标签:JavaScript,HTTP
作者解释了为什么 await fetch(url) 需要 await 两次。因为看着像在等响应,其实只等到了响应头。响应的 body 会有一点点的延迟。可以看到下面这个示例代码中,返回头和返回体之间有几分之一毫秒的差距
const t0 = performance.now()
const response = await fetch(<https://httpbin.org/drip?duration=3&numbytes=120&delay=0)>
console.log(headers , (performance.now() - t0).toFixed(1), ms, response.status)
await response.arrayBuffer()
console.log(body done, (performance.now() - t0).toFixed(1), ms)
headers 250.7 ms 200
body done 3445.8 ms作者还后文详细地列举了其他情况,这里就不做展开。当我们使用 await fetch(url) 时,需要注意要 await 两次,因为它是返回头完整且返回体即将开始的位置。
3、Connection reuse is the money[^5]
标签:性能,架构
一个支付平台发现自己几乎整天都在做 TLS 握手。11.2M 次/周的 webhook 投递里,绝大多数连接都指向刚聊过没几秒的同一个域名。
作者翻出生产日志算了笔账:10% 的目标扛了 96% 的请求,间隔全在 60 秒内,于是改成每个目标一个 Undici 连接池、60 秒 keep-alive,命中率超过 95%。反直觉的是 allowH2 基本没用上,并发太低,multiplexing 根本没机会出场,真正省下来的就是握手那 150ms。与其换更更快的 runtime,不如先考虑优化手握的时间。

4、On JavaScript's Weirdness[^7]
标签:JavaScript,语言特性
这篇不讲常见的不聊 '0'== 0 ,而是介绍了几个更少见的 JS 怪癖:
eval一改名就丢了当前作用域,因为规范给eval这个名字硬编码了特殊分支;for循环头里声明的变量才会被按值捕获,把i提到循环外就变回3 3 3;document.all是第九个falsy值,而且它是个对象;- 字符串长度还能在 UTF-16 码元、码点、显示字符、字素簇之间来回横跳。
相信经常使用的 JavaScript 的朋友也未必知道这些特性。在实际工作中也很难遇到,可以了解一下以备不时之需(也可以收藏起来喂给 AI)。
生活
1、细数一下我所有的离职瞬间[^4]
标签:职场,个人成长
作者把毕业十四年的离职史翻了个底朝天。最早在广州卖汽配,为爱奔浙江,走的方式是直接断联拉黑;到杭州转岗产品经理后,年轻气盛写了一封公开辞职信硬刚主管。后面还有阿里提两次才走成、老板当场落泪,以及一周半、一个月就闪人的两段。
作者最后复盘:公司和个人的关系,说到底就是利益交换加阶段性同行,容器装不下你的诉求,离开就是最优解。
AI
1、Five software engineering roles for working with AI - Human Who Codes[^6]
标签:AI Coding,工程实践
JavaScript 高级程序设计的作者 Nicholas Zakas 把人和 AI 协作的方式,对应到五种熟悉的工程角色上:
- 结对编程里的观察者:挑战在于代码的审查疲劳。
- 写规格再验收的 tech lead:挑战在于编写技术规范和审查疲劳。
- 只看架构的架构师:这里已经不在意具体代码,只关注代码结构,挑战在于出现错误时无法了解原因。
- 搭建团队的项目经理:更关注项目流程和交付,代码同样成为了黑盒。
- 只关心体验的产品经理:这里只关注最终产品,代码已经完全成为了黑盒。
越往后你离代码越远,能并行放大的产出越多,但真出问题时也越无力回天。没有哪种更好,要根据任务和实际情况进行选择。但不管怎样,都需要对 AI 的结果进行负责。

参考文章:
- [1] jaskirat1616/mactap-app: MacTap — knock your MacBook to run shortcuts: https://github.com/jaskirat1616/mactap-app
- [2] Your Modules Are Lying to You: https://blog.gaborkoos.com/posts/2026-08-14-Your-Modules-Are-Lying-to-You/
- [3] Half Past Fetch: https://blog.gaborkoos.com/posts/2026-09-08-Half-Past-Fetch/
- [4] 细数一下我所有的离职瞬间: https://blog.solazy.me/20260914/
- [5] Connection reuse is the money: https://thelazyweb.dev/connection-reuse-is-the-money
- [6] Five software engineering roles for working with AI - Human Who Codes: https://humanwhocodes.com/blog/2026/09/five-roles-working-ai/
- [7] On JavaScript's Weirdness: https://www.hexclave.com/blog/on-javascripts-weirdness
