fluffy-context 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +86 -136
  3. package/dist/src/agent/api.d.ts +8 -0
  4. package/dist/src/agent/api.js +285 -0
  5. package/dist/src/agent/index.d.ts +3 -0
  6. package/dist/src/agent/index.js +1 -0
  7. package/dist/src/agent/types.d.ts +50 -0
  8. package/dist/src/agent/types.js +1 -0
  9. package/dist/src/capture/context-filter.d.ts +7 -0
  10. package/dist/src/cli/main.d.ts +2 -0
  11. package/dist/src/cli/main.js +382 -30
  12. package/dist/src/git/git-adapter.d.ts +2 -0
  13. package/dist/src/hooks/claude-code.d.ts +1 -0
  14. package/dist/src/hooks/claude-code.js +84 -0
  15. package/dist/src/integrations/claude-code.d.ts +19 -0
  16. package/dist/src/integrations/claude-code.js +122 -0
  17. package/dist/src/mcp/main.d.ts +1 -0
  18. package/dist/src/mcp/main.js +5 -0
  19. package/dist/src/mcp/server.d.ts +2 -0
  20. package/dist/src/mcp/server.js +40 -0
  21. package/dist/src/project/project-resolver.d.ts +1 -0
  22. package/dist/src/runtime/diagnostics.d.ts +6 -0
  23. package/dist/src/runtime/diagnostics.js +34 -5
  24. package/dist/src/runtime/init.d.ts +7 -0
  25. package/dist/src/runtime/knowledge.d.ts +9 -0
  26. package/dist/src/runtime/knowledge.js +179 -12
  27. package/dist/src/runtime/notes.d.ts +6 -0
  28. package/dist/src/runtime/notes.js +173 -0
  29. package/dist/src/runtime/runtime.d.ts +11 -0
  30. package/dist/src/runtime/runtime.js +48 -18
  31. package/dist/src/runtime/types.d.ts +294 -0
  32. package/dist/src/storage/atomic-write.d.ts +1 -0
  33. package/dist/src/storage/json-store.d.ts +6 -0
  34. package/dist/src/storage/layout.d.ts +13 -0
  35. package/dist/src/storage/layout.js +3 -0
  36. package/dist/src/storage/lock.d.ts +1 -0
  37. package/dist/src/version.d.ts +1 -0
  38. package/dist/src/version.js +1 -0
  39. package/package.json +48 -11
  40. package/skills/fluffy-context/SKILL.md +345 -0
package/package.json CHANGED
@@ -1,36 +1,73 @@
1
1
  {
2
2
  "name": "fluffy-context",
3
- "version": "0.1.0",
4
- "description": "面向 AI 编程会话的本地上下文运行时 CLI",
3
+ "version": "0.3.0",
4
+ "description": "Local context management CLI and MCP tools for AI coding agents",
5
+ "license": "MIT",
6
+ "author": "FluffyChi-Xing",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/FluffyChi-Xing/fluffy-context.git"
10
+ },
11
+ "homepage": "https://github.com/FluffyChi-Xing/fluffy-context#readme",
12
+ "bugs": {
13
+ "url": "https://github.com/FluffyChi-Xing/fluffy-context/issues"
14
+ },
5
15
  "type": "module",
6
16
  "keywords": [
7
- "context-runtime",
8
17
  "ai-agent",
9
- "coding-agent",
10
- "developer-tools",
18
+ "agent-context",
19
+ "claude-code",
11
20
  "cli",
12
21
  "context-management",
13
- "session-resume",
14
- "knowledge-base",
15
- "deadend-tracking",
16
- "snapshot"
22
+ "context-runtime",
23
+ "developer-tools",
24
+ "mcp",
25
+ "model-context-protocol",
26
+ "session-resume"
17
27
  ],
18
28
  "bin": {
19
29
  "ctx": "dist/src/cli/main.js"
20
30
  },
31
+ "types": "./dist/src/agent/index.d.ts",
32
+ "exports": {
33
+ ".": {
34
+ "types": "./dist/src/agent/index.d.ts",
35
+ "default": "./dist/src/agent/index.js"
36
+ },
37
+ "./agent": {
38
+ "types": "./dist/src/agent/index.d.ts",
39
+ "default": "./dist/src/agent/index.js"
40
+ },
41
+ "./version": {
42
+ "types": "./dist/src/version.d.ts",
43
+ "default": "./dist/src/version.js"
44
+ }
45
+ },
21
46
  "files": [
22
- "dist/src"
47
+ "dist/src",
48
+ "README.md",
49
+ "LICENSE",
50
+ "skills/fluffy-context/SKILL.md"
23
51
  ],
24
52
  "engines": {
25
53
  "node": ">=20.19.0"
26
54
  },
27
55
  "scripts": {
28
56
  "build": "tsc -p tsconfig.json",
29
- "test": "npm run build && node --test dist/test/*.test.js",
57
+ "typecheck": "tsc -p tsconfig.test.json --noEmit",
58
+ "test": "tsc -p tsconfig.test.json && node --test dist/test/*.test.js",
59
+ "pack:check": "tsc -p tsconfig.test.json && node --test dist/test/package-smoke.test.js",
60
+ "prepack": "npm run build",
61
+ "prepublishOnly": "npm test && npm run pack:check",
30
62
  "ctx": "npm run build && node dist/src/cli/main.js"
31
63
  },
32
64
  "devDependencies": {
65
+ "@modelcontextprotocol/client": "^2.0.0",
33
66
  "@types/node": "^22.10.0",
34
67
  "typescript": "^5.7.2"
68
+ },
69
+ "dependencies": {
70
+ "@modelcontextprotocol/server": "^2.0.0",
71
+ "zod": "^4.4.3"
35
72
  }
36
73
  }
@@ -0,0 +1,345 @@
1
+ ---
2
+ name: fluffy-context
3
+ description: 使用 fluffy-context(ctx)CLI 管理 AI 编程会话的本地上下文。需要初始化项目、保存或恢复工作状态、查看 Context、运行 doctor、记录项目知识或验证死路时使用;也用于排查 ctx 在 Windows、npm 全局安装、.contextignored、Snapshot patch、10 秒限流和 JSON 输出方面的问题。
4
+ compatibility: 需要 Node.js >=20.19.0;Git 可选。CLI 通过 npm 全局安装后提供 ctx 命令。
5
+ ---
6
+
7
+ # fluffy-context CLI Skill
8
+
9
+ 使用 `ctx` 保存和恢复 AI 编程任务的结构化工作状态。它保存的是 Context、Snapshot、Knowledge 和 Deadend,不是项目代码备份;Git 仍是代码与真实文件变更的权威来源。
10
+
11
+ ## 使用原则
12
+
13
+ - 先确认当前工作目录是否是目标项目;不确定时显式传入 `--path <project-path>`。
14
+ - 开始使用前运行 `ctx init`,不要手工创建 `.context` 文件。
15
+ - 下班交接或完成一个阶段时运行 `ctx checkpoint`,不要为了每条消息频繁保存。
16
+ - 开发过程中遇到问题、找到解决措施、做出临时决策或发现重要观察时,Agent 应优先使用低成本的 `ctx note add`,不要为了单条记录创建 Snapshot。
17
+ - 人类需要了解 Agent 发生了什么时使用 `ctx activity`;它是只读时间线,不要求人类参与 Agent 的高频记录操作。
18
+ - 新会话与新任务优先运行 `ctx orient [query] --max-chars <预算>`;它只读地返回有界摘要、匹配的已验证共识和当前 Context 的 open Note,不会创建 Snapshot 或更新 `lastUsedAt`。
19
+ - 仅需要完整详情时再运行 `ctx resume --max-chars <预算>`;它会保留既有的 `lastUsedAt` 更新语义。
20
+ - Agent 集成从 `fluffy-context` 或 `fluffy-context/agent` 导入 `contextOrient`、`saveContext`、`loadContext` 和 `searchContext`,不应直接读写 `.context` 或导入内部 `dist/...` 路径。
21
+ - 新任务先发现已验证共识,再开始实现;候选项只在显式审查时使用。
22
+ - 普通查询只使用已验证 Knowledge 和 Deadend;需要审查候选项时显式使用 `--all`。
23
+ - CLI 业务命令的标准输出是 JSON;错误写入标准错误并返回非零退出码。解析输出时不要把 `--help` 的纯文本当作 JSON。
24
+
25
+ ## 快速工作流
26
+
27
+ ```text
28
+ ctx init
29
+ ↓
30
+ ctx orient "当前任务" --max-chars 4000 / contextOrient(...)
31
+ ↓
32
+ Plan:先形成实现计划
33
+ ↓
34
+ Implement:ctx note add "观察、决策或问题"
35
+ ↓
36
+ Verify:执行适用检查并记录重要失败
37
+ ↓
38
+ Handoff:ctx checkpoint --title ... --progress ...
39
+ ↓
40
+ ctx learn ... / ctx deadend ... → 显式 verify
41
+ ```
42
+
43
+ `ctx orient` 不带查询时也有效,用于恢复当前任务和 open Note。带查询时只发现已验证的 Knowledge 与 Deadend;不要以候选项驱动普通实现。
44
+
45
+ ### 初始化
46
+
47
+ ```bash
48
+ ctx init
49
+ ctx init --path path/to/project
50
+ ```
51
+
52
+ 初始化会创建 `.context/` 和项目根目录的 `.contextignored`。重复执行是幂等的,不会覆盖已有 Context 或忽略规则。
53
+
54
+ ### 保存 Context
55
+
56
+ 第一次保存创建 baseline,后续变化保存 patch,没有变化返回 `no_change`:
57
+
58
+ ```bash
59
+ ctx checkpoint \
60
+ --title "订单状态机重构" \
61
+ --progress "完成状态流转梳理,正在补充异常测试" \
62
+ --completed "梳理状态转移,确认幂等策略" \
63
+ --pending "补充异常测试,运行集成测试" \
64
+ --decisions "服务端统一维护状态" \
65
+ --risks "第三方回调可能重复" \
66
+ --files "src/order.ts,src/order.test.ts"
67
+ ```
68
+
69
+ 列表参数用逗号分隔。继续更新已有 Context 时传入:
70
+
71
+ ```bash
72
+ ctx checkpoint --context <context-id> --progress "完成异常测试"
73
+ ```
74
+
75
+ 字段未提供时会沿用之前的值;需要清理字段时根据 CLI 当前参数语义显式传入空值或调整运行时输入。
76
+
77
+ ### 恢复 Context
78
+
79
+ ```bash
80
+ ctx resume
81
+ ctx resume --context <context-id>
82
+ ctx resume --path path/to/project --max-chars 2000
83
+ ```
84
+
85
+ `resume` 返回:
86
+
87
+ - `context`:Context 元数据。
88
+ - `snapshot`:当前不可变 Snapshot。
89
+ - `resumeSummary`:受字符预算限制的轻量摘要。
90
+ - `details`:完整结构化 Context,按需使用。
91
+
92
+ 默认保存实际写入之间至少间隔 10 秒:
93
+
94
+ - 有变化且距离上次写入不足 10 秒:`status: "rate_limited"`,同时返回 `retryAt`。
95
+ - 输入与当前内容相同:`status: "no_change"`。
96
+ - 可以保存:`status: "saved"`。
97
+
98
+ 遇到 `rate_limited` 时不要循环重试;完成更多阶段性工作后,在 `retryAt` 之后再保存。
99
+
100
+ ## MCP 与 Claude Code 集成
101
+
102
+ `ctx agent serve` 提供 MCP stdio server,注册 `context_orient` 工具。标准输入和输出都是 MCP 协议,不能输出提示、日志或交互文本;调用错误是单次工具错误,不应让 server 退出。
103
+
104
+ ```bash
105
+ ctx agent serve
106
+ ```
107
+
108
+ Claude Code 项目集成必须显式安装,且默认不修改文件:
109
+
110
+ ```bash
111
+ ctx integrate claude inspect
112
+ ctx integrate claude install
113
+ ctx integrate claude install --apply
114
+ ```
115
+
116
+ 只有 `--apply` 会合并项目的 `.claude/settings.json` 和 `.mcp.json`。它保留无关配置,遇到无效 JSON、无效结构或同名 `fluffy-context` MCP server 冲突时必须拒绝覆盖。安装后 Hook 使用以下阶段引导:
117
+
118
+ ```text
119
+ Orient → Plan → Implement → Verify → Handoff
120
+ ```
121
+
122
+ Hook 是 fail-open 的只读提示:输入损坏、项目未初始化或定位失败时不应阻止任务;它不自动保存 Note 或 checkpoint。阶段结束时 Agent 应自行评估后执行一次带完成项、待办、决策和风险的 `ctx checkpoint`。
123
+
124
+ ## Agent 短期记录与 Human 可观测性
125
+
126
+ `checkpoint` 适合阶段性总结;Agent 在任务进行中遇到突发问题、排查出解决措施、做出决策或发现重要事实时,应使用 `ctx note add` 快速追加记录:
127
+
128
+ ```bash
129
+ ctx note add "第三方人脸识别测试凭据缺失" \
130
+ --kind problem \
131
+ --context <context-id>
132
+ ctx note add "保留原始请求体后验签恢复" \
133
+ --kind decision \
134
+ --status resolved \
135
+ --context <context-id>
136
+ ctx note list --context <context-id> --open
137
+ ```
138
+
139
+ Note 不会创建 Snapshot,原始记录会保留。阶段性总结时可以显式吸收当前 Context 的 Note:
140
+
141
+ ```bash
142
+ ctx checkpoint --context <context-id> --progress "完成阶段排查" --absorb-notes
143
+ ```
144
+
145
+ 只有真正保存了新 Snapshot 时 Note 才会被标记为已吸收;`no_change` 和 `rate_limited` 不会改变 Note。
146
+
147
+ 人类查看 Agent 开发过程中发生了什么时使用只读 Activity 时间线:
148
+
149
+ ```bash
150
+ ctx activity --context <context-id> --open --limit 20
151
+ ctx activity --since 2026-08-21T00:00:00.000Z
152
+ ```
153
+
154
+ `ctx activity` 返回 Note 和已保存 Snapshot 的有限时间线,不会把完整日志或所有历史内容注入上下文。
155
+
156
+ ## Knowledge 与 Deadend
157
+
158
+ ### 记录可复用知识
159
+
160
+ Knowledge 默认是 `candidate`,不会进入普通查询,也不会自动替代人工确认:
161
+
162
+ ```bash
163
+ ctx learn "订单取消后不能再次进入支付中状态" \
164
+ --scope project \
165
+ --context <context-id> \
166
+ --snapshot <snapshot-id> \
167
+ --evidence "src/order/state-machine.ts,接口约束"
168
+ ```
169
+
170
+ 查询、发现和确认:
171
+
172
+ ```bash
173
+ ctx knowledge
174
+ ctx knowledge --all
175
+ ctx knowledge discover "投保人认证"
176
+ ctx knowledge discover "identity verification" --scope project --limit 10 --max-chars 4000
177
+ ctx knowledge verify <knowledge-id>
178
+ ```
179
+
180
+ `discover` 默认只匹配已验证 Knowledge,并返回命中的字段、规则原因、来源 Context/Snapshot 和 supporting evidence。候选项不会参与普通发现;审查候选或其它状态时使用 `--all` 或显式 `--status candidate,verified`。匹配采用确定性的规范化文本和少量业务别名规则,不依赖模型或向量数据库。
181
+
182
+ ### 记录已验证死路
183
+
184
+ Deadend 用来阻止后续会话重复尝试明确失败的方案,默认也是 `candidate`:
185
+
186
+ ```bash
187
+ ctx deadend \
188
+ --attempt "使用共享可变单例保存订单状态" \
189
+ --reason "并发测试出现跨用例状态泄漏" \
190
+ --scope project \
191
+ --context <context-id> \
192
+ --snapshot <snapshot-id> \
193
+ --evidence "test/order-state.test.ts"
194
+ ```
195
+
196
+ 查询和确认:
197
+
198
+ ```bash
199
+ ctx deadends
200
+ ctx deadends --all
201
+ ctx deadend verify <deadend-id>
202
+ ```
203
+
204
+ 提供 `--context` 或 `--snapshot` 时,来源必须真实存在;不存在的来源会拒绝写入。不要为了让命令成功而删除来源参数,除非该知识确实没有可追溯来源。
205
+
206
+ ## `.contextignored` 与安全边界
207
+
208
+ `.contextignored` 使用接近 `.gitignore` 的规则配置项目关联文件:
209
+
210
+ ```gitignore
211
+ private/
212
+ *.generated.ts
213
+ notes/draft-*
214
+ ```
215
+
216
+ 内置保护规则优先于项目规则,不能通过否定规则绕过。以下路径默认不会作为关联文件保存:
217
+
218
+ - `.context/`、`.git/`
219
+ - `node_modules/`、`dist/`、`build/`、`coverage/`
220
+ - `.env`、`.env.*`
221
+ - `*.pem`、`*.key`、`*.p12`、`*.pfx`
222
+ - 常见 credential、secret、token 文件
223
+ - 绝对路径和 `..` 越界路径
224
+
225
+ 如果 `relatedFiles` 中缺少某个路径,先检查 `.contextignored` 和内置保护规则,不要直接认为 Snapshot 损坏。
226
+
227
+ ## 诊断流程
228
+
229
+ 出现恢复失败、Context 不见或状态异常时按顺序执行:
230
+
231
+ ```bash
232
+ ctx status --path <project-path>
233
+ ctx doctor --path <project-path>
234
+ ```
235
+
236
+ 重点查看:
237
+
238
+ - `initialized` 是否为 `true`。
239
+ - `layoutVersion` 是否为 `compact-json-v1`。
240
+ - `doctor.checks` 中的 `manifest`、`index`、`contexts`、`index rebuild`。
241
+ - 是否传入了正确的 `--path`。
242
+ - Context 是否仍为 `active` 或 `stable`。
243
+
244
+ 不要直接删除 `.context`、Snapshot 或 lock 文件来“修复”问题;先保留现场并运行 doctor。Index 是可重建索引,但 Context metadata 和 Snapshot 才是主要业务数据。
245
+
246
+ ## 常见问题与解决方案
247
+
248
+ ### 1. `npm install --global context-runtime` 安装的不是当前项目
249
+
250
+ 如果要安装当前工作树,不要使用 registry 包名安装,先在项目根目录执行:
251
+
252
+ ```bash
253
+ npm install --global .
254
+ ctx --version
255
+ ```
256
+
257
+ 如果项目包名已经是 `fluffy-context`,也可以确认:
258
+
259
+ ```bash
260
+ npm install --global fluffy-context
261
+ ```
262
+
263
+ 但这会安装 registry 上的已发布版本;开发当前代码时应使用 `npm install --global .`。
264
+
265
+ ### 2. Windows 下 Node 子进程找不到 `ctx`
266
+
267
+ Windows npm 通常生成 `ctx.cmd` 和 `ctx` 包装器。交互式终端中直接运行 `ctx` 通常可用;从 Node `spawnSync`、测试脚本或其它程序调用时,应使用 `ctx.cmd`,或在明确控制参数转义的前提下使用 shell:
268
+
269
+ ```js
270
+ spawnSync('ctx.cmd', args, { encoding: 'utf8', shell: true });
271
+ ```
272
+
273
+ 不要把未转义的用户输入拼进 shell 命令。普通 CLI 使用优先直接调用 `ctx`,不需要自行构造子进程。
274
+
275
+ ### 3. `checkpoint` 返回 `rate_limited`
276
+
277
+ 这是默认的防刷写机制,不是保存失败。检查返回的 `retryAt`,完成更多阶段性工作后再保存。相同内容的输入应返回 `no_change`,但如果内容相对当前 Snapshot 有变化,限流优先于下一次写入。
278
+
279
+ ### 4. `resume` 找不到 Context
280
+
281
+ 先确认:
282
+
283
+ ```bash
284
+ ctx status --path <project-path>
285
+ ctx doctor --path <project-path>
286
+ ```
287
+
288
+ 然后检查:
289
+
290
+ - 是否在正确的项目根目录运行。
291
+ - 是否使用了错误的 `--context` ID。
292
+ - Context 是否是 `active` 或 `stable`。
293
+ - Context 是否有 `currentSnapshotId`。
294
+ - Git 分支变化是否只是漂移提示,而不是 Context 丢失。
295
+
296
+ ### 5. `--help` 不能用 `JSON.parse` 解析
297
+
298
+ `ctx --help` 是面向终端用户的文本输出;`ctx --version` 输出 JSON 字符串,业务命令返回 JSON。脚本应根据命令区分处理:
299
+
300
+ ```bash
301
+ ctx --help
302
+ ctx --version
303
+ ctx status | node -e "let s='';process.stdin.on('data',d=>s+=d).on('end',()=>console.log(JSON.parse(s)))"
304
+ ```
305
+
306
+ ### 6. 参数包含空格或中文
307
+
308
+ 在 shell 中将每个带空格的值整体加引号:
309
+
310
+ ```bash
311
+ ctx checkpoint --title "支付回调修复" --progress "已定位签名校验失败原因"
312
+ ctx learn "订单取消后不能再次进入支付中状态"
313
+ ```
314
+
315
+ 列表项用逗号分隔,但逗号本身不适合作为单个列表项内容。
316
+
317
+ ### 7. `doctor` 报告索引问题
318
+
319
+ 不要把 `index.json` 当作唯一数据源。先读取 doctor 的逐项结果;如果 Context metadata 和 Snapshot 存在,索引通常可以从权威 Context 数据重建。若报告 Context metadata 或 Snapshot 损坏,先备份 `.context/` 后再处理,不要用空的 index 覆盖现场。
320
+
321
+ ## 验收清单
322
+
323
+ 使用本 Skill 验收一次 CLI 时,至少验证:
324
+
325
+ ```text
326
+ [ ] ctx --help / ctx --version
327
+ [ ] ctx init
328
+ [ ] ctx status
329
+ [ ] ctx doctor
330
+ [ ] 首次 checkpoint 为 baseline
331
+ [ ] 变更 checkpoint 为 patch
332
+ [ ] 相同输入为 no_change
333
+ [ ] 短时间变更输入为 rate_limited
334
+ [ ] ctx orient 的摘要、共识和 Note 受预算限制且不改写 Context
335
+ [ ] .contextignored 排除敏感和越界路径
336
+ [ ] Knowledge candidate → verified
337
+ [ ] Deadend candidate → verified
338
+ [ ] MCP context_orient 的 no_context 和单次错误不会终止 server
339
+ [ ] Claude 集成预览不写文件,--apply 幂等且拒绝冲突
340
+ [ ] Hook 失败时 fail open,且不会自动 checkpoint
341
+ [ ] npm pack 的安装包可运行 ctx 并导入 contextOrient
342
+ [ ] 未知参数返回非零退出码
343
+ ```
344
+
345
+ 所有命令都应在测试项目或明确指定的 `--path` 下运行,避免把验收数据写入真实项目。