pcl-mcp 0.2.4 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +137 -28
- package/dist/benchmarks/evaluators/context-retrieval-quality.d.ts +30 -0
- package/dist/benchmarks/evaluators/context-retrieval-quality.d.ts.map +1 -0
- package/dist/benchmarks/evaluators/context-retrieval-quality.js +50 -0
- package/dist/benchmarks/evaluators/context-retrieval-quality.js.map +1 -0
- package/dist/benchmarks/evaluators/ir-metrics.d.ts +32 -0
- package/dist/benchmarks/evaluators/ir-metrics.d.ts.map +1 -0
- package/dist/benchmarks/evaluators/ir-metrics.js +98 -0
- package/dist/benchmarks/evaluators/ir-metrics.js.map +1 -0
- package/dist/benchmarks/evaluators/structured-judge.d.ts +34 -0
- package/dist/benchmarks/evaluators/structured-judge.d.ts.map +1 -0
- package/dist/benchmarks/evaluators/structured-judge.js +153 -0
- package/dist/benchmarks/evaluators/structured-judge.js.map +1 -0
- package/dist/benchmarks/evaluators/token-counter.d.ts +9 -0
- package/dist/benchmarks/evaluators/token-counter.d.ts.map +1 -0
- package/dist/benchmarks/evaluators/token-counter.js +24 -0
- package/dist/benchmarks/evaluators/token-counter.js.map +1 -0
- package/dist/benchmarks/generators/generate-corpus.d.ts +2 -0
- package/dist/benchmarks/generators/generate-corpus.d.ts.map +1 -0
- package/dist/benchmarks/generators/generate-corpus.js +243 -0
- package/dist/benchmarks/generators/generate-corpus.js.map +1 -0
- package/dist/benchmarks/lib/harness.d.ts +23 -0
- package/dist/benchmarks/lib/harness.d.ts.map +1 -0
- package/dist/benchmarks/lib/harness.js +44 -0
- package/dist/benchmarks/lib/harness.js.map +1 -0
- package/dist/benchmarks/lib/types.d.ts +79 -0
- package/dist/benchmarks/lib/types.d.ts.map +1 -0
- package/dist/benchmarks/lib/types.js +2 -0
- package/dist/benchmarks/lib/types.js.map +1 -0
- package/dist/benchmarks/reporters/markdown-reporter.d.ts +2 -0
- package/dist/benchmarks/reporters/markdown-reporter.d.ts.map +1 -0
- package/dist/benchmarks/reporters/markdown-reporter.js +80 -0
- package/dist/benchmarks/reporters/markdown-reporter.js.map +1 -0
- package/dist/benchmarks/runners/bench-ablation.d.ts +2 -0
- package/dist/benchmarks/runners/bench-ablation.d.ts.map +1 -0
- package/dist/benchmarks/runners/bench-ablation.js +49 -0
- package/dist/benchmarks/runners/bench-ablation.js.map +1 -0
- package/dist/benchmarks/runners/bench-ai-quality.d.ts +2 -0
- package/dist/benchmarks/runners/bench-ai-quality.d.ts.map +1 -0
- package/dist/benchmarks/runners/bench-ai-quality.js +297 -0
- package/dist/benchmarks/runners/bench-ai-quality.js.map +1 -0
- package/dist/benchmarks/runners/bench-interactive-eval.d.ts +2 -0
- package/dist/benchmarks/runners/bench-interactive-eval.d.ts.map +1 -0
- package/dist/benchmarks/runners/bench-interactive-eval.js +119 -0
- package/dist/benchmarks/runners/bench-interactive-eval.js.map +1 -0
- package/dist/benchmarks/runners/bench-performance.bench.d.ts +2 -0
- package/dist/benchmarks/runners/bench-performance.bench.d.ts.map +1 -0
- package/dist/benchmarks/runners/bench-performance.bench.js +50 -0
- package/dist/benchmarks/runners/bench-performance.bench.js.map +1 -0
- package/dist/benchmarks/runners/bench-search-quality.d.ts +2 -0
- package/dist/benchmarks/runners/bench-search-quality.d.ts.map +1 -0
- package/dist/benchmarks/runners/bench-search-quality.js +70 -0
- package/dist/benchmarks/runners/bench-search-quality.js.map +1 -0
- package/dist/benchmarks/runners/bench-token-efficiency.d.ts +2 -0
- package/dist/benchmarks/runners/bench-token-efficiency.d.ts.map +1 -0
- package/dist/benchmarks/runners/bench-token-efficiency.js +89 -0
- package/dist/benchmarks/runners/bench-token-efficiency.js.map +1 -0
- package/dist/benchmarks/runners/diag.d.ts +2 -0
- package/dist/benchmarks/runners/diag.d.ts.map +1 -0
- package/dist/benchmarks/runners/diag.js +30 -0
- package/dist/benchmarks/runners/diag.js.map +1 -0
- package/dist/benchmarks/vitest.config.bench.d.ts +3 -0
- package/dist/benchmarks/vitest.config.bench.d.ts.map +1 -0
- package/dist/benchmarks/vitest.config.bench.js +14 -0
- package/dist/benchmarks/vitest.config.bench.js.map +1 -0
- package/dist/bin/pcl.js +36 -23
- package/dist/bin/pcl.js.map +1 -1
- package/dist/src/db.d.ts +2 -1
- package/dist/src/db.d.ts.map +1 -1
- package/dist/src/db.js +25 -21
- package/dist/src/db.js.map +1 -1
- package/dist/src/embeddings.d.ts +1 -1
- package/dist/src/embeddings.js +2 -2
- package/dist/src/embeddings.js.map +1 -1
- package/dist/src/indexer.d.ts +1 -1
- package/dist/src/indexer.d.ts.map +1 -1
- package/dist/src/indexer.js +6 -2
- package/dist/src/indexer.js.map +1 -1
- package/dist/src/search.d.ts.map +1 -1
- package/dist/src/search.js +138 -26
- package/dist/src/search.js.map +1 -1
- package/dist/src/server.js +6 -0
- package/dist/src/server.js.map +1 -1
- package/dist/src/types.d.ts +1 -0
- package/dist/src/types.d.ts.map +1 -1
- package/dist/tests/db.test.d.ts +2 -0
- package/dist/tests/db.test.d.ts.map +1 -0
- package/dist/tests/db.test.js +459 -0
- package/dist/tests/db.test.js.map +1 -0
- package/dist/tests/embeddings.test.d.ts +2 -0
- package/dist/tests/embeddings.test.d.ts.map +1 -0
- package/dist/tests/embeddings.test.js +165 -0
- package/dist/tests/embeddings.test.js.map +1 -0
- package/dist/tests/helpers/test-harness.d.ts +26 -0
- package/dist/tests/helpers/test-harness.d.ts.map +1 -0
- package/dist/tests/helpers/test-harness.js +80 -0
- package/dist/tests/helpers/test-harness.js.map +1 -0
- package/dist/tests/indexer.test.d.ts +2 -0
- package/dist/tests/indexer.test.d.ts.map +1 -0
- package/dist/tests/indexer.test.js +299 -0
- package/dist/tests/indexer.test.js.map +1 -0
- package/dist/tests/schemas.test.d.ts +2 -0
- package/dist/tests/schemas.test.d.ts.map +1 -0
- package/dist/tests/schemas.test.js +378 -0
- package/dist/tests/schemas.test.js.map +1 -0
- package/dist/tests/search.test.d.ts +2 -0
- package/dist/tests/search.test.d.ts.map +1 -0
- package/dist/tests/search.test.js +129 -0
- package/dist/tests/search.test.js.map +1 -0
- package/dist/tests/tools.test.d.ts +2 -0
- package/dist/tests/tools.test.d.ts.map +1 -0
- package/dist/tests/tools.test.js +232 -0
- package/dist/tests/tools.test.js.map +1 -0
- package/package.json +14 -2
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
import { describe, it, expect, beforeAll, afterAll } from "vitest";
|
|
2
|
+
import { createTestDB, createTestFile } from "./helpers/test-harness.js";
|
|
3
|
+
import { fullIndex } from "../src/indexer.js";
|
|
4
|
+
import { handleTool, renderFile } from "../src/tools.js";
|
|
5
|
+
// Single populated harness — corpus indexed with embeddings
|
|
6
|
+
// NOTE: DB is a singleton, so we can only have one open at a time.
|
|
7
|
+
// "Empty DB" tests create/destroy their own harness inline.
|
|
8
|
+
let populated;
|
|
9
|
+
beforeAll(async () => {
|
|
10
|
+
populated = await createTestDB({ copyCorpus: true });
|
|
11
|
+
await fullIndex(populated.db, populated.productDir);
|
|
12
|
+
}, 120_000);
|
|
13
|
+
afterAll(async () => {
|
|
14
|
+
await populated?.cleanup();
|
|
15
|
+
});
|
|
16
|
+
// ─── renderFile ────────────────────────────────────────────────────────────────
|
|
17
|
+
describe("renderFile", () => {
|
|
18
|
+
const file = createTestFile({
|
|
19
|
+
id: "test-render",
|
|
20
|
+
type: "persona",
|
|
21
|
+
title: "Render Test",
|
|
22
|
+
path: "/tmp/test/personas/test-render.md",
|
|
23
|
+
frontmatter: { id: "test-render", name: "Render Test", role: "QA" },
|
|
24
|
+
body: " \nBody content here.\n ",
|
|
25
|
+
});
|
|
26
|
+
it("includes type in uppercase header", () => {
|
|
27
|
+
const output = renderFile(file);
|
|
28
|
+
expect(output).toContain("[PERSONA]");
|
|
29
|
+
});
|
|
30
|
+
it("includes title and id in header", () => {
|
|
31
|
+
const output = renderFile(file);
|
|
32
|
+
expect(output).toContain("Render Test");
|
|
33
|
+
expect(output).toContain("(id: test-render)");
|
|
34
|
+
});
|
|
35
|
+
it("includes path as HTML comment", () => {
|
|
36
|
+
const output = renderFile(file);
|
|
37
|
+
expect(output).toContain("<!-- path: /tmp/test/personas/test-render.md -->");
|
|
38
|
+
});
|
|
39
|
+
it("includes frontmatter as JSON in yaml code fence", () => {
|
|
40
|
+
const output = renderFile(file);
|
|
41
|
+
expect(output).toContain("```yaml");
|
|
42
|
+
expect(output).toContain("```");
|
|
43
|
+
expect(output).toContain('"role": "QA"');
|
|
44
|
+
});
|
|
45
|
+
it("includes trimmed body", () => {
|
|
46
|
+
const output = renderFile(file);
|
|
47
|
+
expect(output).toContain("Body content here.");
|
|
48
|
+
// Body should be trimmed — no leading/trailing whitespace
|
|
49
|
+
const bodyLine = output.split("\n").at(-1);
|
|
50
|
+
expect(bodyLine).toBe("Body content here.");
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
// ─── handleTool ────────────────────────────────────────────────────────────────
|
|
54
|
+
describe("handleTool", () => {
|
|
55
|
+
// ── pcl_product_summary ──────────────────────────────────────────────────
|
|
56
|
+
describe("pcl_product_summary", () => {
|
|
57
|
+
it("returns rendered product when indexed", async () => {
|
|
58
|
+
const result = await handleTool("pcl_product_summary", {}, populated.db);
|
|
59
|
+
expect(result).toContain("[PRODUCT]");
|
|
60
|
+
expect(result).toContain("TaskPilot");
|
|
61
|
+
});
|
|
62
|
+
it("returns warning when no product.md exists", async () => {
|
|
63
|
+
// Create a temporary empty DB for this test
|
|
64
|
+
const emptyHarness = await createTestDB();
|
|
65
|
+
try {
|
|
66
|
+
const result = await handleTool("pcl_product_summary", {}, emptyHarness.db);
|
|
67
|
+
expect(result).toMatch(/^⚠/);
|
|
68
|
+
}
|
|
69
|
+
finally {
|
|
70
|
+
await emptyHarness.cleanup();
|
|
71
|
+
// Reopen the populated DB since cleanup closed the singleton
|
|
72
|
+
populated = await createTestDB({ copyCorpus: true });
|
|
73
|
+
await fullIndex(populated.db, populated.productDir);
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
// ── pcl_get_persona ──────────────────────────────────────────────────────
|
|
78
|
+
describe("pcl_get_persona", () => {
|
|
79
|
+
it("returns persona for valid id", async () => {
|
|
80
|
+
const result = await handleTool("pcl_get_persona", { id: "sarah-pm" }, populated.db);
|
|
81
|
+
expect(result).toContain("[PERSONA]");
|
|
82
|
+
expect(result).toContain("Sarah Chen");
|
|
83
|
+
});
|
|
84
|
+
it("returns warning for invalid id", async () => {
|
|
85
|
+
const result = await handleTool("pcl_get_persona", { id: "no-such-persona" }, populated.db);
|
|
86
|
+
expect(result).toMatch(/^⚠/);
|
|
87
|
+
});
|
|
88
|
+
it("guidance suggests pcl_list", async () => {
|
|
89
|
+
const result = await handleTool("pcl_get_persona", { id: "no-such-persona" }, populated.db);
|
|
90
|
+
expect(result).toContain("pcl_list");
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
// ── pcl_get_journey ──────────────────────────────────────────────────────
|
|
94
|
+
describe("pcl_get_journey", () => {
|
|
95
|
+
it("returns journey for valid id", async () => {
|
|
96
|
+
const result = await handleTool("pcl_get_journey", { id: "onboarding" }, populated.db);
|
|
97
|
+
expect(result).toContain("[JOURNEY]");
|
|
98
|
+
expect(result).toContain("Onboarding");
|
|
99
|
+
});
|
|
100
|
+
it("returns warning for invalid id", async () => {
|
|
101
|
+
const result = await handleTool("pcl_get_journey", { id: "no-such-journey" }, populated.db);
|
|
102
|
+
expect(result).toMatch(/^⚠/);
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
// ── pcl_get_spec ─────────────────────────────────────────────────────────
|
|
106
|
+
describe("pcl_get_spec", () => {
|
|
107
|
+
it("returns spec for valid id", async () => {
|
|
108
|
+
const result = await handleTool("pcl_get_spec", { id: "dashboard" }, populated.db);
|
|
109
|
+
expect(result).toContain("[SPEC]");
|
|
110
|
+
expect(result).toContain("Dashboard");
|
|
111
|
+
});
|
|
112
|
+
it("returns warning for invalid id", async () => {
|
|
113
|
+
const result = await handleTool("pcl_get_spec", { id: "no-such-spec" }, populated.db);
|
|
114
|
+
expect(result).toMatch(/^⚠/);
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
// ── pcl_get_decision ─────────────────────────────────────────────────────
|
|
118
|
+
describe("pcl_get_decision", () => {
|
|
119
|
+
it("returns decision for valid id", async () => {
|
|
120
|
+
const result = await handleTool("pcl_get_decision", { id: "adr-001-nextjs" }, populated.db);
|
|
121
|
+
expect(result).toContain("[DECISION]");
|
|
122
|
+
expect(result).toContain("Next.js");
|
|
123
|
+
});
|
|
124
|
+
it("returns warning for invalid id", async () => {
|
|
125
|
+
const result = await handleTool("pcl_get_decision", { id: "no-such-decision" }, populated.db);
|
|
126
|
+
expect(result).toMatch(/^⚠/);
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
// ── pcl_get_domain ───────────────────────────────────────────────────────
|
|
130
|
+
describe("pcl_get_domain", () => {
|
|
131
|
+
it("returns domain file for valid id", async () => {
|
|
132
|
+
const result = await handleTool("pcl_get_domain", { id: "billing-rules" }, populated.db);
|
|
133
|
+
expect(result).toContain("[DOMAIN]");
|
|
134
|
+
expect(result).toContain("Billing");
|
|
135
|
+
});
|
|
136
|
+
it("returns all critical files for '*critical'", async () => {
|
|
137
|
+
const result = await handleTool("pcl_get_domain", { id: "*critical" }, populated.db);
|
|
138
|
+
expect(result).toContain("billing-rules");
|
|
139
|
+
expect(result).toContain("data-governance");
|
|
140
|
+
});
|
|
141
|
+
it("critical response contains separators between files", async () => {
|
|
142
|
+
const result = await handleTool("pcl_get_domain", { id: "*critical" }, populated.db);
|
|
143
|
+
expect(result).toContain("---");
|
|
144
|
+
});
|
|
145
|
+
it("returns warning for invalid domain id", async () => {
|
|
146
|
+
const result = await handleTool("pcl_get_domain", { id: "no-such-domain" }, populated.db);
|
|
147
|
+
expect(result).toMatch(/^⚠/);
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
// ── pcl_list ─────────────────────────────────────────────────────────────
|
|
151
|
+
describe("pcl_list", () => {
|
|
152
|
+
it("returns list of personas with count", async () => {
|
|
153
|
+
const result = await handleTool("pcl_list", { type: "personas" }, populated.db);
|
|
154
|
+
expect(result).toContain("personas");
|
|
155
|
+
expect(result).toMatch(/\d+ total/);
|
|
156
|
+
expect(result).toContain("sarah-pm");
|
|
157
|
+
});
|
|
158
|
+
it("returns list of specs with status badges", async () => {
|
|
159
|
+
const result = await handleTool("pcl_list", { type: "specs" }, populated.db);
|
|
160
|
+
// Specs have status in frontmatter, rendered as badges like [approved]
|
|
161
|
+
expect(result).toMatch(/\[.+\]/);
|
|
162
|
+
});
|
|
163
|
+
it("maps plural 'personas' to singular 'persona'", async () => {
|
|
164
|
+
// If mapping works, it should return persona files, not an error
|
|
165
|
+
const result = await handleTool("pcl_list", { type: "personas" }, populated.db);
|
|
166
|
+
expect(result).not.toMatch(/^⚠/);
|
|
167
|
+
expect(result).toContain("sarah-pm");
|
|
168
|
+
});
|
|
169
|
+
it("returns 'no files' for empty type", async () => {
|
|
170
|
+
const emptyHarness = await createTestDB();
|
|
171
|
+
try {
|
|
172
|
+
const result = await handleTool("pcl_list", { type: "personas" }, emptyHarness.db);
|
|
173
|
+
expect(result).toContain("No personas defined yet");
|
|
174
|
+
}
|
|
175
|
+
finally {
|
|
176
|
+
await emptyHarness.cleanup();
|
|
177
|
+
populated = await createTestDB({ copyCorpus: true });
|
|
178
|
+
await fullIndex(populated.db, populated.productDir);
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
it("returns warning for unknown type", async () => {
|
|
182
|
+
const result = await handleTool("pcl_list", { type: "widgets" }, populated.db);
|
|
183
|
+
expect(result).toMatch(/^⚠/);
|
|
184
|
+
});
|
|
185
|
+
it("includes [CRITICAL] flag on critical domain files", async () => {
|
|
186
|
+
const result = await handleTool("pcl_list", { type: "domain" }, populated.db);
|
|
187
|
+
expect(result).toContain("[CRITICAL]");
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
// ── pcl_search ───────────────────────────────────────────────────────────
|
|
191
|
+
describe("pcl_search", () => {
|
|
192
|
+
it("returns scored results for valid query", async () => {
|
|
193
|
+
const result = await handleTool("pcl_search", { query: "project management" }, populated.db);
|
|
194
|
+
expect(result).toContain("Search results");
|
|
195
|
+
expect(result).toMatch(/score: \d+\.\d+/);
|
|
196
|
+
});
|
|
197
|
+
it("returns 'no results' for unmatched query", async () => {
|
|
198
|
+
const result = await handleTool("pcl_search", { query: "xyzzyplughnotaword", mode: "keyword" }, populated.db);
|
|
199
|
+
expect(result).toContain("No results found");
|
|
200
|
+
});
|
|
201
|
+
it("respects mode parameter", async () => {
|
|
202
|
+
// Keyword mode should work without error
|
|
203
|
+
const result = await handleTool("pcl_search", { query: "billing", mode: "keyword" }, populated.db);
|
|
204
|
+
expect(result).toContain("Search results");
|
|
205
|
+
});
|
|
206
|
+
it("respects top_k parameter", async () => {
|
|
207
|
+
const result = await handleTool("pcl_search", { query: "project", top_k: 1 }, populated.db);
|
|
208
|
+
// Should contain at least 1 result (cross-reference resolution may add extras)
|
|
209
|
+
expect(result).toContain("1.");
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
// ── pcl_related ──────────────────────────────────────────────────────────
|
|
213
|
+
describe("pcl_related", () => {
|
|
214
|
+
it("returns related files for valid id", async () => {
|
|
215
|
+
const result = await handleTool("pcl_related", { id: "sarah-pm" }, populated.db);
|
|
216
|
+
expect(result).toContain("Files related to");
|
|
217
|
+
expect(result).toMatch(/similarity: \d+\.\d+/);
|
|
218
|
+
});
|
|
219
|
+
it("returns guidance for unknown id", async () => {
|
|
220
|
+
const result = await handleTool("pcl_related", { id: "does-not-exist" }, populated.db);
|
|
221
|
+
expect(result).toContain("No related files found");
|
|
222
|
+
});
|
|
223
|
+
});
|
|
224
|
+
// ── unknown tool ─────────────────────────────────────────────────────────
|
|
225
|
+
describe("unknown tool", () => {
|
|
226
|
+
it("returns warning for unrecognized tool name", async () => {
|
|
227
|
+
const result = await handleTool("pcl_not_a_tool", {}, populated.db);
|
|
228
|
+
expect(result).toMatch(/^⚠/);
|
|
229
|
+
});
|
|
230
|
+
});
|
|
231
|
+
});
|
|
232
|
+
//# sourceMappingURL=tools.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.test.js","sourceRoot":"","sources":["../../tests/tools.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pcl-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Product Context Layer — MCP server for AI-assisted product development",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/src/server.js",
|
|
@@ -18,7 +18,16 @@
|
|
|
18
18
|
"dev": "tsx watch src/server.ts",
|
|
19
19
|
"serve": "node dist/src/server.js",
|
|
20
20
|
"init": "tsx bin/pcl.ts init",
|
|
21
|
+
"test": "vitest run",
|
|
22
|
+
"test:watch": "vitest",
|
|
21
23
|
"typecheck": "tsc --noEmit",
|
|
24
|
+
"bench": "vitest bench --config benchmarks/vitest.config.bench.ts --run",
|
|
25
|
+
"bench:perf": "vitest bench --config benchmarks/vitest.config.bench.ts --run benchmarks/runners/bench-performance.bench.ts",
|
|
26
|
+
"bench:quality": "tsx benchmarks/runners/bench-search-quality.ts",
|
|
27
|
+
"bench:tokens": "tsx benchmarks/runners/bench-token-efficiency.ts",
|
|
28
|
+
"bench:ablation": "tsx benchmarks/runners/bench-ablation.ts",
|
|
29
|
+
"bench:ai": "tsx benchmarks/runners/bench-ai-quality.ts",
|
|
30
|
+
"bench:report": "tsx benchmarks/reporters/markdown-reporter.ts",
|
|
22
31
|
"prepare": "tsc",
|
|
23
32
|
"publish:npm": "npm publish --registry https://registry.npmjs.org",
|
|
24
33
|
"publish:github": "npm pkg set name='@michaelgorski/pcl-mcp' && npm publish --registry https://npm.pkg.github.com && npm pkg set name='pcl-mcp'"
|
|
@@ -47,10 +56,13 @@
|
|
|
47
56
|
"zod": "^3.24.0"
|
|
48
57
|
},
|
|
49
58
|
"devDependencies": {
|
|
59
|
+
"@anthropic-ai/sdk": "^0.80.0",
|
|
50
60
|
"@types/better-sqlite3": "^7.6.12",
|
|
51
61
|
"@types/node": "^22.0.0",
|
|
62
|
+
"tiktoken": "^1.0.22",
|
|
52
63
|
"tsx": "^4.19.0",
|
|
53
|
-
"typescript": "^5.8.0"
|
|
64
|
+
"typescript": "^5.8.0",
|
|
65
|
+
"vitest": "^4.1.1"
|
|
54
66
|
},
|
|
55
67
|
"publishConfig": {
|
|
56
68
|
"registry": "https://registry.npmjs.org",
|