@pcircle/footprint 1.5.0 → 1.7.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 (249) hide show
  1. package/README.md +301 -132
  2. package/SKILL.md +72 -28
  3. package/bin/footprint.js +16 -0
  4. package/dist/src/adapters/claude.d.ts +2 -0
  5. package/dist/src/adapters/claude.d.ts.map +1 -0
  6. package/dist/src/adapters/claude.js +7 -0
  7. package/dist/src/adapters/claude.js.map +1 -0
  8. package/dist/src/adapters/codex.d.ts +2 -0
  9. package/dist/src/adapters/codex.d.ts.map +1 -0
  10. package/dist/src/adapters/codex.js +7 -0
  11. package/dist/src/adapters/codex.js.map +1 -0
  12. package/dist/src/adapters/gemini.d.ts +2 -0
  13. package/dist/src/adapters/gemini.d.ts.map +1 -0
  14. package/dist/src/adapters/gemini.js +7 -0
  15. package/dist/src/adapters/gemini.js.map +1 -0
  16. package/dist/src/adapters/index.d.ts +5 -0
  17. package/dist/src/adapters/index.d.ts.map +1 -0
  18. package/dist/src/adapters/index.js +12 -0
  19. package/dist/src/adapters/index.js.map +1 -0
  20. package/dist/src/adapters/structured-prefix.d.ts +10 -0
  21. package/dist/src/adapters/structured-prefix.d.ts.map +1 -0
  22. package/dist/src/adapters/structured-prefix.js +59 -0
  23. package/dist/src/adapters/structured-prefix.js.map +1 -0
  24. package/dist/src/adapters/types.d.ts +32 -0
  25. package/dist/src/adapters/types.d.ts.map +1 -0
  26. package/dist/src/adapters/types.js +2 -0
  27. package/dist/src/adapters/types.js.map +1 -0
  28. package/dist/src/cli/context-flow.d.ts +92 -0
  29. package/dist/src/cli/context-flow.d.ts.map +1 -0
  30. package/dist/src/cli/context-flow.js +724 -0
  31. package/dist/src/cli/context-flow.js.map +1 -0
  32. package/dist/src/cli/history-display.d.ts +27 -0
  33. package/dist/src/cli/history-display.d.ts.map +1 -0
  34. package/dist/src/cli/history-display.js +167 -0
  35. package/dist/src/cli/history-display.js.map +1 -0
  36. package/dist/src/cli/index.js +924 -0
  37. package/dist/src/cli/index.js.map +1 -1
  38. package/dist/src/cli/launch-spec.d.ts +31 -0
  39. package/dist/src/cli/launch-spec.d.ts.map +1 -0
  40. package/dist/src/cli/launch-spec.js +182 -0
  41. package/dist/src/cli/launch-spec.js.map +1 -0
  42. package/dist/src/cli/live-demo.d.ts +34 -0
  43. package/dist/src/cli/live-demo.d.ts.map +1 -0
  44. package/dist/src/cli/live-demo.js +254 -0
  45. package/dist/src/cli/live-demo.js.map +1 -0
  46. package/dist/src/cli/pty-transcript.d.ts +34 -0
  47. package/dist/src/cli/pty-transcript.d.ts.map +1 -0
  48. package/dist/src/cli/pty-transcript.js +174 -0
  49. package/dist/src/cli/pty-transcript.js.map +1 -0
  50. package/dist/src/cli/session-display.d.ts +74 -0
  51. package/dist/src/cli/session-display.d.ts.map +1 -0
  52. package/dist/src/cli/session-display.js +922 -0
  53. package/dist/src/cli/session-display.js.map +1 -0
  54. package/dist/src/cli/session-execution.d.ts +55 -0
  55. package/dist/src/cli/session-execution.d.ts.map +1 -0
  56. package/dist/src/cli/session-execution.js +817 -0
  57. package/dist/src/cli/session-execution.js.map +1 -0
  58. package/dist/src/cli/session-runtime.d.ts +5 -0
  59. package/dist/src/cli/session-runtime.d.ts.map +1 -0
  60. package/dist/src/cli/session-runtime.js +11 -0
  61. package/dist/src/cli/session-runtime.js.map +1 -0
  62. package/dist/src/cli/setup.d.ts.map +1 -1
  63. package/dist/src/cli/setup.js +2 -0
  64. package/dist/src/cli/setup.js.map +1 -1
  65. package/dist/src/index.d.ts +4 -0
  66. package/dist/src/index.d.ts.map +1 -1
  67. package/dist/src/index.js +148 -7
  68. package/dist/src/index.js.map +1 -1
  69. package/dist/src/ingestion/deterministic.d.ts +3 -0
  70. package/dist/src/ingestion/deterministic.d.ts.map +1 -0
  71. package/dist/src/ingestion/deterministic.js +862 -0
  72. package/dist/src/ingestion/deterministic.js.map +1 -0
  73. package/dist/src/ingestion/index.d.ts +5 -0
  74. package/dist/src/ingestion/index.d.ts.map +1 -0
  75. package/dist/src/ingestion/index.js +27 -0
  76. package/dist/src/ingestion/index.js.map +1 -0
  77. package/dist/src/ingestion/semantic.d.ts +6 -0
  78. package/dist/src/ingestion/semantic.d.ts.map +1 -0
  79. package/dist/src/ingestion/semantic.js +627 -0
  80. package/dist/src/ingestion/semantic.js.map +1 -0
  81. package/dist/src/ingestion/types.d.ts +10 -0
  82. package/dist/src/ingestion/types.d.ts.map +1 -0
  83. package/dist/src/ingestion/types.js +2 -0
  84. package/dist/src/ingestion/types.js.map +1 -0
  85. package/dist/src/lib/context-memory.d.ts +140 -0
  86. package/dist/src/lib/context-memory.d.ts.map +1 -0
  87. package/dist/src/lib/context-memory.js +974 -0
  88. package/dist/src/lib/context-memory.js.map +1 -0
  89. package/dist/src/lib/history-handoff.d.ts +43 -0
  90. package/dist/src/lib/history-handoff.d.ts.map +1 -0
  91. package/dist/src/lib/history-handoff.js +179 -0
  92. package/dist/src/lib/history-handoff.js.map +1 -0
  93. package/dist/src/lib/observability.d.ts +3 -0
  94. package/dist/src/lib/observability.d.ts.map +1 -0
  95. package/dist/src/lib/observability.js +63 -0
  96. package/dist/src/lib/observability.js.map +1 -0
  97. package/dist/src/lib/session-artifacts.d.ts +51 -0
  98. package/dist/src/lib/session-artifacts.d.ts.map +1 -0
  99. package/dist/src/lib/session-artifacts.js +132 -0
  100. package/dist/src/lib/session-artifacts.js.map +1 -0
  101. package/dist/src/lib/session-filters.d.ts +11 -0
  102. package/dist/src/lib/session-filters.d.ts.map +1 -0
  103. package/dist/src/lib/session-filters.js +16 -0
  104. package/dist/src/lib/session-filters.js.map +1 -0
  105. package/dist/src/lib/session-history.d.ts +50 -0
  106. package/dist/src/lib/session-history.d.ts.map +1 -0
  107. package/dist/src/lib/session-history.js +73 -0
  108. package/dist/src/lib/session-history.js.map +1 -0
  109. package/dist/src/lib/session-trends.d.ts +129 -0
  110. package/dist/src/lib/session-trends.d.ts.map +1 -0
  111. package/dist/src/lib/session-trends.js +361 -0
  112. package/dist/src/lib/session-trends.js.map +1 -0
  113. package/dist/src/lib/storage/database.d.ts +212 -1
  114. package/dist/src/lib/storage/database.d.ts.map +1 -1
  115. package/dist/src/lib/storage/database.js +1694 -114
  116. package/dist/src/lib/storage/database.js.map +1 -1
  117. package/dist/src/lib/storage/export-sessions.d.ts +33 -0
  118. package/dist/src/lib/storage/export-sessions.d.ts.map +1 -0
  119. package/dist/src/lib/storage/export-sessions.js +525 -0
  120. package/dist/src/lib/storage/export-sessions.js.map +1 -0
  121. package/dist/src/lib/storage/index.d.ts +7 -6
  122. package/dist/src/lib/storage/index.d.ts.map +1 -1
  123. package/dist/src/lib/storage/index.js +6 -5
  124. package/dist/src/lib/storage/index.js.map +1 -1
  125. package/dist/src/lib/storage/schema.d.ts +6 -1
  126. package/dist/src/lib/storage/schema.d.ts.map +1 -1
  127. package/dist/src/lib/storage/schema.js +337 -2
  128. package/dist/src/lib/storage/schema.js.map +1 -1
  129. package/dist/src/lib/storage/types.d.ts +122 -0
  130. package/dist/src/lib/storage/types.d.ts.map +1 -1
  131. package/dist/src/prompts/skill-prompt.d.ts.map +1 -1
  132. package/dist/src/prompts/skill-prompt.js +13 -0
  133. package/dist/src/prompts/skill-prompt.js.map +1 -1
  134. package/dist/src/tools/confirm-context-link.d.ts +62 -0
  135. package/dist/src/tools/confirm-context-link.d.ts.map +1 -0
  136. package/dist/src/tools/confirm-context-link.js +36 -0
  137. package/dist/src/tools/confirm-context-link.js.map +1 -0
  138. package/dist/src/tools/context-schemas.d.ts +694 -0
  139. package/dist/src/tools/context-schemas.d.ts.map +1 -0
  140. package/dist/src/tools/context-schemas.js +171 -0
  141. package/dist/src/tools/context-schemas.js.map +1 -0
  142. package/dist/src/tools/export-sessions.d.ts +111 -0
  143. package/dist/src/tools/export-sessions.d.ts.map +1 -0
  144. package/dist/src/tools/export-sessions.js +136 -0
  145. package/dist/src/tools/export-sessions.js.map +1 -0
  146. package/dist/src/tools/get-context.d.ts +208 -0
  147. package/dist/src/tools/get-context.d.ts.map +1 -0
  148. package/dist/src/tools/get-context.js +27 -0
  149. package/dist/src/tools/get-context.js.map +1 -0
  150. package/dist/src/tools/get-history-handoff.d.ts +109 -0
  151. package/dist/src/tools/get-history-handoff.d.ts.map +1 -0
  152. package/dist/src/tools/get-history-handoff.js +85 -0
  153. package/dist/src/tools/get-history-handoff.js.map +1 -0
  154. package/dist/src/tools/get-history-trends.d.ts +155 -0
  155. package/dist/src/tools/get-history-trends.d.ts.map +1 -0
  156. package/dist/src/tools/get-history-trends.js +123 -0
  157. package/dist/src/tools/get-history-trends.js.map +1 -0
  158. package/dist/src/tools/get-session-artifacts.d.ts +151 -0
  159. package/dist/src/tools/get-session-artifacts.d.ts.map +1 -0
  160. package/dist/src/tools/get-session-artifacts.js +184 -0
  161. package/dist/src/tools/get-session-artifacts.js.map +1 -0
  162. package/dist/src/tools/get-session-decisions.d.ts +69 -0
  163. package/dist/src/tools/get-session-decisions.d.ts.map +1 -0
  164. package/dist/src/tools/get-session-decisions.js +99 -0
  165. package/dist/src/tools/get-session-decisions.js.map +1 -0
  166. package/dist/src/tools/get-session-messages.d.ts +55 -0
  167. package/dist/src/tools/get-session-messages.d.ts.map +1 -0
  168. package/dist/src/tools/get-session-messages.js +89 -0
  169. package/dist/src/tools/get-session-messages.js.map +1 -0
  170. package/dist/src/tools/get-session-narrative.d.ts +72 -0
  171. package/dist/src/tools/get-session-narrative.d.ts.map +1 -0
  172. package/dist/src/tools/get-session-narrative.js +106 -0
  173. package/dist/src/tools/get-session-narrative.js.map +1 -0
  174. package/dist/src/tools/get-session-timeline.d.ts +55 -0
  175. package/dist/src/tools/get-session-timeline.d.ts.map +1 -0
  176. package/dist/src/tools/get-session-timeline.js +93 -0
  177. package/dist/src/tools/get-session-timeline.js.map +1 -0
  178. package/dist/src/tools/get-session-trends.d.ts +108 -0
  179. package/dist/src/tools/get-session-trends.d.ts.map +1 -0
  180. package/dist/src/tools/get-session-trends.js +130 -0
  181. package/dist/src/tools/get-session-trends.js.map +1 -0
  182. package/dist/src/tools/get-session.d.ts +251 -0
  183. package/dist/src/tools/get-session.d.ts.map +1 -0
  184. package/dist/src/tools/get-session.js +290 -0
  185. package/dist/src/tools/get-session.js.map +1 -0
  186. package/dist/src/tools/index.d.ts +22 -0
  187. package/dist/src/tools/index.d.ts.map +1 -1
  188. package/dist/src/tools/index.js +22 -0
  189. package/dist/src/tools/index.js.map +1 -1
  190. package/dist/src/tools/list-contexts.d.ts +50 -0
  191. package/dist/src/tools/list-contexts.d.ts.map +1 -0
  192. package/dist/src/tools/list-contexts.js +28 -0
  193. package/dist/src/tools/list-contexts.js.map +1 -0
  194. package/dist/src/tools/list-sessions.d.ts +86 -0
  195. package/dist/src/tools/list-sessions.d.ts.map +1 -0
  196. package/dist/src/tools/list-sessions.js +97 -0
  197. package/dist/src/tools/list-sessions.js.map +1 -0
  198. package/dist/src/tools/merge-contexts.d.ts +58 -0
  199. package/dist/src/tools/merge-contexts.d.ts.map +1 -0
  200. package/dist/src/tools/merge-contexts.js +27 -0
  201. package/dist/src/tools/merge-contexts.js.map +1 -0
  202. package/dist/src/tools/move-session-context.d.ts +62 -0
  203. package/dist/src/tools/move-session-context.d.ts.map +1 -0
  204. package/dist/src/tools/move-session-context.js +33 -0
  205. package/dist/src/tools/move-session-context.js.map +1 -0
  206. package/dist/src/tools/reingest-session.d.ts +31 -0
  207. package/dist/src/tools/reingest-session.d.ts.map +1 -0
  208. package/dist/src/tools/reingest-session.js +43 -0
  209. package/dist/src/tools/reingest-session.js.map +1 -0
  210. package/dist/src/tools/reject-context-link.d.ts +58 -0
  211. package/dist/src/tools/reject-context-link.d.ts.map +1 -0
  212. package/dist/src/tools/reject-context-link.js +26 -0
  213. package/dist/src/tools/reject-context-link.js.map +1 -0
  214. package/dist/src/tools/resolve-context.d.ts +287 -0
  215. package/dist/src/tools/resolve-context.d.ts.map +1 -0
  216. package/dist/src/tools/resolve-context.js +35 -0
  217. package/dist/src/tools/resolve-context.js.map +1 -0
  218. package/dist/src/tools/search-history.d.ts +86 -0
  219. package/dist/src/tools/search-history.d.ts.map +1 -0
  220. package/dist/src/tools/search-history.js +103 -0
  221. package/dist/src/tools/search-history.js.map +1 -0
  222. package/dist/src/tools/session-ui-metadata.d.ts +15 -0
  223. package/dist/src/tools/session-ui-metadata.d.ts.map +1 -0
  224. package/dist/src/tools/session-ui-metadata.js +15 -0
  225. package/dist/src/tools/session-ui-metadata.js.map +1 -0
  226. package/dist/src/tools/set-active-context.d.ts +58 -0
  227. package/dist/src/tools/set-active-context.d.ts.map +1 -0
  228. package/dist/src/tools/set-active-context.js +26 -0
  229. package/dist/src/tools/set-active-context.js.map +1 -0
  230. package/dist/src/tools/split-context.d.ts +62 -0
  231. package/dist/src/tools/split-context.d.ts.map +1 -0
  232. package/dist/src/tools/split-context.js +36 -0
  233. package/dist/src/tools/split-context.js.map +1 -0
  234. package/dist/src/tools/verify-footprint.js +1 -1
  235. package/dist/src/tools/verify-footprint.js.map +1 -1
  236. package/dist/src/types.d.ts +2 -0
  237. package/dist/src/types.d.ts.map +1 -1
  238. package/dist/src/ui/register.d.ts +6 -1
  239. package/dist/src/ui/register.d.ts.map +1 -1
  240. package/dist/src/ui/register.js +60 -16
  241. package/dist/src/ui/register.js.map +1 -1
  242. package/dist/ui/dashboard.html +239 -868
  243. package/dist/ui/detail.html +107 -248
  244. package/dist/ui/export.html +115 -298
  245. package/dist/ui/session-dashboard-live.html +264 -0
  246. package/dist/ui/session-dashboard.html +329 -0
  247. package/dist/ui/session-detail-live.html +336 -0
  248. package/dist/ui/session-detail.html +355 -0
  249. package/package.json +34 -9
package/README.md CHANGED
@@ -3,195 +3,364 @@
3
3
  [![npm version](https://img.shields.io/npm/v/@pcircle/footprint)](https://www.npmjs.com/package/@pcircle/footprint)
4
4
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
5
5
 
6
- MCP server that automatically captures and encrypts AI conversations as verifiable records with Git timestamps and end-to-end encryption.
6
+ Read in:
7
+ [English](../../README.md)
8
+ |
9
+ [繁體中文](../../README.zh-TW.md)
10
+ |
11
+ [日本語](../../README.ja.md)
7
12
 
8
- ## Why Footprint?
13
+ Project site:
14
+ [footprint.memesh.ai](https://footprint.memesh.ai/)
9
15
 
10
- - **Prove IP Ownership** Timestamped evidence of AI-assisted work
11
- - **Zero Effort** — Automatic capture via MCP protocol
12
- - **Privacy First** End-to-end encrypted, locally stored
13
- - **Legally Valid** Git timestamps + SHA-256 checksums
16
+ `@pcircle/footprint` is a local-first MCP server for AI-assisted work continuity. It gives you one place to:
17
+
18
+ - keep a usable history of ongoing AI-assisted work, including context memory and handoff-friendly summaries
19
+ - preserve specific conversations as encrypted evidence when they need verification and export
20
+
21
+ It is open source. No seats, no usage pricing, and no hosted-memory lock-in.
22
+
23
+ The session recorder preserves raw transcript and timeline data first, then derives artifacts, narratives, decisions, and user-correctable context threads from that source history.
24
+
25
+ Interactive sessions use `script`-backed PTY transport on BSD/macOS and Linux. BSD/macOS replays native `script -r` transcripts, while Linux replays util-linux advanced timing logs so transcript attribution stays consistent across platforms.
26
+
27
+ ## Start Here
28
+
29
+ If you are new to Footprint, use this order:
30
+
31
+ 1. [Open the project site](https://footprint.memesh.ai/) and look at the product screenshots first.
32
+ 2. Run `npx @pcircle/footprint setup` to try it quickly, or install the CLI with `npm install -g @pcircle/footprint`.
33
+ 3. If you are still using the quick `npx` path, open the local product with `npx @pcircle/footprint demo --open`. If you installed the CLI, use `footprint demo --open`.
34
+ 4. Start recording real work with `footprint run ...`.
14
35
 
15
36
  ## Quick Start
16
37
 
38
+ If you only want to see the product locally first:
39
+
17
40
  ```bash
18
41
  npx @pcircle/footprint setup
42
+ npx @pcircle/footprint demo --open
19
43
  ```
20
44
 
21
- The interactive wizard auto-detects your system, validates your encryption password, and configures Claude Desktop automatically.
45
+ If you want the CLI installed for repeated use:
22
46
 
23
- ### Manual Configuration
47
+ ```bash
48
+ npm install -g @pcircle/footprint
49
+ footprint setup
50
+ ```
24
51
 
25
- Add to Claude Desktop config (`~/Library/Application Support/Claude/claude_desktop_config.json`):
52
+ If you want to start recording live CLI work immediately:
26
53
 
27
- ```json
28
- {
29
- "mcpServers": {
30
- "footprint": {
31
- "command": "npx",
32
- "args": ["@pcircle/footprint"],
33
- "env": {
34
- "FOOTPRINT_DATA_DIR": "/path/to/footprint-data",
35
- "FOOTPRINT_PASSPHRASE": "your-secure-passphrase"
36
- }
37
- }
38
- }
39
- }
54
+ ```bash
55
+ footprint run claude -- <args...>
56
+ footprint run gemini -- <args...>
57
+ footprint run codex -- <args...>
40
58
  ```
41
59
 
42
- For Claude Code, add to `~/.claude/mcp_settings.json` with the same structure.
60
+ If you want Footprint to suggest the right context before a run begins:
43
61
 
44
- ## MCP Tools (9 tools)
62
+ ```bash
63
+ footprint run codex --prepare-context -- <args...>
64
+ ```
45
65
 
46
- ### capture-footprint
66
+ ### Choose Your Next Read
47
67
 
48
- Capture and encrypt an LLM conversation. Use when: user explicitly asks to save, or high-value content (IP, legal, business, research, compliance).
68
+ - Install and first-run setup:
69
+ [Getting Started](../../docs/getting-started.md)
70
+ - Environment and deployment details:
71
+ [Configuration](../../docs/configuration.md)
72
+ - MCP tool walkthrough:
73
+ [MCP Tools Overview](../../docs/mcp-tools.md)
74
+ - Full docs map:
75
+ [Docs Index](../../docs/README.md)
49
76
 
50
- | Parameter | Required | Description |
51
- | ---------------- | -------- | ------------------------------------------------------------------ |
52
- | `conversationId` | Yes | Unique ID, format: `{topic}-{descriptor}-{YYYY-MM-DD}` |
53
- | `content` | Yes | Full conversation text including both human and assistant messages |
54
- | `tags` | No | Comma-separated tags |
55
- | `llmProvider` | No | Provider name (default: `"unknown"`) |
56
- | `messageCount` | No | Number of messages (auto-calculated from content if omitted) |
77
+ ### Install And Configure
57
78
 
58
- ### list-footprints
79
+ ```bash
80
+ npx @pcircle/footprint setup
81
+ ```
59
82
 
60
- List all captured evidence with pagination.
83
+ Persistent install:
61
84
 
62
- | Parameter | Required | Description |
63
- | --------- | -------- | ------------------------------ |
64
- | `limit` | No | Results per page (default: 10) |
65
- | `offset` | No | Pagination offset |
66
- | `tags` | No | Filter by tags |
85
+ ```bash
86
+ npm install -g @pcircle/footprint
87
+ footprint setup
88
+ ```
67
89
 
68
- ### get-footprint
90
+ The setup wizard:
69
91
 
70
- Retrieve and decrypt specific evidence by ID.
92
+ - creates the local data directory
93
+ - validates the passphrase
94
+ - configures Claude Desktop when available
95
+ - optionally appends environment variables to the active shell rc file
71
96
 
72
- | Parameter | Required | Description |
73
- | --------- | -------- | ----------- |
74
- | `id` | Yes | Evidence ID |
97
+ Node.js `>=22` is required.
75
98
 
76
- ### search-footprints
99
+ If you stay on the quick `npx` path, use `npx @pcircle/footprint ...` for later commands too. The bare `footprint` command is only available after a global install.
77
100
 
78
- Search conversations by query, tags, and date range. Query matches conversationId and tags (LIKE). Tags filter uses AND logic.
101
+ ### Open The Local Live Product
79
102
 
80
- | Parameter | Required | Description |
81
- | ---------- | -------- | ------------------------------ |
82
- | `query` | No | Search text |
83
- | `tags` | No | Array of tags (AND logic) |
84
- | `dateFrom` | No | Start date (ISO 8601) |
85
- | `dateTo` | No | End date (ISO 8601) |
86
- | `limit` | No | Results per page (default: 10) |
87
- | `offset` | No | Pagination offset |
103
+ ```bash
104
+ npx @pcircle/footprint demo
105
+ ```
88
106
 
89
- ### export-footprints
107
+ If you installed the CLI globally, use `footprint demo` or `footprint demo --open`.
90
108
 
91
- Export evidence to encrypted ZIP archive.
109
+ This starts a local browser-facing surface for the current Footprint database and prints a localhost URL for:
92
110
 
93
- | Parameter | Required | Description |
94
- | ------------- | -------- | ----------------------------------------------------- |
95
- | `evidenceIds` | No | Specific IDs to export (all if omitted) |
96
- | `outputMode` | No | `"file"`, `"base64"`, or `"both"` (default: `"both"`) |
111
+ - the session dashboard
112
+ - deep-linked session detail pages
113
+ - context review and correction flows
114
+ - export and handoff interactions
97
115
 
98
- ### verify-footprint
116
+ Optional flags:
99
117
 
100
- Verify evidence integrity using stored checksums and Git timestamps.
118
+ ```bash
119
+ footprint demo --host 127.0.0.1 --port 4310
120
+ footprint demo --open
121
+ ```
101
122
 
102
- | Parameter | Required | Description |
103
- | --------- | -------- | ----------- |
104
- | `id` | Yes | Evidence ID |
123
+ Repo-local shortcut:
105
124
 
106
- Returns: `integrityVerified`, `checksumValid`, `gitTimestamp`
125
+ ```bash
126
+ pnpm --dir packages/mcp-server demo:live
127
+ ```
107
128
 
108
- ### delete-footprints
129
+ Recorder inspection commands:
109
130
 
110
- Permanently delete evidence records. Uses two-step confirmation.
131
+ ```bash
132
+ footprint sessions list [--query "<text>"] [--issue-key "<issue-key>"] [--host <claude|gemini|codex>] [--status <running|completed|failed|interrupted>]
133
+ footprint session show <session-id> [--message-limit <n>] [--message-offset <n>] [--trend-limit <n>] [--trend-offset <n>] [--timeline-limit <n>] [--timeline-offset <n>] [--artifact-limit <n>] [--artifact-offset <n>] [--narrative-limit <n>] [--narrative-offset <n>] [--decision-limit <n>] [--decision-offset <n>]
134
+ footprint session ingest <session-id>
135
+ footprint session export <session-id> [--group-by <issue|family>]
136
+ footprint session messages <session-id> [--limit <n>] [--offset <n>]
137
+ footprint session trends <session-id> [--limit <n>] [--offset <n>]
138
+ footprint session timeline <session-id> [--limit <n>] [--offset <n>]
139
+ footprint session artifacts <session-id> [--limit <n>] [--offset <n>]
140
+ footprint session narratives <session-id> [--kind <journal|project-summary|handoff>] [--limit <n>] [--offset <n>]
141
+ footprint session decisions <session-id> [--limit <n>] [--offset <n>]
142
+ footprint history search "<query>" [--host <claude|gemini|codex>] [--status <running|completed|failed|interrupted>]
143
+ footprint history trends [--query "<text>"] [--issue-key "<issue-key>"] [--host <claude|gemini|codex>] [--status <running|completed|failed|interrupted>] [--group-by <issue|family>]
144
+ footprint history handoff [--query "<text>"] [--issue-key "<issue-key>"] [--host <claude|gemini|codex>] [--status <running|completed|failed|interrupted>] [--group-by <issue|family>]
145
+ ```
111
146
 
112
- | Parameter | Required | Description |
113
- | --------------- | -------- | ---------------------------------------------------- |
114
- | `evidenceIds` | Yes | Array of evidence IDs |
115
- | `confirmDelete` | No | Set `true` to confirm (default: `false` for preview) |
147
+ Context memory commands:
116
148
 
117
- ### suggest-capture
149
+ ```bash
150
+ footprint contexts list
151
+ footprint context resolve [--session <session-id>] [--cwd <path>] [--title "<text>"] [--host <claude|gemini|codex>]
152
+ footprint context prepare [--session <session-id>] [--cwd <path>] [--title "<text>"] [--host <claude|gemini|codex>] [--interactive] [--json]
153
+ footprint context show <context-id>
154
+ footprint context confirm <session-id> [<session-id> ...] [--context <context-id>] [--label "<label>"] [--set-preferred]
155
+ footprint context reject <session-id> --context <context-id>
156
+ footprint context move <session-id> [--context <context-id>] [--label "<label>"] [--set-preferred]
157
+ footprint context merge <source-context-id> <target-context-id>
158
+ footprint context split <context-id> --sessions <session-id,session-id,...> [--label "<label>"] [--set-preferred]
159
+ footprint context activate <context-id> [--cwd <path>]
160
+ footprint demo [--host <address>] [--port <number>] [--open]
161
+ ```
118
162
 
119
- AI-powered capture suggestion based on keyword analysis.
163
+ Compatibility aliases:
120
164
 
121
- | Parameter | Required | Description |
122
- | --------- | -------- | ------------------------------- |
123
- | `content` | Yes | Conversation content to analyze |
165
+ ```bash
166
+ footprint list-sessions [--query "<text>"] [--issue-key "<issue-key>"] [--host <claude|gemini|codex>] [--status <running|completed|failed|interrupted>]
167
+ footprint get-session <session-id> [--message-limit <n>] [--message-offset <n>] [--trend-limit <n>] [--trend-offset <n>] [--timeline-limit <n>] [--timeline-offset <n>] [--artifact-limit <n>] [--artifact-offset <n>] [--narrative-limit <n>] [--narrative-offset <n>] [--decision-limit <n>] [--decision-offset <n>]
168
+ footprint export-sessions [<session-id> ...] [--query "<text>"] [--issue-key "<issue-key>"] [--host <claude|gemini|codex>] [--status <running|completed|failed|interrupted>] [--group-by <issue|family>]
169
+ footprint get-session-messages <session-id> [--limit <n>] [--offset <n>]
170
+ footprint get-session-trends <session-id> [--limit <n>] [--offset <n>]
171
+ footprint get-session-timeline <session-id> [--limit <n>] [--offset <n>]
172
+ footprint get-session-artifacts <session-id> [--limit <n>] [--offset <n>]
173
+ footprint get-session-narrative <session-id> [--kind <journal|project-summary|handoff>] [--limit <n>] [--offset <n>]
174
+ footprint get-session-decisions <session-id> [--limit <n>] [--offset <n>]
175
+ footprint search-history "<query>" [--host <claude|gemini|codex>] [--status <running|completed|failed|interrupted>]
176
+ footprint get-history-trends [--query "<text>"] [--issue-key "<issue-key>"] [--host <claude|gemini|codex>] [--status <running|completed|failed|interrupted>] [--group-by <issue|family>]
177
+ footprint get-history-handoff [--query "<text>"] [--issue-key "<issue-key>"] [--host <claude|gemini|codex>] [--status <running|completed|failed|interrupted>] [--group-by <issue|family>]
178
+ footprint list-contexts
179
+ footprint get-context <context-id>
180
+ footprint resolve-context [--session <session-id>] [--cwd <path>] [--title "<text>"] [--host <claude|gemini|codex>]
181
+ footprint prepare-context [--session <session-id>] [--cwd <path>] [--title "<text>"] [--host <claude|gemini|codex>] [--interactive] [--json]
182
+ footprint confirm-context-link <session-id> [<session-id> ...] [--context <context-id>] [--label "<label>"] [--set-preferred]
183
+ footprint reject-context-link <session-id> --context <context-id>
184
+ footprint move-session-context <session-id> [--context <context-id>] [--label "<label>"] [--set-preferred]
185
+ footprint merge-contexts <source-context-id> <target-context-id>
186
+ footprint split-context <context-id> --sessions <session-id,session-id,...> [--label "<label>"] [--set-preferred]
187
+ footprint set-active-context <context-id> [--cwd <path>]
188
+ ```
124
189
 
125
- ### manage-tags
190
+ Add `--json` to the query commands above when you want scriptable output.
126
191
 
127
- Unified tag management with three actions: `stats`, `rename`, `remove`.
192
+ ### Run As An MCP Server
128
193
 
129
- | Parameter | Required | Description |
130
- | --------- | ---------- | ------------------------------------- |
131
- | `action` | Yes | `"stats"` \| `"rename"` \| `"remove"` |
132
- | `tag` | For remove | Tag to remove |
133
- | `oldTag` | For rename | Current tag name |
134
- | `newTag` | For rename | New tag name |
194
+ When invoked without a CLI subcommand, Footprint starts the MCP server on stdio.
135
195
 
136
- ## MCP Prompts (3 prompts)
196
+ ## Product Surfaces
137
197
 
138
- - **`footprint-skill`** Full agent behavior guide (decision tree, triggers, workflows, error recovery)
139
- - **`footprint-quick-ref`** — Condensed quick reference for tool selection and tag conventions
140
- - **`footprint-should-capture`** — Semantic decision framework for evaluating capture worthiness (takes `conversationSummary` argument)
198
+ ### Session History And Context Memory
141
199
 
142
- ## Architecture
200
+ Use the recorder when you care about staying in the right line of work, seeing what happened, and handing it off cleanly:
143
201
 
202
+ - ordered user and assistant transcript
203
+ - wrapper and adapter timeline events
204
+ - command and test activity with richer command intent classification
205
+ - file and git changes
206
+ - conservative context-thread suggestions for new or resumed sessions
207
+ - canonical context briefings with current truth, blockers, open questions, active decisions, and superseded decisions
208
+ - correction operations so users can confirm, reject, move, merge, split, and prefer contexts instead of accepting black-box auto-linking
209
+ - cross-session issue trends built from execution-backed retries and failures, with optional broader failure-family grouping
210
+ - derived narratives and decisions, including retry-aware handoff summaries and clustered issue rollups
211
+ - downloadable ZIP handoff bundles with raw and derived session state
212
+
213
+ Primary MCP tools:
214
+
215
+ - `list-sessions`
216
+ - `list-contexts`
217
+ - `get-context`
218
+ - `resolve-context`
219
+ - `confirm-context-link`
220
+ - `reject-context-link`
221
+ - `move-session-context`
222
+ - `merge-contexts`
223
+ - `split-context`
224
+ - `set-active-context`
225
+ - `get-session`
226
+ - `export-sessions`
227
+ - `get-session-messages`
228
+ - `get-session-trends`
229
+ - `get-session-timeline`
230
+ - `get-session-artifacts`
231
+ - `get-session-narrative`
232
+ - `get-session-decisions`
233
+ - `search-history`
234
+ - `get-history-trends`
235
+ - `get-history-handoff`
236
+ - `reingest-session`
237
+
238
+ Primary UI resources:
239
+
240
+ - `ui://footprint/session-dashboard.html`
241
+ - `ui://footprint/session-detail.html`
242
+
243
+ The session dashboard now combines recent sessions, confirmed canonical contexts, a handoff-oriented scope summary, pinned `search-history` matches, and recurring execution-backed issue trends. It supports interactive query, issue key, host, status, and trend-grouping filters; search, handoff, trend, and context cards can drill directly into session detail or tighten the current dashboard investigation scope. The dashboard now also paginates recent sessions, search matches, and recurring trends with server-backed `limit` / `offset` calls instead of truncating large histories in the client. Those query and search surfaces are now backed by cached SQLite history indexes, so large histories do not require a full JavaScript detail scan just to filter, count, or aggregate matching sessions. The dashboard can also export the current filtered session set directly as a ZIP bundle. The session detail surface now renders recurring trend context for the current session, including the latest related sessions for each recurring issue so investigators can jump across retries without going back to the dashboard, and `footprint session show --json` / `get-session` include the same server-backed trend summary. Trend and handoff surfaces now carry blocker state plus remediation tracking, so repeated failures can be distinguished from recovered or regressed clusters instead of only reporting the latest outcome string. `get-session` now returns paginated transcript, recurring-trend, and timeline slices with page metadata, while `get-session-messages`, `get-session-trends`, `get-session-timeline`, `get-session-artifacts`, `get-session-narrative`, `get-session-decisions`, and the matching CLI commands support `--limit` / `--offset` for large-session inspection. `footprint session show` / `footprint get-session` also expose trend, artifact, narrative, and decision preview pagination through `--trend-*`, `--artifact-*`, `--narrative-*`, and `--decision-*` flags so the condensed CLI view does not need to materialize full derived histories just to render a handoff preview. Deterministic artifact metadata now also carries dependency actions, dependency names, failure signatures, lint rule IDs, test suite/case identifiers, and manifest or lockfile scope so CLI, MCP, UI, and export flows can expose richer execution context without reparsing raw transcript text. Semantic project summaries and handoff narratives now consume that metadata directly, so recurring clusters and dependency changes are described with concrete lint rules, failing test cases, dependency install targets, and manifest/lockfile updates instead of only generic command labels. The human-readable `footprint session show` output is now a condensed handoff/debug report with recurring trend, artifact, decision, and transcript/timeline previews instead of a raw full-session dump. From that detail surface, investigators can now load cross-session issue or family handoff summaries, review the currently linked canonical context, confirm or reject suggested context candidates, move a session into another context, set the preferred workspace context, load more trend/artifact/transcript/timeline/narrative/decision slices on demand, and export either the current session or the selected scope directly as a ZIP archive. The new context-memory layer uses that same session history to suggest likely canonical contexts, but it never auto-links canonical membership without an explicit confirm action. `resolve-context` returns candidates, confidence, reasons, and `confirmationRequired` so an agent host or interactive CLI can ask the user when evidence is ambiguous. `footprint context prepare --interactive` and `footprint run ... --prepare-context` are the shell-side bridge for that contract: they prompt before the session continues, confirm the chosen context, and then record `context.resolved` / `context.updated` timeline events without requiring the MCP server itself to block on user input. Once confirmed, `get-context` returns the latest valid direction for that context plus blockers, open questions, active decisions, superseded decisions, and the recent session trail. `get-history-handoff` / `footprint history handoff` summarize blockers, recoveries, follow-ups, and recent sessions for the current scope while following the same `issue` vs `family` grouping mode as `get-history-trends`; both surfaces now aggregate from materialized trend-attempt rows instead of rebuilding each session’s derived tree on demand. `get-history-trends` and `footprint history trends` now support `groupBy=family` / `--group-by family` when exact issue keys are too fine-grained. Export bundles now include machine-readable JSON snapshots, top-level recurring trend and history-handoff summaries, human-readable `history-handoff.md`, per-session `handoff.md` / `transcript.md` files, the selected `historyGrouping`, and manifest selection metadata when the export was created from filters.
244
+
245
+ ### Encrypted Evidence
246
+
247
+ Use the evidence flow when you need a discrete preserved record of a conversation.
248
+
249
+ Primary MCP tools:
250
+
251
+ - `capture-footprint`
252
+ - `list-footprints`
253
+ - `get-footprint`
254
+ - `search-footprints`
255
+ - `export-footprints`
256
+ - `verify-footprint`
257
+ - `delete-footprints`
258
+ - `manage-tags`
259
+ - `suggest-capture`
260
+
261
+ Primary UI resources:
262
+
263
+ - `ui://footprint/dashboard.html`
264
+ - `ui://footprint/detail.html`
265
+ - `ui://footprint/export.html`
266
+
267
+ ## Manual MCP Configuration
268
+
269
+ Claude Desktop example:
270
+
271
+ ```json
272
+ {
273
+ "mcpServers": {
274
+ "footprint": {
275
+ "command": "npx",
276
+ "args": ["@pcircle/footprint"],
277
+ "env": {
278
+ "FOOTPRINT_DATA_DIR": "/path/to/footprint-data",
279
+ "FOOTPRINT_PASSPHRASE": "your-secure-passphrase"
280
+ }
281
+ }
282
+ }
283
+ }
144
284
  ```
145
- packages/mcp-server/
146
- ├── src/
147
- │ ├── index.ts # Main MCP server
148
- │ ├── prompts/ # MCP prompt handlers
149
- │ │ └── skill-prompt.ts
150
- │ ├── tools/ # MCP tool handlers (9 tools)
151
- │ │ ├── capture-footprint.ts
152
- │ │ ├── list-footprints.ts
153
- │ │ ├── get-footprint.ts
154
- │ │ ├── search-footprints.ts
155
- │ │ ├── export-footprints.ts
156
- │ │ ├── verify-footprint.ts
157
- │ │ ├── delete-footprints.ts
158
- │ │ ├── suggest-capture.ts
159
- │ │ └── manage-tags.ts
160
- │ ├── analyzers/ # Content analysis
161
- │ ├── cli/ # Setup wizard
162
- │ ├── lib/
163
- │ │ ├── crypto/ # XChaCha20-Poly1305 + Argon2id
164
- │ │ └── storage/ # SQLite + Git timestamps
165
- │ └── ui/ # Interactive dashboards
166
- └── tests/
167
- ```
168
285
 
169
- ## Security
286
+ For Claude Code, use the same server definition in `~/.claude/mcp_settings.json`.
287
+
288
+ ## Storage Model
289
+
290
+ Footprint uses one local SQLite database with three logical models:
291
+
292
+ - evidence tables for encrypted conversation capture
293
+ - session-history tables for recorder transcript, events, artifacts, narratives, and decisions
294
+ - context tables for canonical context threads, explicit corrections, and workspace preferences
295
+
296
+ Evidence content is encrypted at rest. Session history is preserved as raw transcript plus raw timeline, derived views can be regenerated through `reingest-session`, and session exports package both raw and derived views into a portable ZIP archive. Context threading is suggestion-first and correction-driven: unresolved sessions stay isolated until the user confirms a canonical link. Cross-session filtering is backed by cached session-history text and exact issue-key rows inside SQLite so search and list surfaces stay incremental as histories grow.
297
+
298
+ ## Architecture
299
+
300
+ Key runtime components:
301
+
302
+ - MCP server registration in `src/index.ts`
303
+ - CLI setup and recorder runtime in `src/cli/`
304
+ - host adapters in `src/adapters/`
305
+ - deterministic and semantic ingestion in `src/ingestion/`
306
+ - SQLite schema and persistence in `src/lib/storage/`
307
+ - MCP app resource registration in `src/ui/register.ts`
308
+
309
+ Further reading:
310
+
311
+ - [Architecture](./ARCHITECTURE.md)
312
+ - [Docs Index](../../docs/README.md)
170
313
 
171
- - **Encryption**: XChaCha20-Poly1305 (256-bit)
172
- - **Key Derivation**: Argon2id (OWASP recommended)
173
- - **Storage**: Local SQLite with encrypted BLOBs
174
- - **No cloud, no tracking, no data collection**
314
+ ## Prompts
175
315
 
176
- > **Store your password securely** loss means permanent data loss.
316
+ Footprint also registers three prompts for MCP clients:
317
+
318
+ - `footprint-skill`
319
+ - `footprint-quick-ref`
320
+ - `footprint-should-capture`
177
321
 
178
322
  ## Development
179
323
 
324
+ Build and test:
325
+
326
+ ```bash
327
+ pnpm --dir packages/mcp-server build
328
+ pnpm --dir packages/mcp-server demo:live
329
+ pnpm --dir packages/mcp-server test:pack-smoke
330
+ pnpm --dir packages/mcp-server test:publish-gate
331
+ pnpm --dir packages/mcp-server test:real-host-smoke
332
+ # macOS only, requires python3 on PATH
333
+ pnpm --dir packages/mcp-server test:macos-smoke
334
+ pnpm --dir packages/mcp-server test:run
335
+ pnpm --dir packages/mcp-server test:linux-smoke
336
+ pnpm --dir packages/mcp-server test:browser
337
+ ```
338
+
339
+ UI-only build:
340
+
180
341
  ```bash
181
- git clone https://github.com/PCIRCLE-AI/footprint.git
182
- cd footprint
183
- pnpm install
184
- pnpm build
185
- pnpm test
342
+ pnpm --dir packages/mcp-server build:ui
186
343
  ```
187
344
 
188
- ## Support
345
+ Repository CI now runs Ubuntu and macOS jobs: Ubuntu covers install, lint, tarball install smoke, the default Vitest suite, the Linux PTY smoke path, browser-mode session UI tests, and the package publish gate; macOS covers recorder-focused PTY tests plus a real BSD `script -r` smoke path.
346
+
347
+ `pnpm --dir packages/mcp-server test:publish-gate` is the package-level release check. It runs audit, build, the package Vitest suite, and the tarball install smoke so `prepublishOnly` blocks releases that are not installable from the packed artifact.
348
+
349
+ Releases now have two supported paths:
350
+
351
+ - local maintainer publish with `npm login` then `pnpm release:npm`
352
+ - GitHub Actions publish through `.github/workflows/npm-publish.yml`
353
+
354
+ Schema upgrades are exercised through legacy `v3` / `v4` / `v6` database fixtures, and older databases now backfill materialized history caches and trend-attempt rows during upgrade instead of waiting for the first query to discover missing rows.
355
+
356
+ `pnpm --dir packages/mcp-server test:real-host-smoke` is an optional manual validation pass. It discovers installed `claude`, `gemini`, and `codex` binaries, skips hosts that are missing, and for hosts that are present it records a real `--version` session and verifies the stored transcript and recorder metadata.
189
357
 
190
- - [GitHub](https://github.com/PCIRCLE-AI/footprint)
191
- - [Issues](https://github.com/PCIRCLE-AI/footprint/issues)
192
- - [npm](https://www.npmjs.com/package/@pcircle/footprint)
193
- - [Website](https://footprint.memesh.ai)
358
+ Set `FOOTPRINT_DEBUG_PERF=1` when you want lightweight timing traces for reingest, history query, and export paths while debugging large session sets.
194
359
 
195
- ## License
360
+ ## Links
196
361
 
197
- MIT License — see [LICENSE](./LICENSE) for details.
362
+ - Repository: <https://github.com/PCIRCLE-AI/footprint-mcp>
363
+ - Package: <https://www.npmjs.com/package/@pcircle/footprint>
364
+ - Project site: <https://footprint.memesh.ai/>
365
+ - Homepage: <https://footprint.memesh.ai>
366
+ - Issues: <https://github.com/PCIRCLE-AI/footprint-mcp/issues>