@pcircle/footprint 1.2.2 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +31 -43
- package/SKILL.md +45 -45
- package/dist/src/cli/constants.d.ts +20 -0
- package/dist/src/cli/constants.d.ts.map +1 -0
- package/dist/src/cli/constants.js +25 -0
- package/dist/src/cli/constants.js.map +1 -0
- package/dist/src/cli/index.d.ts +3 -0
- package/dist/src/cli/index.d.ts.map +1 -0
- package/dist/src/cli/index.js +25 -0
- package/dist/src/cli/index.js.map +1 -0
- package/dist/src/cli/setup.d.ts +6 -0
- package/dist/src/cli/setup.d.ts.map +1 -0
- package/dist/src/cli/setup.js +334 -0
- package/dist/src/cli/setup.js.map +1 -0
- package/dist/src/cli/types.d.ts +38 -0
- package/dist/src/cli/types.d.ts.map +1 -0
- package/dist/src/cli/types.js +5 -0
- package/dist/src/cli/types.js.map +1 -0
- package/dist/src/cli/utils/config.d.ts +19 -0
- package/dist/src/cli/utils/config.d.ts.map +1 -0
- package/dist/src/cli/utils/config.js +86 -0
- package/dist/src/cli/utils/config.js.map +1 -0
- package/dist/src/cli/utils/detect.d.ts +14 -0
- package/dist/src/cli/utils/detect.d.ts.map +1 -0
- package/dist/src/cli/utils/detect.js +57 -0
- package/dist/src/cli/utils/detect.js.map +1 -0
- package/dist/src/cli/utils/env.d.ts +10 -0
- package/dist/src/cli/utils/env.d.ts.map +1 -0
- package/dist/src/cli/utils/env.js +54 -0
- package/dist/src/cli/utils/env.js.map +1 -0
- package/dist/src/cli/utils/validation.d.ts +17 -0
- package/dist/src/cli/utils/validation.d.ts.map +1 -0
- package/dist/src/cli/utils/validation.js +77 -0
- package/dist/src/cli/utils/validation.js.map +1 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +13 -11
- package/dist/src/index.js.map +1 -1
- package/dist/src/lib/storage/export.d.ts +2 -2
- package/dist/src/lib/storage/export.d.ts.map +1 -1
- package/dist/src/lib/storage/export.js +39 -39
- package/dist/src/lib/storage/export.js.map +1 -1
- package/dist/src/tools/capture-footprint.js +1 -1
- package/dist/src/tools/capture-footprint.js.map +1 -1
- package/dist/src/tools/delete-footprints.d.ts +2 -2
- package/dist/src/tools/delete-footprints.d.ts.map +1 -1
- package/dist/src/tools/delete-footprints.js +4 -4
- package/dist/src/tools/delete-footprints.js.map +1 -1
- package/dist/src/tools/export-footprints.d.ts +4 -4
- package/dist/src/tools/export-footprints.d.ts.map +1 -1
- package/dist/src/tools/export-footprints.js +6 -6
- package/dist/src/tools/export-footprints.js.map +1 -1
- package/dist/src/tools/get-footprint.js +19 -19
- package/dist/src/tools/get-footprint.js.map +1 -1
- package/dist/src/tools/list-footprints.d.ts +2 -2
- package/dist/src/tools/list-footprints.js +11 -11
- package/dist/src/tools/list-footprints.js.map +1 -1
- package/dist/src/tools/search-footprints.d.ts +2 -2
- package/dist/src/tools/search-footprints.js +11 -11
- package/dist/src/tools/search-footprints.js.map +1 -1
- package/dist/src/tools/suggest-capture.js +1 -1
- package/dist/src/tools/suggest-capture.js.map +1 -1
- package/dist/src/tools/verify-footprint.js +11 -11
- package/dist/src/tools/verify-footprint.js.map +1 -1
- package/dist/src/ui/register.js +2 -2
- package/dist/src/ui/register.js.map +1 -1
- package/dist/ui/dashboard.html +49 -49
- package/dist/ui/detail.html +9 -9
- package/dist/ui/export.html +17 -17
- package/package.json +13 -6
- package/dist/tests/error-handling.test.d.ts +0 -2
- package/dist/tests/error-handling.test.d.ts.map +0 -1
- package/dist/tests/error-handling.test.js +0 -114
- package/dist/tests/error-handling.test.js.map +0 -1
- package/dist/tests/fixtures.d.ts +0 -87
- package/dist/tests/fixtures.d.ts.map +0 -1
- package/dist/tests/fixtures.js +0 -130
- package/dist/tests/fixtures.js.map +0 -1
- package/dist/tests/integration.test.d.ts +0 -2
- package/dist/tests/integration.test.d.ts.map +0 -1
- package/dist/tests/integration.test.js +0 -115
- package/dist/tests/integration.test.js.map +0 -1
- package/dist/tests/resources.test.d.ts +0 -2
- package/dist/tests/resources.test.d.ts.map +0 -1
- package/dist/tests/resources.test.js +0 -73
- package/dist/tests/resources.test.js.map +0 -1
- package/dist/tests/setup.d.ts +0 -8
- package/dist/tests/setup.d.ts.map +0 -1
- package/dist/tests/setup.js +0 -8
- package/dist/tests/setup.js.map +0 -1
- package/dist/tests/tools.test.d.ts +0 -2
- package/dist/tests/tools.test.d.ts.map +0 -1
- package/dist/tests/tools.test.js +0 -224
- package/dist/tests/tools.test.js.map +0 -1
- package/dist/ui-tmp/ui/export.html +0 -409
package/dist/tests/setup.js
DELETED
package/dist/tests/setup.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../tests/setup.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tools.test.d.ts","sourceRoot":"","sources":["../../tests/tools.test.ts"],"names":[],"mappings":""}
|
package/dist/tests/tools.test.js
DELETED
|
@@ -1,224 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, beforeEach, afterEach } from "vitest";
|
|
2
|
-
import { FootprintServer, FootprintTestHelpers } from "../src/index.js";
|
|
3
|
-
import * as fs from "fs";
|
|
4
|
-
import * as path from "path";
|
|
5
|
-
import { tmpdir } from "node:os";
|
|
6
|
-
describe("MCP Tools", () => {
|
|
7
|
-
let server;
|
|
8
|
-
let helpers;
|
|
9
|
-
let testDbPath;
|
|
10
|
-
let tempDir;
|
|
11
|
-
const testPassword = "test-password-123";
|
|
12
|
-
beforeEach(() => {
|
|
13
|
-
// Create unique temporary directory for each test
|
|
14
|
-
tempDir = fs.mkdtempSync(path.join(tmpdir(), "footprint-mcp-test-"));
|
|
15
|
-
testDbPath = path.join(tempDir, "test-footprint.db");
|
|
16
|
-
// Clean up any existing test database
|
|
17
|
-
if (fs.existsSync(testDbPath)) {
|
|
18
|
-
fs.unlinkSync(testDbPath);
|
|
19
|
-
}
|
|
20
|
-
const config = {
|
|
21
|
-
dbPath: testDbPath,
|
|
22
|
-
password: testPassword,
|
|
23
|
-
};
|
|
24
|
-
server = new FootprintServer(config);
|
|
25
|
-
helpers = new FootprintTestHelpers(server);
|
|
26
|
-
});
|
|
27
|
-
afterEach(() => {
|
|
28
|
-
// Clean up test database and directory
|
|
29
|
-
try {
|
|
30
|
-
if (server) {
|
|
31
|
-
// Close any database connections if the server has them
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
catch (error) {
|
|
35
|
-
// Ignore close errors
|
|
36
|
-
}
|
|
37
|
-
try {
|
|
38
|
-
if (tempDir && fs.existsSync(tempDir)) {
|
|
39
|
-
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
catch (error) {
|
|
43
|
-
// Ignore cleanup errors
|
|
44
|
-
}
|
|
45
|
-
});
|
|
46
|
-
describe("capture-footprint tool", () => {
|
|
47
|
-
it("should capture and encrypt conversation evidence", async () => {
|
|
48
|
-
// This test will fail initially - tool not registered yet
|
|
49
|
-
const tools = await helpers.getTools();
|
|
50
|
-
expect(tools).toContainEqual(expect.objectContaining({
|
|
51
|
-
name: "capture-footprint",
|
|
52
|
-
description: expect.stringContaining("conversation"),
|
|
53
|
-
}));
|
|
54
|
-
});
|
|
55
|
-
});
|
|
56
|
-
describe("list-footprints tool", () => {
|
|
57
|
-
it("should list all evidences", async () => {
|
|
58
|
-
const tools = await helpers.getTools();
|
|
59
|
-
expect(tools).toContainEqual(expect.objectContaining({
|
|
60
|
-
name: "list-footprints",
|
|
61
|
-
}));
|
|
62
|
-
});
|
|
63
|
-
});
|
|
64
|
-
describe("export-footprints tool", () => {
|
|
65
|
-
it("should export evidences to ZIP", async () => {
|
|
66
|
-
const tools = await helpers.getTools();
|
|
67
|
-
expect(tools).toContainEqual(expect.objectContaining({
|
|
68
|
-
name: "export-footprints",
|
|
69
|
-
}));
|
|
70
|
-
});
|
|
71
|
-
});
|
|
72
|
-
describe("get-footprint tool", () => {
|
|
73
|
-
it("should retrieve and decrypt specific evidence", async () => {
|
|
74
|
-
const tools = await helpers.getTools();
|
|
75
|
-
expect(tools).toContainEqual(expect.objectContaining({
|
|
76
|
-
name: "get-footprint",
|
|
77
|
-
}));
|
|
78
|
-
});
|
|
79
|
-
});
|
|
80
|
-
describe("search-footprints tool", () => {
|
|
81
|
-
it("should be registered as a tool", async () => {
|
|
82
|
-
const tools = await helpers.getTools();
|
|
83
|
-
expect(tools).toContainEqual(expect.objectContaining({
|
|
84
|
-
name: "search-footprints",
|
|
85
|
-
description: expect.stringContaining("Search and filter footprints"),
|
|
86
|
-
}));
|
|
87
|
-
});
|
|
88
|
-
it("should have correct input schema", async () => {
|
|
89
|
-
const tools = await helpers.getTools();
|
|
90
|
-
const searchTool = tools.find((t) => t.name === "search-footprints");
|
|
91
|
-
expect(searchTool).toBeDefined();
|
|
92
|
-
// The helper only returns name and description, not the full schema
|
|
93
|
-
expect(searchTool?.name).toBe("search-footprints");
|
|
94
|
-
expect(searchTool?.description).toContain("Search and filter footprints");
|
|
95
|
-
});
|
|
96
|
-
it("should return empty results for no matches", async () => {
|
|
97
|
-
const result = await helpers.callTool("search-footprints", {
|
|
98
|
-
query: "nonexistent-conversation",
|
|
99
|
-
});
|
|
100
|
-
expect(result).toHaveProperty("structuredContent");
|
|
101
|
-
expect(result.structuredContent).toHaveProperty("footprints");
|
|
102
|
-
expect(result.structuredContent).toHaveProperty("total");
|
|
103
|
-
expect(result.structuredContent.footprints).toHaveLength(0);
|
|
104
|
-
expect(result.structuredContent.total).toBe(0);
|
|
105
|
-
});
|
|
106
|
-
it("should validate limit parameter", async () => {
|
|
107
|
-
await expect(helpers.callTool("search-footprints", { limit: 0 })).rejects.toThrow("Limit must be positive");
|
|
108
|
-
await expect(helpers.callTool("search-footprints", { limit: -1 })).rejects.toThrow("Limit must be positive");
|
|
109
|
-
});
|
|
110
|
-
it("should validate offset parameter", async () => {
|
|
111
|
-
await expect(helpers.callTool("search-footprints", { offset: -1 })).rejects.toThrow("Offset cannot be negative");
|
|
112
|
-
});
|
|
113
|
-
it("should validate date parameters", async () => {
|
|
114
|
-
await expect(helpers.callTool("search-footprints", { dateFrom: "invalid-date" })).rejects.toThrow("dateFrom must be a valid ISO date string");
|
|
115
|
-
await expect(helpers.callTool("search-footprints", { dateTo: "invalid-date" })).rejects.toThrow("dateTo must be a valid ISO date string");
|
|
116
|
-
});
|
|
117
|
-
});
|
|
118
|
-
describe("verify-footprint tool", () => {
|
|
119
|
-
it("should verify evidence integrity", async () => {
|
|
120
|
-
// First capture an evidence
|
|
121
|
-
const captureResult = await helpers.callTool("capture-footprint", {
|
|
122
|
-
conversationId: "test-verify",
|
|
123
|
-
llmProvider: "Test LLM",
|
|
124
|
-
content: "Test content for verification",
|
|
125
|
-
messageCount: 1,
|
|
126
|
-
});
|
|
127
|
-
const evidenceId = captureResult.structuredContent.id;
|
|
128
|
-
// Then verify it
|
|
129
|
-
const verifyResult = await helpers.callTool("verify-footprint", {
|
|
130
|
-
id: evidenceId,
|
|
131
|
-
});
|
|
132
|
-
expect(verifyResult.structuredContent.verified).toBe(true);
|
|
133
|
-
expect(verifyResult.structuredContent.checks.contentIntegrity.passed).toBe(true);
|
|
134
|
-
});
|
|
135
|
-
});
|
|
136
|
-
describe("suggest-capture tool", () => {
|
|
137
|
-
it("should be registered as a tool", async () => {
|
|
138
|
-
const tools = await helpers.getTools();
|
|
139
|
-
expect(tools).toContainEqual(expect.objectContaining({
|
|
140
|
-
name: "suggest-capture",
|
|
141
|
-
description: expect.stringContaining("Analyze conversation content"),
|
|
142
|
-
}));
|
|
143
|
-
});
|
|
144
|
-
it("should suggest capture for IP-related content", async () => {
|
|
145
|
-
const result = await helpers.callTool("suggest-capture", {
|
|
146
|
-
summary: "We discussed the new caching algorithm patent and its implementation details. The invention uses a novel approach for memory management.",
|
|
147
|
-
});
|
|
148
|
-
expect(result.structuredContent).toHaveProperty("shouldCapture", true);
|
|
149
|
-
expect(result.structuredContent).toHaveProperty("reason", expect.stringContaining("IP"));
|
|
150
|
-
expect(result.structuredContent).toHaveProperty("suggestedTags");
|
|
151
|
-
expect(result.structuredContent.suggestedTags).toContain("ip");
|
|
152
|
-
expect(result.structuredContent).toHaveProperty("suggestedConversationId", expect.any(String));
|
|
153
|
-
expect(result.structuredContent).toHaveProperty("confidence", expect.any(Number));
|
|
154
|
-
expect(result.structuredContent.confidence).toBeGreaterThan(0.7);
|
|
155
|
-
});
|
|
156
|
-
it("should suggest capture for legal content", async () => {
|
|
157
|
-
const result = await helpers.callTool("suggest-capture", {
|
|
158
|
-
summary: "We reviewed the software license agreement and contract terms for the new vendor partnership.",
|
|
159
|
-
});
|
|
160
|
-
expect(result.structuredContent.shouldCapture).toBe(true);
|
|
161
|
-
expect(result.structuredContent.reason).toContain("legal");
|
|
162
|
-
expect(result.structuredContent.suggestedTags).toContain("legal");
|
|
163
|
-
expect(result.structuredContent.confidence).toBeGreaterThan(0.7);
|
|
164
|
-
});
|
|
165
|
-
it("should suggest capture for business decisions", async () => {
|
|
166
|
-
const result = await helpers.callTool("suggest-capture", {
|
|
167
|
-
summary: "The team made a critical decision about the product milestone and approved the final deliverable for Q1.",
|
|
168
|
-
});
|
|
169
|
-
expect(result.structuredContent.shouldCapture).toBe(true);
|
|
170
|
-
expect(result.structuredContent.reason).toContain("business");
|
|
171
|
-
expect(result.structuredContent.suggestedTags).toContain("decision");
|
|
172
|
-
expect(result.structuredContent.confidence).toBeGreaterThan(0.7);
|
|
173
|
-
});
|
|
174
|
-
it("should suggest capture for research content", async () => {
|
|
175
|
-
const result = await helpers.callTool("suggest-capture", {
|
|
176
|
-
summary: "Our research findings show clear evidence supporting our hypothesis about machine learning performance.",
|
|
177
|
-
});
|
|
178
|
-
expect(result.structuredContent.shouldCapture).toBe(true);
|
|
179
|
-
expect(result.structuredContent.reason).toContain("research");
|
|
180
|
-
expect(result.structuredContent.suggestedTags).toContain("research");
|
|
181
|
-
expect(result.structuredContent.confidence).toBeGreaterThan(0.7);
|
|
182
|
-
});
|
|
183
|
-
it("should suggest capture for compliance content", async () => {
|
|
184
|
-
const result = await helpers.callTool("suggest-capture", {
|
|
185
|
-
summary: "We need to document this for audit purposes and ensure compliance with the new regulations.",
|
|
186
|
-
});
|
|
187
|
-
expect(result.structuredContent.shouldCapture).toBe(true);
|
|
188
|
-
expect(result.structuredContent.reason).toContain("compliance");
|
|
189
|
-
expect(result.structuredContent.suggestedTags).toContain("audit");
|
|
190
|
-
expect(result.structuredContent.confidence).toBeGreaterThan(0.7);
|
|
191
|
-
});
|
|
192
|
-
it("should not suggest capture for casual conversation", async () => {
|
|
193
|
-
const result = await helpers.callTool("suggest-capture", {
|
|
194
|
-
summary: "We chatted about the weather and discussed weekend plans. Nothing important was covered.",
|
|
195
|
-
});
|
|
196
|
-
expect(result.structuredContent.shouldCapture).toBe(false);
|
|
197
|
-
expect(result.structuredContent.reason).toContain("casual");
|
|
198
|
-
expect(result.structuredContent.confidence).toBeLessThan(0.5);
|
|
199
|
-
});
|
|
200
|
-
it("should generate appropriate conversation ID", async () => {
|
|
201
|
-
const result = await helpers.callTool("suggest-capture", {
|
|
202
|
-
summary: "Discussing patent application for the new AI algorithm invention.",
|
|
203
|
-
});
|
|
204
|
-
expect(result.structuredContent.suggestedConversationId).toMatch(/^[a-z0-9-]+$/);
|
|
205
|
-
expect(result.structuredContent.suggestedConversationId).toContain("patent");
|
|
206
|
-
expect(result.structuredContent.suggestedConversationId).toContain(new Date().toISOString().slice(0, 10));
|
|
207
|
-
});
|
|
208
|
-
it("should validate input parameters", async () => {
|
|
209
|
-
await expect(helpers.callTool("suggest-capture", {})).rejects.toThrow();
|
|
210
|
-
await expect(helpers.callTool("suggest-capture", { summary: "" })).rejects.toThrow("Summary cannot be empty");
|
|
211
|
-
});
|
|
212
|
-
it("should handle multiple keyword categories", async () => {
|
|
213
|
-
const result = await helpers.callTool("suggest-capture", {
|
|
214
|
-
summary: "We discussed the patent license agreement and our research findings for compliance documentation.",
|
|
215
|
-
});
|
|
216
|
-
expect(result.structuredContent.shouldCapture).toBe(true);
|
|
217
|
-
expect(result.structuredContent.suggestedTags.length).toBeGreaterThan(1);
|
|
218
|
-
expect(result.structuredContent.suggestedTags).toContain("ip");
|
|
219
|
-
expect(result.structuredContent.suggestedTags).toContain("legal");
|
|
220
|
-
expect(result.structuredContent.confidence).toBeGreaterThan(0.8);
|
|
221
|
-
});
|
|
222
|
-
});
|
|
223
|
-
});
|
|
224
|
-
//# sourceMappingURL=tools.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tools.test.js","sourceRoot":"","sources":["../../tests/tools.test.ts"],"names":[],"mappings":"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"}
|