# get-shit-done-redux

> 来源：[GitHub](https://github.com/open-gsd/get-shit-done-redux) · ⭐ 561 stars

```markdown
# 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 校验，在灵活性与可维护性间取得平衡。

## 快速上手

```bash
# 全局安装
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 或许不算耀眼，但每一个都代表着一次对数字极简主义的投票。
```