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` 接口:

```javascript
// 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 或许不算耀眼,但每一个都代表着一次对数字极简主义的投票。