{"_id":"@deltafleet/goalkeeper","_rev":"3-1cc07954473ceb7866be5145f8f1e97d","name":"@deltafleet/goalkeeper","dist-tags":{"latest":"0.3.0"},"versions":{"0.2.0":{"name":"@deltafleet/goalkeeper","version":"0.2.0","keywords":["agent-skills","claude-code","claude-skill","codex","ai-agents","context","compaction","checkpoint","goal"],"license":"MIT","_id":"@deltafleet/goalkeeper@0.2.0","maintainers":[{"name":"deltafleet","email":"fazomo@deltafleet.io"}],"homepage":"https://github.com/deltafleet/goalkeeper#readme","bugs":{"url":"https://github.com/deltafleet/goalkeeper/issues"},"bin":{"goalkeeper-init":"src/goalkeeper/scripts/goalkeeper-init.mjs","goalkeeper-doctor":"src/goalkeeper/scripts/goalkeeper-doctor.mjs","codex-goalkeeper-init":"src/goalkeeper/scripts/goalkeeper-init.mjs","goalkeeper-turn-start":"src/goalkeeper/scripts/goalkeeper-turn-start.mjs","codex-goalkeeper-doctor":"src/goalkeeper/scripts/goalkeeper-doctor.mjs","goalkeeper-append-event":"src/goalkeeper/scripts/goalkeeper-append-event.mjs","codex-goalkeeper-turn-start":"src/goalkeeper/scripts/goalkeeper-turn-start.mjs","goalkeeper-update-checkpoint":"src/goalkeeper/scripts/goalkeeper-update-checkpoint.mjs","codex-goalkeeper-append-event":"src/goalkeeper/scripts/goalkeeper-append-event.mjs","codex-goalkeeper-update-checkpoint":"src/goalkeeper/scripts/goalkeeper-update-checkpoint.mjs"},"dist":{"shasum":"ed0bbdf1ae1daaea15eb35de0fd3b8a53d9b3ae8","tarball":"https://registry.npmjs.org/@deltafleet/goalkeeper/-/goalkeeper-0.2.0.tgz","fileCount":31,"integrity":"sha512-LldUWQv6QBFyiDXzW/oid5yUeOCsV6P7AB7mTVegclKqO4tfyL1VKnCqoQNvo167HQjNpFscTjQoACvV48aIdQ==","signatures":[{"sig":"MEQCIDdX92GRzwi4Vk8nr4Q4Dg8068+N55ZQJ1X+3VfN4SFcAiBHP2ECOR+d7A8XpWx4377YFy7CcklQQQZdalvJ1NZfqQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":120753},"type":"module","engines":{"node":">=18"},"gitHead":"06d3f66bfde9636000dbfe425478d8c87d8da222","scripts":{"test":"node tests/test-goalkeeper-update-checkpoint.mjs","validate":"npm run check:scripts && npm test && npm run validate:examples && npm run validate:skill","check:scripts":"find src/goalkeeper/scripts tests -name '*.mjs' -print0 | xargs -0 -n1 node --check","validate:skill":"npx skills add . --list","validate:examples":"find examples -name '*.jsonl' -print0 | xargs -0 -n1 jq -c . >/dev/null"},"_npmUser":{"name":"deltafleet","email":"fazomo@deltafleet.io"},"repository":{"url":"git+https://github.com/deltafleet/goalkeeper.git","type":"git"},"_npmVersion":"11.12.1","description":"A small Agent Skill for keeping long-running goals oriented across compaction, resumes, and handoffs.","directories":{},"_nodeVersion":"25.9.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/goalkeeper_0.2.0_1779091187879_0.3018969839931154","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@deltafleet/goalkeeper","version":"0.2.1","keywords":["agent-skills","claude-code","claude-skill","codex","ai-agents","context","compaction","checkpoint","goal"],"license":"MIT","_id":"@deltafleet/goalkeeper@0.2.1","maintainers":[{"name":"deltafleet","email":"fazomo@deltafleet.io"}],"homepage":"https://github.com/deltafleet/goalkeeper#readme","bugs":{"url":"https://github.com/deltafleet/goalkeeper/issues"},"bin":{"goalkeeper-init":"src/goalkeeper/scripts/goalkeeper-init.mjs","goalkeeper-doctor":"src/goalkeeper/scripts/goalkeeper-doctor.mjs","codex-goalkeeper-init":"src/goalkeeper/scripts/goalkeeper-init.mjs","goalkeeper-turn-start":"src/goalkeeper/scripts/goalkeeper-turn-start.mjs","codex-goalkeeper-doctor":"src/goalkeeper/scripts/goalkeeper-doctor.mjs","goalkeeper-append-event":"src/goalkeeper/scripts/goalkeeper-append-event.mjs","codex-goalkeeper-turn-start":"src/goalkeeper/scripts/goalkeeper-turn-start.mjs","goalkeeper-update-checkpoint":"src/goalkeeper/scripts/goalkeeper-update-checkpoint.mjs","codex-goalkeeper-append-event":"src/goalkeeper/scripts/goalkeeper-append-event.mjs","codex-goalkeeper-update-checkpoint":"src/goalkeeper/scripts/goalkeeper-update-checkpoint.mjs"},"dist":{"shasum":"c11b5b5d200f381bf94a381259a2f2110de865ec","tarball":"https://registry.npmjs.org/@deltafleet/goalkeeper/-/goalkeeper-0.2.1.tgz","fileCount":31,"integrity":"sha512-1k9zTEGKIH6rZ/vznDg7CpRAj5MyBrOZWHuJN6Z2uPlaeDibMiKbO5x7V8nIMTNWyo087RQ5Qh9Pp1asJyLuKw==","signatures":[{"sig":"MEYCIQCTlIch+C7DwhXCLOwpajoIAh4Eyg2US4rL6Q5kEse0fgIhAP7pFPLb58LM8fo7mz4QTg6JYGblIW8G6CpoohJERCZG","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":120410},"type":"module","engines":{"node":">=18"},"gitHead":"973d339bd105bd6f05a15b5899a963fb069da166","scripts":{"test":"node tests/test-goalkeeper-update-checkpoint.mjs","validate":"npm run check:scripts && npm test && npm run validate:examples && npm run validate:skill","check:scripts":"find src/goalkeeper/scripts tests -name '*.mjs' -print0 | xargs -0 -n1 node --check","validate:skill":"npx skills add . --list","validate:examples":"find examples -name '*.jsonl' -print0 | xargs -0 -n1 jq -c . >/dev/null"},"_npmUser":{"name":"deltafleet","email":"fazomo@deltafleet.io"},"repository":{"url":"git+https://github.com/deltafleet/goalkeeper.git","type":"git"},"_npmVersion":"11.12.1","description":"A small Agent Skill for keeping long-running goals oriented across compaction, resumes, and handoffs.","directories":{},"_nodeVersion":"25.9.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/goalkeeper_0.2.1_1779091748104_0.9382648244520153","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@deltafleet/goalkeeper","version":"0.3.0","description":"A small Agent Skill for keeping long-running goals oriented across compaction, resumes, and handoffs.","license":"MIT","type":"module","homepage":"https://github.com/deltafleet/goalkeeper#readme","repository":{"type":"git","url":"git+https://github.com/deltafleet/goalkeeper.git"},"bugs":{"url":"https://github.com/deltafleet/goalkeeper/issues"},"keywords":["agent-skills","claude-code","claude-skill","codex","ai-agents","context","compaction","checkpoint","goal"],"bin":{"goalkeeper-init":"src/goalkeeper/scripts/goalkeeper-init.mjs","goalkeeper-turn-start":"src/goalkeeper/scripts/goalkeeper-turn-start.mjs","goalkeeper-append-event":"src/goalkeeper/scripts/goalkeeper-append-event.mjs","goalkeeper-update-checkpoint":"src/goalkeeper/scripts/goalkeeper-update-checkpoint.mjs","goalkeeper-doctor":"src/goalkeeper/scripts/goalkeeper-doctor.mjs","goalkeeper-close":"src/goalkeeper/scripts/goalkeeper-close.mjs","codex-goalkeeper-init":"src/goalkeeper/scripts/goalkeeper-init.mjs","codex-goalkeeper-turn-start":"src/goalkeeper/scripts/goalkeeper-turn-start.mjs","codex-goalkeeper-append-event":"src/goalkeeper/scripts/goalkeeper-append-event.mjs","codex-goalkeeper-update-checkpoint":"src/goalkeeper/scripts/goalkeeper-update-checkpoint.mjs","codex-goalkeeper-doctor":"src/goalkeeper/scripts/goalkeeper-doctor.mjs","codex-goalkeeper-close":"src/goalkeeper/scripts/goalkeeper-close.mjs"},"scripts":{"check:scripts":"find src/goalkeeper/scripts tests -name '*.mjs' -print0 | xargs -0 -n1 node --check","test":"node tests/test-goalkeeper-update-checkpoint.mjs","validate:skill":"npx skills add . --list","validate:examples":"find examples -name '*.jsonl' -print0 | xargs -0 -n1 jq -c . >/dev/null","validate":"npm run check:scripts && npm test && npm run validate:examples && npm run validate:skill"},"engines":{"node":">=18"},"publishConfig":{"access":"public"},"gitHead":"5f99fb2a3e7670d3261565064602e9ccf200f5c1","_id":"@deltafleet/goalkeeper@0.3.0","_nodeVersion":"25.9.0","_npmVersion":"11.12.1","dist":{"integrity":"sha512-wcSq6sWUoB64NPU13EUiKircgSFT3BCgUbzmImvCgS/ZdlVUmyjW8ziczF75axtt2diLFU9yD2hgem7Jbjl3+A==","shasum":"6f7272b07a31cd0b193299a35a2b7443444012ad","tarball":"https://registry.npmjs.org/@deltafleet/goalkeeper/-/goalkeeper-0.3.0.tgz","fileCount":32,"unpackedSize":135176,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQD6soljucDw/eyP6xEer4KFOGVZN/nFo3MVPCfdNEPY4QIgKXDPSS9cHl9/uB+cvoNjid5uhiWYoMLgxZ/hJA2ed4E="}]},"_npmUser":{"name":"deltafleet","email":"fazomo@deltafleet.io"},"directories":{},"maintainers":[{"name":"deltafleet","email":"fazomo@deltafleet.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/goalkeeper_0.3.0_1779092967938_0.03142954740846782"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-18T07:59:47.806Z","modified":"2026-05-18T08:29:28.246Z","0.2.0":"2026-05-18T07:59:48.032Z","0.2.1":"2026-05-18T08:09:08.235Z","0.3.0":"2026-05-18T08:29:28.148Z"},"bugs":{"url":"https://github.com/deltafleet/goalkeeper/issues"},"license":"MIT","homepage":"https://github.com/deltafleet/goalkeeper#readme","keywords":["agent-skills","claude-code","claude-skill","codex","ai-agents","context","compaction","checkpoint","goal"],"repository":{"type":"git","url":"git+https://github.com/deltafleet/goalkeeper.git"},"description":"A small Agent Skill for keeping long-running goals oriented across compaction, resumes, and handoffs.","maintainers":[{"name":"deltafleet","email":"fazomo@deltafleet.io"}],"readme":"# Goalkeeper\n\n长时间 agent 任务通常不是突然失败的。\n\n它们会慢慢偏离方向。\n\nAgent 仍然会显得很自信。测试仍然会运行。计划看起来也仍然合理。但经过多次 compaction、handoff 和 resume 之后，最重要的东西可能会悄悄变模糊：\n\n> 我们为什么要按这个方向做？\n\nGoalkeeper 是一个很小的 skill，用来帮助 Claude Code、Codex 以及其他 skill-compatible coding agents 在长时间 `/goal` 工作中跨越 compaction、resume 和 handoff 仍然保持方向。\n\n它不添加隐藏的记忆引擎。它给 agent 一个可持续的工作习惯：\n\n- 保持一个简短 checkpoint\n- 保持一个更丰富的 context pack\n- 把决策和验证写入 event log\n- 在容易发生 drift 的边界之后，继续前先读 checkpoint\n\n无聊的文件。更好的连续性。\n\n[English](README.md) | [한국어](README.ko.md) | [日本語](README.ja.md)\n\n## 安装\n\n```bash\nnpx skills add deltafleet/goalkeeper\n```\n\n如果要明确指定 agent：\n\n```bash\nnpx skills add deltafleet/goalkeeper --agent claude-code codex\n```\n\n要求: Node.js 18+ 和 `npx`。在长 goal workflow 中，agent 会使用 skill 内置的 Node helper scripts。\n\n当请求和 metadata 高度匹配时，Skill-compatible agent 可以自动加载已安装的 skill。Goalkeeper 的 metadata 面向 `/goal`、长时间任务、compaction、resume、handoff 和 continuity preservation。\n\n所以像下面这样的 goal 可能已经足够触发它：\n\n> `/goal` Harden this release over a long-running session. Use goalkeeper.\n\n但 skill activation 仍然是 routing decision，不是私有的 agent runtime hook。Goalkeeper 不能强制自己附着到每一个 goal。\n\n对于重要的长期任务，最稳妥的做法是在创建 goal 时，或创建 goal 后正式开始工作前，明确调用它：\n\n> Use goalkeeper for this goal.\n\n用户需要记住的句子到这里就够了。checkpoint、context pack、event log、失败尝试、验证状态和 helper scripts，都由 agent 在 Goalkeeper workflow 中处理。\n\n## 问题\n\n对于短任务，compaction 通常只是细节。Agent 大多能恢复。\n\n但长 goal 不一样。\n\n想象一个真实会话：\n\n1. 你让 agent 修一个支付 bug。\n2. 早期调查发现，`refunds` 相关代码是 legacy，不能轻易动。\n3. 最快的 patch 是直接改 `refunds`，所以你明确拒绝这条路。\n4. agent 尝试把修复放到 webhook handler，但 duplicate event 场景会失败。\n5. 最后它验证了安全路线：在 service layer 加 idempotency guard，并用 regression test 覆盖。\n6. 测试通过了。这条路线现在是需要保留下来的安全路线。\n7. 上下文被 compact。\n8. 后来 agent 带着整洁摘要回来：“支付 bug 基本修好了。”\n9. 它还记得 goal，但可能不再清楚 `refunds` 为什么不能动，webhook 尝试为什么失败，以及 service-layer test 为什么证明了正确路线。\n\ndrift 就从这里开始。\n\n失败原因不是“模型忘掉了一切”。这更难处理：它记得足够继续工作，但不记得足够沿着同一个方向继续。\n\n你会在这些情况里看到它：\n\n- 重新打开用户已经拒绝的方案\n- 因为失败原因在摘要里消失，重复同样的尝试\n- 把未验证的假设当作确定事实\n- 在长 handoff 后丢失准确的 next action\n- 还记得 goal，但丢掉了操作约束\n- 解释很流畅，但已经不匹配实际工作流\n\nGoalkeeper 解决的是这个空隙：goal 还在，但会话的方向感已经变弱。\n\n## Agent 会做什么\n\nskill 激活后，agent 会在项目内维护一个连续性文件夹：\n\n```text\n.goalkeeper/\n  active-session\n  sessions/\n    <goal-session-id>/\n      checkpoint.md\n      context-pack.md\n      events.jsonl\n```\n\n每个文件的职责不同：\n\n- `checkpoint.md`: 恢复时首先读取的简短状态\n- `context-pack.md`: 对 checkpoint 来说太长、但 compaction 后仍应保留的推理链\n- `events.jsonl`: 决策、失败尝试、命令证据、验证、风险和 handoff 记录\n\nactive goal 说明目的地。Goalkeeper 保存为什么这条路线仍然正确。\n\n## 工作原理\n\nGoalkeeper 把长时间 agent 工作变成一个简单循环：\n\n```text\n长 /goal 开始\n  -> agent 创建或恢复 Goalkeeper session\n  -> 记录重要约束和决策\n  -> 保留失败尝试，避免重复犯错\n  -> 在信心变化时记录验证证据\n  -> 在有意义的边界刷新 checkpoint.md\n  -> context-pack.md 保存更深的推理链\n  -> resume、handoff 或怀疑 compaction 后，agent 先读 checkpoint.md\n  -> 如果 checkpoint 太薄，agent 再读 context-pack.md\n  -> 如果需要精确证据，agent 检查 events.jsonl 或 source files\n  -> goal 完成后，agent 关闭 Goalkeeper session\n  -> 之后无关的一般问题不会触发 Goalkeeper recovery\n```\n\n这不是保存对话 transcript。它保存的是工作状态。\n\nGoalkeeper 不应该一直附着在会话上。被管理的 goal 完成后，agent 会记录最终结果，把 checkpoint 标记为 closed，移除 active session pointer，然后再汇报完成。\n\n## 为什么故意做得很小\n\n把这个项目做大很容易：\n\n- daemon\n- database\n- session rewriter\n- private runtime hook\n- vector memory layer\n- full transcript engine\n\nGoalkeeper 故意避开这些。\n\n它使用文件，因为文件可见、可审查、可移动，并且 compaction 后 agent 容易重新读取。目标不是让 agent 全知全能。目标是让下一轮从正确状态开始。\n\n## 它不是什么\n\n- 不是 Codex 或 Claude Code plugin。\n- 不是 MCP server。\n- 不是 database。\n- 不是完整对话 transcript 仓库。\n- 不是 private agent runtime hook。\n- 不保证完美记忆。\n- 不会降低 compaction 频率。\n\nGoalkeeper 改善连续性。它不假装消除上下文限制。\n\n## 改善什么\n\n使用 Goalkeeper 后，恢复的会话更有机会找回：\n\n- 用户的 non-negotiable constraints\n- 当前实现方向\n- 被拒绝的替代方案为什么仍然应被拒绝\n- 改变信心的测试或命令\n- 真实的 next action\n- 不应该被轻描淡写带过的 unresolved risks\n\n长时间 agent 工作里很多无聊但昂贵的失败，只靠这些就能减少。\n\n## Repository Layout\n\n```text\nsrc/goalkeeper/       # installable skill payload\n  SKILL.md\n  agents/openai.yaml\n  scripts/\n  templates/\n  references/\ntests/                      # maintainer tests\nexamples/goalkeeper-session # static example state\ndocs/                       # roadmap and release policy\n```\n\n## Maintainer Validation\n\nFor repository maintainers:\n\n```bash\nnpm run validate\n```\n\nEquivalent manual checks:\n\n```bash\nfind src/goalkeeper/scripts tests -name '*.mjs' -print0 | xargs -0 -n1 node --check\nnode tests/test-goalkeeper-update-checkpoint.mjs\nnpx skills add . --list\n```\n\n## Versioning\n\nGoalkeeper uses SemVer.\n\n- Patch: docs, examples, tests, and compatible bug fixes\n- Minor: new compatible helpers or workflow fields\n- Major: breaking changes to checkpoint, event, or script contracts\n\nSee [docs/RELEASE.md](docs/RELEASE.md) for release steps.\n\n## Contributing\n\nIssues and PRs are welcome. The project bias is strict:\n\n- keep the core workflow small\n- do not add hidden runtime dependencies\n- do not promise perfect recovery\n- prefer project-local files over global state\n- prove changes with the validation commands above\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md), [SECURITY.md](SECURITY.md), and [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md).\n\n## License\n\nMIT. See [LICENSE](LICENSE).\n","readmeFilename":"README.zh-CN.md"}