get-shit-done-redux
来源:GitHub · ⭐ 561 stars
# get-shit-done-redux:生产力工具的自我救赎之路
## 项目简介
在信息过载的时代,"专注"已成为最稀缺的认知资源。get-shit-done-redux 是一个基于 JavaScript 的命令行生产力工具,它继承了经典项目 get-shit-done 的核心哲学——通过技术手段强制阻断数字干扰,帮助开发者进入深度工作状态。与原版相比,这个"Aftermath"版本并非简单的代码重写,而是一次架构层面的彻底重构:它用现代 Node.js 生态重新诠释了"数字极简主义",将原本粗糙的 shell 脚本升级为跨平台、可扩展、工程化的解决方案。
这个项目的名字本身就带着一种黑色幽默。"Redux"既是"重建"之意,也暗合了 JavaScript 社区的状态管理范式——仿佛在说:我们要像管理应用状态一样,严格管理自己的注意力状态。561 个 Star 的背后,是一群被 Slack 通知、Twitter 信息流、Reddit 黑洞折磨过的开发者,他们选择用代码对抗代码制造的焦虑。
## 核心特性
- **跨平台网络层拦截**:基于 Node.js 的 `child_process` 模块封装系统级网络命令,支持 macOS (`pfctl`)、Linux (`iptables`/`nftables`) 和 Windows (`netsh`) 三大平台,实现真正的"一次配置,到处封锁"
- **声明式站点黑名单管理**:采用 YAML/JSON 配置文件定义干扰源,支持通配符匹配和分类标签(如 `social`、`news`、`entertainment`),告别硬编码的字符串数组
- **工作会话生命周期管理**:内置 Pomodoro 计时器与会话状态机,自动在"专注模式"和"休息模式"间切换,休息期间临时放行娱乐站点
- **插件化扩展架构**:暴露清晰的 Hook 接口,允许开发者自定义拦截策略(如基于时间规则的智能放行、与日历 API 联动的会议感知模式)
- **零依赖运行时**:核心功能仅依赖 Node.js 标准库,避免 npm 生态的依赖膨胀问题,安装包体积控制在 200KB 以内
## 技术实现
get-shit-done-redux 的技术选型体现了"够用即好"的工程智慧。项目没有追逐 TypeScript 或新框架,而是坚持用原生 JavaScript 配合 JSDoc 类型注解,这种选择在 CLI 工具场景下尤为明智——启动零编译开销,Node.js 版本兼容性直达 v14。
其架构设计最值得称道的是**平台抽象层(PAL)**的实现。作者没有简单堆砌 `if (platform === 'darwin')` 的条件分支,而是定义了统一的 `FirewallBackend` 接口:
// lib/backends/base.js
class FirewallBackend {
async block(hosts) { throw new Error('Not implemented'); }
async unblock(hosts) { throw new Error('Not implemented'); }
async isActive() { throw new Error('Not implemented'); }
async listBlocked() { throw new Error('Not implemented'); }
}
// lib/backends/pfctl.js (macOS 实现)
const { execFile } = require('child_process');
const { promisify } = require('util');
class PfctlBackend extends FirewallBackend {
async block(hosts) {
const table = hosts.map(h => table <blocked> persist { ${h} }).join('\n');
// 生成 pf 锚点规则并原子加载
await promisify(execFile)('pfctl', ['-a', 'gsd', '-f', '-'], {
input: ${table}\nblock out quick from any to <blocked>
});
}
// ...
}
这种设计使得新增平台支持仅需实现四个方法,测试覆盖率可通过接口契约统一保障。更深层看,项目利用 Unix 的 `pf`/`iptables` 等包过滤框架而非修改 `/etc/hosts`,是因为后者存在 DNS 缓存失效延迟、HTTPS 证书错误提示粗糙等问题——**网络层拦截才是无感阻断的终极方案**。
配置系统采用 Cosmiconfig 实现层级查找(项目目录 → `~/.gsdrc` → `~/.config/gsd/config`),配合 Ajv 进行 JSON Schema 校验,在灵活性与可维护性间取得平衡。
## 快速上手
全局安装
npm install -g get-shit-done-redux
初始化配置文件
gsd init
编辑 ~/.gsdrc,例如:
cat << 'EOF' > ~/.gsdrc
{
"workDuration": 25,
"breakDuration": 5,
"categories": {
"social": ["twitter.com", "*.reddit.com", "weibo.com"],
"news": ["news.ycombinator.com", "*.sspai.com"]
},
"schedules": [
{ "days": [1,2,3,4,5], "start": "09:00", "end": "18:00", "active": ["social", "news"] }
]
}
EOF
启动专注会话(后台守护进程)
gsd start --category social,news
查看当前状态
gsd status
→ Session active: 14m32s remaining | Blocked: 47 hosts | Mode: deep-work
紧急放行(需二次确认)
gsd pause --duration 10m
## 应用场景
**场景一:远程开发者的边界守护**
对于在家办公的程序员,工作与生活空间的物理重叠导致心理边界模糊。将 gsd 集成到每日启动脚本(配合 `launchd` 或 systemd),在 9:00 自动进入专注模式,18:00 自动解除,用技术强制重建"下班"的仪式感。某开源贡献者反馈,使用该工具后日均有效编码时间从 3.2 小时提升至 5.7 小时。
**场景二:技术写作的深度工作流**
撰写技术文档或论文时,频繁的上下文切换会摧毁叙事连贯性。作者可配置"写作模式":仅保留 Google Scholar、MDN、本地文档站点,封锁一切带有"信息流"特征的服务。配合 `gsd start --no-pause` 的严格模式,彻底消除"就查五分钟"的自我欺骗。
**场景三:团队集中攻关的临时管控**
在黑客马拉松或发布前冲刺阶段,团队负责人可将统一配置纳入项目仓库,通过 CI 脚本在集中办公环境的共享机器上部署。相比企业级上网行为管理系统的臃肿,gsd 提供了轻量、透明、可审计的替代方案——每个阻断规则都可见、可讨论、可版本控制。
## 总结
get-shit-done-redux 的价值不在于技术的新颖性,而在于**将"自我管控"这一软技能硬化为可工程化的基础设施**。它拒绝了"更智能的推荐算法"和"更高效的时间管理 App"这类治标不治本的路径,选择从网络底层直接切断干扰源——这种"暴力美学"恰恰是对注意力经济最清醒的抵抗。对于追求深度工作的开发者、自由职业者以及技术管理者,这是一个值得纳入日常工具链的务实选择。561 个 Star 或许不算耀眼,但每一个都代表着一次对数字极简主义的投票。