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.
Files changed (155) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +59 -0
  3. package/bin/docspack.js +25 -0
  4. package/dist/build.d.ts +31 -0
  5. package/dist/build.d.ts.map +1 -0
  6. package/dist/build.js +435 -0
  7. package/dist/build.js.map +1 -0
  8. package/dist/cli.d.ts +3 -0
  9. package/dist/cli.d.ts.map +1 -0
  10. package/dist/cli.js +763 -0
  11. package/dist/cli.js.map +1 -0
  12. package/dist/config.d.ts +41 -0
  13. package/dist/config.d.ts.map +1 -0
  14. package/dist/config.js +118 -0
  15. package/dist/config.js.map +1 -0
  16. package/dist/db.d.ts +60 -0
  17. package/dist/db.d.ts.map +1 -0
  18. package/dist/db.js +204 -0
  19. package/dist/db.js.map +1 -0
  20. package/dist/discovery.d.ts +31 -0
  21. package/dist/discovery.d.ts.map +1 -0
  22. package/dist/discovery.js +126 -0
  23. package/dist/discovery.js.map +1 -0
  24. package/dist/doctor.d.ts +25 -0
  25. package/dist/doctor.d.ts.map +1 -0
  26. package/dist/doctor.js +276 -0
  27. package/dist/doctor.js.map +1 -0
  28. package/dist/document.d.ts +13 -0
  29. package/dist/document.d.ts.map +1 -0
  30. package/dist/document.js +47 -0
  31. package/dist/document.js.map +1 -0
  32. package/dist/errors.d.ts +9 -0
  33. package/dist/errors.d.ts.map +1 -0
  34. package/dist/errors.js +10 -0
  35. package/dist/errors.js.map +1 -0
  36. package/dist/exports.d.ts +20 -0
  37. package/dist/exports.d.ts.map +1 -0
  38. package/dist/exports.js +100 -0
  39. package/dist/exports.js.map +1 -0
  40. package/dist/feedback.d.ts +68 -0
  41. package/dist/feedback.d.ts.map +1 -0
  42. package/dist/feedback.js +0 -0
  43. package/dist/feedback.js.map +1 -0
  44. package/dist/html.d.ts +4 -0
  45. package/dist/html.d.ts.map +1 -0
  46. package/dist/html.js +23 -0
  47. package/dist/html.js.map +1 -0
  48. package/dist/http.d.ts +30 -0
  49. package/dist/http.d.ts.map +1 -0
  50. package/dist/http.js +144 -0
  51. package/dist/http.js.map +1 -0
  52. package/dist/index.d.ts +25 -0
  53. package/dist/index.d.ts.map +1 -0
  54. package/dist/index.js +25 -0
  55. package/dist/index.js.map +1 -0
  56. package/dist/init/detect.d.ts +16 -0
  57. package/dist/init/detect.d.ts.map +1 -0
  58. package/dist/init/detect.js +120 -0
  59. package/dist/init/detect.js.map +1 -0
  60. package/dist/init/plan.d.ts +43 -0
  61. package/dist/init/plan.d.ts.map +1 -0
  62. package/dist/init/plan.js +145 -0
  63. package/dist/init/plan.js.map +1 -0
  64. package/dist/init/run.d.ts +28 -0
  65. package/dist/init/run.d.ts.map +1 -0
  66. package/dist/init/run.js +96 -0
  67. package/dist/init/run.js.map +1 -0
  68. package/dist/init/templates.d.ts +24 -0
  69. package/dist/init/templates.d.ts.map +1 -0
  70. package/dist/init/templates.js +181 -0
  71. package/dist/init/templates.js.map +1 -0
  72. package/dist/init/write.d.ts +20 -0
  73. package/dist/init/write.d.ts.map +1 -0
  74. package/dist/init/write.js +56 -0
  75. package/dist/init/write.js.map +1 -0
  76. package/dist/kinds.d.ts +14 -0
  77. package/dist/kinds.d.ts.map +1 -0
  78. package/dist/kinds.js +15 -0
  79. package/dist/kinds.js.map +1 -0
  80. package/dist/llms-txt.d.ts +25 -0
  81. package/dist/llms-txt.d.ts.map +1 -0
  82. package/dist/llms-txt.js +94 -0
  83. package/dist/llms-txt.js.map +1 -0
  84. package/dist/mcp.d.ts +15 -0
  85. package/dist/mcp.d.ts.map +1 -0
  86. package/dist/mcp.js +158 -0
  87. package/dist/mcp.js.map +1 -0
  88. package/dist/preview.d.ts +18 -0
  89. package/dist/preview.d.ts.map +1 -0
  90. package/dist/preview.js +72 -0
  91. package/dist/preview.js.map +1 -0
  92. package/dist/prompt.d.ts +27 -0
  93. package/dist/prompt.d.ts.map +1 -0
  94. package/dist/prompt.js +79 -0
  95. package/dist/prompt.js.map +1 -0
  96. package/dist/search.d.ts +41 -0
  97. package/dist/search.d.ts.map +1 -0
  98. package/dist/search.js +60 -0
  99. package/dist/search.js.map +1 -0
  100. package/dist/snippet.d.ts +20 -0
  101. package/dist/snippet.d.ts.map +1 -0
  102. package/dist/snippet.js +29 -0
  103. package/dist/snippet.js.map +1 -0
  104. package/dist/spec.d.ts +38 -0
  105. package/dist/spec.d.ts.map +1 -0
  106. package/dist/spec.js +105 -0
  107. package/dist/spec.js.map +1 -0
  108. package/dist/style.d.ts +33 -0
  109. package/dist/style.d.ts.map +1 -0
  110. package/dist/style.js +94 -0
  111. package/dist/style.js.map +1 -0
  112. package/dist/submit.d.ts +61 -0
  113. package/dist/submit.d.ts.map +1 -0
  114. package/dist/submit.js +111 -0
  115. package/dist/submit.js.map +1 -0
  116. package/dist/sync.d.ts +29 -0
  117. package/dist/sync.d.ts.map +1 -0
  118. package/dist/sync.js +73 -0
  119. package/dist/sync.js.map +1 -0
  120. package/dist/verify.d.ts +44 -0
  121. package/dist/verify.d.ts.map +1 -0
  122. package/dist/verify.js +291 -0
  123. package/dist/verify.js.map +1 -0
  124. package/package.json +60 -5
  125. package/src/build.ts +572 -0
  126. package/src/cli.ts +883 -0
  127. package/src/config.ts +158 -0
  128. package/src/db.ts +261 -0
  129. package/src/discovery.ts +161 -0
  130. package/src/doctor.ts +344 -0
  131. package/src/document.ts +59 -0
  132. package/src/errors.ts +10 -0
  133. package/src/exports.ts +120 -0
  134. package/src/feedback.ts +0 -0
  135. package/src/html.ts +24 -0
  136. package/src/http.ts +190 -0
  137. package/src/index.ts +132 -0
  138. package/src/init/detect.ts +142 -0
  139. package/src/init/plan.ts +215 -0
  140. package/src/init/run.ts +142 -0
  141. package/src/init/templates.ts +200 -0
  142. package/src/init/write.ts +83 -0
  143. package/src/kinds.ts +17 -0
  144. package/src/llms-txt.ts +116 -0
  145. package/src/mcp.ts +196 -0
  146. package/src/preview.ts +98 -0
  147. package/src/prompt.ts +103 -0
  148. package/src/search.ts +96 -0
  149. package/src/snippet.ts +30 -0
  150. package/src/spec.ts +138 -0
  151. package/src/style.ts +111 -0
  152. package/src/submit.ts +189 -0
  153. package/src/sync.ts +112 -0
  154. package/src/verify.ts +355 -0
  155. 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.1",
4
- "description": "Local, version-locked AI documentation package manager. (Work in progress)",
5
- "main": "index.js",
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/cli.js"
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
+ }