docspack 0.0.1 → 0.1.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 +21 -0
- package/README.md +59 -0
- package/bin/docspack.js +25 -0
- package/dist/build.d.ts +31 -0
- package/dist/build.d.ts.map +1 -0
- package/dist/build.js +435 -0
- package/dist/build.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +763 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +41 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +118 -0
- package/dist/config.js.map +1 -0
- package/dist/db.d.ts +60 -0
- package/dist/db.d.ts.map +1 -0
- package/dist/db.js +204 -0
- package/dist/db.js.map +1 -0
- package/dist/discovery.d.ts +31 -0
- package/dist/discovery.d.ts.map +1 -0
- package/dist/discovery.js +126 -0
- package/dist/discovery.js.map +1 -0
- package/dist/doctor.d.ts +25 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +276 -0
- package/dist/doctor.js.map +1 -0
- package/dist/document.d.ts +13 -0
- package/dist/document.d.ts.map +1 -0
- package/dist/document.js +47 -0
- package/dist/document.js.map +1 -0
- package/dist/errors.d.ts +9 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +10 -0
- package/dist/errors.js.map +1 -0
- package/dist/exports.d.ts +20 -0
- package/dist/exports.d.ts.map +1 -0
- package/dist/exports.js +100 -0
- package/dist/exports.js.map +1 -0
- package/dist/feedback.d.ts +68 -0
- package/dist/feedback.d.ts.map +1 -0
- package/dist/feedback.js +0 -0
- package/dist/feedback.js.map +1 -0
- package/dist/html.d.ts +4 -0
- package/dist/html.d.ts.map +1 -0
- package/dist/html.js +23 -0
- package/dist/html.js.map +1 -0
- package/dist/http.d.ts +30 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +144 -0
- package/dist/http.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/init/detect.d.ts +16 -0
- package/dist/init/detect.d.ts.map +1 -0
- package/dist/init/detect.js +120 -0
- package/dist/init/detect.js.map +1 -0
- package/dist/init/plan.d.ts +43 -0
- package/dist/init/plan.d.ts.map +1 -0
- package/dist/init/plan.js +145 -0
- package/dist/init/plan.js.map +1 -0
- package/dist/init/run.d.ts +28 -0
- package/dist/init/run.d.ts.map +1 -0
- package/dist/init/run.js +96 -0
- package/dist/init/run.js.map +1 -0
- package/dist/init/templates.d.ts +24 -0
- package/dist/init/templates.d.ts.map +1 -0
- package/dist/init/templates.js +181 -0
- package/dist/init/templates.js.map +1 -0
- package/dist/init/write.d.ts +20 -0
- package/dist/init/write.d.ts.map +1 -0
- package/dist/init/write.js +56 -0
- package/dist/init/write.js.map +1 -0
- package/dist/kinds.d.ts +14 -0
- package/dist/kinds.d.ts.map +1 -0
- package/dist/kinds.js +15 -0
- package/dist/kinds.js.map +1 -0
- package/dist/llms-txt.d.ts +25 -0
- package/dist/llms-txt.d.ts.map +1 -0
- package/dist/llms-txt.js +94 -0
- package/dist/llms-txt.js.map +1 -0
- package/dist/mcp.d.ts +15 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +158 -0
- package/dist/mcp.js.map +1 -0
- package/dist/preview.d.ts +18 -0
- package/dist/preview.d.ts.map +1 -0
- package/dist/preview.js +72 -0
- package/dist/preview.js.map +1 -0
- package/dist/prompt.d.ts +27 -0
- package/dist/prompt.d.ts.map +1 -0
- package/dist/prompt.js +79 -0
- package/dist/prompt.js.map +1 -0
- package/dist/search.d.ts +41 -0
- package/dist/search.d.ts.map +1 -0
- package/dist/search.js +60 -0
- package/dist/search.js.map +1 -0
- package/dist/snippet.d.ts +20 -0
- package/dist/snippet.d.ts.map +1 -0
- package/dist/snippet.js +29 -0
- package/dist/snippet.js.map +1 -0
- package/dist/spec.d.ts +38 -0
- package/dist/spec.d.ts.map +1 -0
- package/dist/spec.js +105 -0
- package/dist/spec.js.map +1 -0
- package/dist/style.d.ts +33 -0
- package/dist/style.d.ts.map +1 -0
- package/dist/style.js +94 -0
- package/dist/style.js.map +1 -0
- package/dist/submit.d.ts +61 -0
- package/dist/submit.d.ts.map +1 -0
- package/dist/submit.js +111 -0
- package/dist/submit.js.map +1 -0
- package/dist/sync.d.ts +29 -0
- package/dist/sync.d.ts.map +1 -0
- package/dist/sync.js +73 -0
- package/dist/sync.js.map +1 -0
- package/dist/verify.d.ts +44 -0
- package/dist/verify.d.ts.map +1 -0
- package/dist/verify.js +291 -0
- package/dist/verify.js.map +1 -0
- package/package.json +60 -5
- package/src/build.ts +572 -0
- package/src/cli.ts +883 -0
- package/src/config.ts +158 -0
- package/src/db.ts +261 -0
- package/src/discovery.ts +161 -0
- package/src/doctor.ts +344 -0
- package/src/document.ts +59 -0
- package/src/errors.ts +10 -0
- package/src/exports.ts +120 -0
- package/src/feedback.ts +0 -0
- package/src/html.ts +24 -0
- package/src/http.ts +190 -0
- package/src/index.ts +132 -0
- package/src/init/detect.ts +142 -0
- package/src/init/plan.ts +215 -0
- package/src/init/run.ts +142 -0
- package/src/init/templates.ts +200 -0
- package/src/init/write.ts +83 -0
- package/src/kinds.ts +17 -0
- package/src/llms-txt.ts +116 -0
- package/src/mcp.ts +196 -0
- package/src/preview.ts +98 -0
- package/src/prompt.ts +103 -0
- package/src/search.ts +96 -0
- package/src/snippet.ts +30 -0
- package/src/spec.ts +138 -0
- package/src/style.ts +111 -0
- package/src/submit.ts +189 -0
- package/src/sync.ts +112 -0
- package/src/verify.ts +355 -0
- package/bin/cli.js +0 -2
package/dist/verify.js
ADDED
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { readBuildConfig } from "./config.js";
|
|
4
|
+
import { discoverPackages, resolvePackageDir } from "./discovery.js";
|
|
5
|
+
import { DocspackError } from "./errors.js";
|
|
6
|
+
import { readExportSurface } from "./exports.js";
|
|
7
|
+
import { chunkId, LLMS_DIR, MANIFEST_FILE, parseManifest } from "./spec.js";
|
|
8
|
+
/** Below this length a name is too generic to reason about. */
|
|
9
|
+
const MIN_SYMBOL = 4;
|
|
10
|
+
/**
|
|
11
|
+
* Names that appear in documentation everywhere and belong to the language or the platform
|
|
12
|
+
* rather than to any library.
|
|
13
|
+
*/
|
|
14
|
+
const UNIVERSAL = new Set([
|
|
15
|
+
"console",
|
|
16
|
+
"log",
|
|
17
|
+
"error",
|
|
18
|
+
"warn",
|
|
19
|
+
"then",
|
|
20
|
+
"catch",
|
|
21
|
+
"finally",
|
|
22
|
+
"await",
|
|
23
|
+
"async",
|
|
24
|
+
"json",
|
|
25
|
+
"stringify",
|
|
26
|
+
"parse",
|
|
27
|
+
"length",
|
|
28
|
+
"process",
|
|
29
|
+
"env",
|
|
30
|
+
"module",
|
|
31
|
+
"exports",
|
|
32
|
+
"require",
|
|
33
|
+
"import",
|
|
34
|
+
"default",
|
|
35
|
+
"window",
|
|
36
|
+
"document",
|
|
37
|
+
"fetch",
|
|
38
|
+
"response",
|
|
39
|
+
"request",
|
|
40
|
+
]);
|
|
41
|
+
/**
|
|
42
|
+
* Receivers that belong to the language or the runtime. `document.cookie` and `stream.Duplex`
|
|
43
|
+
* are documentation about the platform, and the library they appear in did not declare them.
|
|
44
|
+
*/
|
|
45
|
+
const PLATFORM = new Set([
|
|
46
|
+
"array",
|
|
47
|
+
"buffer",
|
|
48
|
+
"console",
|
|
49
|
+
"crypto",
|
|
50
|
+
"document",
|
|
51
|
+
"fs",
|
|
52
|
+
"global",
|
|
53
|
+
"globalthis",
|
|
54
|
+
"intl",
|
|
55
|
+
"json",
|
|
56
|
+
"math",
|
|
57
|
+
"navigator",
|
|
58
|
+
"number",
|
|
59
|
+
"object",
|
|
60
|
+
"os",
|
|
61
|
+
"path",
|
|
62
|
+
"process",
|
|
63
|
+
"promise",
|
|
64
|
+
"reflect",
|
|
65
|
+
"regexp",
|
|
66
|
+
"stream",
|
|
67
|
+
"string",
|
|
68
|
+
"symbol",
|
|
69
|
+
"url",
|
|
70
|
+
"window",
|
|
71
|
+
]);
|
|
72
|
+
/** `wrangler.jsonc` is a filename that survives the entity regex, not a member access. */
|
|
73
|
+
const EXTENSIONS = new Set([
|
|
74
|
+
"cjs",
|
|
75
|
+
"css",
|
|
76
|
+
"html",
|
|
77
|
+
"js",
|
|
78
|
+
"json",
|
|
79
|
+
"jsonc",
|
|
80
|
+
"lock",
|
|
81
|
+
"md",
|
|
82
|
+
"mdx",
|
|
83
|
+
"mjs",
|
|
84
|
+
"toml",
|
|
85
|
+
"ts",
|
|
86
|
+
"tsx",
|
|
87
|
+
"txt",
|
|
88
|
+
"yaml",
|
|
89
|
+
"yml",
|
|
90
|
+
]);
|
|
91
|
+
/**
|
|
92
|
+
* Checks the identifiers documentation names against what the documented library declares.
|
|
93
|
+
*
|
|
94
|
+
* A finding is only produced when a name is absent *and* a very similar name exists — that is
|
|
95
|
+
* the signature of a rename. An absent name with nothing like it is far more likely to come
|
|
96
|
+
* from an example about some other library, so it is counted and ignored rather than reported.
|
|
97
|
+
* Precision matters more than recall here: a check that cries wolf is worse than no check.
|
|
98
|
+
*/
|
|
99
|
+
export async function verifyProject(options) {
|
|
100
|
+
const packages = options.packageDir === undefined
|
|
101
|
+
? await verifyInstalled(options.cwd)
|
|
102
|
+
: [await verifyOne(options.cwd, options.packageDir)];
|
|
103
|
+
return { packages, ok: packages.every((pkg) => pkg.findings.length === 0) };
|
|
104
|
+
}
|
|
105
|
+
async function verifyInstalled(cwd) {
|
|
106
|
+
const { packages } = await discoverPackages(cwd);
|
|
107
|
+
const results = [];
|
|
108
|
+
for (const pkg of packages) {
|
|
109
|
+
results.push(await verifyPackage(cwd, pkg.id, pkg.dir, pkg.manifest));
|
|
110
|
+
}
|
|
111
|
+
return results;
|
|
112
|
+
}
|
|
113
|
+
async function verifyOne(cwd, packageDir) {
|
|
114
|
+
let manifest;
|
|
115
|
+
try {
|
|
116
|
+
const raw = await readFile(join(packageDir, LLMS_DIR, MANIFEST_FILE), "utf8");
|
|
117
|
+
manifest = parseManifest(JSON.parse(raw), `${LLMS_DIR}/${MANIFEST_FILE}`);
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
throw new DocspackError(`No ${LLMS_DIR}/${MANIFEST_FILE} in ${packageDir}`, {
|
|
121
|
+
hint: "Run `docspack build` first.",
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
return verifyPackage(cwd, `${manifest.name}@${manifest.version}`, packageDir, manifest);
|
|
125
|
+
}
|
|
126
|
+
async function verifyPackage(cwd, id, packageDir, manifest) {
|
|
127
|
+
const empty = { id, checked: 0, matched: 0, unrecognised: 0, findings: [] };
|
|
128
|
+
const { documents } = await readBuildConfig(packageDir);
|
|
129
|
+
if (documents === undefined) {
|
|
130
|
+
return {
|
|
131
|
+
...empty,
|
|
132
|
+
status: "skipped",
|
|
133
|
+
reason: `declares no "docspack.documents", so there is nothing to check against`,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
const libraryDir = (await resolvePackageDir(documents, packageDir)) ?? (await resolvePackageDir(documents, cwd));
|
|
137
|
+
if (libraryDir === undefined) {
|
|
138
|
+
return { ...empty, status: "skipped", documents, reason: `${documents} is not installed` };
|
|
139
|
+
}
|
|
140
|
+
const surface = await readExportSurface(libraryDir);
|
|
141
|
+
if (surface === undefined || surface.names.size === 0) {
|
|
142
|
+
return {
|
|
143
|
+
...empty,
|
|
144
|
+
status: "skipped",
|
|
145
|
+
documents,
|
|
146
|
+
reason: `${documents} ships no type declarations to check against`,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
const declared = new Set([...surface.names].map(normalize));
|
|
150
|
+
const findings = [];
|
|
151
|
+
let checked = 0;
|
|
152
|
+
let matched = 0;
|
|
153
|
+
let unrecognised = 0;
|
|
154
|
+
for (const chunk of manifest.chunks) {
|
|
155
|
+
for (const entity of chunk.entities) {
|
|
156
|
+
const symbol = checkableSymbol(entity);
|
|
157
|
+
if (symbol === undefined)
|
|
158
|
+
continue;
|
|
159
|
+
checked += 1;
|
|
160
|
+
// Case and leading underscores differ between documentation and declarations often
|
|
161
|
+
// enough that treating them as drift is wrong.
|
|
162
|
+
if (declared.has(normalize(symbol))) {
|
|
163
|
+
matched += 1;
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
const suggestion = nearestName(symbol, surface);
|
|
167
|
+
if (suggestion === undefined) {
|
|
168
|
+
unrecognised += 1;
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
findings.push({
|
|
172
|
+
chunkId: chunkId(id, chunk.id),
|
|
173
|
+
file: chunk.file,
|
|
174
|
+
entity,
|
|
175
|
+
symbol,
|
|
176
|
+
suggestion,
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return { id, status: "verified", documents, checked, matched, unrecognised, findings };
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* The name worth checking in an entity like `client.setKey()`, or nothing when the entity is
|
|
184
|
+
* not about the library at all: a filename, a platform API, or a name too generic to place.
|
|
185
|
+
*/
|
|
186
|
+
function checkableSymbol(entity) {
|
|
187
|
+
const parts = entity.replace(/\(\)$/, "").split(".");
|
|
188
|
+
const symbol = parts[parts.length - 1] ?? entity;
|
|
189
|
+
const receiver = parts.length > 1 ? (parts[parts.length - 2] ?? "") : "";
|
|
190
|
+
if (symbol.length < MIN_SYMBOL)
|
|
191
|
+
return undefined;
|
|
192
|
+
if (EXTENSIONS.has(symbol.toLowerCase()))
|
|
193
|
+
return undefined;
|
|
194
|
+
if (UNIVERSAL.has(symbol.toLowerCase()))
|
|
195
|
+
return undefined;
|
|
196
|
+
if (PLATFORM.has(receiver.toLowerCase()))
|
|
197
|
+
return undefined;
|
|
198
|
+
return symbol;
|
|
199
|
+
}
|
|
200
|
+
/** Case and leading underscores are styling, not identity, when comparing two names. */
|
|
201
|
+
function normalize(name) {
|
|
202
|
+
return name.replace(/^_+/, "").toLowerCase();
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* The declared name a symbol was most likely renamed from, or nothing if no declared name
|
|
206
|
+
* resembles it closely enough to say so.
|
|
207
|
+
*
|
|
208
|
+
* Two shapes count, and only two. A near-identical spelling of the same leading word, which
|
|
209
|
+
* catches typos and small edits; and a qualifier inserted between the same first and last word
|
|
210
|
+
* — `setKey` against `setApiKey` — which is what most real renames look like. Everything else
|
|
211
|
+
* is left alone. In particular a differing first word is never a match: `includeLanguages` and
|
|
212
|
+
* `excludeLanguages` are two edits apart and mean opposite things.
|
|
213
|
+
*/
|
|
214
|
+
function nearestName(symbol, surface) {
|
|
215
|
+
const lower = normalize(symbol);
|
|
216
|
+
const words = camelWords(symbol);
|
|
217
|
+
let best;
|
|
218
|
+
let bestDistance = Number.POSITIVE_INFINITY;
|
|
219
|
+
for (const candidate of surface.names) {
|
|
220
|
+
if (candidate.length < MIN_SYMBOL)
|
|
221
|
+
continue;
|
|
222
|
+
const candidateWords = camelWords(candidate);
|
|
223
|
+
if (isRequalified(words, candidateWords))
|
|
224
|
+
return candidate;
|
|
225
|
+
if (candidateWords[0] !== words[0])
|
|
226
|
+
continue;
|
|
227
|
+
const other = normalize(candidate);
|
|
228
|
+
if (Math.abs(other.length - lower.length) > 4)
|
|
229
|
+
continue;
|
|
230
|
+
const distance = editDistance(lower, other, 3);
|
|
231
|
+
if (distance < bestDistance) {
|
|
232
|
+
bestDistance = distance;
|
|
233
|
+
best = candidate;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
if (best === undefined || bestDistance > 2)
|
|
237
|
+
return undefined;
|
|
238
|
+
// A two-character difference between two short names is coincidence more often than a rename.
|
|
239
|
+
if (bestDistance === 2 && symbol.length < 8)
|
|
240
|
+
return undefined;
|
|
241
|
+
return best;
|
|
242
|
+
}
|
|
243
|
+
/** `setApiKey` becomes `["set", "api", "key"]`. */
|
|
244
|
+
function camelWords(name) {
|
|
245
|
+
return name
|
|
246
|
+
.replace(/([a-z0-9])([A-Z])/g, "$1 $2")
|
|
247
|
+
.split(/[\s_$-]+/)
|
|
248
|
+
.filter((word) => word.length > 0)
|
|
249
|
+
.map((word) => word.toLowerCase());
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* True when the two names are the same multi-word name with a qualifier inserted, in either
|
|
253
|
+
* direction. Requiring the first and last word to match, and both names to have at least two
|
|
254
|
+
* words, is what keeps this from firing on every method that happens to start with `get`.
|
|
255
|
+
*/
|
|
256
|
+
function isRequalified(a, b) {
|
|
257
|
+
const [shorter, longer] = a.length <= b.length ? [a, b] : [b, a];
|
|
258
|
+
if (shorter.length < 2 || longer.length <= shorter.length)
|
|
259
|
+
return false;
|
|
260
|
+
if (shorter[0] !== longer[0])
|
|
261
|
+
return false;
|
|
262
|
+
if (shorter[shorter.length - 1] !== longer[longer.length - 1])
|
|
263
|
+
return false;
|
|
264
|
+
let index = 0;
|
|
265
|
+
for (const word of longer) {
|
|
266
|
+
if (word === shorter[index])
|
|
267
|
+
index += 1;
|
|
268
|
+
}
|
|
269
|
+
return index === shorter.length;
|
|
270
|
+
}
|
|
271
|
+
/** Levenshtein distance, abandoned once it passes `limit`. */
|
|
272
|
+
function editDistance(a, b, limit) {
|
|
273
|
+
if (Math.abs(a.length - b.length) > limit)
|
|
274
|
+
return limit + 1;
|
|
275
|
+
let previous = Array.from({ length: b.length + 1 }, (_, index) => index);
|
|
276
|
+
for (let i = 1; i <= a.length; i += 1) {
|
|
277
|
+
const current = [i];
|
|
278
|
+
let rowBest = i;
|
|
279
|
+
for (let j = 1; j <= b.length; j += 1) {
|
|
280
|
+
const cost = a[i - 1] === b[j - 1] ? 0 : 1;
|
|
281
|
+
const value = Math.min((current[j - 1] ?? 0) + 1, (previous[j] ?? 0) + 1, (previous[j - 1] ?? 0) + cost);
|
|
282
|
+
current.push(value);
|
|
283
|
+
rowBest = Math.min(rowBest, value);
|
|
284
|
+
}
|
|
285
|
+
if (rowBest > limit)
|
|
286
|
+
return limit + 1;
|
|
287
|
+
previous = current;
|
|
288
|
+
}
|
|
289
|
+
return previous[b.length] ?? limit + 1;
|
|
290
|
+
}
|
|
291
|
+
//# sourceMappingURL=verify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../src/verify.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,9 +1,64 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "docspack",
|
|
3
|
-
"version": "0.0
|
|
4
|
-
"description": "Local, version-locked
|
|
5
|
-
"
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Local, version-locked documentation packages for AI agents, indexed in SQLite and served over MCP.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"ai",
|
|
7
|
+
"agents",
|
|
8
|
+
"mcp",
|
|
9
|
+
"documentation",
|
|
10
|
+
"docs",
|
|
11
|
+
"llms.txt",
|
|
12
|
+
"sqlite",
|
|
13
|
+
"fts5",
|
|
14
|
+
"context",
|
|
15
|
+
"cli"
|
|
16
|
+
],
|
|
17
|
+
"homepage": "https://github.com/docspack/docspack#readme",
|
|
18
|
+
"bugs": "https://github.com/docspack/docspack/issues",
|
|
19
|
+
"repository": {
|
|
20
|
+
"type": "git",
|
|
21
|
+
"url": "git+https://github.com/docspack/docspack.git",
|
|
22
|
+
"directory": "packages/docspack"
|
|
23
|
+
},
|
|
24
|
+
"license": "MIT",
|
|
25
|
+
"type": "module",
|
|
6
26
|
"bin": {
|
|
7
|
-
"docspack": "./bin/
|
|
27
|
+
"docspack": "./bin/docspack.js"
|
|
28
|
+
},
|
|
29
|
+
"main": "./dist/index.js",
|
|
30
|
+
"types": "./dist/index.d.ts",
|
|
31
|
+
"exports": {
|
|
32
|
+
".": {
|
|
33
|
+
"types": "./dist/index.d.ts",
|
|
34
|
+
"default": "./dist/index.js"
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
"files": [
|
|
38
|
+
"bin",
|
|
39
|
+
"dist",
|
|
40
|
+
"README.md",
|
|
41
|
+
"src"
|
|
42
|
+
],
|
|
43
|
+
"engines": {
|
|
44
|
+
"node": ">=22.5.0"
|
|
45
|
+
},
|
|
46
|
+
"dependencies": {
|
|
47
|
+
"@modelcontextprotocol/sdk": "1.30.0",
|
|
48
|
+
"turndown": "7.2.4",
|
|
49
|
+
"zod": "4.4.3",
|
|
50
|
+
"@docspack/registry": "^0.1.0"
|
|
51
|
+
},
|
|
52
|
+
"devDependencies": {
|
|
53
|
+
"@types/node": "26.2.0",
|
|
54
|
+
"@types/turndown": "5.0.6",
|
|
55
|
+
"typescript": "6.0.3",
|
|
56
|
+
"vitest": "4.1.10",
|
|
57
|
+
"@docspack/config": "0.1.0"
|
|
58
|
+
},
|
|
59
|
+
"scripts": {
|
|
60
|
+
"build": "tsc -p tsconfig.json",
|
|
61
|
+
"check-types": "tsc -p tsconfig.json --noEmit && tsc -p tsconfig.test.json",
|
|
62
|
+
"test": "vitest run"
|
|
8
63
|
}
|
|
9
|
-
}
|
|
64
|
+
}
|