@pcircle/footprint 1.2.2 → 1.5.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 (184) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +125 -161
  3. package/SKILL.md +50 -50
  4. package/dist/src/analyzers/content-analyzer.d.ts.map +1 -1
  5. package/dist/src/analyzers/content-analyzer.js +20 -4
  6. package/dist/src/analyzers/content-analyzer.js.map +1 -1
  7. package/dist/src/cli/constants.d.ts +20 -0
  8. package/dist/src/cli/constants.d.ts.map +1 -0
  9. package/dist/src/cli/constants.js +25 -0
  10. package/dist/src/cli/constants.js.map +1 -0
  11. package/dist/src/cli/index.d.ts +3 -0
  12. package/dist/src/cli/index.d.ts.map +1 -0
  13. package/dist/src/cli/index.js +25 -0
  14. package/dist/src/cli/index.js.map +1 -0
  15. package/dist/src/cli/setup.d.ts +6 -0
  16. package/dist/src/cli/setup.d.ts.map +1 -0
  17. package/dist/src/cli/setup.js +356 -0
  18. package/dist/src/cli/setup.js.map +1 -0
  19. package/dist/src/cli/types.d.ts +38 -0
  20. package/dist/src/cli/types.d.ts.map +1 -0
  21. package/dist/src/cli/types.js +5 -0
  22. package/dist/src/cli/types.js.map +1 -0
  23. package/dist/src/cli/utils/config.d.ts +19 -0
  24. package/dist/src/cli/utils/config.d.ts.map +1 -0
  25. package/dist/src/cli/utils/config.js +86 -0
  26. package/dist/src/cli/utils/config.js.map +1 -0
  27. package/dist/src/cli/utils/detect.d.ts +14 -0
  28. package/dist/src/cli/utils/detect.d.ts.map +1 -0
  29. package/dist/src/cli/utils/detect.js +57 -0
  30. package/dist/src/cli/utils/detect.js.map +1 -0
  31. package/dist/src/cli/utils/env.d.ts +15 -0
  32. package/dist/src/cli/utils/env.d.ts.map +1 -0
  33. package/dist/src/cli/utils/env.js +85 -0
  34. package/dist/src/cli/utils/env.js.map +1 -0
  35. package/dist/src/cli/utils/validation.d.ts +17 -0
  36. package/dist/src/cli/utils/validation.d.ts.map +1 -0
  37. package/dist/src/cli/utils/validation.js +77 -0
  38. package/dist/src/cli/utils/validation.js.map +1 -0
  39. package/dist/src/index.d.ts +1 -1
  40. package/dist/src/index.d.ts.map +1 -1
  41. package/dist/src/index.js +53 -38
  42. package/dist/src/index.js.map +1 -1
  43. package/dist/src/lib/crypto/decrypt.d.ts.map +1 -1
  44. package/dist/src/lib/crypto/decrypt.js +12 -8
  45. package/dist/src/lib/crypto/decrypt.js.map +1 -1
  46. package/dist/src/lib/crypto/encrypt.d.ts.map +1 -1
  47. package/dist/src/lib/crypto/encrypt.js +6 -3
  48. package/dist/src/lib/crypto/encrypt.js.map +1 -1
  49. package/dist/src/lib/crypto/key-derivation.d.ts +1 -1
  50. package/dist/src/lib/crypto/key-derivation.d.ts.map +1 -1
  51. package/dist/src/lib/crypto/key-derivation.js +11 -11
  52. package/dist/src/lib/crypto/key-derivation.js.map +1 -1
  53. package/dist/src/lib/storage/database.d.ts +46 -3
  54. package/dist/src/lib/storage/database.d.ts.map +1 -1
  55. package/dist/src/lib/storage/database.js +175 -80
  56. package/dist/src/lib/storage/database.js.map +1 -1
  57. package/dist/src/lib/storage/export.d.ts +3 -4
  58. package/dist/src/lib/storage/export.d.ts.map +1 -1
  59. package/dist/src/lib/storage/export.js +75 -62
  60. package/dist/src/lib/storage/export.js.map +1 -1
  61. package/dist/src/lib/storage/salt-storage.d.ts +1 -1
  62. package/dist/src/lib/storage/salt-storage.d.ts.map +1 -1
  63. package/dist/src/lib/storage/salt-storage.js +26 -18
  64. package/dist/src/lib/storage/salt-storage.js.map +1 -1
  65. package/dist/src/lib/storage/schema.d.ts +1 -1
  66. package/dist/src/lib/storage/schema.d.ts.map +1 -1
  67. package/dist/src/lib/storage/schema.js +29 -47
  68. package/dist/src/lib/storage/schema.js.map +1 -1
  69. package/dist/src/lib/tool-wrapper.d.ts.map +1 -1
  70. package/dist/src/lib/tool-wrapper.js +2 -2
  71. package/dist/src/lib/tool-wrapper.js.map +1 -1
  72. package/dist/src/prompts/skill-prompt.d.ts +6 -0
  73. package/dist/src/prompts/skill-prompt.d.ts.map +1 -0
  74. package/dist/src/prompts/skill-prompt.js +125 -0
  75. package/dist/src/prompts/skill-prompt.js.map +1 -0
  76. package/dist/src/tools/capture-footprint.d.ts +2 -2
  77. package/dist/src/tools/capture-footprint.d.ts.map +1 -1
  78. package/dist/src/tools/capture-footprint.js +53 -12
  79. package/dist/src/tools/capture-footprint.js.map +1 -1
  80. package/dist/src/tools/delete-footprints.d.ts +19 -2
  81. package/dist/src/tools/delete-footprints.d.ts.map +1 -1
  82. package/dist/src/tools/delete-footprints.js +56 -8
  83. package/dist/src/tools/delete-footprints.js.map +1 -1
  84. package/dist/src/tools/export-footprints.d.ts +14 -6
  85. package/dist/src/tools/export-footprints.d.ts.map +1 -1
  86. package/dist/src/tools/export-footprints.js +54 -15
  87. package/dist/src/tools/export-footprints.js.map +1 -1
  88. package/dist/src/tools/get-footprint.d.ts +1 -7
  89. package/dist/src/tools/get-footprint.d.ts.map +1 -1
  90. package/dist/src/tools/get-footprint.js +26 -22
  91. package/dist/src/tools/get-footprint.js.map +1 -1
  92. package/dist/src/tools/index.d.ts +1 -3
  93. package/dist/src/tools/index.d.ts.map +1 -1
  94. package/dist/src/tools/index.js +1 -3
  95. package/dist/src/tools/index.js.map +1 -1
  96. package/dist/src/tools/list-footprints.d.ts +3 -17
  97. package/dist/src/tools/list-footprints.d.ts.map +1 -1
  98. package/dist/src/tools/list-footprints.js +27 -16
  99. package/dist/src/tools/list-footprints.js.map +1 -1
  100. package/dist/src/tools/manage-tags.d.ts +47 -0
  101. package/dist/src/tools/manage-tags.d.ts.map +1 -0
  102. package/dist/src/tools/manage-tags.js +109 -0
  103. package/dist/src/tools/manage-tags.js.map +1 -0
  104. package/dist/src/tools/search-footprints.d.ts +4 -18
  105. package/dist/src/tools/search-footprints.d.ts.map +1 -1
  106. package/dist/src/tools/search-footprints.js +32 -16
  107. package/dist/src/tools/search-footprints.js.map +1 -1
  108. package/dist/src/tools/suggest-capture.d.ts +1 -1
  109. package/dist/src/tools/suggest-capture.d.ts.map +1 -1
  110. package/dist/src/tools/suggest-capture.js +6 -2
  111. package/dist/src/tools/suggest-capture.js.map +1 -1
  112. package/dist/src/tools/verify-footprint.d.ts +7 -54
  113. package/dist/src/tools/verify-footprint.d.ts.map +1 -1
  114. package/dist/src/tools/verify-footprint.js +22 -19
  115. package/dist/src/tools/verify-footprint.js.map +1 -1
  116. package/dist/src/types.d.ts +4 -4
  117. package/dist/src/types.d.ts.map +1 -1
  118. package/dist/src/ui/register.js +3 -3
  119. package/dist/src/ui/register.js.map +1 -1
  120. package/dist/ui/dashboard.html +78 -65
  121. package/dist/ui/detail.html +69 -56
  122. package/dist/ui/export.html +72 -59
  123. package/package.json +28 -16
  124. package/dist/src/lib/errors/base-error.d.ts +0 -15
  125. package/dist/src/lib/errors/base-error.d.ts.map +0 -1
  126. package/dist/src/lib/errors/base-error.js +0 -34
  127. package/dist/src/lib/errors/base-error.js.map +0 -1
  128. package/dist/src/lib/errors/crypto-error.d.ts +0 -29
  129. package/dist/src/lib/errors/crypto-error.d.ts.map +0 -1
  130. package/dist/src/lib/errors/crypto-error.js +0 -43
  131. package/dist/src/lib/errors/crypto-error.js.map +0 -1
  132. package/dist/src/lib/errors/index.d.ts +0 -26
  133. package/dist/src/lib/errors/index.d.ts.map +0 -1
  134. package/dist/src/lib/errors/index.js +0 -26
  135. package/dist/src/lib/errors/index.js.map +0 -1
  136. package/dist/src/lib/errors/storage-error.d.ts +0 -25
  137. package/dist/src/lib/errors/storage-error.d.ts.map +0 -1
  138. package/dist/src/lib/errors/storage-error.js +0 -38
  139. package/dist/src/lib/errors/storage-error.js.map +0 -1
  140. package/dist/src/lib/errors/validation-error.d.ts +0 -21
  141. package/dist/src/lib/errors/validation-error.d.ts.map +0 -1
  142. package/dist/src/lib/errors/validation-error.js +0 -29
  143. package/dist/src/lib/errors/validation-error.js.map +0 -1
  144. package/dist/src/test-helpers.d.ts +0 -33
  145. package/dist/src/test-helpers.d.ts.map +0 -1
  146. package/dist/src/test-helpers.js +0 -108
  147. package/dist/src/test-helpers.js.map +0 -1
  148. package/dist/src/tools/get-tag-stats.d.ts +0 -30
  149. package/dist/src/tools/get-tag-stats.d.ts.map +0 -1
  150. package/dist/src/tools/get-tag-stats.js +0 -33
  151. package/dist/src/tools/get-tag-stats.js.map +0 -1
  152. package/dist/src/tools/remove-tag.d.ts +0 -22
  153. package/dist/src/tools/remove-tag.d.ts.map +0 -1
  154. package/dist/src/tools/remove-tag.js +0 -30
  155. package/dist/src/tools/remove-tag.js.map +0 -1
  156. package/dist/src/tools/rename-tag.d.ts +0 -24
  157. package/dist/src/tools/rename-tag.d.ts.map +0 -1
  158. package/dist/src/tools/rename-tag.js +0 -34
  159. package/dist/src/tools/rename-tag.js.map +0 -1
  160. package/dist/tests/error-handling.test.d.ts +0 -2
  161. package/dist/tests/error-handling.test.d.ts.map +0 -1
  162. package/dist/tests/error-handling.test.js +0 -114
  163. package/dist/tests/error-handling.test.js.map +0 -1
  164. package/dist/tests/fixtures.d.ts +0 -87
  165. package/dist/tests/fixtures.d.ts.map +0 -1
  166. package/dist/tests/fixtures.js +0 -130
  167. package/dist/tests/fixtures.js.map +0 -1
  168. package/dist/tests/integration.test.d.ts +0 -2
  169. package/dist/tests/integration.test.d.ts.map +0 -1
  170. package/dist/tests/integration.test.js +0 -115
  171. package/dist/tests/integration.test.js.map +0 -1
  172. package/dist/tests/resources.test.d.ts +0 -2
  173. package/dist/tests/resources.test.d.ts.map +0 -1
  174. package/dist/tests/resources.test.js +0 -73
  175. package/dist/tests/resources.test.js.map +0 -1
  176. package/dist/tests/setup.d.ts +0 -8
  177. package/dist/tests/setup.d.ts.map +0 -1
  178. package/dist/tests/setup.js +0 -8
  179. package/dist/tests/setup.js.map +0 -1
  180. package/dist/tests/tools.test.d.ts +0 -2
  181. package/dist/tests/tools.test.d.ts.map +0 -1
  182. package/dist/tests/tools.test.js +0 -224
  183. package/dist/tests/tools.test.js.map +0 -1
  184. package/dist/ui-tmp/ui/export.html +0 -409
package/LICENSE CHANGED
@@ -18,4 +18,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
18
  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
19
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
20
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
21
+ SOFTWARE.
package/README.md CHANGED
@@ -3,231 +3,195 @@
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
- Model Context Protocol (MCP) server that automatically captures and encrypts LLM conversations as timestamped footprints.
6
+ MCP server that automatically captures and encrypts AI conversations as verifiable records with Git timestamps and end-to-end encryption.
7
7
 
8
8
  ## Why Footprint?
9
9
 
10
- - **Prove IP Ownership** - Timestamped footprints of LLM-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
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
14
14
 
15
- ## Installation
15
+ ## Quick Start
16
16
 
17
17
  ```bash
18
- npm install -g @pcircle/footprint
18
+ npx @pcircle/footprint setup
19
19
  ```
20
20
 
21
- ## Quick Start
22
-
23
- 1. **Set environment variables:**
21
+ The interactive wizard auto-detects your system, validates your encryption password, and configures Claude Desktop automatically.
24
22
 
25
- ```bash
26
- export FOOTPRINT_DB_PATH="./footprints.db"
27
- export FOOTPRINT_PASSWORD="your-secure-password"
28
- ```
23
+ ### Manual Configuration
29
24
 
30
- 2. **Configure Claude Desktop** (`~/Library/Application Support/Claude/claude_desktop_config.json`):
25
+ Add to Claude Desktop config (`~/Library/Application Support/Claude/claude_desktop_config.json`):
31
26
 
32
27
  ```json
33
28
  {
34
29
  "mcpServers": {
35
30
  "footprint": {
36
31
  "command": "npx",
37
- "args": ["footprint"],
32
+ "args": ["@pcircle/footprint"],
38
33
  "env": {
39
- "FOOTPRINT_DB_PATH": "/path/to/footprints.db",
40
- "FOOTPRINT_PASSWORD": "your-password"
34
+ "FOOTPRINT_DATA_DIR": "/path/to/footprint-data",
35
+ "FOOTPRINT_PASSPHRASE": "your-secure-passphrase"
41
36
  }
42
37
  }
43
38
  }
44
39
  }
45
40
  ```
46
41
 
47
- 3. **Restart Claude Desktop** - Footprint collection starts automatically
48
-
49
- ## Features
50
-
51
- - 🔐 XChaCha20-Poly1305 encryption
52
- - 🕒 Git commit timestamps
53
- - 📦 Tamper-proof ZIP exports
54
- - 🔍 Search and retrieve footprints
55
- - 🤖 AI-powered capture suggestions
56
- - ✅ Integrity verification
57
- - 🏷️ Tag management
58
- - 📊 Interactive UI dashboard
59
-
60
- ## Architecture
61
-
62
- The Footprint MCP server follows a modular, layered architecture:
63
-
64
- ```
65
- src/
66
- ├── index.ts # Main MCP server
67
- ├── tools/ # MCP tool handlers (11 tools)
68
- │ ├── capture-footprint.ts
69
- │ ├── list-footprints.ts
70
- │ ├── get-footprint.ts
71
- │ ├── export-footprints.ts
72
- │ ├── search-footprints.ts
73
- │ ├── verify-footprint.ts
74
- │ ├── suggest-capture.ts
75
- │ ├── delete-footprints.ts
76
- │ ├── rename-tag.ts
77
- │ ├── remove-tag.ts
78
- │ └── get-tag-stats.ts
79
- ├── analyzers/ # Content analysis modules
80
- │ └── content-analyzer.ts
81
- ├── lib/
82
- │ ├── crypto/ # Encryption & key derivation
83
- │ ├── storage/ # Database & export
84
- │ ├── tool-wrapper.ts # Error handling wrapper
85
- │ └── tool-response.ts # Response formatters
86
- └── ui/ # Interactive dashboards
87
- ```
88
-
89
- ### Design Principles
90
-
91
- - **Modular**: Each tool is self-contained with schema, metadata, and handler
92
- - **Type-Safe**: Full TypeScript with Zod schema validation
93
- - **Testable**: Dependency injection enables isolated testing
94
- - **Secure**: Encrypted storage with integrity verification
95
- - **Maintainable**: Clear separation of concerns across layers
96
-
97
- ## MCP Tools
98
-
99
- ### Core Tools
100
-
101
- #### capture-footprint
102
-
103
- Captures and encrypts an LLM conversation as a footprint.
104
-
105
- **Parameters:**
106
-
107
- - `conversationId` - Unique identifier for the conversation
108
- - `llmProvider` - LLM provider name (e.g., "Claude Sonnet 4.5")
109
- - `content` - Full conversation content
110
- - `messageCount` - Number of messages in conversation
111
- - `tags` (optional) - Comma-separated tags
112
-
113
- #### list-footprints
42
+ For Claude Code, add to `~/.claude/mcp_settings.json` with the same structure.
114
43
 
115
- Lists all captured footprints with pagination support.
44
+ ## MCP Tools (9 tools)
116
45
 
117
- **Parameters:**
46
+ ### capture-footprint
118
47
 
119
- - `limit` (optional) - Maximum results per page
120
- - `offset` (optional) - Pagination offset
48
+ Capture and encrypt an LLM conversation. Use when: user explicitly asks to save, or high-value content (IP, legal, business, research, compliance).
121
49
 
122
- #### get-footprint
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) |
123
57
 
124
- Retrieves and decrypts a specific footprint by ID.
58
+ ### list-footprints
125
59
 
126
- **Parameters:**
60
+ List all captured evidence with pagination.
127
61
 
128
- - `id` - Footprint ID
62
+ | Parameter | Required | Description |
63
+ | --------- | -------- | ------------------------------ |
64
+ | `limit` | No | Results per page (default: 10) |
65
+ | `offset` | No | Pagination offset |
66
+ | `tags` | No | Filter by tags |
129
67
 
130
- #### export-footprints
68
+ ### get-footprint
131
69
 
132
- Exports footprints to tamper-proof encrypted ZIP archive.
70
+ Retrieve and decrypt specific evidence by ID.
133
71
 
134
- **Parameters:**
72
+ | Parameter | Required | Description |
73
+ | --------- | -------- | ----------- |
74
+ | `id` | Yes | Evidence ID |
135
75
 
136
- - `ids` - Array of footprint IDs to export
137
- - `includeGitInfo` (optional) - Include git metadata
76
+ ### search-footprints
138
77
 
139
- ### Search & Discovery
78
+ Search conversations by query, tags, and date range. Query matches conversationId and tags (LIKE). Tags filter uses AND logic.
140
79
 
141
- #### search-footprints
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 |
142
88
 
143
- Search and filter footprints by query, tags, or date range.
89
+ ### export-footprints
144
90
 
145
- **Parameters:**
91
+ Export evidence to encrypted ZIP archive.
146
92
 
147
- - `query` (optional) - Search text (matches conversationId, tags)
148
- - `tags` (optional) - Array of tags to filter by
149
- - `dateFrom` (optional) - Start date (ISO format)
150
- - `dateTo` (optional) - End date (ISO format)
151
- - `limit` (optional) - Maximum results
152
- - `offset` (optional) - Pagination offset
93
+ | Parameter | Required | Description |
94
+ | ------------- | -------- | ----------------------------------------------------- |
95
+ | `evidenceIds` | No | Specific IDs to export (all if omitted) |
96
+ | `outputMode` | No | `"file"`, `"base64"`, or `"both"` (default: `"both"`) |
153
97
 
154
- #### suggest-capture
98
+ ### verify-footprint
155
99
 
156
- Analyze conversation content and suggest whether to capture it as a footprint.
100
+ Verify evidence integrity using stored checksums and Git timestamps.
157
101
 
158
- **Parameters:**
102
+ | Parameter | Required | Description |
103
+ | --------- | -------- | ----------- |
104
+ | `id` | Yes | Evidence ID |
159
105
 
160
- - `summary` - Conversation summary or key content to analyze
106
+ Returns: `integrityVerified`, `checksumValid`, `gitTimestamp`
161
107
 
162
- **Returns:**
108
+ ### delete-footprints
163
109
 
164
- - `shouldCapture` - Whether to capture (based on keyword analysis)
165
- - `reason` - Human-readable explanation
166
- - `suggestedTags` - Recommended tags
167
- - `suggestedConversationId` - Recommended ID
168
- - `confidence` - Confidence score (0-1)
110
+ Permanently delete evidence records. Uses two-step confirmation.
169
111
 
170
- ### Verification
112
+ | Parameter | Required | Description |
113
+ | --------------- | -------- | ---------------------------------------------------- |
114
+ | `evidenceIds` | Yes | Array of evidence IDs |
115
+ | `confirmDelete` | No | Set `true` to confirm (default: `false` for preview) |
171
116
 
172
- #### verify-footprint
117
+ ### suggest-capture
173
118
 
174
- Verify the integrity and authenticity of a captured footprint.
119
+ AI-powered capture suggestion based on keyword analysis.
175
120
 
176
- **Parameters:**
121
+ | Parameter | Required | Description |
122
+ | --------- | -------- | ------------------------------- |
123
+ | `content` | Yes | Conversation content to analyze |
177
124
 
178
- - `id` - Footprint ID to verify
125
+ ### manage-tags
179
126
 
180
- **Returns:**
127
+ Unified tag management with three actions: `stats`, `rename`, `remove`.
181
128
 
182
- - `verified` - Overall verification status
183
- - `checks` - Detailed checks (content integrity, git timestamp, encryption)
184
- - `legalReadiness` - Whether footprint meets legal standards
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 |
185
135
 
186
- ### Management
136
+ ## MCP Prompts (3 prompts)
187
137
 
188
- #### delete-footprints
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)
189
141
 
190
- Delete footprint records permanently.
191
-
192
- **Parameters:**
193
-
194
- - `ids` - Array of footprint IDs to delete
195
-
196
- #### rename-tag
197
-
198
- Rename a tag across all footprints.
199
-
200
- **Parameters:**
201
-
202
- - `oldTag` - Current tag name
203
- - `newTag` - New tag name
204
-
205
- #### remove-tag
206
-
207
- Remove a tag from all footprints.
208
-
209
- **Parameters:**
210
-
211
- - `tag` - Tag name to remove
212
-
213
- #### get-tag-stats
214
-
215
- Get statistics about tag usage.
216
-
217
- **Returns:**
142
+ ## Architecture
218
143
 
219
- - Tag names and their usage counts
144
+ ```
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
+ ```
220
168
 
221
169
  ## Security
222
170
 
223
171
  - **Encryption**: XChaCha20-Poly1305 (256-bit)
224
172
  - **Key Derivation**: Argon2id (OWASP recommended)
225
173
  - **Storage**: Local SQLite with encrypted BLOBs
174
+ - **No cloud, no tracking, no data collection**
175
+
176
+ > **Store your password securely** — loss means permanent data loss.
226
177
 
227
- ⚠️ **Store your password securely** - Loss means permanent data loss.
178
+ ## Development
179
+
180
+ ```bash
181
+ git clone https://github.com/PCIRCLE-AI/footprint.git
182
+ cd footprint
183
+ pnpm install
184
+ pnpm build
185
+ pnpm test
186
+ ```
228
187
 
229
188
  ## Support
230
189
 
231
- - [Documentation](https://github.com/PCIRCLE-AI/footprint#readme)
190
+ - [GitHub](https://github.com/PCIRCLE-AI/footprint)
232
191
  - [Issues](https://github.com/PCIRCLE-AI/footprint/issues)
233
- - [License](https://github.com/PCIRCLE-AI/footprint/blob/main/LICENSE)
192
+ - [npm](https://www.npmjs.com/package/@pcircle/footprint)
193
+ - [Website](https://footprint.memesh.ai)
194
+
195
+ ## License
196
+
197
+ MIT License — see [LICENSE](./LICENSE) for details.
package/SKILL.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  > MCP server for capturing and encrypting AI conversations as verifiable records with Git timestamps.
4
4
 
5
- **Package:** `@pcircle/footprint` (v1.2.1)
5
+ **Package:** `@pcircle/footprint` (v1.1.1)
6
6
  **Protocol:** Model Context Protocol (MCP)
7
7
  **License:** MIT
8
8
 
@@ -26,7 +26,7 @@ Should I capture this conversation?
26
26
  │ ├─ Basic troubleshooting
27
27
  │ └─ Draft/brainstorming sessions (unless finalized)
28
28
  └─ Uncertain content → ASK user
29
- └─ "Would you like me to save this conversation as a footprint?"
29
+ └─ "Would you like me to save this conversation as evidence?"
30
30
  ```
31
31
 
32
32
  ## Specific Trigger Patterns
@@ -53,7 +53,7 @@ Should I capture this conversation?
53
53
  ## Available Tools
54
54
 
55
55
  ### 1. `capture-footprint`
56
- Save a conversation as encrypted footprint.
56
+ Save a conversation as encrypted evidence.
57
57
 
58
58
  **Input Parameters:**
59
59
  ```json
@@ -68,22 +68,22 @@ Save a conversation as encrypted footprint.
68
68
 
69
69
  **Expected Output (text):**
70
70
  ```
71
- Footprint captured successfully
72
- - Footprint ID: `550e8400-e29b-41d4-a716-446655440000`
71
+ Evidence captured successfully
72
+ - Evidence ID: `550e8400-e29b-41d4-a716-446655440000`
73
73
  - Conversation ID: `api-auth-decision-2026-01-28`
74
74
  - Messages: 15
75
75
  - Tags: api,oauth,security,decision,approved
76
76
  - Git hash: `a1b2c3d4e5f6789...`
77
77
  - Created: 2026-01-28T14:30:45Z
78
78
 
79
- Keep this Footprint ID safe for future reference.
79
+ Keep this Evidence ID safe for future reference.
80
80
  ```
81
81
 
82
82
  **Expected Output (structuredContent):**
83
83
  ```json
84
84
  {
85
- "type": "footprint_created",
86
- "footprintId": "550e8400-e29b-41d4-a716-446655440000",
85
+ "type": "evidence_created",
86
+ "evidenceId": "550e8400-e29b-41d4-a716-446655440000",
87
87
  "conversationId": "api-auth-decision-2026-01-28",
88
88
  "messageCount": 15,
89
89
  "tags": ["api", "oauth", "security", "decision", "approved"],
@@ -94,7 +94,7 @@ Keep this Footprint ID safe for future reference.
94
94
  ```
95
95
 
96
96
  ### 2. `list-footprints`
97
- List all captured footprints (metadata only).
97
+ List all captured evidence (metadata only).
98
98
 
99
99
  **Input Parameters:**
100
100
  ```json
@@ -106,7 +106,7 @@ List all captured footprints (metadata only).
106
106
 
107
107
  **Expected Output (text):**
108
108
  ```
109
- 📋 Footprint Archive (10 most recent)
109
+ 📋 Evidence Archive (10 most recent)
110
110
  1. api-auth-decision-2026-01-28 | 15 msgs | api,oauth,security
111
111
  2. patent-algorithm-2026-01-27 | 32 msgs | ip,patent,algorithm
112
112
  3. contract-review-2026-01-26 | 8 msgs | legal,contract
@@ -116,9 +116,9 @@ List all captured footprints (metadata only).
116
116
  **Expected Output (structuredContent):**
117
117
  ```json
118
118
  {
119
- "type": "footprint_list",
119
+ "type": "evidence_list",
120
120
  "total": 25,
121
- "footprints": [
121
+ "evidences": [
122
122
  {
123
123
  "id": "550e8400-e29b-41d4-a716-446655440000",
124
124
  "conversationId": "api-auth-decision-2026-01-28",
@@ -131,7 +131,7 @@ List all captured footprints (metadata only).
131
131
  ```
132
132
 
133
133
  ### 3. `get-footprint`
134
- Retrieve and decrypt a specific footprint.
134
+ Retrieve and decrypt specific evidence.
135
135
 
136
136
  **Input Parameters:**
137
137
  ```json
@@ -142,7 +142,7 @@ Retrieve and decrypt a specific footprint.
142
142
 
143
143
  **Expected Output (text):**
144
144
  ```
145
- 📄 Footprint Retrieved
145
+ 📄 Evidence Retrieved
146
146
  - ID: 550e8400-e29b-41d4-a716-446655440000
147
147
  - Created: 2026-01-28T14:30:45Z
148
148
  - Provider: Claude Sonnet 4.5
@@ -154,7 +154,7 @@ Assistant: I recommend using PKCE flow...
154
154
  ```
155
155
 
156
156
  ### 4. `search-footprints`
157
- Find footprints by content or tags.
157
+ Find evidence by content or tags.
158
158
 
159
159
  **Input Parameters:**
160
160
  ```json
@@ -166,7 +166,7 @@ Find footprints by content or tags.
166
166
  ```
167
167
 
168
168
  ### 5. `export-footprints`
169
- Export footprints as encrypted archive.
169
+ Export evidence as encrypted archive.
170
170
 
171
171
  **Input Parameters:**
172
172
  ```json
@@ -179,8 +179,8 @@ Export footprints as encrypted archive.
179
179
  **Expected Output (structuredContent):**
180
180
  ```json
181
181
  {
182
- "type": "footprint_export",
183
- "filename": "footprint-550e8400-export.zip",
182
+ "type": "evidence_export",
183
+ "filename": "evidence-550e8400-export.zip",
184
184
  "base64Data": "UEsDBBQAAAAIAL...",
185
185
  "size": 2048,
186
186
  "checksum": "sha256:a1b2c3d4..."
@@ -188,7 +188,7 @@ Export footprints as encrypted archive.
188
188
  ```
189
189
 
190
190
  ### 6. `verify-footprint`
191
- Verify footprint integrity (checksum + Git timestamp).
191
+ Verify evidence integrity (checksum + Git timestamp).
192
192
 
193
193
  **Input Parameters:**
194
194
  ```json
@@ -199,7 +199,7 @@ Verify footprint integrity (checksum + Git timestamp).
199
199
 
200
200
  **Expected Output (text):**
201
201
  ```
202
- 🔐 Footprint Verification Report
202
+ 🔐 Evidence Verification Report
203
203
  - ID: 550e8400-e29b-41d4-a716-446655440000
204
204
  - Content Hash: ✅ Valid (SHA-256 matches)
205
205
  - Git Timestamp: ✅ Verified (2026-01-28T14:30:45Z)
@@ -252,29 +252,29 @@ Verify footprint integrity (checksum + Git timestamp).
252
252
 
253
253
  ### When to Use Each Tool
254
254
  - **capture-footprint**: Primary tool for saving conversations
255
- - **list-footprints**: Browse/overview existing footprints
256
- - **search-footprints**: Find specific content across footprints
257
- - **get-footprint**: Retrieve full content of a specific footprint
255
+ - **list-footprints**: Browse/overview existing evidence
256
+ - **search-footprints**: Find specific content across evidence
257
+ - **get-footprint**: Retrieve full content of specific evidence
258
258
  - **export-footprints**: Legal/audit export needs
259
- - **verify-footprint**: Verify footprint integrity and checksums
259
+ - **verify-footprint**: Verify evidence integrity and checksums
260
260
 
261
261
  ## Token-Efficient Agent Responses
262
262
 
263
- **After capturing a footprint (keep it brief):**
263
+ **After capturing evidence (keep it brief):**
264
264
  ```
265
- Footprint saved as `{conversationId}`
265
+ Evidence saved as `{conversationId}`
266
266
  ID: `{first-8-chars-of-id}`...
267
267
  Tags: {tags}
268
268
  ```
269
269
 
270
270
  **When suggesting capture:**
271
271
  ```
272
- 💡 This looks like valuable content (contains {trigger}). Save it as a footprint?
272
+ 💡 This looks like valuable evidence (contains {trigger}). Save it?
273
273
  ```
274
274
 
275
275
  **When declining to capture:**
276
276
  ```
277
- ℹ️ Skipping footprint capture (casual conversation)
277
+ ℹ️ Skipping evidence capture (casual conversation)
278
278
  ```
279
279
 
280
280
  **For retrieval:**
@@ -287,11 +287,11 @@ Tags: {tags}
287
287
 
288
288
  | Error | Likely Cause | Recovery Action |
289
289
  |-------|--------------|-----------------|
290
- | "Password required" | FOOTPRINT_PASSWORD not set | 1. Check env config<br>2. Restart MCP server<br>3. Verify password in env |
291
- | "Footprint not found" | Invalid/wrong ID | 1. Use `list-footprints` to find correct ID<br>2. Search by conversationId<br>3. Check if user meant different footprint |
292
- | "Decryption failed" | Password changed/wrong | 1. Verify current password matches<br>2. Check if footprint pre-dates password change<br>3. Try with backup password if available |
293
- | "Database error" | DB path/permissions issues | 1. Check FOOTPRINT_DB_PATH exists<br>2. Verify file permissions<br>3. Create directory if missing |
294
- | "Git repository error" | Git not initialized | 1. Initialize git in footprint directory<br>2. Set git user.name/user.email<br>3. Make initial commit |
290
+ | "Password required" | FOOTPRINT_PASSPHRASE not set | 1. Check env config<br>2. Restart MCP server<br>3. Verify passphrase in env |
291
+ | "Evidence not found" | Invalid/wrong ID | 1. Use `list-footprints` to find correct ID<br>2. Search by conversationId<br>3. Check if user meant different evidence |
292
+ | "Decryption failed" | Password changed/wrong | 1. Verify current password matches<br>2. Check if evidence pre-dates password change<br>3. Try with backup password if available |
293
+ | "Database error" | DB path/permissions issues | 1. Check FOOTPRINT_DATA_DIR exists<br>2. Verify file permissions<br>3. Create directory if missing |
294
+ | "Git repository error" | Git not initialized | 1. Initialize git in evidence directory<br>2. Set git user.name/user.email<br>3. Make initial commit |
295
295
  | "Capture timeout" | Large conversation size | 1. Split into smaller chunks<br>2. Reduce messageCount<br>3. Compress content before capture |
296
296
 
297
297
  **Agent Recovery Protocol:**
@@ -311,7 +311,7 @@ Agent:
311
311
  1. ✅ Capture immediately (explicit request)
312
312
  2. Use conversationId: "api-design-discussion-2026-01-28"
313
313
  3. Tags: "api,design,architecture"
314
- 4. Report success with Footprint ID
314
+ 4. Report success with Evidence ID
315
315
  ```
316
316
 
317
317
  ### 2. High-Value Content Detection
@@ -320,42 +320,42 @@ User: "We've decided to patent this algorithm approach."
320
320
 
321
321
  Agent:
322
322
  1. 🔍 Detect trigger: "patent" + "decided"
323
- 2. 💡 Suggest: "This looks like valuable content (contains patent decision). Save it as a footprint?"
323
+ 2. 💡 Suggest: "This looks like valuable evidence (contains patent decision). Save it?"
324
324
  3. ✅ If user agrees, capture with tags: "patent,algorithm,decision,ip"
325
325
  ```
326
326
 
327
- ### 3. Footprint Retrieval
327
+ ### 3. Evidence Retrieval
328
328
  ```
329
329
  User: "Find the conversation about OAuth implementation"
330
330
 
331
331
  Agent:
332
- 1. 🔍 Search: list-footprints or search-footprints with "OAuth"
332
+ 1. 🔍 Search: list-footprints or search-evidence with "OAuth"
333
333
  2. 📄 Present matches with conversationId and brief summary
334
334
  3. 🎯 If user selects one, get-footprint to show full content
335
335
  ```
336
336
 
337
337
  ### 4. Legal Export
338
338
  ```
339
- User: "Export the patent footprints for filing"
339
+ User: "Export the patent evidence for filing"
340
340
 
341
- Agent:
342
- 1. 🔍 Help identify relevant footprints (search by "patent" tag)
343
- 2. 📦 Export each footprint as encrypted ZIP
341
+ Agent:
342
+ 1. 🔍 Help identify relevant evidence (search by "patent" tag)
343
+ 2. 📦 Export each evidence as encrypted ZIP
344
344
  3. ✅ Provide files with verification instructions
345
345
  4. 📋 Remind about Git hash verification for legal proof
346
346
  ```
347
347
 
348
348
  ## Security & Verification
349
349
 
350
- - **Password**: Set via `FOOTPRINT_PASSWORD` env var (never ask user in chat)
350
+ - **Password**: Set via `FOOTPRINT_PASSPHRASE` env var (never ask user in chat)
351
351
  - **Encryption**: XChaCha20-Poly1305 (256-bit) with Argon2id key derivation
352
352
  - **Git Timestamps**: Cryptographic proof of creation time
353
353
  - **SHA-256 Checksums**: Detect any content tampering
354
- - **Footprint Chain**: Each capture creates immutable Git commit
354
+ - **Evidence Chain**: Each capture creates immutable Git commit
355
355
  - **Storage**: Local SQLite with encrypted BLOBs (no cloud, no tracking)
356
356
 
357
357
  **For legal proceedings:**
358
- 1. Export footprint with `export-footprints`
358
+ 1. Export evidence with `export-evidence`
359
359
  2. Verify Git hash against repository
360
360
  3. Check SHA-256 checksum matches
361
361
  4. Git log shows creation timestamp
@@ -389,8 +389,8 @@ npx @pcircle/footprint
389
389
  "command": "npx",
390
390
  "args": ["@pcircle/footprint"],
391
391
  "env": {
392
- "FOOTPRINT_DB_PATH": "/path/to/footprints.db",
393
- "FOOTPRINT_PASSWORD": "your-secure-password-here"
392
+ "FOOTPRINT_DATA_DIR": "/path/to/data",
393
+ "FOOTPRINT_PASSPHRASE": "your-secure-password-here"
394
394
  }
395
395
  }
396
396
  }
@@ -398,15 +398,15 @@ npx @pcircle/footprint
398
398
  ```
399
399
 
400
400
  **Environment Variables:**
401
- - `FOOTPRINT_PASSWORD` (required): Encryption passphrase
402
- - `FOOTPRINT_DB_PATH` (optional): Path to SQLite database (default: `./footprints.db` in current directory)
401
+ - `FOOTPRINT_PASSPHRASE` (required): Encryption passphrase
402
+ - `FOOTPRINT_DATA_DIR` (optional): Directory for data storage (default: `~/.footprint`)
403
403
 
404
404
  ## Performance Notes
405
405
 
406
406
  - **Capture time**: ~1-3 seconds per conversation
407
407
  - **Database size**: ~1KB per message on average
408
- - **Git overhead**: ~100 bytes per footprint commit
409
- - **Search speed**: Sub-second for <1000 footprint records
408
+ - **Git overhead**: ~100 bytes per evidence commit
409
+ - **Search speed**: Sub-second for <1000 evidence records
410
410
  - **Export time**: ~5-15 seconds depending on content size
411
411
 
412
412
  Large conversations (>100 messages) may take longer to encrypt and commit.
@@ -1 +1 @@
1
- {"version":3,"file":"content-analyzer.d.ts","sourceRoot":"","sources":["../../../src/analyzers/content-analyzer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,cAAc;IAC7B,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,uBAAuB,EAAE,MAAM,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAkLD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,CAuB9D"}
1
+ {"version":3,"file":"content-analyzer.d.ts","sourceRoot":"","sources":["../../../src/analyzers/content-analyzer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,cAAc;IAC7B,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,uBAAuB,EAAE,MAAM,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAsMD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,CAwB9D"}