任务锚点
ADHD executive function enforcement for Claude Desktop.
An MCP server that transforms task management from a social contract
into a stateful boundary Claude cannot cross without explicit tool invocation.
Python 3.11+ · MIT License · 108 tests · 14 tools
______________________________________________________________________
为什么存在
ADHD开发人员并不缺乏想法——他们缺乏想法之间的摩擦。一个简单的“当我们在做的时候”可能会把一个小时的专注工作变成一个兔子洞,让人觉得有生产力,但什么也没有。
任务锚机械地增加了摩擦力。它创造了一个 任务锁 克劳德必须尊重他 漂移检测 关于每一条信息和力量 显式验证 在任务被标记为完成之前。那些在任务中期浮出水面的想法被搁置了,而不是丢失了——它们会进入一个安全的队列,你可以稍后查看。
该系统还跟踪会话中的情绪状态。如果你沮丧地离开,第二天早上回来,它就会知道,它会提供重新进入的策略,而不是把你扔回同一堵墙里。
______________________________________________________________________
运作原理
You say something → drift_detect scores it → drift? → park the idea, redirect
clear? → continue working
↓
scope_validate_edit → in scope? → proceed
out of scope? → block + offer options
↓
task_complete → evidence matches exit condition? → release lock
doesn't match? → reject, keep lock克劳德必须遵守这些规则(通过 .claude/CLAUDE.md):
- 没有锁就没有代码。 Claude拒绝所有编码帮助,直到
task_lock_create定义您正在构建的内容、退出条件和文件范围。 - 对每条消息进行漂移检测。 每个用户输入都会根据26个加权信号短语进行评分(例如,“当我们在做的时候”=5分,“实际上”=2分)。分数≥4会触发自动停车和重定向。
- 编辑前的范围强制执行。 在修改任何文件之前,Claude会根据锁定的作用域对其进行检查。范围外的编辑被阻止。
- 注销前的会话检查点。 情绪状态、下一个微动作和拦截器注释被捕获,以便下一个会话可以智能地恢复。
______________________________________________________________________
设置
先决条件
Python 3.11或更高版本。没有其他系统依赖关系。
安装
cd mcp-server
pip install -e .或者只安装运行时依赖项而不安装包:
pip install mcp配置Claude桌面
添加到您的 claude_desktop_config.json:
{
"mcpServers": {
"task-anchor": {
"command": "python",
"args": ["-m", "task_anchor.server"],
"cwd": "/absolute/path/to/TaskAnchor/mcp-server"
}
}
}如果通过pip安装:
{
"mcpServers": {
"task-anchor": {
"command": "task-anchor"
}
}
}保存后重新启动Claude Desktop。
______________________________________________________________________
工具
核心执法
| 工具 | 目的 |
|---|---|
task_lock_create | 创建具有构建目标、退出条件和文件范围的任务锁 |
task_lock_status | 检查当前锁定状态——在每次响应开始时调用 |
drift_detect | 对用户输入的上下文切换信号进行评分;如果检测到漂移,则停车 |
scope_validate_edit | 在允许编辑之前,请验证文件是否在锁定范围内 |
task_complete | 根据退出条件验证完成证据;如果满意,松开锁 |
创意管理
| 工具 | 目的 |
|---|---|
parked_add | 将偏离主题的想法保存到 PARKED.md 具有紧迫性和类别 |
parked_list | 列出已搁置的想法——按以下条件筛选 all, urgent,或 current_session |
会话连续性
| 工具 | 目的 |
|---|---|
session_checkpoint | 保存情绪状态、下一个微动作和拦截器注释;创建git提交 |
session_resume | 恢复之前的会话上下文;检测卡住状态并提供重返策略 |
个性化
| 工具 | 目的 |
|---|---|
set_tone | 切换通信方式: strict, supportive (默认),或 minimal |
get_tone | 显示当前音调设置 |
flow_mode_activate | 暂停超聚焦会话的漂移检测(默认30分钟,最大120分钟) |
flow_mode_deactivate | 提前结束流动模式并重新启用漂移检测 |
分析
| 工具 | 目的 |
|---|---|
drift_history_log | 记录漂移事件用于长期ADHD自我监测和模式分析 |
______________________________________________________________________
声调系统
所有面向用户的消息都通过可配置的音调层路由。同样的执行逻辑,不同的声音。
严格 --最初的执行语言。
⚓ DRIFT DETECTED (Score: 5/10)
ACTION REQUIRED: Call parked_add to capture this idea...
BINARY CHOICE:
[1] Park this idea and continue current task
[2] Mark current complete and switch (requires validation)支持性的 (默认)——热情的指导声音,认可努力,保留代理权。
⚓ New thread detected (score: 5/10)
That sounds like a separate idea — and it might be a good one.
Let me save it so you don't lose it.
What would you like to do?
[1] Park this idea — I'll save it, and we keep going
[2] This IS more important — let's switch (finish current first)最小化 --只有事实,尽可能短的产出。
Drift (score 5/10): "while we're at it let's..."
[1] Park [2] Switch随时切换 set_tone.
______________________________________________________________________
流动模式
当你处于超聚焦状态,漂移检测挡道时,激活流动模式:
flow_mode_activate(duration_minutes=45)漂移检测已暂停。范围执法保持活跃(安全网,而不是笼子)。模式在设定的持续时间后自动过期,并发送温和的登记。提前结束 flow_mode_deactivate.
最长持续时间为120分钟——即使是超聚焦也能从定期签到中受益。
______________________________________________________________________
建筑
mcp-server/
├── pyproject.toml
└── task_anchor/
├── config.py — path resolution (immune to cwd, env-overridable)
├── models.py — TaskLock dataclass, drift signal weights + thresholds
├── storage.py — atomic file I/O, cross-platform locking (fcntl/msvcrt)
├── drift.py — scoring engine, completion validation, history logging
├── flow.py — flow mode activate/deactivate/auto-expire
├── tone.py — tone persistence + message resolver
├── messages.py — message registry (aggregator)
├── messages_core.py — templates: lock, drift, parked, scope
├── messages_session.py — templates: completion, session, flow, celebration
├── helpers.py — shared utilities (git branch, load lock, session log)
├── streak.py — daily streak tracking, completion celebration
├── tools.py — MCP tool schema definitions (14 tools)
├── handlers.py — core tool handler coroutines
├── handlers_session.py — session lifecycle handlers (checkpoint, resume)
└── server.py — MCP wiring, route table, entry point国家档案
所有州都住在 .claude/skills/task-anchor/ 在repo根目录内。覆盖 TASK_ANCHOR_DIR.
| 文件 | 目的 |
|---|---|
TASK_LOCK.json | 活动任务锁(构建、退出条件、范围、时间戳) |
SESSION.json | 上次会话快照(情绪状态、下一个动作、拦截器) |
SESSION_LOG.md | 人类可读的会话历史记录 |
PARKED.md | 仅在已搁置的想法日志中添加紧迫性和时间戳 |
DRIFT_HISTORY.json | 漂移事件统计(总漂移、成功干预) |
STREAK.json | 每日完成记录(当前、最长、历史) |
TONE.json | 用户的音调偏好 |
FLOW_MODE.json | 带到期时间戳的活动流模式状态 |
设计决策
为什么是MCP,而不是立即注射? 及时注射是一种社会契约——克劳德可以被说服放弃。MCP工具是有状态的边界。克劳德如果不打电话,就无法标记任务完成 task_complete,这在释放锁之前验证了退出条件的证据。
为什么用词边界正则表达式而不是子字符串匹配进行漂移检测? “重写”中出现的“重写”不是漂移信号。“相反,”出现在“实例化”中并不是一个漂移信号。全词边界匹配可防止正常技术语言的误报。
为什么是幼稚的词干而不是真正的NLP库? 零附加依赖关系。词干分析器处理90%的情况(复数、-ing、-ed、-ion、-ly),这对匹配退出条件(如“测试通过”)和证据(如“通过测试”)很重要。一个完整的NLP堆栈将增加边际精度增益的权重。
为什么是三个音调? ADHD不是一种体验。有些人会对外部结构做出反应(“违反:无法继续”)。其他人发现语言触发,尤其是那些对拒绝敏感的焦虑症患者。可配置的音调意味着相同的执行逻辑适用于不同的大脑。
______________________________________________________________________
测试
cd mcp-server
pip install -e ".[test]"
pytest tests/ -v6个测试文件中的108个测试,涵盖漂移评分、完成验证、模型序列化、范围验证、会话生命周期(包括所有git检查点状态分支)、路由/工具一致性、音调切换、流模式(包括自动到期)和所有14个处理程序协程。
______________________________________________________________________
环境变量
| 变量 | 默认值 | 用途 |
|---|---|---|
TASK_ANCHOR_DIR | /.claude/skills/task-anchor | 覆盖状态文件位置 |
TASK_ANCHOR_SILENT | unset | 设置为 1 抑制竣工庆典输出 |
______________________________________________________________________
许可证
麻省理工学院
