@ssmeo/mcp-local-rag 0.18.6

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 (247) hide show
  1. package/LICENSE +21 -0
  2. package/README.de.md +441 -0
  3. package/README.es.md +441 -0
  4. package/README.fr.md +441 -0
  5. package/README.md +530 -0
  6. package/README.pt-BR.md +441 -0
  7. package/README.zh-CN.md +441 -0
  8. package/dist/bin/install-skills.d.ts +19 -0
  9. package/dist/bin/install-skills.d.ts.map +1 -0
  10. package/dist/bin/install-skills.js +218 -0
  11. package/dist/bin/install-skills.js.map +1 -0
  12. package/dist/chunker/index.d.ts +24 -0
  13. package/dist/chunker/index.d.ts.map +1 -0
  14. package/dist/chunker/index.js +2 -0
  15. package/dist/chunker/index.js.map +1 -0
  16. package/dist/chunker/semantic-chunker.d.ts +96 -0
  17. package/dist/chunker/semantic-chunker.d.ts.map +1 -0
  18. package/dist/chunker/semantic-chunker.js +362 -0
  19. package/dist/chunker/semantic-chunker.js.map +1 -0
  20. package/dist/chunker/sentence-splitter.d.ts +32 -0
  21. package/dist/chunker/sentence-splitter.d.ts.map +1 -0
  22. package/dist/chunker/sentence-splitter.js +231 -0
  23. package/dist/chunker/sentence-splitter.js.map +1 -0
  24. package/dist/chunker/token-containment.d.ts +39 -0
  25. package/dist/chunker/token-containment.d.ts.map +1 -0
  26. package/dist/chunker/token-containment.js +83 -0
  27. package/dist/chunker/token-containment.js.map +1 -0
  28. package/dist/cli/common.d.ts +34 -0
  29. package/dist/cli/common.d.ts.map +1 -0
  30. package/dist/cli/common.js +121 -0
  31. package/dist/cli/common.js.map +1 -0
  32. package/dist/cli/delete.d.ts +3 -0
  33. package/dist/cli/delete.d.ts.map +1 -0
  34. package/dist/cli/delete.js +169 -0
  35. package/dist/cli/delete.js.map +1 -0
  36. package/dist/cli/file-collection.d.ts +2 -0
  37. package/dist/cli/file-collection.d.ts.map +1 -0
  38. package/dist/cli/file-collection.js +53 -0
  39. package/dist/cli/file-collection.js.map +1 -0
  40. package/dist/cli/ingest.d.ts +69 -0
  41. package/dist/cli/ingest.d.ts.map +1 -0
  42. package/dist/cli/ingest.js +323 -0
  43. package/dist/cli/ingest.js.map +1 -0
  44. package/dist/cli/list.d.ts +27 -0
  45. package/dist/cli/list.d.ts.map +1 -0
  46. package/dist/cli/list.js +207 -0
  47. package/dist/cli/list.js.map +1 -0
  48. package/dist/cli/options.d.ts +89 -0
  49. package/dist/cli/options.d.ts.map +1 -0
  50. package/dist/cli/options.js +244 -0
  51. package/dist/cli/options.js.map +1 -0
  52. package/dist/cli/query.d.ts +17 -0
  53. package/dist/cli/query.d.ts.map +1 -0
  54. package/dist/cli/query.js +194 -0
  55. package/dist/cli/query.js.map +1 -0
  56. package/dist/cli/read-neighbors.d.ts +3 -0
  57. package/dist/cli/read-neighbors.d.ts.map +1 -0
  58. package/dist/cli/read-neighbors.js +192 -0
  59. package/dist/cli/read-neighbors.js.map +1 -0
  60. package/dist/cli/status.d.ts +6 -0
  61. package/dist/cli/status.d.ts.map +1 -0
  62. package/dist/cli/status.js +78 -0
  63. package/dist/cli/status.js.map +1 -0
  64. package/dist/cli/sync.d.ts +6 -0
  65. package/dist/cli/sync.d.ts.map +1 -0
  66. package/dist/cli/sync.js +271 -0
  67. package/dist/cli/sync.js.map +1 -0
  68. package/dist/cli-main.d.ts +9 -0
  69. package/dist/cli-main.d.ts.map +1 -0
  70. package/dist/cli-main.js +60 -0
  71. package/dist/cli-main.js.map +1 -0
  72. package/dist/embedder/index.d.ts +143 -0
  73. package/dist/embedder/index.d.ts.map +1 -0
  74. package/dist/embedder/index.js +429 -0
  75. package/dist/embedder/index.js.map +1 -0
  76. package/dist/embedder/remote.d.ts +51 -0
  77. package/dist/embedder/remote.d.ts.map +1 -0
  78. package/dist/embedder/remote.js +182 -0
  79. package/dist/embedder/remote.js.map +1 -0
  80. package/dist/features/list.d.ts +37 -0
  81. package/dist/features/list.d.ts.map +1 -0
  82. package/dist/features/list.js +41 -0
  83. package/dist/features/list.js.map +1 -0
  84. package/dist/features/sync.d.ts +219 -0
  85. package/dist/features/sync.d.ts.map +1 -0
  86. package/dist/features/sync.js +461 -0
  87. package/dist/features/sync.js.map +1 -0
  88. package/dist/index.d.ts +3 -0
  89. package/dist/index.d.ts.map +1 -0
  90. package/dist/index.js +56 -0
  91. package/dist/index.js.map +1 -0
  92. package/dist/ingest/compute.d.ts +63 -0
  93. package/dist/ingest/compute.d.ts.map +1 -0
  94. package/dist/ingest/compute.js +161 -0
  95. package/dist/ingest/compute.js.map +1 -0
  96. package/dist/ingest/file.d.ts +40 -0
  97. package/dist/ingest/file.d.ts.map +1 -0
  98. package/dist/ingest/file.js +74 -0
  99. package/dist/ingest/file.js.map +1 -0
  100. package/dist/ingest/visual.d.ts +52 -0
  101. package/dist/ingest/visual.d.ts.map +1 -0
  102. package/dist/ingest/visual.js +294 -0
  103. package/dist/ingest/visual.js.map +1 -0
  104. package/dist/parser/docx-parser.d.ts +12 -0
  105. package/dist/parser/docx-parser.d.ts.map +1 -0
  106. package/dist/parser/docx-parser.js +375 -0
  107. package/dist/parser/docx-parser.js.map +1 -0
  108. package/dist/parser/html-parser.d.ts +16 -0
  109. package/dist/parser/html-parser.d.ts.map +1 -0
  110. package/dist/parser/html-parser.js +119 -0
  111. package/dist/parser/html-parser.js.map +1 -0
  112. package/dist/parser/index.d.ts +125 -0
  113. package/dist/parser/index.d.ts.map +1 -0
  114. package/dist/parser/index.js +364 -0
  115. package/dist/parser/index.js.map +1 -0
  116. package/dist/parser/pdf-extract.d.ts +49 -0
  117. package/dist/parser/pdf-extract.d.ts.map +1 -0
  118. package/dist/parser/pdf-extract.js +114 -0
  119. package/dist/parser/pdf-extract.js.map +1 -0
  120. package/dist/parser/pdf-filter.d.ts +91 -0
  121. package/dist/parser/pdf-filter.d.ts.map +1 -0
  122. package/dist/parser/pdf-filter.js +522 -0
  123. package/dist/parser/pdf-filter.js.map +1 -0
  124. package/dist/parser/title-extractor.d.ts +28 -0
  125. package/dist/parser/title-extractor.d.ts.map +1 -0
  126. package/dist/parser/title-extractor.js +105 -0
  127. package/dist/parser/title-extractor.js.map +1 -0
  128. package/dist/pdf-visual/captioner.d.ts +11 -0
  129. package/dist/pdf-visual/captioner.d.ts.map +1 -0
  130. package/dist/pdf-visual/captioner.js +48 -0
  131. package/dist/pdf-visual/captioner.js.map +1 -0
  132. package/dist/pdf-visual/captioners/fast.d.ts +7 -0
  133. package/dist/pdf-visual/captioners/fast.d.ts.map +1 -0
  134. package/dist/pdf-visual/captioners/fast.js +108 -0
  135. package/dist/pdf-visual/captioners/fast.js.map +1 -0
  136. package/dist/pdf-visual/captioners/quality.d.ts +7 -0
  137. package/dist/pdf-visual/captioners/quality.d.ts.map +1 -0
  138. package/dist/pdf-visual/captioners/quality.js +101 -0
  139. package/dist/pdf-visual/captioners/quality.js.map +1 -0
  140. package/dist/pdf-visual/captioners/shared.d.ts +81 -0
  141. package/dist/pdf-visual/captioners/shared.d.ts.map +1 -0
  142. package/dist/pdf-visual/captioners/shared.js +156 -0
  143. package/dist/pdf-visual/captioners/shared.js.map +1 -0
  144. package/dist/pdf-visual/detector.d.ts +9 -0
  145. package/dist/pdf-visual/detector.d.ts.map +1 -0
  146. package/dist/pdf-visual/detector.js +269 -0
  147. package/dist/pdf-visual/detector.js.map +1 -0
  148. package/dist/pdf-visual/index.d.ts +13 -0
  149. package/dist/pdf-visual/index.d.ts.map +1 -0
  150. package/dist/pdf-visual/index.js +53 -0
  151. package/dist/pdf-visual/index.js.map +1 -0
  152. package/dist/pdf-visual/renderer.d.ts +9 -0
  153. package/dist/pdf-visual/renderer.d.ts.map +1 -0
  154. package/dist/pdf-visual/renderer.js +186 -0
  155. package/dist/pdf-visual/renderer.js.map +1 -0
  156. package/dist/pdf-visual/types.d.ts +53 -0
  157. package/dist/pdf-visual/types.d.ts.map +1 -0
  158. package/dist/pdf-visual/types.js +17 -0
  159. package/dist/pdf-visual/types.js.map +1 -0
  160. package/dist/server/error-utils.d.ts +63 -0
  161. package/dist/server/error-utils.d.ts.map +1 -0
  162. package/dist/server/error-utils.js +124 -0
  163. package/dist/server/error-utils.js.map +1 -0
  164. package/dist/server/index.d.ts +216 -0
  165. package/dist/server/index.d.ts.map +1 -0
  166. package/dist/server/index.js +1068 -0
  167. package/dist/server/index.js.map +1 -0
  168. package/dist/server/list-scanner.d.ts +30 -0
  169. package/dist/server/list-scanner.d.ts.map +1 -0
  170. package/dist/server/list-scanner.js +50 -0
  171. package/dist/server/list-scanner.js.map +1 -0
  172. package/dist/server/tool-definitions.d.ts +8 -0
  173. package/dist/server/tool-definitions.d.ts.map +1 -0
  174. package/dist/server/tool-definitions.js +181 -0
  175. package/dist/server/tool-definitions.js.map +1 -0
  176. package/dist/server/tool-input.d.ts +37 -0
  177. package/dist/server/tool-input.d.ts.map +1 -0
  178. package/dist/server/tool-input.js +211 -0
  179. package/dist/server/tool-input.js.map +1 -0
  180. package/dist/server/types.d.ts +307 -0
  181. package/dist/server/types.d.ts.map +1 -0
  182. package/dist/server/types.js +3 -0
  183. package/dist/server/types.js.map +1 -0
  184. package/dist/server-main.d.ts +40 -0
  185. package/dist/server-main.d.ts.map +1 -0
  186. package/dist/server-main.js +254 -0
  187. package/dist/server-main.js.map +1 -0
  188. package/dist/utils/base-dirs.d.ts +145 -0
  189. package/dist/utils/base-dirs.d.ts.map +1 -0
  190. package/dist/utils/base-dirs.js +344 -0
  191. package/dist/utils/base-dirs.js.map +1 -0
  192. package/dist/utils/errors.d.ts +32 -0
  193. package/dist/utils/errors.d.ts.map +1 -0
  194. package/dist/utils/errors.js +61 -0
  195. package/dist/utils/errors.js.map +1 -0
  196. package/dist/utils/limits.d.ts +26 -0
  197. package/dist/utils/limits.d.ts.map +1 -0
  198. package/dist/utils/limits.js +28 -0
  199. package/dist/utils/limits.js.map +1 -0
  200. package/dist/utils/list-sources.d.ts +38 -0
  201. package/dist/utils/list-sources.d.ts.map +1 -0
  202. package/dist/utils/list-sources.js +40 -0
  203. package/dist/utils/list-sources.js.map +1 -0
  204. package/dist/utils/raw-data-utils.d.ts +76 -0
  205. package/dist/utils/raw-data-utils.d.ts.map +1 -0
  206. package/dist/utils/raw-data-utils.js +202 -0
  207. package/dist/utils/raw-data-utils.js.map +1 -0
  208. package/dist/utils/scan.d.ts +114 -0
  209. package/dist/utils/scan.d.ts.map +1 -0
  210. package/dist/utils/scan.js +209 -0
  211. package/dist/utils/scan.js.map +1 -0
  212. package/dist/utils/scope-match.d.ts +38 -0
  213. package/dist/utils/scope-match.d.ts.map +1 -0
  214. package/dist/utils/scope-match.js +86 -0
  215. package/dist/utils/scope-match.js.map +1 -0
  216. package/dist/utils/sensitive-path.d.ts +9 -0
  217. package/dist/utils/sensitive-path.d.ts.map +1 -0
  218. package/dist/utils/sensitive-path.js +78 -0
  219. package/dist/utils/sensitive-path.js.map +1 -0
  220. package/dist/utils/sync-path-key.d.ts +14 -0
  221. package/dist/utils/sync-path-key.d.ts.map +1 -0
  222. package/dist/utils/sync-path-key.js +27 -0
  223. package/dist/utils/sync-path-key.js.map +1 -0
  224. package/dist/utils/type-guards.d.ts +18 -0
  225. package/dist/utils/type-guards.d.ts.map +1 -0
  226. package/dist/utils/type-guards.js +34 -0
  227. package/dist/utils/type-guards.js.map +1 -0
  228. package/dist/utils/visual-profile.d.ts +10 -0
  229. package/dist/utils/visual-profile.d.ts.map +1 -0
  230. package/dist/utils/visual-profile.js +15 -0
  231. package/dist/utils/visual-profile.js.map +1 -0
  232. package/dist/vectordb/index.d.ts +132 -0
  233. package/dist/vectordb/index.d.ts.map +1 -0
  234. package/dist/vectordb/index.js +617 -0
  235. package/dist/vectordb/index.js.map +1 -0
  236. package/dist/vectordb/search-filters.d.ts +15 -0
  237. package/dist/vectordb/search-filters.d.ts.map +1 -0
  238. package/dist/vectordb/search-filters.js +129 -0
  239. package/dist/vectordb/search-filters.js.map +1 -0
  240. package/dist/vectordb/types.d.ts +194 -0
  241. package/dist/vectordb/types.d.ts.map +1 -0
  242. package/dist/vectordb/types.js +237 -0
  243. package/dist/vectordb/types.js.map +1 -0
  244. package/package.json +108 -0
  245. package/skills/mcp-local-rag/SKILL.md +234 -0
  246. package/skills/mcp-local-rag/references/cli-reference.md +190 -0
  247. package/skills/mcp-local-rag/references/html-ingestion.md +78 -0
@@ -0,0 +1,27 @@
1
+ import type { GlobalOptions } from './options.js';
2
+ interface ListCliOptions {
3
+ /**
4
+ * Collected `--base-dir` values in CLI order. Repeatable: each flag
5
+ * occurrence appends one entry. `undefined` means the flag was not
6
+ * provided.
7
+ */
8
+ baseDirs?: string[] | undefined;
9
+ /**
10
+ * Repeatable `--scope` prefixes in CLI order; multiple flags union.
11
+ * `undefined` means no scope. Trailing-separator equivalence is
12
+ * `scope-match.ts`'s job.
13
+ */
14
+ scope?: string[] | undefined;
15
+ }
16
+ interface ParsedArgs {
17
+ options: ListCliOptions;
18
+ help: boolean;
19
+ }
20
+ /** No positional arguments; an unknown flag exits 1. */
21
+ export declare function parseArgs(args: string[]): ParsedArgs;
22
+ /**
23
+ * Run the list CLI subcommand.
24
+ */
25
+ export declare function runList(args: string[], globalOptions?: GlobalOptions): Promise<void>;
26
+ export {};
27
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/cli/list.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AA+DjD,UAAU,cAAc;IACtB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAA;IAC/B;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAA;CAC7B;AAED,UAAU,UAAU;IAClB,OAAO,EAAE,cAAc,CAAA;IACvB,IAAI,EAAE,OAAO,CAAA;CACd;AAwDD,wDAAwD;AACxD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAsDpD;AAMD;;GAEG;AACH,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,aAAa,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqG9F"}
@@ -0,0 +1,207 @@
1
+ // CLI list subcommand — list files and ingestion status
2
+ import { resolve, sep } from 'node:path';
3
+ import { listDocuments } from '../features/list.js';
4
+ import { displayPath } from '../utils/base-dirs.js';
5
+ import { MAX_SCAN_DEPTH } from '../utils/limits.js';
6
+ import { bfsCollectSupportedFiles } from '../utils/scan.js';
7
+ import { nonAbsolutePrefixes } from '../utils/scope-match.js';
8
+ import { createVectorStore, formatCliError, resolveCliBaseDirsOrExit } from './common.js';
9
+ import { consumeBaseDirArg, requireFlagValue, resolveGlobalConfig, validatePath, } from './options.js';
10
+ // ============================================
11
+ // Helpers
12
+ // ============================================
13
+ /** Lexicographic order, independent of locale. */
14
+ function compareStrings(a, b) {
15
+ if (a < b) {
16
+ return -1;
17
+ }
18
+ return a > b ? 1 : 0;
19
+ }
20
+ /**
21
+ * Delegates traversal to {@link bfsCollectSupportedFiles} and renders the
22
+ * `list`-specific warnings, annotated with `displayPath`.
23
+ */
24
+ async function scanRoot(root, excludePaths, scope) {
25
+ const { files, unreadableDirs, depthLimited } = await bfsCollectSupportedFiles(root, excludePaths, {
26
+ scope,
27
+ });
28
+ const warnings = [];
29
+ for (const { dirPath, code } of unreadableDirs) {
30
+ warnings.push(`cannot read directory: ${displayPath(dirPath)} (${code})`);
31
+ }
32
+ if (depthLimited) {
33
+ warnings.push(`some directories under ${displayPath(root)} were skipped because they exceed the maximum depth (${MAX_SCAN_DEPTH})`);
34
+ }
35
+ return { files, warnings };
36
+ }
37
+ // ============================================
38
+ // Help
39
+ // ============================================
40
+ const HELP_TEXT = `Usage: mcp-local-rag [global-options] list [options]
41
+
42
+ List files and their ingestion status.
43
+
44
+ Options:
45
+ --base-dir <path> Base directory to scan for files (repeatable: pass once per root; default: BASE_DIRS/BASE_DIR env or cwd)
46
+ --scope <prefix> Restrict results to a path prefix (must be absolute; a relative prefix matches nothing; repeatable for multiple prefixes)
47
+ -h, --help Show this help
48
+
49
+ Global options (must appear before "list"):
50
+ --db-path <path> LanceDB database path
51
+ --cache-dir <path> Model cache directory
52
+ --model-name <name> Embedding model`;
53
+ // ============================================
54
+ // Arg Parsing
55
+ // ============================================
56
+ /** No positional arguments; an unknown flag exits 1. */
57
+ export function parseArgs(args) {
58
+ const options = {};
59
+ let help = false;
60
+ let i = 0;
61
+ while (i < args.length) {
62
+ const arg = args[i] ?? '';
63
+ switch (arg) {
64
+ case '-h':
65
+ case '--help':
66
+ help = true;
67
+ i++;
68
+ break;
69
+ case '--base-dir': {
70
+ // Repeatable: each `--base-dir <path>` occurrence appends one entry
71
+ // to `options.baseDirs`. The accumulator is lazily initialized so an
72
+ // absent flag leaves `options.baseDirs` as `undefined`, which the
73
+ // resolver treats as "fall through to env / cwd".
74
+ if (options.baseDirs === undefined) {
75
+ options.baseDirs = [];
76
+ }
77
+ const valueIndex = consumeBaseDirArg(args, i, options.baseDirs);
78
+ i = valueIndex + 1;
79
+ break;
80
+ }
81
+ case '--scope': {
82
+ // Repeatable prefix filter (mirrors `query --scope`). Trim and reject
83
+ // empty/whitespace locally — the same non-empty check `normalizeScope`
84
+ // applies at the MCP boundary, kept module-private there. Trailing-
85
+ // separator equivalence is handled downstream in `scope-match.ts`.
86
+ const value = requireFlagValue(args, i, '--scope').trim();
87
+ if (value.length === 0) {
88
+ console.error('--scope value must not be empty');
89
+ process.exit(1);
90
+ }
91
+ const scope = options.scope ?? [];
92
+ scope.push(value);
93
+ options.scope = scope;
94
+ i += 2;
95
+ break;
96
+ }
97
+ default:
98
+ if (arg.startsWith('-')) {
99
+ console.error(`Unknown option: ${arg}`);
100
+ console.error(HELP_TEXT);
101
+ process.exit(1);
102
+ }
103
+ console.error(`Unexpected argument: ${arg}`);
104
+ console.error('The list command does not accept positional arguments.');
105
+ process.exit(1);
106
+ }
107
+ }
108
+ return { options, help };
109
+ }
110
+ // ============================================
111
+ // Main Entry Point
112
+ // ============================================
113
+ /**
114
+ * Run the list CLI subcommand.
115
+ */
116
+ export async function runList(args, globalOptions = {}) {
117
+ // Parse CLI options
118
+ const { options, help } = parseArgs(args);
119
+ // Handle --help
120
+ if (help) {
121
+ console.error(HELP_TEXT);
122
+ process.exit(0);
123
+ }
124
+ // Resolve global config
125
+ const globalConfig = resolveGlobalConfig(globalOptions);
126
+ // Validate CLI-supplied paths against the sensitive-path policy BEFORE
127
+ // calling the resolver, so the user sees a `--base-dir`-attributed error
128
+ // without an unnecessary realpath round-trip on a rejected path.
129
+ const cliBaseDirs = options.baseDirs ?? [];
130
+ for (const root of cliBaseDirs) {
131
+ const baseDirError = validatePath(root, '--base-dir');
132
+ if (baseDirError) {
133
+ console.error(baseDirError);
134
+ process.exit(1);
135
+ }
136
+ }
137
+ // Resolver errors exit non-zero and do NOT fall back. Warnings go to stderr,
138
+ // so the JSON-only stdout contract survives.
139
+ const { config: baseDirsConfig, warnings: baseDirsWarnings } = await resolveCliBaseDirsOrExit(cliBaseDirs);
140
+ for (const warning of baseDirsWarnings) {
141
+ console.error(warning.message);
142
+ }
143
+ // A non-absolute `--scope` prefix matches nothing (scan matching is
144
+ // absolute-path based) but silently yields an empty result for that prefix.
145
+ // Surface it as a non-fatal stderr warning without changing result semantics
146
+ // or the exit code — relative is unhelpful, not an error.
147
+ if (options.scope) {
148
+ for (const prefix of nonAbsolutePrefixes(options.scope)) {
149
+ console.error(`Warning [scope]: "${prefix}" is not an absolute path; it matches nothing.`);
150
+ }
151
+ }
152
+ // Scan/display the normal-path roots (`rawBaseDirs`) so scanned paths match
153
+ // the resolve()-stored DB keys; the realpath'd `baseDirs` are the security
154
+ // boundary, not used here. `rawBaseDirs[0]` is the legacy `baseDir` field.
155
+ const rawBaseDirs = baseDirsConfig.rawBaseDirs;
156
+ const firstRawBaseDir = rawBaseDirs[0];
157
+ if (firstRawBaseDir === undefined) {
158
+ // Cannot happen in non-degraded mode: the resolver always returns at least
159
+ // one effective root. Surface as a programming error rather than emitting
160
+ // an empty `baseDir` field.
161
+ throw new Error('internal: resolver returned no effective base directories');
162
+ }
163
+ const baseDir = firstRawBaseDir;
164
+ const vectorStore = createVectorStore(globalConfig);
165
+ try {
166
+ await vectorStore.initialize();
167
+ // Build exclude paths (resolved to absolute, platform-aware trailing
168
+ // separator). Applied uniformly to every root so dbPath/cacheDir remain
169
+ // excluded under each root even when they happen to live below one of
170
+ // them.
171
+ const excludePaths = [
172
+ `${resolve(globalConfig.dbPath)}${sep}`,
173
+ `${resolve(globalConfig.cacheDir)}${sep}`,
174
+ ];
175
+ const ingested = await vectorStore.listFiles();
176
+ const listed = await listDocuments({
177
+ roots: rawBaseDirs,
178
+ dbPath: globalConfig.dbPath,
179
+ ingested,
180
+ scope: options.scope,
181
+ scan: (root, scope) => scanRoot(root, excludePaths, scope),
182
+ });
183
+ for (const warning of listed.warnings) {
184
+ console.error(`Warning [${warning.baseDir}]: ${warning.message}`);
185
+ }
186
+ const files = listed.files;
187
+ files.sort((a, b) => compareStrings(a.filePath, b.filePath));
188
+ const sources = listed.sources;
189
+ const result = {
190
+ baseDirs: [...rawBaseDirs],
191
+ baseDir,
192
+ files,
193
+ sources,
194
+ };
195
+ // Output JSON to stdout
196
+ process.stdout.write(JSON.stringify(result, null, 2));
197
+ }
198
+ catch (error) {
199
+ const message = formatCliError(error);
200
+ console.error(`Failed to list files: ${message}`);
201
+ process.exitCode = 1;
202
+ }
203
+ finally {
204
+ await vectorStore.close();
205
+ }
206
+ }
207
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/cli/list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ import { type QualityProfile } from '../utils/visual-profile.js';
2
+ /**
3
+ * Delegates to `checkSensitivePath`, so the CLI and MCP entry points share one
4
+ * policy. Returns an error message, or `undefined` when valid.
5
+ */
6
+ export declare function validatePath(value: string, flagName: string): string | undefined;
7
+ /**
8
+ * Validate model name against allowed pattern.
9
+ * Returns an error message if invalid, or undefined if valid.
10
+ */
11
+ export declare function validateModelName(value: string): string | undefined;
12
+ /**
13
+ * Validate max file size is within acceptable range.
14
+ * Returns an error message if invalid, or undefined if valid.
15
+ */
16
+ export declare function validateMaxFileSize(value: number): string | undefined;
17
+ /**
18
+ * Validate chunk minimum length is within acceptable range.
19
+ * Returns an error message if invalid, or undefined if valid.
20
+ */
21
+ export declare function validateChunkMinLength(value: number): string | undefined;
22
+ /**
23
+ * Consume the value after a `--base-dir` and append it to `collected`, so the
24
+ * flag can repeat with its order preserved. Returns the value's index, or
25
+ * exits 1 when the value is missing.
26
+ *
27
+ * Shared because `ingest`, `list` and `sync` must stay in lockstep here.
28
+ */
29
+ export declare function consumeBaseDirArg(argv: string[], flagIndex: number, collected: string[]): number;
30
+ /**
31
+ * Read the required value after a value-taking flag, exiting 1 when the next
32
+ * token is absent or is itself a flag. The caller advances by 2. Numeric flags
33
+ * validate the returned string themselves.
34
+ */
35
+ export declare function requireFlagValue(argv: string[], flagIndex: number, flag: string): string;
36
+ /**
37
+ * Read the `--visual-quality` value, exiting 1 when it is missing or outside
38
+ * the profile vocabulary. Shared by `ingest` and `sync` so both subcommands
39
+ * accept and reject exactly the same values with the same message.
40
+ */
41
+ export declare function requireVisualQuality(argv: string[], flagIndex: number): QualityProfile;
42
+ export interface GlobalOptions {
43
+ dbPath?: string | undefined;
44
+ cacheDir?: string | undefined;
45
+ modelName?: string | undefined;
46
+ }
47
+ export interface ParsedGlobalResult {
48
+ globalOptions: GlobalOptions;
49
+ remainingArgs: string[];
50
+ }
51
+ export interface ResolvedGlobalConfig {
52
+ dbPath: string;
53
+ cacheDir: string;
54
+ modelName: string;
55
+ }
56
+ export declare const GLOBAL_DEFAULTS: {
57
+ readonly dbPath: './lancedb/';
58
+ readonly cacheDir: './models/';
59
+ readonly modelName: 'Xenova/all-MiniLM-L6-v2';
60
+ };
61
+ export declare const ROOT_HELP_TEXT: string;
62
+ /**
63
+ * Extract global options, which are recognized only BEFORE the subcommand.
64
+ * Everything after it is forwarded as-is.
65
+ */
66
+ export declare function parseGlobalOptions(args: string[]): ParsedGlobalResult;
67
+ /**
68
+ * Resolve global config with priority: CLI flags > environment variables > defaults.
69
+ * Validates all resolved values before returning.
70
+ */
71
+ export declare function resolveGlobalConfig(options: GlobalOptions): ResolvedGlobalConfig;
72
+ /**
73
+ * Resolve RAG_DEVICE. The value is passed through to transformers.js — no
74
+ * allowlist is maintained here. Whitespace-only is treated as unset.
75
+ */
76
+ export declare function resolveDevice(value: string | undefined): string;
77
+ /**
78
+ * Resolve RAG_DTYPE, passed through with no allowlist like RAG_DEVICE. Unset
79
+ * resolves to `undefined`, NOT a default: that is the only signal separating
80
+ * "unset" from an explicit `RAG_DTYPE=fp32`, and it gates the failure-path
81
+ * error enrichment. The fp32 default lives in `Embedder.initialize()` alone.
82
+ */
83
+ export declare function resolveDtype(value: string | undefined): string | undefined;
84
+ /**
85
+ * Resolve RAG_EMBEDDING_SERVER_URL. Unset or whitespace-only resolves to
86
+ * `undefined`, which keeps the local Transformers.js pipeline selected.
87
+ */
88
+ export declare function resolveEmbeddingServerUrl(value: string | undefined): string | undefined;
89
+ //# sourceMappingURL=options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/cli/options.ts"],"names":[],"mappings":"AAIA,OAAO,EAAoB,KAAK,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAMlF;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEhF;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CASnE;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKrE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKxE;AAMD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,CAShG;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAOxF;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,cAAc,CAStF;AAMD,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC3B,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC7B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAC/B;AAED,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,aAAa,CAAA;IAC5B,aAAa,EAAE,MAAM,EAAE,CAAA;CACxB;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;CAClB;AAMD,eAAO,MAAM,eAAe;aAC1B,MAAM,EAAE,YAAY;aACpB,QAAQ,EAAE,WAAW;aACrB,SAAS,EAAE,yBAAyB;CAC5B,CAAA;AAMV,eAAO,MAAM,cAAc,QAgBiC,CAAA;AAM5D;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,kBAAkB,CAsDrE;AAMD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,aAAa,GAAG,oBAAoB,CA0BhF;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAK/D;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAK1E;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAKvF"}
@@ -0,0 +1,244 @@
1
+ // Shared CLI global options — parsed before subcommand routing
2
+ import { MAX_CHUNK_MIN_LENGTH, MAX_FILE_SIZE_LIMIT } from '../utils/limits.js';
3
+ import { checkSensitivePath } from '../utils/sensitive-path.js';
4
+ import { isQualityProfile } from '../utils/visual-profile.js';
5
+ // ============================================
6
+ // Validation Helpers
7
+ // ============================================
8
+ /**
9
+ * Delegates to `checkSensitivePath`, so the CLI and MCP entry points share one
10
+ * policy. Returns an error message, or `undefined` when valid.
11
+ */
12
+ export function validatePath(value, flagName) {
13
+ return checkSensitivePath(value, flagName);
14
+ }
15
+ /**
16
+ * Validate model name against allowed pattern.
17
+ * Returns an error message if invalid, or undefined if valid.
18
+ */
19
+ export function validateModelName(value) {
20
+ const pattern = /^[a-zA-Z0-9_\-./]+$/;
21
+ if (!pattern.test(value)) {
22
+ return `Invalid model name: ${value}. Only alphanumeric, '_', '-', '.', '/' allowed.`;
23
+ }
24
+ if (value.includes('..')) {
25
+ return `Invalid model name: ${value}. Path traversal ('..') is not allowed.`;
26
+ }
27
+ return undefined;
28
+ }
29
+ /**
30
+ * Validate max file size is within acceptable range.
31
+ * Returns an error message if invalid, or undefined if valid.
32
+ */
33
+ export function validateMaxFileSize(value) {
34
+ if (!Number.isFinite(value) || value < 1 || value > MAX_FILE_SIZE_LIMIT) {
35
+ return `--max-file-size must be between 1 and ${MAX_FILE_SIZE_LIMIT} (500MB)`;
36
+ }
37
+ return undefined;
38
+ }
39
+ /**
40
+ * Validate chunk minimum length is within acceptable range.
41
+ * Returns an error message if invalid, or undefined if valid.
42
+ */
43
+ export function validateChunkMinLength(value) {
44
+ if (!Number.isFinite(value) || value < 1 || value > MAX_CHUNK_MIN_LENGTH) {
45
+ return `--chunk-min-length must be between 1 and ${MAX_CHUNK_MIN_LENGTH}`;
46
+ }
47
+ return undefined;
48
+ }
49
+ // ============================================
50
+ // Repeatable --base-dir parsing
51
+ // ============================================
52
+ /**
53
+ * Consume the value after a `--base-dir` and append it to `collected`, so the
54
+ * flag can repeat with its order preserved. Returns the value's index, or
55
+ * exits 1 when the value is missing.
56
+ *
57
+ * Shared because `ingest`, `list` and `sync` must stay in lockstep here.
58
+ */
59
+ export function consumeBaseDirArg(argv, flagIndex, collected) {
60
+ const valueIndex = flagIndex + 1;
61
+ const value = argv[valueIndex];
62
+ if (value === undefined || value.startsWith('-')) {
63
+ console.error('Missing value for --base-dir');
64
+ process.exit(1);
65
+ }
66
+ collected.push(value);
67
+ return valueIndex;
68
+ }
69
+ /**
70
+ * Read the required value after a value-taking flag, exiting 1 when the next
71
+ * token is absent or is itself a flag. The caller advances by 2. Numeric flags
72
+ * validate the returned string themselves.
73
+ */
74
+ export function requireFlagValue(argv, flagIndex, flag) {
75
+ const value = argv[flagIndex + 1];
76
+ if (value === undefined || value.startsWith('-')) {
77
+ console.error(`Missing value for ${flag}`);
78
+ process.exit(1);
79
+ }
80
+ return value;
81
+ }
82
+ /**
83
+ * Read the `--visual-quality` value, exiting 1 when it is missing or outside
84
+ * the profile vocabulary. Shared by `ingest` and `sync` so both subcommands
85
+ * accept and reject exactly the same values with the same message.
86
+ */
87
+ export function requireVisualQuality(argv, flagIndex) {
88
+ const value = requireFlagValue(argv, flagIndex, '--visual-quality');
89
+ if (!isQualityProfile(value)) {
90
+ console.error(`Invalid value for --visual-quality: "${value.slice(0, 100)}". Expected "fast" or "quality".`);
91
+ process.exit(1);
92
+ }
93
+ return value;
94
+ }
95
+ // ============================================
96
+ // Defaults
97
+ // ============================================
98
+ export const GLOBAL_DEFAULTS = {
99
+ dbPath: './lancedb/',
100
+ cacheDir: './models/',
101
+ modelName: 'Xenova/all-MiniLM-L6-v2',
102
+ };
103
+ // ============================================
104
+ // Help
105
+ // ============================================
106
+ export const ROOT_HELP_TEXT = `Usage: mcp-local-rag [options] <command>
107
+
108
+ Options:
109
+ --db-path <path> LanceDB database path (default: ${GLOBAL_DEFAULTS.dbPath})
110
+ --cache-dir <path> Model cache directory (default: ${GLOBAL_DEFAULTS.cacheDir})
111
+ --model-name <name> Embedding model (default: ${GLOBAL_DEFAULTS.modelName})
112
+ -h, --help Show this help
113
+
114
+ Commands:
115
+ ingest <path> Ingest files into the vector database
116
+ sync [path] Incrementally synchronize indexed files with disk
117
+ query <text> Search ingested documents
118
+ read-neighbors Read N chunks before and after a target chunk within the same document
119
+ list List files and ingestion status
120
+ status Show database status
121
+ delete <path> Delete ingested content
122
+ skills install Install Claude Code / Codex skills`;
123
+ // ============================================
124
+ // Global Option Parsing
125
+ // ============================================
126
+ /**
127
+ * Extract global options, which are recognized only BEFORE the subcommand.
128
+ * Everything after it is forwarded as-is.
129
+ */
130
+ export function parseGlobalOptions(args) {
131
+ const globalOptions = {};
132
+ let help = false;
133
+ let i = 0;
134
+ // Parse global flags until we hit a non-flag (subcommand) or end of args
135
+ while (i < args.length) {
136
+ const arg = args[i] ?? '';
137
+ switch (arg) {
138
+ case '-h':
139
+ case '--help':
140
+ help = true;
141
+ i++;
142
+ break;
143
+ case '--db-path': {
144
+ globalOptions.dbPath = requireFlagValue(args, i, '--db-path');
145
+ i += 2;
146
+ break;
147
+ }
148
+ case '--cache-dir': {
149
+ globalOptions.cacheDir = requireFlagValue(args, i, '--cache-dir');
150
+ i += 2;
151
+ break;
152
+ }
153
+ case '--model-name': {
154
+ globalOptions.modelName = requireFlagValue(args, i, '--model-name');
155
+ i += 2;
156
+ break;
157
+ }
158
+ default:
159
+ // If arg starts with -, it's an unknown global flag
160
+ if (arg.startsWith('-')) {
161
+ console.error(`Unknown global option: ${arg}`);
162
+ console.error('Run "mcp-local-rag --help" for available options.');
163
+ process.exit(1);
164
+ }
165
+ // First non-global-flag token: treat as subcommand boundary.
166
+ // Everything from here onward is returned as remainingArgs.
167
+ if (help) {
168
+ // If --help was seen before subcommand, show root help
169
+ console.error(ROOT_HELP_TEXT);
170
+ process.exit(0);
171
+ }
172
+ return { globalOptions, remainingArgs: args.slice(i) };
173
+ }
174
+ }
175
+ // All args consumed (no subcommand found)
176
+ if (help) {
177
+ console.error(ROOT_HELP_TEXT);
178
+ process.exit(0);
179
+ }
180
+ return { globalOptions, remainingArgs: [] };
181
+ }
182
+ // ============================================
183
+ // Config Resolution
184
+ // ============================================
185
+ /**
186
+ * Resolve global config with priority: CLI flags > environment variables > defaults.
187
+ * Validates all resolved values before returning.
188
+ */
189
+ export function resolveGlobalConfig(options) {
190
+ const dbPath = options.dbPath ?? process.env['DB_PATH'] ?? GLOBAL_DEFAULTS.dbPath;
191
+ const cacheDir = options.cacheDir ?? process.env['CACHE_DIR'] ?? GLOBAL_DEFAULTS.cacheDir;
192
+ const modelName = options.modelName ?? process.env['MODEL_NAME'] ?? GLOBAL_DEFAULTS.modelName;
193
+ // Validate paths
194
+ const dbPathError = validatePath(dbPath, '--db-path');
195
+ if (dbPathError) {
196
+ console.error(dbPathError);
197
+ process.exit(1);
198
+ }
199
+ const cacheDirError = validatePath(cacheDir, '--cache-dir');
200
+ if (cacheDirError) {
201
+ console.error(cacheDirError);
202
+ process.exit(1);
203
+ }
204
+ // Validate model name
205
+ const modelNameError = validateModelName(modelName);
206
+ if (modelNameError) {
207
+ console.error(modelNameError);
208
+ process.exit(1);
209
+ }
210
+ return { dbPath, cacheDir, modelName };
211
+ }
212
+ /**
213
+ * Resolve RAG_DEVICE. The value is passed through to transformers.js — no
214
+ * allowlist is maintained here. Whitespace-only is treated as unset.
215
+ */
216
+ export function resolveDevice(value) {
217
+ if (!value || value.trim() === '') {
218
+ return 'cpu';
219
+ }
220
+ return value.trim();
221
+ }
222
+ /**
223
+ * Resolve RAG_DTYPE, passed through with no allowlist like RAG_DEVICE. Unset
224
+ * resolves to `undefined`, NOT a default: that is the only signal separating
225
+ * "unset" from an explicit `RAG_DTYPE=fp32`, and it gates the failure-path
226
+ * error enrichment. The fp32 default lives in `Embedder.initialize()` alone.
227
+ */
228
+ export function resolveDtype(value) {
229
+ if (!value || value.trim() === '') {
230
+ return undefined;
231
+ }
232
+ return value.trim();
233
+ }
234
+ /**
235
+ * Resolve RAG_EMBEDDING_SERVER_URL. Unset or whitespace-only resolves to
236
+ * `undefined`, which keeps the local Transformers.js pipeline selected.
237
+ */
238
+ export function resolveEmbeddingServerUrl(value) {
239
+ if (!value || value.trim() === '') {
240
+ return undefined;
241
+ }
242
+ return value.trim().replace(/\/+$/, '');
243
+ }
244
+ //# sourceMappingURL=options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.js","sourceRoot":"","sources":["../../src/cli/options.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { GlobalOptions } from './options.js';
2
+ interface QueryCliOptions {
3
+ limit?: number | undefined;
4
+ scope?: string[] | undefined;
5
+ }
6
+ interface ParsedArgs {
7
+ queryText: string | undefined;
8
+ options: QueryCliOptions;
9
+ help: boolean;
10
+ }
11
+ export declare function parseArgs(args: string[]): ParsedArgs;
12
+ /**
13
+ * Run the query CLI subcommand.
14
+ */
15
+ export declare function runQuery(args: string[], globalOptions?: GlobalOptions): Promise<void>;
16
+ export {};
17
+ //# sourceMappingURL=query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/cli/query.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAOjD,UAAU,eAAe;IACvB,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC1B,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAA;CAC7B;AAED,UAAU,UAAU;IAClB,SAAS,EAAE,MAAM,GAAG,SAAS,CAAA;IAC7B,OAAO,EAAE,eAAe,CAAA;IACxB,IAAI,EAAE,OAAO,CAAA;CACd;AA2ED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAqCpD;AAuBD;;GAEG;AACH,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,aAAa,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CA8F/F"}