@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.
- package/README.md +301 -132
- package/SKILL.md +72 -28
- package/bin/footprint.js +16 -0
- package/dist/src/adapters/claude.d.ts +2 -0
- package/dist/src/adapters/claude.d.ts.map +1 -0
- package/dist/src/adapters/claude.js +7 -0
- package/dist/src/adapters/claude.js.map +1 -0
- package/dist/src/adapters/codex.d.ts +2 -0
- package/dist/src/adapters/codex.d.ts.map +1 -0
- package/dist/src/adapters/codex.js +7 -0
- package/dist/src/adapters/codex.js.map +1 -0
- package/dist/src/adapters/gemini.d.ts +2 -0
- package/dist/src/adapters/gemini.d.ts.map +1 -0
- package/dist/src/adapters/gemini.js +7 -0
- package/dist/src/adapters/gemini.js.map +1 -0
- package/dist/src/adapters/index.d.ts +5 -0
- package/dist/src/adapters/index.d.ts.map +1 -0
- package/dist/src/adapters/index.js +12 -0
- package/dist/src/adapters/index.js.map +1 -0
- package/dist/src/adapters/structured-prefix.d.ts +10 -0
- package/dist/src/adapters/structured-prefix.d.ts.map +1 -0
- package/dist/src/adapters/structured-prefix.js +59 -0
- package/dist/src/adapters/structured-prefix.js.map +1 -0
- package/dist/src/adapters/types.d.ts +32 -0
- package/dist/src/adapters/types.d.ts.map +1 -0
- package/dist/src/adapters/types.js +2 -0
- package/dist/src/adapters/types.js.map +1 -0
- package/dist/src/cli/context-flow.d.ts +92 -0
- package/dist/src/cli/context-flow.d.ts.map +1 -0
- package/dist/src/cli/context-flow.js +724 -0
- package/dist/src/cli/context-flow.js.map +1 -0
- package/dist/src/cli/history-display.d.ts +27 -0
- package/dist/src/cli/history-display.d.ts.map +1 -0
- package/dist/src/cli/history-display.js +167 -0
- package/dist/src/cli/history-display.js.map +1 -0
- package/dist/src/cli/index.js +924 -0
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/cli/launch-spec.d.ts +31 -0
- package/dist/src/cli/launch-spec.d.ts.map +1 -0
- package/dist/src/cli/launch-spec.js +182 -0
- package/dist/src/cli/launch-spec.js.map +1 -0
- package/dist/src/cli/live-demo.d.ts +34 -0
- package/dist/src/cli/live-demo.d.ts.map +1 -0
- package/dist/src/cli/live-demo.js +254 -0
- package/dist/src/cli/live-demo.js.map +1 -0
- package/dist/src/cli/pty-transcript.d.ts +34 -0
- package/dist/src/cli/pty-transcript.d.ts.map +1 -0
- package/dist/src/cli/pty-transcript.js +174 -0
- package/dist/src/cli/pty-transcript.js.map +1 -0
- package/dist/src/cli/session-display.d.ts +74 -0
- package/dist/src/cli/session-display.d.ts.map +1 -0
- package/dist/src/cli/session-display.js +922 -0
- package/dist/src/cli/session-display.js.map +1 -0
- package/dist/src/cli/session-execution.d.ts +55 -0
- package/dist/src/cli/session-execution.d.ts.map +1 -0
- package/dist/src/cli/session-execution.js +817 -0
- package/dist/src/cli/session-execution.js.map +1 -0
- package/dist/src/cli/session-runtime.d.ts +5 -0
- package/dist/src/cli/session-runtime.d.ts.map +1 -0
- package/dist/src/cli/session-runtime.js +11 -0
- package/dist/src/cli/session-runtime.js.map +1 -0
- package/dist/src/cli/setup.d.ts.map +1 -1
- package/dist/src/cli/setup.js +2 -0
- package/dist/src/cli/setup.js.map +1 -1
- package/dist/src/index.d.ts +4 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +148 -7
- package/dist/src/index.js.map +1 -1
- package/dist/src/ingestion/deterministic.d.ts +3 -0
- package/dist/src/ingestion/deterministic.d.ts.map +1 -0
- package/dist/src/ingestion/deterministic.js +862 -0
- package/dist/src/ingestion/deterministic.js.map +1 -0
- package/dist/src/ingestion/index.d.ts +5 -0
- package/dist/src/ingestion/index.d.ts.map +1 -0
- package/dist/src/ingestion/index.js +27 -0
- package/dist/src/ingestion/index.js.map +1 -0
- package/dist/src/ingestion/semantic.d.ts +6 -0
- package/dist/src/ingestion/semantic.d.ts.map +1 -0
- package/dist/src/ingestion/semantic.js +627 -0
- package/dist/src/ingestion/semantic.js.map +1 -0
- package/dist/src/ingestion/types.d.ts +10 -0
- package/dist/src/ingestion/types.d.ts.map +1 -0
- package/dist/src/ingestion/types.js +2 -0
- package/dist/src/ingestion/types.js.map +1 -0
- package/dist/src/lib/context-memory.d.ts +140 -0
- package/dist/src/lib/context-memory.d.ts.map +1 -0
- package/dist/src/lib/context-memory.js +974 -0
- package/dist/src/lib/context-memory.js.map +1 -0
- package/dist/src/lib/history-handoff.d.ts +43 -0
- package/dist/src/lib/history-handoff.d.ts.map +1 -0
- package/dist/src/lib/history-handoff.js +179 -0
- package/dist/src/lib/history-handoff.js.map +1 -0
- package/dist/src/lib/observability.d.ts +3 -0
- package/dist/src/lib/observability.d.ts.map +1 -0
- package/dist/src/lib/observability.js +63 -0
- package/dist/src/lib/observability.js.map +1 -0
- package/dist/src/lib/session-artifacts.d.ts +51 -0
- package/dist/src/lib/session-artifacts.d.ts.map +1 -0
- package/dist/src/lib/session-artifacts.js +132 -0
- package/dist/src/lib/session-artifacts.js.map +1 -0
- package/dist/src/lib/session-filters.d.ts +11 -0
- package/dist/src/lib/session-filters.d.ts.map +1 -0
- package/dist/src/lib/session-filters.js +16 -0
- package/dist/src/lib/session-filters.js.map +1 -0
- package/dist/src/lib/session-history.d.ts +50 -0
- package/dist/src/lib/session-history.d.ts.map +1 -0
- package/dist/src/lib/session-history.js +73 -0
- package/dist/src/lib/session-history.js.map +1 -0
- package/dist/src/lib/session-trends.d.ts +129 -0
- package/dist/src/lib/session-trends.d.ts.map +1 -0
- package/dist/src/lib/session-trends.js +361 -0
- package/dist/src/lib/session-trends.js.map +1 -0
- package/dist/src/lib/storage/database.d.ts +212 -1
- package/dist/src/lib/storage/database.d.ts.map +1 -1
- package/dist/src/lib/storage/database.js +1694 -114
- package/dist/src/lib/storage/database.js.map +1 -1
- package/dist/src/lib/storage/export-sessions.d.ts +33 -0
- package/dist/src/lib/storage/export-sessions.d.ts.map +1 -0
- package/dist/src/lib/storage/export-sessions.js +525 -0
- package/dist/src/lib/storage/export-sessions.js.map +1 -0
- package/dist/src/lib/storage/index.d.ts +7 -6
- package/dist/src/lib/storage/index.d.ts.map +1 -1
- package/dist/src/lib/storage/index.js +6 -5
- package/dist/src/lib/storage/index.js.map +1 -1
- package/dist/src/lib/storage/schema.d.ts +6 -1
- package/dist/src/lib/storage/schema.d.ts.map +1 -1
- package/dist/src/lib/storage/schema.js +337 -2
- package/dist/src/lib/storage/schema.js.map +1 -1
- package/dist/src/lib/storage/types.d.ts +122 -0
- package/dist/src/lib/storage/types.d.ts.map +1 -1
- package/dist/src/prompts/skill-prompt.d.ts.map +1 -1
- package/dist/src/prompts/skill-prompt.js +13 -0
- package/dist/src/prompts/skill-prompt.js.map +1 -1
- package/dist/src/tools/confirm-context-link.d.ts +62 -0
- package/dist/src/tools/confirm-context-link.d.ts.map +1 -0
- package/dist/src/tools/confirm-context-link.js +36 -0
- package/dist/src/tools/confirm-context-link.js.map +1 -0
- package/dist/src/tools/context-schemas.d.ts +694 -0
- package/dist/src/tools/context-schemas.d.ts.map +1 -0
- package/dist/src/tools/context-schemas.js +171 -0
- package/dist/src/tools/context-schemas.js.map +1 -0
- package/dist/src/tools/export-sessions.d.ts +111 -0
- package/dist/src/tools/export-sessions.d.ts.map +1 -0
- package/dist/src/tools/export-sessions.js +136 -0
- package/dist/src/tools/export-sessions.js.map +1 -0
- package/dist/src/tools/get-context.d.ts +208 -0
- package/dist/src/tools/get-context.d.ts.map +1 -0
- package/dist/src/tools/get-context.js +27 -0
- package/dist/src/tools/get-context.js.map +1 -0
- package/dist/src/tools/get-history-handoff.d.ts +109 -0
- package/dist/src/tools/get-history-handoff.d.ts.map +1 -0
- package/dist/src/tools/get-history-handoff.js +85 -0
- package/dist/src/tools/get-history-handoff.js.map +1 -0
- package/dist/src/tools/get-history-trends.d.ts +155 -0
- package/dist/src/tools/get-history-trends.d.ts.map +1 -0
- package/dist/src/tools/get-history-trends.js +123 -0
- package/dist/src/tools/get-history-trends.js.map +1 -0
- package/dist/src/tools/get-session-artifacts.d.ts +151 -0
- package/dist/src/tools/get-session-artifacts.d.ts.map +1 -0
- package/dist/src/tools/get-session-artifacts.js +184 -0
- package/dist/src/tools/get-session-artifacts.js.map +1 -0
- package/dist/src/tools/get-session-decisions.d.ts +69 -0
- package/dist/src/tools/get-session-decisions.d.ts.map +1 -0
- package/dist/src/tools/get-session-decisions.js +99 -0
- package/dist/src/tools/get-session-decisions.js.map +1 -0
- package/dist/src/tools/get-session-messages.d.ts +55 -0
- package/dist/src/tools/get-session-messages.d.ts.map +1 -0
- package/dist/src/tools/get-session-messages.js +89 -0
- package/dist/src/tools/get-session-messages.js.map +1 -0
- package/dist/src/tools/get-session-narrative.d.ts +72 -0
- package/dist/src/tools/get-session-narrative.d.ts.map +1 -0
- package/dist/src/tools/get-session-narrative.js +106 -0
- package/dist/src/tools/get-session-narrative.js.map +1 -0
- package/dist/src/tools/get-session-timeline.d.ts +55 -0
- package/dist/src/tools/get-session-timeline.d.ts.map +1 -0
- package/dist/src/tools/get-session-timeline.js +93 -0
- package/dist/src/tools/get-session-timeline.js.map +1 -0
- package/dist/src/tools/get-session-trends.d.ts +108 -0
- package/dist/src/tools/get-session-trends.d.ts.map +1 -0
- package/dist/src/tools/get-session-trends.js +130 -0
- package/dist/src/tools/get-session-trends.js.map +1 -0
- package/dist/src/tools/get-session.d.ts +251 -0
- package/dist/src/tools/get-session.d.ts.map +1 -0
- package/dist/src/tools/get-session.js +290 -0
- package/dist/src/tools/get-session.js.map +1 -0
- package/dist/src/tools/index.d.ts +22 -0
- package/dist/src/tools/index.d.ts.map +1 -1
- package/dist/src/tools/index.js +22 -0
- package/dist/src/tools/index.js.map +1 -1
- package/dist/src/tools/list-contexts.d.ts +50 -0
- package/dist/src/tools/list-contexts.d.ts.map +1 -0
- package/dist/src/tools/list-contexts.js +28 -0
- package/dist/src/tools/list-contexts.js.map +1 -0
- package/dist/src/tools/list-sessions.d.ts +86 -0
- package/dist/src/tools/list-sessions.d.ts.map +1 -0
- package/dist/src/tools/list-sessions.js +97 -0
- package/dist/src/tools/list-sessions.js.map +1 -0
- package/dist/src/tools/merge-contexts.d.ts +58 -0
- package/dist/src/tools/merge-contexts.d.ts.map +1 -0
- package/dist/src/tools/merge-contexts.js +27 -0
- package/dist/src/tools/merge-contexts.js.map +1 -0
- package/dist/src/tools/move-session-context.d.ts +62 -0
- package/dist/src/tools/move-session-context.d.ts.map +1 -0
- package/dist/src/tools/move-session-context.js +33 -0
- package/dist/src/tools/move-session-context.js.map +1 -0
- package/dist/src/tools/reingest-session.d.ts +31 -0
- package/dist/src/tools/reingest-session.d.ts.map +1 -0
- package/dist/src/tools/reingest-session.js +43 -0
- package/dist/src/tools/reingest-session.js.map +1 -0
- package/dist/src/tools/reject-context-link.d.ts +58 -0
- package/dist/src/tools/reject-context-link.d.ts.map +1 -0
- package/dist/src/tools/reject-context-link.js +26 -0
- package/dist/src/tools/reject-context-link.js.map +1 -0
- package/dist/src/tools/resolve-context.d.ts +287 -0
- package/dist/src/tools/resolve-context.d.ts.map +1 -0
- package/dist/src/tools/resolve-context.js +35 -0
- package/dist/src/tools/resolve-context.js.map +1 -0
- package/dist/src/tools/search-history.d.ts +86 -0
- package/dist/src/tools/search-history.d.ts.map +1 -0
- package/dist/src/tools/search-history.js +103 -0
- package/dist/src/tools/search-history.js.map +1 -0
- package/dist/src/tools/session-ui-metadata.d.ts +15 -0
- package/dist/src/tools/session-ui-metadata.d.ts.map +1 -0
- package/dist/src/tools/session-ui-metadata.js +15 -0
- package/dist/src/tools/session-ui-metadata.js.map +1 -0
- package/dist/src/tools/set-active-context.d.ts +58 -0
- package/dist/src/tools/set-active-context.d.ts.map +1 -0
- package/dist/src/tools/set-active-context.js +26 -0
- package/dist/src/tools/set-active-context.js.map +1 -0
- package/dist/src/tools/split-context.d.ts +62 -0
- package/dist/src/tools/split-context.d.ts.map +1 -0
- package/dist/src/tools/split-context.js +36 -0
- package/dist/src/tools/split-context.js.map +1 -0
- package/dist/src/tools/verify-footprint.js +1 -1
- package/dist/src/tools/verify-footprint.js.map +1 -1
- package/dist/src/types.d.ts +2 -0
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/ui/register.d.ts +6 -1
- package/dist/src/ui/register.d.ts.map +1 -1
- package/dist/src/ui/register.js +60 -16
- package/dist/src/ui/register.js.map +1 -1
- package/dist/ui/dashboard.html +239 -868
- package/dist/ui/detail.html +107 -248
- package/dist/ui/export.html +115 -298
- package/dist/ui/session-dashboard-live.html +264 -0
- package/dist/ui/session-dashboard.html +329 -0
- package/dist/ui/session-detail-live.html +336 -0
- package/dist/ui/session-detail.html +355 -0
- package/package.json +34 -9
package/README.md
CHANGED
|
@@ -3,195 +3,364 @@
|
|
|
3
3
|
[](https://www.npmjs.com/package/@pcircle/footprint)
|
|
4
4
|
[](LICENSE)
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
Read in:
|
|
7
|
+
[English](../../README.md)
|
|
8
|
+
|
|
|
9
|
+
[繁體中文](../../README.zh-TW.md)
|
|
10
|
+
|
|
|
11
|
+
[日本語](../../README.ja.md)
|
|
7
12
|
|
|
8
|
-
|
|
13
|
+
Project site:
|
|
14
|
+
[footprint.memesh.ai](https://footprint.memesh.ai/)
|
|
9
15
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
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
|
-
|
|
45
|
+
If you want the CLI installed for repeated use:
|
|
22
46
|
|
|
23
|
-
|
|
47
|
+
```bash
|
|
48
|
+
npm install -g @pcircle/footprint
|
|
49
|
+
footprint setup
|
|
50
|
+
```
|
|
24
51
|
|
|
25
|
-
|
|
52
|
+
If you want to start recording live CLI work immediately:
|
|
26
53
|
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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
|
-
|
|
60
|
+
If you want Footprint to suggest the right context before a run begins:
|
|
43
61
|
|
|
44
|
-
|
|
62
|
+
```bash
|
|
63
|
+
footprint run codex --prepare-context -- <args...>
|
|
64
|
+
```
|
|
45
65
|
|
|
46
|
-
###
|
|
66
|
+
### Choose Your Next Read
|
|
47
67
|
|
|
48
|
-
|
|
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
|
-
|
|
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
|
-
|
|
79
|
+
```bash
|
|
80
|
+
npx @pcircle/footprint setup
|
|
81
|
+
```
|
|
59
82
|
|
|
60
|
-
|
|
83
|
+
Persistent install:
|
|
61
84
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
| `tags` | No | Filter by tags |
|
|
85
|
+
```bash
|
|
86
|
+
npm install -g @pcircle/footprint
|
|
87
|
+
footprint setup
|
|
88
|
+
```
|
|
67
89
|
|
|
68
|
-
|
|
90
|
+
The setup wizard:
|
|
69
91
|
|
|
70
|
-
|
|
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
|
-
|
|
73
|
-
| --------- | -------- | ----------- |
|
|
74
|
-
| `id` | Yes | Evidence ID |
|
|
97
|
+
Node.js `>=22` is required.
|
|
75
98
|
|
|
76
|
-
|
|
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
|
-
|
|
101
|
+
### Open The Local Live Product
|
|
79
102
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
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
|
-
|
|
107
|
+
If you installed the CLI globally, use `footprint demo` or `footprint demo --open`.
|
|
90
108
|
|
|
91
|
-
|
|
109
|
+
This starts a local browser-facing surface for the current Footprint database and prints a localhost URL for:
|
|
92
110
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
111
|
+
- the session dashboard
|
|
112
|
+
- deep-linked session detail pages
|
|
113
|
+
- context review and correction flows
|
|
114
|
+
- export and handoff interactions
|
|
97
115
|
|
|
98
|
-
|
|
116
|
+
Optional flags:
|
|
99
117
|
|
|
100
|
-
|
|
118
|
+
```bash
|
|
119
|
+
footprint demo --host 127.0.0.1 --port 4310
|
|
120
|
+
footprint demo --open
|
|
121
|
+
```
|
|
101
122
|
|
|
102
|
-
|
|
103
|
-
| --------- | -------- | ----------- |
|
|
104
|
-
| `id` | Yes | Evidence ID |
|
|
123
|
+
Repo-local shortcut:
|
|
105
124
|
|
|
106
|
-
|
|
125
|
+
```bash
|
|
126
|
+
pnpm --dir packages/mcp-server demo:live
|
|
127
|
+
```
|
|
107
128
|
|
|
108
|
-
|
|
129
|
+
Recorder inspection commands:
|
|
109
130
|
|
|
110
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
163
|
+
Compatibility aliases:
|
|
120
164
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
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
|
-
|
|
190
|
+
Add `--json` to the query commands above when you want scriptable output.
|
|
126
191
|
|
|
127
|
-
|
|
192
|
+
### Run As An MCP Server
|
|
128
193
|
|
|
129
|
-
|
|
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
|
-
##
|
|
196
|
+
## Product Surfaces
|
|
137
197
|
|
|
138
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
##
|
|
360
|
+
## Links
|
|
196
361
|
|
|
197
|
-
|
|
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>
|