docspack 0.4.0 → 1.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 (91) hide show
  1. package/README.md +31 -0
  2. package/dist/agent.d.ts +48 -0
  3. package/dist/agent.d.ts.map +1 -0
  4. package/dist/agent.js +243 -0
  5. package/dist/agent.js.map +1 -0
  6. package/dist/artifact.d.ts +32 -0
  7. package/dist/artifact.d.ts.map +1 -0
  8. package/dist/artifact.js +78 -0
  9. package/dist/artifact.js.map +1 -0
  10. package/dist/build.d.ts +23 -0
  11. package/dist/build.d.ts.map +1 -1
  12. package/dist/build.js +201 -96
  13. package/dist/build.js.map +1 -1
  14. package/dist/changed.d.ts +31 -0
  15. package/dist/changed.d.ts.map +1 -0
  16. package/dist/changed.js +71 -0
  17. package/dist/changed.js.map +1 -0
  18. package/dist/cli.js +222 -12
  19. package/dist/cli.js.map +1 -1
  20. package/dist/coverage.d.ts +35 -0
  21. package/dist/coverage.d.ts.map +1 -0
  22. package/dist/coverage.js +64 -0
  23. package/dist/coverage.js.map +1 -0
  24. package/dist/db.d.ts +75 -2
  25. package/dist/db.d.ts.map +1 -1
  26. package/dist/db.js +168 -6
  27. package/dist/db.js.map +1 -1
  28. package/dist/discovery.d.ts +14 -0
  29. package/dist/discovery.d.ts.map +1 -1
  30. package/dist/discovery.js +31 -6
  31. package/dist/discovery.js.map +1 -1
  32. package/dist/doctor.d.ts.map +1 -1
  33. package/dist/doctor.js +60 -9
  34. package/dist/doctor.js.map +1 -1
  35. package/dist/endpoints.d.ts +45 -0
  36. package/dist/endpoints.d.ts.map +1 -0
  37. package/dist/endpoints.js +155 -0
  38. package/dist/endpoints.js.map +1 -0
  39. package/dist/help.d.ts.map +1 -1
  40. package/dist/help.js +120 -5
  41. package/dist/help.js.map +1 -1
  42. package/dist/index.d.ts +10 -4
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +10 -4
  45. package/dist/index.js.map +1 -1
  46. package/dist/local.d.ts +67 -0
  47. package/dist/local.d.ts.map +1 -0
  48. package/dist/local.js +242 -0
  49. package/dist/local.js.map +1 -0
  50. package/dist/mcp.d.ts.map +1 -1
  51. package/dist/mcp.js +3 -0
  52. package/dist/mcp.js.map +1 -1
  53. package/dist/preview.d.ts.map +1 -1
  54. package/dist/preview.js +26 -7
  55. package/dist/preview.js.map +1 -1
  56. package/dist/search.d.ts +22 -1
  57. package/dist/search.d.ts.map +1 -1
  58. package/dist/search.js +147 -22
  59. package/dist/search.js.map +1 -1
  60. package/dist/surface.d.ts +45 -0
  61. package/dist/surface.d.ts.map +1 -0
  62. package/dist/surface.js +208 -0
  63. package/dist/surface.js.map +1 -0
  64. package/dist/sync.d.ts +8 -1
  65. package/dist/sync.d.ts.map +1 -1
  66. package/dist/sync.js +50 -1
  67. package/dist/sync.js.map +1 -1
  68. package/dist/verify.d.ts +9 -0
  69. package/dist/verify.d.ts.map +1 -1
  70. package/dist/verify.js +1 -1
  71. package/dist/verify.js.map +1 -1
  72. package/package.json +7 -5
  73. package/src/agent.ts +308 -0
  74. package/src/artifact.ts +110 -0
  75. package/src/build.ts +240 -111
  76. package/src/changed.ts +99 -0
  77. package/src/cli.ts +263 -12
  78. package/src/coverage.ts +96 -0
  79. package/src/db.ts +250 -7
  80. package/src/discovery.ts +40 -5
  81. package/src/doctor.ts +68 -8
  82. package/src/endpoints.ts +184 -0
  83. package/src/help.ts +120 -5
  84. package/src/index.ts +52 -1
  85. package/src/local.ts +335 -0
  86. package/src/mcp.ts +3 -0
  87. package/src/preview.ts +38 -13
  88. package/src/search.ts +203 -23
  89. package/src/surface.ts +265 -0
  90. package/src/sync.ts +66 -2
  91. package/src/verify.ts +1 -1
package/dist/db.d.ts CHANGED
@@ -1,9 +1,47 @@
1
+ /**
2
+ * Where a package's text came from. `docs` is written by a human and published as a docs
3
+ * package; `artifact` is derived from an installed library's own type declarations; `local` is a
4
+ * working corpus indexed from this project's own sources and never published. The
5
+ * distinction is not cosmetic — a signature is a fact about the build, prose is a claim by its
6
+ * author, and a working corpus is a copy that can go stale under the reader — so it is stored
7
+ * rather than inferred from the name.
8
+ */
9
+ export type PackageKind = "docs" | "artifact" | "local";
10
+ /**
11
+ * Reads the stored kind, defaulting an unrecognized one to `docs`.
12
+ *
13
+ * Written once rather than inline at each read: a store may have been written by a newer version
14
+ * that knows a kind this one does not, and silently relabelling it as something it is not is how
15
+ * a local corpus would end up presented as published documentation.
16
+ */
17
+ export declare function toPackageKind(value: string): PackageKind;
1
18
  export interface IndexedPackage {
2
19
  readonly id: string;
3
20
  readonly name: string;
4
21
  readonly version: string;
22
+ readonly kind?: PackageKind;
5
23
  readonly indexedAt?: string;
6
24
  }
25
+ /** An exported name and the chunk carrying its declaration. */
26
+ export interface SymbolHit {
27
+ readonly name: string;
28
+ readonly packageId: string;
29
+ readonly chunkId: string;
30
+ }
31
+ /**
32
+ * A file an indexed package was built from, as it was at index time.
33
+ *
34
+ * Only a working corpus records these. Published documentation is immutable for the life of its
35
+ * version, so there is nothing to detect; a corpus of the reader's own files is edited underneath
36
+ * the index, and an answer quoted from a superseded source is worse than no answer.
37
+ */
38
+ export interface IndexedSource {
39
+ readonly path: string;
40
+ readonly size: number;
41
+ /** ISO timestamp, as text, because that is what survives a round trip through SQLite. */
42
+ readonly mtime: string;
43
+ readonly hash: string;
44
+ }
7
45
  export interface IndexedChunk {
8
46
  readonly chunkId: string;
9
47
  readonly filePath: string;
@@ -26,12 +64,24 @@ export interface SearchOptions {
26
64
  readonly limit?: number;
27
65
  /** Stop returning chunks once this many tokens have been collected. */
28
66
  readonly maxTokens?: number;
67
+ /** Restrict to packages of these kinds. Defaults to every kind. */
68
+ readonly kinds?: readonly PackageKind[];
29
69
  }
70
+ /** Where per-project state lives, alongside the feedback file already written there. */
71
+ export declare const LOCAL_STORE_DIR = ".docspack";
30
72
  /**
31
73
  * `node:sqlite` is still flagged experimental on Node 22 and warns when it is loaded. The database
32
74
  * is an implementation detail of this tool, so the warning is noise for its users.
33
75
  */
34
76
  export declare function silenceSqliteWarning(): void;
77
+ /**
78
+ * Where a project's own working corpus is indexed.
79
+ *
80
+ * Deliberately not the global store: these chunks are a plaintext copy of one project's sources,
81
+ * they are worthless to any other project, and a machine-wide store would accumulate them from
82
+ * every checkout with nothing to evict them.
83
+ */
84
+ export declare function localStorePath(cwd: string): string;
35
85
  /** Default location of the shared index, mirroring pnpm's global store. */
36
86
  export declare function defaultStorePath(env?: NodeJS.ProcessEnv): string;
37
87
  /**
@@ -55,9 +105,32 @@ export declare class Store {
55
105
  static open(path?: string): Store;
56
106
  hasPackage(id: string): boolean;
57
107
  listPackages(): IndexedPackage[];
108
+ /** Every version of one library in the store, newest indexing first. */
109
+ versionsOf(name: string): IndexedPackage[];
110
+ /**
111
+ * Chunks declaring an exported name, by exact match rather than by ranking.
112
+ *
113
+ * A symbol is a key, not a phrase. Ranking one is the mistake that made `docspack ask` unable
114
+ * to tell "the documentation does not mention this" from "nothing matched".
115
+ */
116
+ lookupSymbol(name: string, packageIds?: readonly string[]): SymbolHit[];
117
+ /** Every chunk of one package, for a check that has to read the whole corpus. */
118
+ chunksOf(packageId: string): SearchHit[];
119
+ /** Every exported name recorded for one package. */
120
+ symbolsOf(packageId: string): string[];
121
+ /** One chunk by its id, however it was found. */
122
+ chunk(chunkId: string): SearchHit | undefined;
58
123
  countChunks(packageId: string): number;
59
- /** Replaces a package and all of its chunks in a single transaction. */
60
- indexPackage(pkg: IndexedPackage, chunks: readonly IndexedChunk[]): void;
124
+ /**
125
+ * Replaces a package, all of its chunks and its symbol table in a single transaction.
126
+ *
127
+ * `symbols` maps an exported name to the chunk declaring it, and is how a query about a name
128
+ * is answered without ranking anything.
129
+ */
130
+ indexPackage(pkg: IndexedPackage, chunks: readonly IndexedChunk[], symbols?: ReadonlyMap<string, string>): void;
131
+ /** Replaces the record of what a package was built from. */
132
+ recordSources(packageId: string, sources: readonly IndexedSource[]): void;
133
+ sourcesOf(packageId: string): IndexedSource[];
61
134
  removePackage(id: string): void;
62
135
  /**
63
136
  * Full-text search, ranked by bm25. Results stop early once `maxTokens` is reached, so a caller
package/dist/db.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,qEAAqE;IACrE,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,gEAAgE;IAChE,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,uEAAuE;IACvE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AA+BD;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAO3C;AAWD,2EAA2E;AAC3E,wBAAgB,gBAAgB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAI7E;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAW9C;AAED,0FAA0F;AAC1F,qBAAa,KAAK;;IAGhB,OAAO;IAOP,MAAM,CAAC,IAAI,CAAC,IAAI,GAAE,MAA2B,GAAG,KAAK;IAYrD,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAI/B,YAAY,IAAI,cAAc,EAAE;IAYhC,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAOtC,wEAAwE;IACxE,YAAY,CAAC,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,SAAS,YAAY,EAAE,GAAG,IAAI;IA0BxE,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAY/B;;;OAGG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,SAAS,EAAE;IAmD/D,KAAK,IAAI,IAAI;CAQd"}
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAUA;;;;;;;GAOG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,CAAC;AAExD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAExD;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,+DAA+D;AAC/D,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;GAMG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,yFAAyF;IACzF,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,qEAAqE;IACrE,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,gEAAgE;IAChE,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,uEAAuE;IACvE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,mEAAmE;IACnE,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;CACzC;AAED,wFAAwF;AACxF,eAAO,MAAM,eAAe,cAAc,CAAC;AAkD3C;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAO3C;AAWD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,2EAA2E;AAC3E,wBAAgB,gBAAgB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAI7E;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAW9C;AAED,0FAA0F;AAC1F,qBAAa,KAAK;;IAGhB,OAAO;IAoBP,MAAM,CAAC,IAAI,CAAC,IAAI,GAAE,MAA2B,GAAG,KAAK;IAYrD,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAI/B,YAAY,IAAI,cAAc,EAAE;IAmBhC,wEAAwE;IACxE,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,EAAE;IAI1C;;;;;OAKG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,EAAE;IAsBvE,iFAAiF;IACjF,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE;IAuBxC,oDAAoD;IACpD,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE;IAOtC,iDAAiD;IACjD,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IA0B7C,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAOtC;;;;;OAKG;IACH,YAAY,CACV,GAAG,EAAE,cAAc,EACnB,MAAM,EAAE,SAAS,YAAY,EAAE,EAC/B,OAAO,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GACpC,IAAI;IA8BP,4DAA4D;IAC5D,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,aAAa,EAAE,GAAG,IAAI;IAiBzE,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,EAAE;IAY7C,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAY/B;;;OAGG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,SAAS,EAAE;IA0D/D,KAAK,IAAI,IAAI;CAUd"}
package/dist/db.js CHANGED
@@ -5,12 +5,25 @@ import { dirname, join } from "node:path";
5
5
  import { DocspackError } from "./errors.js";
6
6
  import { STOPWORDS } from "./stopwords.js";
7
7
  const require = createRequire(import.meta.url);
8
- const SCHEMA_VERSION = 1;
8
+ /**
9
+ * Reads the stored kind, defaulting an unrecognized one to `docs`.
10
+ *
11
+ * Written once rather than inline at each read: a store may have been written by a newer version
12
+ * that knows a kind this one does not, and silently relabelling it as something it is not is how
13
+ * a local corpus would end up presented as published documentation.
14
+ */
15
+ export function toPackageKind(value) {
16
+ return value === "artifact" || value === "local" ? value : "docs";
17
+ }
18
+ /** Where per-project state lives, alongside the feedback file already written there. */
19
+ export const LOCAL_STORE_DIR = ".docspack";
20
+ const SCHEMA_VERSION = 3;
9
21
  const SCHEMA = `
10
22
  CREATE TABLE IF NOT EXISTS packages (
11
23
  id TEXT PRIMARY KEY,
12
24
  name TEXT NOT NULL,
13
25
  version TEXT NOT NULL,
26
+ kind TEXT NOT NULL DEFAULT 'docs',
14
27
  indexed_at DATETIME DEFAULT CURRENT_TIMESTAMP
15
28
  );
16
29
 
@@ -24,6 +37,24 @@ CREATE TABLE IF NOT EXISTS chunks (
24
37
 
25
38
  CREATE INDEX IF NOT EXISTS chunks_by_package ON chunks(package_id);
26
39
 
40
+ CREATE TABLE IF NOT EXISTS symbols (
41
+ package_id TEXT NOT NULL REFERENCES packages(id),
42
+ name TEXT NOT NULL,
43
+ chunk_id TEXT NOT NULL,
44
+ PRIMARY KEY (package_id, name)
45
+ );
46
+
47
+ CREATE INDEX IF NOT EXISTS symbols_by_name ON symbols(name);
48
+
49
+ CREATE TABLE IF NOT EXISTS sources (
50
+ package_id TEXT NOT NULL REFERENCES packages(id),
51
+ path TEXT NOT NULL,
52
+ size INTEGER NOT NULL,
53
+ mtime TEXT NOT NULL,
54
+ hash TEXT NOT NULL,
55
+ PRIMARY KEY (package_id, path)
56
+ );
57
+
27
58
  CREATE VIRTUAL TABLE IF NOT EXISTS chunks_fts USING fts5(
28
59
  content,
29
60
  tags,
@@ -53,6 +84,16 @@ function loadSqlite() {
53
84
  silenceSqliteWarning();
54
85
  return require("node:sqlite");
55
86
  }
87
+ /**
88
+ * Where a project's own working corpus is indexed.
89
+ *
90
+ * Deliberately not the global store: these chunks are a plaintext copy of one project's sources,
91
+ * they are worthless to any other project, and a machine-wide store would accumulate them from
92
+ * every checkout with nothing to evict them.
93
+ */
94
+ export function localStorePath(cwd) {
95
+ return join(cwd, LOCAL_STORE_DIR, "local.db");
96
+ }
56
97
  /** Default location of the shared index, mirroring pnpm's global store. */
57
98
  export function defaultStorePath(env = process.env) {
58
99
  const override = env.DOCSPACK_STORE;
@@ -92,8 +133,20 @@ export class Store {
92
133
  this.#db = db;
93
134
  this.#db.exec("PRAGMA journal_mode = WAL");
94
135
  this.#db.exec(SCHEMA);
136
+ this.#migrate();
95
137
  this.#db.exec(`PRAGMA user_version = ${SCHEMA_VERSION}`);
96
138
  }
139
+ /**
140
+ * Brings a store written by an older version forward. `CREATE TABLE IF NOT EXISTS` covers a
141
+ * new table, but not a new column on one that already exists, and rebuilding the whole index
142
+ * to add one would make an upgrade re-read every package on the machine.
143
+ */
144
+ #migrate() {
145
+ const columns = this.#db.prepare("PRAGMA table_info(packages)").all();
146
+ if (!columns.some((column) => column.name === "kind")) {
147
+ this.#db.exec("ALTER TABLE packages ADD COLUMN kind TEXT NOT NULL DEFAULT 'docs'");
148
+ }
149
+ }
97
150
  static open(path = defaultStorePath()) {
98
151
  if (path !== ":memory:")
99
152
  mkdirSync(dirname(path), { recursive: true });
@@ -112,34 +165,108 @@ export class Store {
112
165
  }
113
166
  listPackages() {
114
167
  const rows = this.#db
115
- .prepare("SELECT id, name, version, indexed_at FROM packages ORDER BY name, version")
168
+ .prepare("SELECT id, name, version, kind, indexed_at FROM packages ORDER BY name, version")
116
169
  .all();
117
170
  return rows.map((row) => ({
118
171
  id: row.id,
119
172
  name: row.name,
120
173
  version: row.version,
174
+ kind: toPackageKind(row.kind),
121
175
  indexedAt: row.indexed_at,
122
176
  }));
123
177
  }
178
+ /** Every version of one library in the store, newest indexing first. */
179
+ versionsOf(name) {
180
+ return this.listPackages().filter((pkg) => pkg.name === name);
181
+ }
182
+ /**
183
+ * Chunks declaring an exported name, by exact match rather than by ranking.
184
+ *
185
+ * A symbol is a key, not a phrase. Ranking one is the mistake that made `docspack ask` unable
186
+ * to tell "the documentation does not mention this" from "nothing matched".
187
+ */
188
+ lookupSymbol(name, packageIds) {
189
+ if (packageIds !== undefined && packageIds.length === 0)
190
+ return [];
191
+ const scope = packageIds === undefined
192
+ ? ""
193
+ : ` AND package_id IN (${packageIds.map(() => "?").join(", ")})`;
194
+ const rows = this.#db
195
+ .prepare(
196
+ // A package that declares the name comes first: an empty chunk id means the name is
197
+ // exported but its declaration was not readable, which answers less.
198
+ `SELECT name, package_id AS packageId, chunk_id AS chunkId
199
+ FROM symbols WHERE name = ?${scope}
200
+ ORDER BY (chunk_id = '') ASC, package_id`)
201
+ .all(name, ...(packageIds ?? []));
202
+ return rows.map((row) => ({ name: row.name, packageId: row.packageId, chunkId: row.chunkId }));
203
+ }
204
+ /** Every chunk of one package, for a check that has to read the whole corpus. */
205
+ chunksOf(packageId) {
206
+ const rows = this.#db
207
+ .prepare(`SELECT chunk_id AS chunkId, package_id AS packageId, file_path AS filePath,
208
+ tokens, content
209
+ FROM chunks WHERE package_id = ?`)
210
+ .all(packageId);
211
+ return rows.map((row) => ({
212
+ chunkId: row.chunkId,
213
+ packageId: row.packageId,
214
+ filePath: row.filePath,
215
+ tokens: Number(row.tokens ?? 0),
216
+ content: row.content,
217
+ }));
218
+ }
219
+ /** Every exported name recorded for one package. */
220
+ symbolsOf(packageId) {
221
+ const rows = this.#db
222
+ .prepare("SELECT name FROM symbols WHERE package_id = ? ORDER BY name")
223
+ .all(packageId);
224
+ return rows.map((row) => row.name);
225
+ }
226
+ /** One chunk by its id, however it was found. */
227
+ chunk(chunkId) {
228
+ const row = this.#db
229
+ .prepare(`SELECT chunk_id AS chunkId, package_id AS packageId, file_path AS filePath,
230
+ tokens, content
231
+ FROM chunks WHERE chunk_id = ?`)
232
+ .get(chunkId);
233
+ if (row === undefined)
234
+ return undefined;
235
+ return {
236
+ chunkId: row.chunkId,
237
+ packageId: row.packageId,
238
+ filePath: row.filePath,
239
+ tokens: Number(row.tokens ?? 0),
240
+ content: row.content,
241
+ };
242
+ }
124
243
  countChunks(packageId) {
125
244
  const row = this.#db
126
245
  .prepare("SELECT COUNT(*) AS total FROM chunks WHERE package_id = ?")
127
246
  .get(packageId);
128
247
  return row.total;
129
248
  }
130
- /** Replaces a package and all of its chunks in a single transaction. */
131
- indexPackage(pkg, chunks) {
132
- const insertPackage = this.#db.prepare("INSERT OR REPLACE INTO packages (id, name, version) VALUES (?, ?, ?)");
249
+ /**
250
+ * Replaces a package, all of its chunks and its symbol table in a single transaction.
251
+ *
252
+ * `symbols` maps an exported name to the chunk declaring it, and is how a query about a name
253
+ * is answered without ranking anything.
254
+ */
255
+ indexPackage(pkg, chunks, symbols) {
256
+ const insertPackage = this.#db.prepare("INSERT OR REPLACE INTO packages (id, name, version, kind) VALUES (?, ?, ?, ?)");
133
257
  const insertChunk = this.#db.prepare("INSERT OR REPLACE INTO chunks (chunk_id, package_id, file_path, tokens, content) VALUES (?, ?, ?, ?, ?)");
134
258
  const insertFts = this.#db.prepare("INSERT INTO chunks_fts (content, tags, package_id, chunk_id) VALUES (?, ?, ?, ?)");
259
+ const insertSymbol = this.#db.prepare("INSERT OR REPLACE INTO symbols (package_id, name, chunk_id) VALUES (?, ?, ?)");
135
260
  this.#db.exec("BEGIN");
136
261
  try {
137
262
  this.#deleteChunks(pkg.id);
138
- insertPackage.run(pkg.id, pkg.name, pkg.version);
263
+ insertPackage.run(pkg.id, pkg.name, pkg.version, pkg.kind ?? "docs");
139
264
  for (const chunk of chunks) {
140
265
  insertChunk.run(chunk.chunkId, pkg.id, chunk.filePath, chunk.tokens, chunk.content);
141
266
  insertFts.run(chunk.content, chunk.tags.join(" "), pkg.id, chunk.chunkId);
142
267
  }
268
+ for (const [name, chunk] of symbols ?? [])
269
+ insertSymbol.run(pkg.id, name, chunk);
143
270
  this.#db.exec("COMMIT");
144
271
  }
145
272
  catch (error) {
@@ -147,6 +274,33 @@ export class Store {
147
274
  throw error;
148
275
  }
149
276
  }
277
+ /** Replaces the record of what a package was built from. */
278
+ recordSources(packageId, sources) {
279
+ const insert = this.#db.prepare("INSERT OR REPLACE INTO sources (package_id, path, size, mtime, hash) VALUES (?, ?, ?, ?, ?)");
280
+ this.#db.exec("BEGIN");
281
+ try {
282
+ this.#db.prepare("DELETE FROM sources WHERE package_id = ?").run(packageId);
283
+ for (const source of sources) {
284
+ insert.run(packageId, source.path, source.size, source.mtime, source.hash);
285
+ }
286
+ this.#db.exec("COMMIT");
287
+ }
288
+ catch (error) {
289
+ this.#db.exec("ROLLBACK");
290
+ throw error;
291
+ }
292
+ }
293
+ sourcesOf(packageId) {
294
+ const rows = this.#db
295
+ .prepare("SELECT path, size, mtime, hash FROM sources WHERE package_id = ? ORDER BY path")
296
+ .all(packageId);
297
+ return rows.map((row) => ({
298
+ path: row.path,
299
+ size: Number(row.size),
300
+ mtime: row.mtime,
301
+ hash: row.hash,
302
+ }));
303
+ }
150
304
  removePackage(id) {
151
305
  this.#db.exec("BEGIN");
152
306
  try {
@@ -177,6 +331,12 @@ export class Store {
177
331
  conditions.push("f.package_id LIKE ?");
178
332
  parameters.push(options.packageFilter);
179
333
  }
334
+ if (options.kinds !== undefined) {
335
+ if (options.kinds.length === 0)
336
+ return [];
337
+ conditions.push(`f.package_id IN (SELECT id FROM packages WHERE kind IN (${options.kinds.map(() => "?").join(", ")}))`);
338
+ parameters.push(...options.kinds);
339
+ }
180
340
  const rows = this.#db
181
341
  .prepare(`SELECT f.chunk_id AS chunkId, f.package_id AS packageId, c.file_path AS filePath,
182
342
  c.tokens AS tokens, c.content AS content
@@ -212,8 +372,10 @@ export class Store {
212
372
  this.#db.close();
213
373
  }
214
374
  #deleteChunks(packageId) {
375
+ this.#db.prepare("DELETE FROM sources WHERE package_id = ?").run(packageId);
215
376
  this.#db.prepare("DELETE FROM chunks_fts WHERE package_id = ?").run(packageId);
216
377
  this.#db.prepare("DELETE FROM chunks WHERE package_id = ?").run(packageId);
378
+ this.#db.prepare("DELETE FROM symbols WHERE package_id = ?").run(packageId);
217
379
  }
218
380
  }
219
381
  //# sourceMappingURL=db.js.map
package/dist/db.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAmC/C,MAAM,cAAc,GAAG,CAAC,CAAC;AAEzB,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;CAyBd,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,oBAAoB;IAClC,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACnD,OAAO,CAAC,WAAW,GAAG,CAAC,CAAC,OAAuB,EAAE,GAAG,IAAe,EAAQ,EAAE;QAC3E,MAAM,OAAO,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;QACxE,IAAI,OAAO,CAAC,QAAQ,CAAC,mCAAmC,CAAC;YAAE,OAAO;QACjE,QAAyC,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;IAC/D,CAAC,CAA+B,CAAC;AACnC,CAAC;AAED;;;GAGG;AACH,SAAS,UAAU;IACjB,oBAAoB,EAAE,CAAC;IACvB,OAAO,OAAO,CAAC,aAAa,CAAiC,CAAC;AAChE,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,gBAAgB,CAAC,MAAyB,OAAO,CAAC,GAAG;IACnE,MAAM,QAAQ,GAAG,GAAG,CAAC,cAAc,CAAC;IACpC,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,QAAQ,CAAC;IACnE,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;AAClD,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC;IAChE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,aAAa,CAAC,IAAI,GAAG,+BAA+B,EAAE;YAC9D,IAAI,EAAE,kEAAkE;SACzE,CAAC,CAAC;IACL,CAAC;IACD,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACrD,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/D,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;IACnF,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACxD,CAAC;AAED,0FAA0F;AAC1F,MAAM,OAAO,KAAK;IACP,GAAG,CAAe;IAE3B,YAAoB,EAAgB;QAClC,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;QACd,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QAC3C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,yBAAyB,cAAc,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,OAAe,gBAAgB,EAAE;QAC3C,IAAI,IAAI,KAAK,UAAU;YAAE,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACvE,IAAI,CAAC;YACH,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,aAAa,CAAC,wCAAwC,IAAI,EAAE,EAAE;gBACtE,IAAI,EAAE,wEAAwE;gBAC9E,KAAK,EAAE,KAAK;aACb,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,UAAU,CAAC,EAAU;QACnB,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,SAAS,CAAC;IACvF,CAAC;IAED,YAAY;QACV,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG;aAClB,OAAO,CAAC,2EAA2E,CAAC;aACpF,GAAG,EAAyE,CAAC;QAChF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACxB,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,SAAS,EAAE,GAAG,CAAC,UAAU;SAC1B,CAAC,CAAC,CAAC;IACN,CAAC;IAED,WAAW,CAAC,SAAiB;QAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG;aACjB,OAAO,CAAC,2DAA2D,CAAC;aACpE,GAAG,CAAC,SAAS,CAAsB,CAAC;QACvC,OAAO,GAAG,CAAC,KAAK,CAAC;IACnB,CAAC;IAED,wEAAwE;IACxE,YAAY,CAAC,GAAmB,EAAE,MAA+B;QAC/D,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CACpC,sEAAsE,CACvE,CAAC;QACF,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAClC,yGAAyG,CAC1G,CAAC;QACF,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAChC,kFAAkF,CACnF,CAAC;QAEF,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvB,IAAI,CAAC;YACH,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC3B,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;YACjD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;gBACpF,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YAC5E,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC1B,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,aAAa,CAAC,EAAU;QACtB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvB,IAAI,CAAC;YACH,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;YACvB,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,mCAAmC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC9D,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC1B,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,KAAa,EAAE,UAAyB,EAAE;QAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC;QACjC,MAAM,UAAU,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAC1C,MAAM,UAAU,GAAwB,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;QAE5D,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YACrC,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,EAAE,CAAC;YAC/C,UAAU,CAAC,IAAI,CAAC,oBAAoB,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACrF,UAAU,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACzC,CAAC;QACD,IAAI,OAAO,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YACxC,UAAU,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YACvC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QACzC,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG;aAClB,OAAO,CACN;;;;kBAIU,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC;;;;kBAIxB,CACX;aACA,GAAG,CAAC,GAAG,UAAU,EAAE,KAAK,CAAC;aACzB,GAAG,CACF,CAAC,GAAG,EAAa,EAAE,CAAC,CAAC;YACnB,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;YAC5B,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC;YAChC,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAC9B,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC;YAC/B,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;SAC7B,CAAC,CACH,CAAC;QAEJ,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QAEjD,MAAM,QAAQ,GAAgB,EAAE,CAAC;QACjC,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/C,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC,SAAS;gBAAE,MAAM;YACrE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACnB,KAAK,IAAI,MAAM,CAAC;QAClB,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;IACnB,CAAC;IAED,aAAa,CAAC,SAAiB;QAC7B,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,6CAA6C,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC/E,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,yCAAyC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC7E,CAAC;CACF"}
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,13 @@ export interface DiscoveredPackage {
10
10
  /** False for `@docspack-community/*`, whose contents nobody has vetted. */
11
11
  readonly trusted: boolean;
12
12
  }
13
+ /** An ordinary dependency: a library this project installed, whatever documents it. */
14
+ export interface DiscoveredLibrary {
15
+ readonly name: string;
16
+ readonly version: string;
17
+ /** Root of the installed package. */
18
+ readonly dir: string;
19
+ }
13
20
  export interface Discovery {
14
21
  readonly packages: readonly DiscoveredPackage[];
15
22
  /** Human-readable problems that did not stop discovery, e.g. a declared but uninstalled package. */
@@ -21,6 +28,13 @@ export interface Discovery {
21
28
  * ships a `.llms/manifest.json`.
22
29
  */
23
30
  export declare function discoverPackages(cwd: string): Promise<Discovery>;
31
+ /**
32
+ * Every library this project depends on directly, installed and readable.
33
+ *
34
+ * Documentation packages are excluded: those are handled by `discoverPackages`, and a docs
35
+ * package's own type declarations describe nothing anybody asks about.
36
+ */
37
+ export declare function discoverLibraries(cwd: string): Promise<readonly DiscoveredLibrary[]>;
24
38
  /** Package ids installed in this project, used to scope queries to the versions actually in use. */
25
39
  export declare function projectPackageIds(cwd: string): Promise<string[]>;
26
40
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"AAGA,OAAO,EAKL,KAAK,eAAe,EAGrB,MAAM,WAAW,CAAC;AAEnB,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,qCAAqC;IACrC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,2EAA2E;IAC3E,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,QAAQ,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAChD,oGAAoG;IACpG,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAsDtE;AAED,oGAAoG;AACpG,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAGtE;AAuDD;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAc9F"}
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"AAGA,OAAO,EAKL,KAAK,eAAe,EAGrB,MAAM,WAAW,CAAC;AAEnB,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,qCAAqC;IACrC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,2EAA2E;IAC3E,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,uFAAuF;AACvF,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,qCAAqC;IACrC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,QAAQ,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAChD,oGAAoG;IACpG,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAsDtE;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,iBAAiB,EAAE,CAAC,CAgB1F;AAED,oGAAoG;AACpG,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAGtE;AA0DD;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAc9F"}
package/dist/discovery.js CHANGED
@@ -54,18 +54,45 @@ export async function discoverPackages(cwd) {
54
54
  packages.sort((a, b) => a.name.localeCompare(b.name));
55
55
  return { packages, problems };
56
56
  }
57
+ /**
58
+ * Every library this project depends on directly, installed and readable.
59
+ *
60
+ * Documentation packages are excluded: those are handled by `discoverPackages`, and a docs
61
+ * package's own type declarations describe nothing anybody asks about.
62
+ */
63
+ export async function discoverLibraries(cwd) {
64
+ const root = resolve(cwd);
65
+ const names = (await declaredDependencies(root)).filter((name) => !isDocsPackage(name));
66
+ const libraries = [];
67
+ for (const name of names) {
68
+ const dir = await resolvePackageDir(name, root);
69
+ if (dir === undefined)
70
+ continue;
71
+ try {
72
+ libraries.push({ name, version: await installedVersion(name, dir), dir });
73
+ }
74
+ catch {
75
+ // A dependency with no version in its manifest is not one to index.
76
+ }
77
+ }
78
+ return libraries;
79
+ }
57
80
  /** Package ids installed in this project, used to scope queries to the versions actually in use. */
58
81
  export async function projectPackageIds(cwd) {
59
82
  const { packages } = await discoverPackages(cwd);
60
83
  return packages.map((pkg) => pkg.id);
61
84
  }
85
+ /** Docs packages this project depends on, the input to `discoverPackages`. */
86
+ async function declaredDocsPackages(cwd) {
87
+ return (await declaredDependencies(cwd)).filter(isDocsPackage);
88
+ }
62
89
  /**
63
- * Every docs package declared by this directory or by an ancestor of it. A workspace declares
90
+ * Every dependency declared by this directory or by an ancestor of it. A workspace declares
64
91
  * shared tooling in the repository root and its members inherit the install, so reading only
65
92
  * `cwd/package.json` answers "this project has no documentation" for most monorepos — the same
66
93
  * upward walk `resolvePackageDir` already does for the install.
67
94
  */
68
- async function declaredDocsPackages(cwd) {
95
+ async function declaredDependencies(cwd) {
69
96
  const names = new Set();
70
97
  let found = false;
71
98
  let dir = cwd;
@@ -96,10 +123,8 @@ async function declaredDocsPackages(cwd) {
96
123
  for (const field of [manifest.dependencies, manifest.devDependencies]) {
97
124
  if (typeof field !== "object" || field === null)
98
125
  continue;
99
- for (const name of Object.keys(field)) {
100
- if (isDocsPackage(name))
101
- names.add(name);
102
- }
126
+ for (const name of Object.keys(field))
127
+ names.add(name);
103
128
  }
104
129
  const parent = dirname(dir);
105
130
  if (parent === dir)
@@ -1 +1 @@
1
- {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"AAqBA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;AAEjD,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;IACtC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,iEAAiE;IACjE,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B;AAMD;;;GAGG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CA0K7E"}
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"AAsBA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;AAEjD,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;IACtC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,iEAAiE;IACjE,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B;AAaD;;;GAGG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CA4K7E"}
package/dist/doctor.js CHANGED
@@ -1,9 +1,16 @@
1
1
  import { readdir, readFile, stat } from "node:fs/promises";
2
2
  import { join } from "node:path";
3
3
  import { readBuildConfig } from "./config.js";
4
+ import { measureCoverage } from "./coverage.js";
4
5
  import { PLACEHOLDER } from "./init/templates.js";
5
6
  import { estimateTokens, LLMS_DIR, MANIFEST_FILE, parseManifest, resolveChunkFile, } from "./spec.js";
6
7
  import { contentFingerprint, findFiller, findLongSentences, hasConcreteContent, withoutCode, } from "./style.js";
8
+ /**
9
+ * Below this share of a library's exported names, a package is documenting a fraction of what
10
+ * the library publishes. Reported, never gated on: a page listing every export and explaining
11
+ * none would score full marks, so this is a number for an author to read, not a wall.
12
+ */
13
+ const THIN_COVERAGE = 0.6;
7
14
  /** Over this, a chunk crowds out the response budget; under it, a chunk answers nothing. */
8
15
  const MAX_CHUNK_TOKENS = 1500;
9
16
  const MIN_CHUNK_TOKENS = 30;
@@ -144,6 +151,7 @@ export async function runDoctor(options) {
144
151
  fix: "Agents act on concrete text. Add the call, the signature or the values.",
145
152
  });
146
153
  }
154
+ findings.push(...(await coverageFindings(options.dir, llmsDir, manifest)));
147
155
  if (manifest.chunks.every((chunk) => chunk.entities.length === 0)) {
148
156
  findings.push({
149
157
  check: "no-entities",
@@ -276,22 +284,29 @@ function checkPackageJson(pkg, manifest, findings) {
276
284
  });
277
285
  }
278
286
  }
279
- /** Newest mtime across the configured documentation source, used to spot a stale payload. */
287
+ /**
288
+ * Newest mtime across every configured documentation source, used to spot a stale payload.
289
+ *
290
+ * Both sources are checked, not the first one found: a package configured with prose *and* an
291
+ * OpenAPI document would otherwise report a fresh payload after the document changed, which is the
292
+ * one case this check exists to catch.
293
+ */
280
294
  async function newestSourceMtime(dir) {
281
295
  const config = await readBuildConfig(dir);
282
- const source = config.from ?? config.openapi;
283
- if (source === undefined)
284
- return 0;
285
- const target = join(dir, source);
286
- const single = await mtime(target);
287
- if (single > 0 && config.openapi !== undefined)
288
- return single;
296
+ const newest = await Promise.all([
297
+ config.openapi === undefined ? 0 : mtime(join(dir, config.openapi)),
298
+ config.from === undefined ? 0 : newestInTree(join(dir, config.from)),
299
+ ]);
300
+ return Math.max(...newest);
301
+ }
302
+ /** Newest mtime in a directory tree, or the file's own when the path is a file. */
303
+ async function newestInTree(target) {
289
304
  let found;
290
305
  try {
291
306
  found = await readdir(target, { recursive: true, withFileTypes: true });
292
307
  }
293
308
  catch {
294
- return single;
309
+ return mtime(target);
295
310
  }
296
311
  let newest = 0;
297
312
  for (const entry of found) {
@@ -309,6 +324,42 @@ async function mtime(path) {
309
324
  return 0;
310
325
  }
311
326
  }
327
+ /**
328
+ * How much of the documented library's public surface the package mentions.
329
+ *
330
+ * A documentation site is written page by page around tasks and an API grows name by name, so
331
+ * they drift apart with nobody noticing. This is the check that notices — mechanical, from two
332
+ * files, with no model and no judgement in it.
333
+ */
334
+ async function coverageFindings(dir, llmsDir, manifest) {
335
+ const findings = [];
336
+ let report;
337
+ try {
338
+ report = await measureCoverage({ packageDir: dir, llmsDir, manifest, cwd: dir });
339
+ }
340
+ catch {
341
+ // Coverage is a note about the documentation, never a reason a package fails to check.
342
+ return findings;
343
+ }
344
+ for (const library of report.libraries) {
345
+ if (library.names === 0)
346
+ continue;
347
+ const share = library.documented / library.names;
348
+ const percent = Math.round(100 * share);
349
+ findings.push({
350
+ check: "coverage",
351
+ severity: "info",
352
+ message: `mentions ${library.documented} of ${library.names} names ${library.library} exports (${percent}%)` +
353
+ (library.uncovered.length === 0 ? "" : `; missing ${library.uncovered.join(", ")}`),
354
+ ...(share < THIN_COVERAGE
355
+ ? {
356
+ fix: "Document the exports nobody has written about, or narrow what the package claims to document.",
357
+ }
358
+ : {}),
359
+ });
360
+ }
361
+ return findings;
362
+ }
312
363
  async function readJson(path) {
313
364
  try {
314
365
  const parsed = JSON.parse(await readFile(path, "utf8"));