@amsterdamdatalabs/enact-docs-search 0.1.1 → 0.2.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 (63) hide show
  1. package/README.md +74 -4
  2. package/dist/cli.js +182 -54
  3. package/dist/cli.js.map +1 -1
  4. package/dist/dependency-errors.d.ts +3 -0
  5. package/dist/dependency-errors.d.ts.map +1 -0
  6. package/dist/dependency-errors.js +26 -0
  7. package/dist/dependency-errors.js.map +1 -0
  8. package/dist/doctor.d.ts +17 -0
  9. package/dist/doctor.d.ts.map +1 -0
  10. package/dist/doctor.js +88 -0
  11. package/dist/doctor.js.map +1 -0
  12. package/dist/embeddings/embedding-service.d.ts.map +1 -1
  13. package/dist/embeddings/embedding-service.js +2 -3
  14. package/dist/embeddings/embedding-service.js.map +1 -1
  15. package/dist/indexing/chunker.d.ts +6 -1
  16. package/dist/indexing/chunker.d.ts.map +1 -1
  17. package/dist/indexing/chunker.js +17 -11
  18. package/dist/indexing/chunker.js.map +1 -1
  19. package/dist/indexing/embedding-text.d.ts +22 -0
  20. package/dist/indexing/embedding-text.d.ts.map +1 -0
  21. package/dist/indexing/embedding-text.js +27 -0
  22. package/dist/indexing/embedding-text.js.map +1 -0
  23. package/dist/indexing/frontmatter.d.ts +48 -0
  24. package/dist/indexing/frontmatter.d.ts.map +1 -0
  25. package/dist/indexing/frontmatter.js +162 -0
  26. package/dist/indexing/frontmatter.js.map +1 -0
  27. package/dist/indexing/indexing-service.d.ts +1 -4
  28. package/dist/indexing/indexing-service.d.ts.map +1 -1
  29. package/dist/indexing/indexing-service.js +24 -12
  30. package/dist/indexing/indexing-service.js.map +1 -1
  31. package/dist/search/authority.d.ts +31 -0
  32. package/dist/search/authority.d.ts.map +1 -0
  33. package/dist/search/authority.js +50 -0
  34. package/dist/search/authority.js.map +1 -0
  35. package/dist/search/relevance.d.ts +80 -0
  36. package/dist/search/relevance.d.ts.map +1 -0
  37. package/dist/search/relevance.js +119 -0
  38. package/dist/search/relevance.js.map +1 -0
  39. package/dist/search/search-service.d.ts +44 -2
  40. package/dist/search/search-service.d.ts.map +1 -1
  41. package/dist/search/search-service.js +181 -23
  42. package/dist/search/search-service.js.map +1 -1
  43. package/dist/search/snippet.d.ts +11 -0
  44. package/dist/search/snippet.d.ts.map +1 -1
  45. package/dist/search/snippet.js +102 -17
  46. package/dist/search/snippet.js.map +1 -1
  47. package/dist/storage/document-store.d.ts +47 -5
  48. package/dist/storage/document-store.d.ts.map +1 -1
  49. package/dist/storage/document-store.js +94 -16
  50. package/dist/storage/document-store.js.map +1 -1
  51. package/dist/storage/persistence.d.ts +6 -10
  52. package/dist/storage/persistence.d.ts.map +1 -1
  53. package/dist/storage/persistence.js +20 -20
  54. package/dist/storage/persistence.js.map +1 -1
  55. package/dist/storage/vector-store.d.ts +2 -3
  56. package/dist/storage/vector-store.d.ts.map +1 -1
  57. package/dist/storage/vector-store.js +5 -15
  58. package/dist/storage/vector-store.js.map +1 -1
  59. package/dist/types.d.ts +2 -7
  60. package/dist/types.d.ts.map +1 -1
  61. package/dist/types.js +2 -20
  62. package/dist/types.js.map +1 -1
  63. package/package.json +9 -2
package/README.md CHANGED
@@ -1,7 +1,6 @@
1
1
  # @amsterdamdatalabs/enact-docs-search
2
2
 
3
- Hybrid BM25 and vector search over a repository's `docs/`, `.plans/`, and
4
- `.specs/` knowledge trees.
3
+ Hybrid BM25 and vector search over a repository's `docs/` knowledge tree.
5
4
 
6
5
  ## Install
7
6
 
@@ -9,29 +8,100 @@ Hybrid BM25 and vector search over a repository's `docs/`, `.plans/`, and
9
8
  npm install -g @amsterdamdatalabs/enact-docs-search
10
9
  ```
11
10
 
11
+ Verify the installed version:
12
+
13
+ ```bash
14
+ enact-docs-search --version
15
+ ```
16
+
12
17
  Node.js 22 or newer is required. The first semantic query downloads the local
13
18
  `Xenova/all-MiniLM-L6-v2` embedding model into the target repository's
14
19
  `.cache/docs/models/` directory. The search index is stored alongside it under
15
20
  `.cache/docs/index/`.
16
21
 
22
+ Semantic search uses `hnswlib-node`, a native Node addon compiled with
23
+ `node-gyp` during installation. The machine installing the CLI therefore needs
24
+ Python 3 and a C/C++ build toolchain: Xcode Command Line Tools on macOS,
25
+ `make`/GCC on Linux, or Python plus Visual Studio Build Tools with the Desktop
26
+ development with C++ workload on Windows. For a global install with npm's
27
+ lifecycle-script policy enabled, use:
28
+
29
+ ```bash
30
+ npm install -g @amsterdamdatalabs/enact-docs-search \
31
+ --allow-scripts=hnswlib-node,onnxruntime-node,sharp,protobufjs \
32
+ --foreground-scripts
33
+ ```
34
+
35
+ Check the native installation without downloading the embedding model:
36
+
37
+ ```bash
38
+ enact-docs-search doctor
39
+ enact-docs-search doctor --json
40
+ ```
41
+
42
+ For a project-scoped install, put the lifecycle approvals in the consuming
43
+ project's root `package.json` (npm does not accept `--allow-scripts` on a
44
+ project-scoped install), then rebuild the native packages:
45
+
46
+ ```json
47
+ {
48
+ "allowScripts": {
49
+ "hnswlib-node": true,
50
+ "onnxruntime-node": true,
51
+ "sharp": true,
52
+ "protobufjs": true
53
+ }
54
+ }
55
+ ```
56
+
57
+ ```bash
58
+ npm rebuild hnswlib-node onnxruntime-node sharp protobufjs --foreground-scripts
59
+ ```
60
+
17
61
  ## Usage
18
62
 
19
63
  Run inside a target repository:
20
64
 
21
65
  ```bash
22
- enact-docs-search query "how crate boundaries are defined?"
66
+ enact-docs-search how crate boundaries are defined
67
+ enact-docs-search query how crate boundaries are defined
23
68
  enact-docs-search index
24
69
  enact-docs-search index --force
25
70
  enact-docs-search prepare
26
71
  ```
27
72
 
73
+ The `query` command is optional. Unquoted words are joined into one query;
74
+ quotes remain useful when the shell must preserve punctuation or special
75
+ characters.
76
+
28
77
  Queries automatically provision a missing model and refresh missing or stale
29
78
  indexes incrementally. If keyword-only indexing leaves semantic vectors stale,
30
79
  the next hybrid or semantic query repairs them automatically before searching.
31
80
  `prepare` performs the model bootstrap and a complete semantic index build
32
- explicitly. Use `enact-docs-search --help` for advanced scope, mode, JSON, and
81
+ explicitly. Use `enact-docs-search --help` for mode, JSON, and
33
82
  exclusion controls.
34
83
 
84
+ ## Ranking
85
+
86
+ Frontmatter is parsed, not indexed as prose. `title` and `description` are
87
+ weighted above heading text, which is weighted above body text, so a document
88
+ whose title answers the query outranks one that mentions it in passing. Results
89
+ collapse to one entry per file.
90
+
91
+ Each result is labelled with what the document says about itself --
92
+ `[stable · operations · 2026-09-15]`. A document marked `status: draft` is
93
+ demoted; one that makes no status claim is left alone. Age decays a result's
94
+ score with a 180-day half-life, floored so an old document is demoted, never
95
+ buried. `--raw-rank` turns this weighting off, and `--explain` prints the score
96
+ and the multiplier behind every result.
97
+
98
+ Results that do not clear a relevance floor are dropped rather than padded out:
99
+ semantic hits need a minimum cosine similarity, and keyword hits must cover
100
+ enough of the query's weight, measured by term rarity so the term that carried
101
+ the query is the one that counts. A query nothing matches exits `1` with no
102
+ results, which is a real answer -- not an empty list dressed up as ten weak
103
+ ones. `--min-score` and `--min-coverage` adjust both floors.
104
+
35
105
  The package is also usable through `npx` or `bunx`:
36
106
 
37
107
  ```bash
package/dist/cli.js CHANGED
@@ -1,53 +1,145 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
3
  * enact-docs-search — hybrid (BM25 + vector) search CLI over a repo's
4
- * docs/.plans/.specs knowledge trees. Takes the target repo as an argument;
4
+ * docs/ knowledge tree. Takes the target repo as an argument;
5
5
  * does not hardcode any particular checkout.
6
6
  *
7
7
  * Usage:
8
- * enact-docs-search index --repo <path> [--scope docs|plans|specs|all] [--force] [--keyword-only]
9
- * enact-docs-search query "<text>" --repo <path> [--scope ...] [--mode hybrid|keyword|semantic] [--limit N]
8
+ * enact-docs-search index --repo <path> [--force] [--keyword-only]
9
+ * enact-docs-search <text...> --repo <path> [--mode hybrid|keyword|semantic] [--limit N]
10
+ * enact-docs-search query "<text>" --repo <path> [--mode hybrid|keyword|semantic] [--limit N]
10
11
  */
11
12
  import { DocumentStore } from "./storage/document-store.js";
12
13
  import { VectorStore, DependencyError as VectorDependencyError } from "./storage/vector-store.js";
13
14
  import { EmbeddingService, DependencyError as EmbeddingDependencyError } from "./embeddings/embedding-service.js";
14
15
  import { SearchService } from "./search/search-service.js";
16
+ import { normalizeQuery, DEFAULT_MIN_VECTOR_SCORE, DEFAULT_MIN_TERM_COVERAGE } from "./search/relevance.js";
17
+ import { extractQueryTerms } from "./search/snippet.js";
15
18
  import { runIndex } from "./indexing/indexing-service.js";
16
19
  import { listMarkdownFiles } from "./adapter/repo-walker.js";
17
20
  import { repoCacheDir, repoCacheRoot, repoModelCacheDir, ensureRepoCache, CachePermissionError, paths, readManifest, readDocumentStoreExport, readVectorSidecar, vectorIndexExists, checkFreshness, EMBEDDING_MODEL_ID, } from "./storage/persistence.js";
18
- import { scopesToRoots } from "./types.js";
21
+ import { DOCS_ROOT } from "./types.js";
19
22
  import { existsSync } from "node:fs";
23
+ import { createRequire } from "node:module";
20
24
  import { dirname, join } from "node:path";
25
+ import { renderDoctor, runDoctor } from "./doctor.js";
21
26
  const EMBEDDING_DIMENSIONS = 384;
27
+ const { version: PACKAGE_VERSION } = createRequire(import.meta.url)("../package.json");
22
28
  function usage() {
23
- return `enact-docs-search — hybrid semantic + keyword search over docs/.plans/.specs
29
+ return `enact-docs-search — hybrid semantic + keyword search over docs/
24
30
 
25
31
  Usage:
26
- enact-docs-search index --repo <path> [--scope docs|plans|specs|all] [--force] [--keyword-only] [--exclude <glob>]
27
- enact-docs-search prepare --repo <path> [--scope docs|plans|specs|all] [--force] [--exclude <glob>]
28
- enact-docs-search query "<text>" --repo <path> [--scope docs|plans|specs|all] [--mode hybrid|keyword|semantic] [--limit N] [--exclude <glob>]
32
+ enact-docs-search index --repo <path> [--force] [--keyword-only] [--exclude <glob>]
33
+ enact-docs-search prepare --repo <path> [--force] [--exclude <glob>]
34
+ enact-docs-search <text...> --repo <path> [--mode hybrid|keyword|semantic] [--limit N] [--exclude <glob>]
35
+ enact-docs-search query <text...> --repo <path> [--mode hybrid|keyword|semantic] [--limit N] [--exclude <glob>]
36
+ enact-docs-search doctor [--json]
29
37
 
30
38
  Options:
31
39
  --repo <path> Target repository root. If omitted, auto-detected by
32
- walking up from the current directory for docs/,
33
- .plans/, or .specs/
34
- --scope <scope> docs | plans | specs | all (default: all)
40
+ walking up from the current directory for docs/
35
41
  --mode <mode> hybrid | keyword | semantic (default: hybrid, query only)
36
- --limit <n> Max results to return (default: 10, query only)
42
+ --limit <n> Max results to return, positive integer (default: 10, query only)
43
+ --min-score <n> Cosine floor for semantic hits, 0-1 (default: ${DEFAULT_MIN_VECTOR_SCORE})
44
+ --min-coverage <n> Fraction of query terms a hit must contain, 0-1 (default: ${DEFAULT_MIN_TERM_COVERAGE})
45
+ --raw-rank Do not apply status/recency weighting
46
+ --explain Show the score and the authority multiplier per result
37
47
  --force Full rebuild, ignoring the incremental manifest (index/prepare only)
38
48
  --keyword-only Skip embedding generation entirely (index only, much faster)
39
49
  --exclude <glob> Additional glob to exclude from scanning; repeatable
40
- --json Emit machine-readable JSON instead of text (query only)
50
+ --json Emit machine-readable JSON instead of text (query/doctor)
51
+ -V, --version Print version and exit
41
52
 
42
53
  Query automatically incrementally refreshes a missing or stale cache. Use
43
54
  index --force only for an explicit full rebuild.
44
55
 
45
56
  Exit codes: 0 = matches found, 1 = no matches, 2 = usage/dependency error.`;
46
57
  }
58
+ /**
59
+ * Read the value for a flag at the end of argv with nothing after it
60
+ * (`--limit` with no argument at all). Letting that `undefined` flow
61
+ * downstream produces NaN (see parseNumberFlag) rather than a usage error.
62
+ * Shared by both the string and numeric value readers below; the numeric
63
+ * one stops here deliberately, because a leading '-' is a legitimate
64
+ * negative number for it to reject on range, not on shape.
65
+ */
66
+ function requireRawValue(argv, i, flag) {
67
+ const value = argv[i];
68
+ if (value === undefined)
69
+ fail(`${flag} requires a value`);
70
+ return value;
71
+ }
72
+ /**
73
+ * Read the value for a flag whose argument is always a string (never a
74
+ * negative number), so a value that itself looks like another option is
75
+ * never legitimate. Two ways this goes wrong, both confirmed:
76
+ * 1. A flag at the end of argv (`--repo` with nothing after it) —
77
+ * handled by requireRawValue.
78
+ * 2. A flag immediately followed by another flag (`--repo --force`) has
79
+ * no dangling gap to detect, but the "value" is really the next
80
+ * option, not an argument for this one. Confirmed: this silently took
81
+ * "--force" as the repo path (creating a literal `--force` directory
82
+ * on disk) while --force itself vanished, unconsumed. Same failure as
83
+ * (1) wearing a different disguise, so it gets the same fail-loud
84
+ * treatment rather than a best-effort guess.
85
+ */
86
+ function requireValue(argv, i, flag) {
87
+ const value = requireRawValue(argv, i, flag);
88
+ if (value.startsWith("-"))
89
+ fail(`${flag} requires a value, got option-like '${value}' instead`);
90
+ return value;
91
+ }
92
+ /**
93
+ * Numeric flags must fail loudly, not silently. `Number(undefined)` and
94
+ * `Number("abc")` both produce NaN, which then compares false against every
95
+ * threshold (`score >= NaN` is always false) and empties `slice(0, NaN)` —
96
+ * the tool reports a confident "0 result(s)" for what was actually a typo.
97
+ * Validating here, before search ever runs, keeps that lie out of the exit
98
+ * code (2 = usage error) and out of the result count (which means 1 = no
99
+ * matches, honestly). Uses requireRawValue, not requireValue: '-0.35' is a
100
+ * legitimate negative number here, to be rejected on range below, not
101
+ * mistaken for a swallowed option.
102
+ */
103
+ function parseNumberFlag(argv, i, flag) {
104
+ const raw = requireRawValue(argv, i, flag);
105
+ const value = Number(raw);
106
+ if (!Number.isFinite(value))
107
+ fail(`${flag} must be a number, got '${raw}'`);
108
+ return value;
109
+ }
110
+ /**
111
+ * `--min-score` and `--min-coverage` are both gate thresholds bounded to
112
+ * [0, 1]: cosine similarity is clamped to that range in VectorStore, and
113
+ * IDF-weighted coverage is a fraction of the query's weight (see
114
+ * relevance.ts). A value outside that range can never pass or can never
115
+ * matter, so it is a usage mistake, not a legitimate strict/lax setting.
116
+ */
117
+ function parseUnitFraction(argv, i, flag, unit) {
118
+ const raw = argv[i];
119
+ const value = parseNumberFlag(argv, i, flag);
120
+ if (value < 0 || value > 1) {
121
+ fail(`${flag} must be between 0 and 1 (${unit}), got '${raw}'`);
122
+ }
123
+ return value;
124
+ }
125
+ /**
126
+ * `--limit` feeds `slice(0, limit)` and an overfetch multiplier. Zero,
127
+ * negative, and fractional counts are all usage mistakes rather than valid
128
+ * "give me nothing" or "give me half a result" requests.
129
+ */
130
+ function parsePositiveInteger(argv, i, flag) {
131
+ const raw = argv[i];
132
+ const value = parseNumberFlag(argv, i, flag);
133
+ if (!Number.isInteger(value) || value < 1) {
134
+ fail(`${flag} must be a positive integer, got '${raw}'`);
135
+ }
136
+ return value;
137
+ }
47
138
  function parseArgs(argv) {
48
139
  const parsed = {
49
140
  positional: [],
50
- scope: "all",
141
+ explain: false,
142
+ rawRank: false,
51
143
  mode: "hybrid",
52
144
  limit: 10,
53
145
  force: false,
@@ -59,16 +151,25 @@ function parseArgs(argv) {
59
151
  const arg = argv[i];
60
152
  switch (arg) {
61
153
  case "--repo":
62
- parsed.repo = argv[++i];
63
- break;
64
- case "--scope":
65
- parsed.scope = argv[++i];
154
+ parsed.repo = requireValue(argv, ++i, arg);
66
155
  break;
67
156
  case "--mode":
68
- parsed.mode = argv[++i];
157
+ parsed.mode = requireValue(argv, ++i, arg);
158
+ break;
159
+ case "--explain":
160
+ parsed.explain = true;
161
+ break;
162
+ case "--raw-rank":
163
+ parsed.rawRank = true;
164
+ break;
165
+ case "--min-score":
166
+ parsed.minScore = parseUnitFraction(argv, ++i, arg, "cosine similarity");
167
+ break;
168
+ case "--min-coverage":
169
+ parsed.minCoverage = parseUnitFraction(argv, ++i, arg, "fraction of query weight");
69
170
  break;
70
171
  case "--limit":
71
- parsed.limit = Number(argv[++i]);
172
+ parsed.limit = parsePositiveInteger(argv, ++i, arg);
72
173
  break;
73
174
  case "--force":
74
175
  parsed.force = true;
@@ -77,7 +178,7 @@ function parseArgs(argv) {
77
178
  parsed.keywordOnly = true;
78
179
  break;
79
180
  case "--exclude":
80
- parsed.exclude.push(argv[++i]);
181
+ parsed.exclude.push(requireValue(argv, ++i, arg));
81
182
  break;
82
183
  case "--json":
83
184
  parsed.json = true;
@@ -88,6 +189,8 @@ function parseArgs(argv) {
88
189
  process.exit(0);
89
190
  break;
90
191
  default:
192
+ if (arg.startsWith("-"))
193
+ fail(`unknown option '${arg}'`);
91
194
  parsed.positional.push(arg);
92
195
  }
93
196
  }
@@ -108,28 +211,21 @@ function info(message) {
108
211
  }
109
212
  /**
110
213
  * Auto-detect a repo root when --repo is omitted: walk up from cwd looking
111
- * for a directory that has any of docs/, .plans/, or .specs/. Stops at the
214
+ * for a directory that has docs/. Stops at the
112
215
  * filesystem root. Returns null if nothing is found, so the caller can fail
113
216
  * with a clear message rather than silently picking the wrong directory.
114
217
  */
115
218
  function detectRepoRoot(startDir) {
116
219
  let dir = startDir;
117
220
  for (;;) {
118
- for (const marker of ["docs", ".plans", ".specs"]) {
119
- if (existsSync(join(dir, marker)))
120
- return dir;
121
- }
221
+ if (existsSync(join(dir, DOCS_ROOT)))
222
+ return dir;
122
223
  const parent = dirname(dir);
123
224
  if (parent === dir)
124
225
  return null;
125
226
  dir = parent;
126
227
  }
127
228
  }
128
- function validateScope(scope) {
129
- if (!["docs", "plans", "specs", "all"].includes(scope)) {
130
- fail(`unknown scope '${scope}' (use docs, plans, specs, or all)`);
131
- }
132
- }
133
229
  function validateMode(mode) {
134
230
  if (!["keyword", "semantic", "hybrid"].includes(mode)) {
135
231
  fail(`unknown mode '${mode}' (use keyword, semantic, or hybrid)`);
@@ -139,7 +235,7 @@ function resolveRepo(args) {
139
235
  if (!args.repo) {
140
236
  const detected = detectRepoRoot(process.cwd());
141
237
  if (!detected) {
142
- fail("--repo <path> was not given, and no docs/, .plans/, or .specs/ found walking up from " +
238
+ fail("--repo <path> was not given, and no docs/ found walking up from " +
143
239
  process.cwd() +
144
240
  " — pass --repo explicitly");
145
241
  }
@@ -149,13 +245,11 @@ function resolveRepo(args) {
149
245
  }
150
246
  async function cmdIndex(args) {
151
247
  resolveRepo(args);
152
- validateScope(args.scope);
153
- info(`root: ${args.repo} (scope: ${args.scope})`);
248
+ info(`root: ${args.repo}`);
154
249
  const t0 = Date.now();
155
250
  let lastPhase = "";
156
251
  const result = await runIndex({
157
252
  repoPath: args.repo,
158
- scope: args.scope,
159
253
  force: args.force,
160
254
  skipEmbeddings: args.keywordOnly,
161
255
  exclude: args.exclude,
@@ -171,7 +265,7 @@ async function cmdIndex(args) {
171
265
  },
172
266
  });
173
267
  process.stderr.write("\n");
174
- console.log(`enact-docs-search: indexed scope='${result.scope}' — ` +
268
+ console.log(`enact-docs-search: indexed docs/ — ` +
175
269
  `${result.filesScanned} files scanned, ${result.filesChanged} changed, ${result.filesRemoved} removed, ` +
176
270
  `${result.chunksIndexed} chunks, ${result.embeddingsGenerated} embeddings ` +
177
271
  `(${(Date.now() - t0)}ms)`);
@@ -179,7 +273,6 @@ async function cmdIndex(args) {
179
273
  }
180
274
  async function cmdPrepare(args) {
181
275
  resolveRepo(args);
182
- validateScope(args.scope);
183
276
  await ensureRepoCache(args.repo);
184
277
  const embeddingService = new EmbeddingService({
185
278
  modelCacheDir: repoModelCacheDir(args.repo),
@@ -189,35 +282,49 @@ async function cmdPrepare(args) {
189
282
  await embeddingService.embed("semantic search bootstrap");
190
283
  await runIndex({
191
284
  repoPath: args.repo,
192
- scope: args.scope,
193
285
  force: args.force,
194
286
  exclude: args.exclude,
195
287
  allowRemoteModels: true,
196
288
  });
197
289
  console.log(`enact-docs-search: prepared cache at ${repoCacheRoot(args.repo)}`);
198
290
  }
291
+ async function cmdDoctor(args) {
292
+ const report = await runDoctor();
293
+ if (args.json) {
294
+ console.log(JSON.stringify(report, null, 2));
295
+ }
296
+ else {
297
+ console.log(renderDoctor(report));
298
+ }
299
+ if (!report.healthy)
300
+ process.exitCode = 2;
301
+ }
199
302
  async function cmdQuery(args) {
200
- const query = args.positional[0];
303
+ const query = normalizeQuery(args.positional.join(" "));
201
304
  if (!query)
202
305
  fail("a query string is required");
306
+ // Every term was a stopword. Searching anyway returns whatever the index
307
+ // ranks highest for filler words -- a confident answer to a question that
308
+ // was never asked. Say so instead.
309
+ if (extractQueryTerms(query).length === 0) {
310
+ fail(`no searchable terms in "${query}" -- every word is a stopword`);
311
+ }
203
312
  resolveRepo(args);
204
- validateScope(args.scope);
205
313
  validateMode(args.mode);
206
314
  await ensureRepoCache(args.repo);
207
315
  // In --json mode, stdout must be pure JSON for downstream parsers — route
208
316
  // this status line to stderr instead of suppressing it outright.
209
317
  if (args.json) {
210
- console.error(`root: ${args.repo} (scope: ${args.scope}, mode: ${args.mode})`);
318
+ console.error(`root: ${args.repo} (mode: ${args.mode})`);
211
319
  }
212
320
  else {
213
- info(`root: ${args.repo} (scope: ${args.scope}, mode: ${args.mode})`);
321
+ info(`root: ${args.repo} (mode: ${args.mode})`);
214
322
  }
215
323
  const cacheDir = repoCacheDir(args.repo);
216
324
  const manifest = await readManifest(cacheDir);
217
325
  // Freshness check (I-08: refresh stale or missing results before serving them).
218
- const roots = scopesToRoots(args.scope);
219
- const currentFiles = await listMarkdownFiles(args.repo, roots, { exclude: args.exclude });
220
- const freshness = checkFreshness(manifest, args.scope, currentFiles, args.mode !== "keyword");
326
+ const currentFiles = await listMarkdownFiles(args.repo, [DOCS_ROOT], { exclude: args.exclude });
327
+ const freshness = checkFreshness(manifest, currentFiles, args.mode !== "keyword");
221
328
  const hasVectorFile = args.mode !== "keyword" && await vectorIndexExists(cacheDir);
222
329
  const vectorSidecar = args.mode !== "keyword" ? await readVectorSidecar(cacheDir) : null;
223
330
  const needsVectorIndex = args.mode !== "keyword" &&
@@ -233,7 +340,7 @@ async function cmdQuery(args) {
233
340
  : freshness.vectorStaleCount > 0
234
341
  ? `${freshness.vectorStaleCount} stale vector file(s)`
235
342
  : "no usable vector index";
236
- const message = `enact-docs-search: refreshing ${args.scope} index (${reason})`;
343
+ const message = `enact-docs-search: refreshing docs/ index (${reason})`;
237
344
  if (args.json)
238
345
  console.error(message);
239
346
  else
@@ -241,7 +348,6 @@ async function cmdQuery(args) {
241
348
  try {
242
349
  await runIndex({
243
350
  repoPath: args.repo,
244
- scope: args.scope,
245
351
  force: rebuildVectorIndex,
246
352
  skipEmbeddings: args.mode === "keyword",
247
353
  exclude: args.exclude,
@@ -263,7 +369,7 @@ async function cmdQuery(args) {
263
369
  if (args.mode !== "keyword") {
264
370
  const hasVectors = await vectorIndexExists(cacheDir);
265
371
  if (!hasVectors) {
266
- fail(`no vector index for scope '${args.scope}' after automatic refresh`);
372
+ fail("no vector index after automatic refresh");
267
373
  }
268
374
  const sidecar = await readVectorSidecar(cacheDir);
269
375
  if (!sidecar)
@@ -287,32 +393,51 @@ async function cmdQuery(args) {
287
393
  const searchService = new SearchService(docStore, vectorStore, embeddingService);
288
394
  const results = await searchService.search(query, {
289
395
  mode: args.mode,
290
- scope: args.scope,
291
396
  limit: args.limit,
292
397
  highlight,
293
398
  repoRoot: args.repo,
399
+ minVectorScore: args.minScore,
400
+ minCoverage: args.minCoverage,
401
+ rawRank: args.rawRank,
294
402
  });
295
403
  if (args.json) {
296
- console.log(JSON.stringify({ query, mode: args.mode, scope: args.scope, results }, null, 2));
404
+ console.log(JSON.stringify({ query, mode: args.mode, results }, null, 2));
297
405
  }
298
406
  else {
299
- printResults(query, results);
407
+ printResults(query, results, args.explain);
300
408
  }
301
409
  process.exit(results.length > 0 ? 0 : 1);
302
410
  }
303
- function printResults(query, results) {
411
+ /** `[stable · operations · 2026-09-15]` — the document's own claims about itself. */
412
+ function metaLabel(r) {
413
+ const day = r.lastUpdate?.slice(0, 10);
414
+ const parts = [r.status, r.documentType, day].filter(Boolean);
415
+ return parts.length ? ` [${parts.join(" · ")}]` : "";
416
+ }
417
+ function explainLabel(r) {
418
+ const base = r.baseScore ?? 0;
419
+ const authority = r.authority ?? 1;
420
+ return ` score ${base.toFixed(4)} x${authority.toFixed(3)} = ${(base * authority).toFixed(4)}`;
421
+ }
422
+ function printResults(query, results, explain) {
304
423
  console.log(`${results.length} result(s) for "${query}"`);
305
424
  if (results.length === 0)
306
425
  return;
307
426
  results.forEach((r, i) => {
308
427
  console.log("");
309
428
  const heading = r.headingBreadcrumb?.length ? ` [${r.headingBreadcrumb.join(" > ")}]` : "";
310
- console.log(`${i + 1}. ${r.filePath}:${r.startLine}${heading}`);
429
+ console.log(`${i + 1}. ${r.filePath}:${r.startLine}${heading}${metaLabel(r)}`);
430
+ if (explain)
431
+ console.log(explainLabel(r));
311
432
  console.log(` ${r.snippet ?? ""}`);
312
433
  });
313
434
  }
314
435
  async function main() {
315
436
  const [command, ...rest] = process.argv.slice(2);
437
+ if (command === "-V" || command === "--version") {
438
+ console.log(PACKAGE_VERSION);
439
+ process.exit(0);
440
+ }
316
441
  if (!command || command === "-h" || command === "--help") {
317
442
  console.log(usage());
318
443
  process.exit(command ? 0 : 2);
@@ -328,8 +453,11 @@ async function main() {
328
453
  case "query":
329
454
  await cmdQuery(args);
330
455
  break;
456
+ case "doctor":
457
+ await cmdDoctor(args);
458
+ break;
331
459
  default:
332
- fail(`unknown command '${command}' (use 'index', 'prepare', or 'query')`);
460
+ await cmdQuery(parseArgs([command, ...rest]));
333
461
  }
334
462
  }
335
463
  main().catch((error) => {
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function nativeDependencyRemediation(packageName: string, error: unknown): string;
2
+ export declare function semanticDependencyMessage(packageName: string, error: unknown): string;
3
+ //# sourceMappingURL=dependency-errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency-errors.d.ts","sourceRoot":"","sources":["../src/dependency-errors.ts"],"names":[],"mappings":"AAIA,wBAAgB,2BAA2B,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,CAoBvF;AAED,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,CAOrF"}
@@ -0,0 +1,26 @@
1
+ function messageOf(error) {
2
+ return error instanceof Error ? error.message : String(error);
3
+ }
4
+ export function nativeDependencyRemediation(packageName, error) {
5
+ const detail = messageOf(error);
6
+ const lower = detail.toLowerCase();
7
+ if (lower.includes("node-gyp") || lower.includes("gyp err") || lower.includes("binding.gyp")) {
8
+ return `The native build failed; install Python 3 and the platform C/C++ toolchain, then run \`npm rebuild ${packageName} --foreground-scripts\`.`;
9
+ }
10
+ if (lower.includes("build/release") ||
11
+ lower.includes("dlopen") ||
12
+ lower.includes("invalid elf") ||
13
+ lower.includes("mach-o") ||
14
+ lower.includes("node_module_version") ||
15
+ lower.includes("symbol not found")) {
16
+ return `The native binding is missing or incompatible with this Node.js/platform combination; run \`npm rebuild ${packageName} --foreground-scripts\`.`;
17
+ }
18
+ return `The package may be missing or its lifecycle script may have been blocked; reinstall with \`npm install ${packageName} --foreground-scripts --allow-scripts=${packageName}\`.`;
19
+ }
20
+ export function semanticDependencyMessage(packageName, error) {
21
+ return (`Semantic search could not load ${packageName}.\n` +
22
+ `${nativeDependencyRemediation(packageName, error)}\n` +
23
+ "Run `enact-docs-search doctor` to check the native/runtime dependencies.\n" +
24
+ `Original error: ${messageOf(error)}`);
25
+ }
26
+ //# sourceMappingURL=dependency-errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency-errors.js","sourceRoot":"","sources":["../src/dependency-errors.ts"],"names":[],"mappings":"AAAA,SAAS,SAAS,CAAC,KAAc;IAC/B,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,WAAmB,EAAE,KAAc;IAC7E,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAChC,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IAEnC,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;QAC7F,OAAO,sGAAsG,WAAW,0BAA0B,CAAC;IACrJ,CAAC;IAED,IACE,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAC;QAC/B,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACxB,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC7B,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACxB,KAAK,CAAC,QAAQ,CAAC,qBAAqB,CAAC;QACrC,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAClC,CAAC;QACD,OAAO,2GAA2G,WAAW,0BAA0B,CAAC;IAC1J,CAAC;IAED,OAAO,0GAA0G,WAAW,yCAAyC,WAAW,KAAK,CAAC;AACxL,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,WAAmB,EAAE,KAAc;IAC3E,OAAO,CACL,kCAAkC,WAAW,KAAK;QAClD,GAAG,2BAA2B,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI;QACtD,4EAA4E;QAC5E,mBAAmB,SAAS,CAAC,KAAK,CAAC,EAAE,CACtC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,17 @@
1
+ export interface DoctorCheck {
2
+ name: string;
3
+ ok: boolean;
4
+ detail: string;
5
+ }
6
+ export interface DoctorReport {
7
+ healthy: boolean;
8
+ node: string;
9
+ platform: NodeJS.Platform;
10
+ arch: string;
11
+ checks: DoctorCheck[];
12
+ }
13
+ export declare function buildToolingGuidance(platform: NodeJS.Platform): string;
14
+ export declare function formatDoctorFailure(name: string, error: unknown, platform?: NodeJS.Platform): string;
15
+ export declare function runDoctor(): Promise<DoctorReport>;
16
+ export declare function renderDoctor(report: DoctorReport): string;
17
+ //# sourceMappingURL=doctor.d.ts.map