contentbase 0.4.0 → 0.4.2

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 (323) hide show
  1. package/dist/adapters/node-fs.d.ts +17 -0
  2. package/dist/adapters/node-fs.d.ts.map +1 -0
  3. package/dist/adapters/node-fs.js +71 -0
  4. package/dist/adapters/node-fs.js.map +1 -0
  5. package/dist/ast-query.d.ts +44 -0
  6. package/dist/ast-query.d.ts.map +1 -0
  7. package/dist/ast-query.js +95 -0
  8. package/dist/ast-query.js.map +1 -0
  9. package/dist/base-model.d.ts +8 -0
  10. package/dist/base-model.d.ts.map +1 -0
  11. package/dist/base-model.js +12 -0
  12. package/dist/base-model.js.map +1 -0
  13. package/dist/cli/commands/action.d.ts +2 -0
  14. package/dist/cli/commands/action.d.ts.map +1 -0
  15. package/dist/cli/commands/action.js +73 -0
  16. package/dist/cli/commands/action.js.map +1 -0
  17. package/dist/cli/commands/api/endpoints/actions.d.ts +13 -0
  18. package/dist/cli/commands/api/endpoints/actions.d.ts.map +1 -0
  19. package/dist/cli/commands/api/endpoints/actions.js +28 -0
  20. package/dist/cli/commands/api/endpoints/actions.js.map +1 -0
  21. package/dist/cli/commands/api/endpoints/doc.d.ts +5 -0
  22. package/dist/cli/commands/api/endpoints/doc.d.ts.map +1 -0
  23. package/dist/cli/commands/api/endpoints/doc.js +186 -0
  24. package/dist/cli/commands/api/endpoints/doc.js.map +1 -0
  25. package/dist/cli/commands/api/endpoints/docs-index.d.ts +8 -0
  26. package/dist/cli/commands/api/endpoints/docs-index.d.ts.map +1 -0
  27. package/dist/cli/commands/api/endpoints/docs-index.js +23 -0
  28. package/dist/cli/commands/api/endpoints/docs-index.js.map +1 -0
  29. package/dist/cli/commands/api/endpoints/document.d.ts +47 -0
  30. package/dist/cli/commands/api/endpoints/document.d.ts.map +1 -0
  31. package/dist/cli/commands/api/endpoints/document.js +146 -0
  32. package/dist/cli/commands/api/endpoints/document.js.map +1 -0
  33. package/dist/cli/commands/api/endpoints/documents.d.ts +35 -0
  34. package/dist/cli/commands/api/endpoints/documents.d.ts.map +1 -0
  35. package/dist/cli/commands/api/endpoints/documents.js +56 -0
  36. package/dist/cli/commands/api/endpoints/documents.js.map +1 -0
  37. package/dist/cli/commands/api/endpoints/index.d.ts +22 -0
  38. package/dist/cli/commands/api/endpoints/index.d.ts.map +1 -0
  39. package/dist/cli/commands/api/endpoints/index.js +38 -0
  40. package/dist/cli/commands/api/endpoints/index.js.map +1 -0
  41. package/dist/cli/commands/api/endpoints/inspect.d.ts +10 -0
  42. package/dist/cli/commands/api/endpoints/inspect.d.ts.map +1 -0
  43. package/dist/cli/commands/api/endpoints/inspect.js +15 -0
  44. package/dist/cli/commands/api/endpoints/inspect.js.map +1 -0
  45. package/dist/cli/commands/api/endpoints/models.d.ts +5 -0
  46. package/dist/cli/commands/api/endpoints/models.d.ts.map +1 -0
  47. package/dist/cli/commands/api/endpoints/models.js +9 -0
  48. package/dist/cli/commands/api/endpoints/models.js.map +1 -0
  49. package/dist/cli/commands/api/endpoints/query.d.ts +40 -0
  50. package/dist/cli/commands/api/endpoints/query.d.ts.map +1 -0
  51. package/dist/cli/commands/api/endpoints/query.js +106 -0
  52. package/dist/cli/commands/api/endpoints/query.js.map +1 -0
  53. package/dist/cli/commands/api/endpoints/root.d.ts +5 -0
  54. package/dist/cli/commands/api/endpoints/root.d.ts.map +1 -0
  55. package/dist/cli/commands/api/endpoints/root.js +7 -0
  56. package/dist/cli/commands/api/endpoints/root.js.map +1 -0
  57. package/dist/cli/commands/api/endpoints/search-reindex.d.ts +10 -0
  58. package/dist/cli/commands/api/endpoints/search-reindex.d.ts.map +1 -0
  59. package/dist/cli/commands/api/endpoints/search-reindex.js +38 -0
  60. package/dist/cli/commands/api/endpoints/search-reindex.js.map +1 -0
  61. package/dist/cli/commands/api/endpoints/search-status.d.ts +7 -0
  62. package/dist/cli/commands/api/endpoints/search-status.d.ts.map +1 -0
  63. package/dist/cli/commands/api/endpoints/search-status.js +33 -0
  64. package/dist/cli/commands/api/endpoints/search-status.js.map +1 -0
  65. package/dist/cli/commands/api/endpoints/search.d.ts +24 -0
  66. package/dist/cli/commands/api/endpoints/search.d.ts.map +1 -0
  67. package/dist/cli/commands/api/endpoints/search.js +61 -0
  68. package/dist/cli/commands/api/endpoints/search.js.map +1 -0
  69. package/dist/cli/commands/api/endpoints/semantic-search.d.ts +28 -0
  70. package/dist/cli/commands/api/endpoints/semantic-search.d.ts.map +1 -0
  71. package/dist/cli/commands/api/endpoints/semantic-search.js +76 -0
  72. package/dist/cli/commands/api/endpoints/semantic-search.js.map +1 -0
  73. package/dist/cli/commands/api/endpoints/text-search.d.ts +17 -0
  74. package/dist/cli/commands/api/endpoints/text-search.d.ts.map +1 -0
  75. package/dist/cli/commands/api/endpoints/text-search.js +55 -0
  76. package/dist/cli/commands/api/endpoints/text-search.js.map +1 -0
  77. package/dist/cli/commands/api/endpoints/validate.d.ts +12 -0
  78. package/dist/cli/commands/api/endpoints/validate.d.ts.map +1 -0
  79. package/dist/cli/commands/api/endpoints/validate.js +27 -0
  80. package/dist/cli/commands/api/endpoints/validate.js.map +1 -0
  81. package/dist/cli/commands/api/helpers.d.ts +8 -0
  82. package/dist/cli/commands/api/helpers.d.ts.map +1 -0
  83. package/dist/cli/commands/api/helpers.js +89 -0
  84. package/dist/cli/commands/api/helpers.js.map +1 -0
  85. package/dist/cli/commands/console.d.ts +2 -0
  86. package/dist/cli/commands/console.d.ts.map +1 -0
  87. package/dist/cli/commands/console.js +117 -0
  88. package/dist/cli/commands/console.js.map +1 -0
  89. package/dist/cli/commands/create.d.ts +2 -0
  90. package/dist/cli/commands/create.d.ts.map +1 -0
  91. package/dist/cli/commands/create.js +185 -0
  92. package/dist/cli/commands/create.js.map +1 -0
  93. package/dist/cli/commands/embed.d.ts +2 -0
  94. package/dist/cli/commands/embed.d.ts.map +1 -0
  95. package/dist/cli/commands/embed.js +231 -0
  96. package/dist/cli/commands/embed.js.map +1 -0
  97. package/dist/cli/commands/export.d.ts +2 -0
  98. package/dist/cli/commands/export.d.ts.map +1 -0
  99. package/dist/cli/commands/export.js +55 -0
  100. package/dist/cli/commands/export.js.map +1 -0
  101. package/dist/cli/commands/extract.d.ts +2 -0
  102. package/dist/cli/commands/extract.d.ts.map +1 -0
  103. package/dist/cli/commands/extract.js +149 -0
  104. package/dist/cli/commands/extract.js.map +1 -0
  105. package/dist/cli/commands/help.d.ts +2 -0
  106. package/dist/cli/commands/help.d.ts.map +1 -0
  107. package/dist/cli/commands/help.js +58 -0
  108. package/dist/cli/commands/help.js.map +1 -0
  109. package/dist/cli/commands/index.d.ts +18 -0
  110. package/dist/cli/commands/index.d.ts.map +1 -0
  111. package/dist/cli/commands/index.js +19 -0
  112. package/dist/cli/commands/index.js.map +1 -0
  113. package/dist/cli/commands/init.d.ts +2 -0
  114. package/dist/cli/commands/init.d.ts.map +1 -0
  115. package/dist/cli/commands/init.js +82 -0
  116. package/dist/cli/commands/init.js.map +1 -0
  117. package/dist/cli/commands/inspect.d.ts +2 -0
  118. package/dist/cli/commands/inspect.d.ts.map +1 -0
  119. package/dist/cli/commands/inspect.js +53 -0
  120. package/dist/cli/commands/inspect.js.map +1 -0
  121. package/dist/cli/commands/mcp.d.ts +2 -0
  122. package/dist/cli/commands/mcp.d.ts.map +1 -0
  123. package/dist/cli/commands/mcp.js +92 -0
  124. package/dist/cli/commands/mcp.js.map +1 -0
  125. package/dist/cli/commands/search.d.ts +2 -0
  126. package/dist/cli/commands/search.d.ts.map +1 -0
  127. package/dist/cli/commands/search.js +212 -0
  128. package/dist/cli/commands/search.js.map +1 -0
  129. package/dist/cli/commands/serve.d.ts +2 -0
  130. package/dist/cli/commands/serve.d.ts.map +1 -0
  131. package/dist/cli/commands/serve.js +298 -0
  132. package/dist/cli/commands/serve.js.map +1 -0
  133. package/dist/cli/commands/summary.d.ts +2 -0
  134. package/dist/cli/commands/summary.d.ts.map +1 -0
  135. package/dist/cli/commands/summary.js +58 -0
  136. package/dist/cli/commands/summary.js.map +1 -0
  137. package/dist/cli/commands/teach.d.ts +2 -0
  138. package/dist/cli/commands/teach.d.ts.map +1 -0
  139. package/dist/cli/commands/teach.js +80 -0
  140. package/dist/cli/commands/teach.js.map +1 -0
  141. package/dist/cli/commands/text-search.d.ts +2 -0
  142. package/dist/cli/commands/text-search.d.ts.map +1 -0
  143. package/dist/cli/commands/text-search.js +125 -0
  144. package/dist/cli/commands/text-search.js.map +1 -0
  145. package/dist/cli/commands/update.d.ts +2 -0
  146. package/dist/cli/commands/update.d.ts.map +1 -0
  147. package/dist/cli/commands/update.js +167 -0
  148. package/dist/cli/commands/update.js.map +1 -0
  149. package/dist/cli/commands/validate.d.ts +2 -0
  150. package/dist/cli/commands/validate.d.ts.map +1 -0
  151. package/dist/cli/commands/validate.js +129 -0
  152. package/dist/cli/commands/validate.js.map +1 -0
  153. package/dist/cli/index.d.ts +3 -0
  154. package/dist/cli/index.d.ts.map +1 -0
  155. package/dist/cli/index.js +84 -0
  156. package/dist/cli/index.js.map +1 -0
  157. package/dist/cli/load-collection.d.ts +7 -0
  158. package/dist/cli/load-collection.d.ts.map +1 -0
  159. package/dist/cli/load-collection.js +201 -0
  160. package/dist/cli/load-collection.js.map +1 -0
  161. package/dist/cli/registry.d.ts +17 -0
  162. package/dist/cli/registry.d.ts.map +1 -0
  163. package/dist/cli/registry.js +16 -0
  164. package/dist/cli/registry.js.map +1 -0
  165. package/dist/cnotes +0 -0
  166. package/dist/collection.d.ts +145 -0
  167. package/dist/collection.d.ts.map +1 -0
  168. package/dist/collection.js +684 -0
  169. package/dist/collection.js.map +1 -0
  170. package/dist/define-model.d.ts +45 -0
  171. package/dist/define-model.d.ts.map +1 -0
  172. package/dist/define-model.js +106 -0
  173. package/dist/define-model.js.map +1 -0
  174. package/dist/document.d.ts +123 -0
  175. package/dist/document.d.ts.map +1 -0
  176. package/dist/document.js +434 -0
  177. package/dist/document.js.map +1 -0
  178. package/dist/extract-sections.d.ts +46 -0
  179. package/dist/extract-sections.d.ts.map +1 -0
  180. package/dist/extract-sections.js +153 -0
  181. package/dist/extract-sections.js.map +1 -0
  182. package/dist/index.d.ts +28 -0
  183. package/dist/index.d.ts.map +1 -0
  184. package/dist/index.js +31 -0
  185. package/dist/index.js.map +1 -0
  186. package/dist/mcp/helpers.d.ts +14 -0
  187. package/dist/mcp/helpers.d.ts.map +1 -0
  188. package/dist/mcp/helpers.js +7 -0
  189. package/dist/mcp/helpers.js.map +1 -0
  190. package/dist/mcp/model-info.d.ts +2 -0
  191. package/dist/mcp/model-info.d.ts.map +1 -0
  192. package/dist/mcp/model-info.js +94 -0
  193. package/dist/mcp/model-info.js.map +1 -0
  194. package/dist/mcp/prompts.d.ts +2 -0
  195. package/dist/mcp/prompts.d.ts.map +1 -0
  196. package/dist/mcp/prompts.js +180 -0
  197. package/dist/mcp/prompts.js.map +1 -0
  198. package/dist/mcp/readme.d.ts +2 -0
  199. package/dist/mcp/readme.d.ts.map +1 -0
  200. package/dist/mcp/readme.js +71 -0
  201. package/dist/mcp/readme.js.map +1 -0
  202. package/dist/mcp/resources.d.ts +2 -0
  203. package/dist/mcp/resources.d.ts.map +1 -0
  204. package/dist/mcp/resources.js +85 -0
  205. package/dist/mcp/resources.js.map +1 -0
  206. package/dist/mcp/server.d.ts +18 -0
  207. package/dist/mcp/server.d.ts.map +1 -0
  208. package/dist/mcp/server.js +83 -0
  209. package/dist/mcp/server.js.map +1 -0
  210. package/dist/mcp/tools/mutation.d.ts +2 -0
  211. package/dist/mcp/tools/mutation.d.ts.map +1 -0
  212. package/dist/mcp/tools/mutation.js +155 -0
  213. package/dist/mcp/tools/mutation.js.map +1 -0
  214. package/dist/mcp/tools/query.d.ts +2 -0
  215. package/dist/mcp/tools/query.d.ts.map +1 -0
  216. package/dist/mcp/tools/query.js +130 -0
  217. package/dist/mcp/tools/query.js.map +1 -0
  218. package/dist/mcp/tools/search.d.ts +2 -0
  219. package/dist/mcp/tools/search.d.ts.map +1 -0
  220. package/dist/mcp/tools/search.js +168 -0
  221. package/dist/mcp/tools/search.js.map +1 -0
  222. package/dist/model-instance.d.ts +11 -0
  223. package/dist/model-instance.d.ts.map +1 -0
  224. package/dist/model-instance.js +208 -0
  225. package/dist/model-instance.js.map +1 -0
  226. package/dist/node-shortcuts.d.ts +25 -0
  227. package/dist/node-shortcuts.d.ts.map +1 -0
  228. package/dist/node-shortcuts.js +67 -0
  229. package/dist/node-shortcuts.js.map +1 -0
  230. package/dist/parse.d.ts +45 -0
  231. package/dist/parse.d.ts.map +1 -0
  232. package/dist/parse.js +98 -0
  233. package/dist/parse.js.map +1 -0
  234. package/dist/query/collection-query.d.ts +39 -0
  235. package/dist/query/collection-query.d.ts.map +1 -0
  236. package/dist/query/collection-query.js +184 -0
  237. package/dist/query/collection-query.js.map +1 -0
  238. package/dist/query/index.d.ts +8 -0
  239. package/dist/query/index.d.ts.map +1 -0
  240. package/dist/query/index.js +5 -0
  241. package/dist/query/index.js.map +1 -0
  242. package/dist/query/operators.d.ts +3 -0
  243. package/dist/query/operators.d.ts.map +1 -0
  244. package/dist/query/operators.js +18 -0
  245. package/dist/query/operators.js.map +1 -0
  246. package/dist/query/query-builder.d.ts +34 -0
  247. package/dist/query/query-builder.d.ts.map +1 -0
  248. package/dist/query/query-builder.js +84 -0
  249. package/dist/query/query-builder.js.map +1 -0
  250. package/dist/query/query-dsl.d.ts +36 -0
  251. package/dist/query/query-dsl.d.ts.map +1 -0
  252. package/dist/query/query-dsl.js +195 -0
  253. package/dist/query/query-dsl.js.map +1 -0
  254. package/dist/relationships/belongs-to.d.ts +9 -0
  255. package/dist/relationships/belongs-to.d.ts.map +1 -0
  256. package/dist/relationships/belongs-to.js +34 -0
  257. package/dist/relationships/belongs-to.js.map +1 -0
  258. package/dist/relationships/has-many.d.ts +23 -0
  259. package/dist/relationships/has-many.d.ts.map +1 -0
  260. package/dist/relationships/has-many.js +136 -0
  261. package/dist/relationships/has-many.js.map +1 -0
  262. package/dist/relationships/index.d.ts +26 -0
  263. package/dist/relationships/index.d.ts.map +1 -0
  264. package/dist/relationships/index.js +32 -0
  265. package/dist/relationships/index.js.map +1 -0
  266. package/dist/relationships/types.d.ts +2 -0
  267. package/dist/relationships/types.d.ts.map +1 -0
  268. package/dist/relationships/types.js +2 -0
  269. package/dist/relationships/types.js.map +1 -0
  270. package/dist/search/document-inputs.d.ts +30 -0
  271. package/dist/search/document-inputs.d.ts.map +1 -0
  272. package/dist/search/document-inputs.js +52 -0
  273. package/dist/search/document-inputs.js.map +1 -0
  274. package/dist/search/luca-semantic-search.d.ts +27 -0
  275. package/dist/search/luca-semantic-search.d.ts.map +1 -0
  276. package/dist/search/luca-semantic-search.js +56 -0
  277. package/dist/search/luca-semantic-search.js.map +1 -0
  278. package/dist/section.d.ts +21 -0
  279. package/dist/section.d.ts.map +1 -0
  280. package/dist/section.js +21 -0
  281. package/dist/section.js.map +1 -0
  282. package/dist/types.d.ts +185 -0
  283. package/dist/types.d.ts.map +1 -0
  284. package/dist/types.js +2 -0
  285. package/dist/types.js.map +1 -0
  286. package/dist/utils/index.d.ts +9 -0
  287. package/dist/utils/index.d.ts.map +1 -0
  288. package/dist/utils/index.js +8 -0
  289. package/dist/utils/index.js.map +1 -0
  290. package/dist/utils/inflect.d.ts +6 -0
  291. package/dist/utils/inflect.d.ts.map +1 -0
  292. package/dist/utils/inflect.js +75 -0
  293. package/dist/utils/inflect.js.map +1 -0
  294. package/dist/utils/match-pattern.d.ts +25 -0
  295. package/dist/utils/match-pattern.d.ts.map +1 -0
  296. package/dist/utils/match-pattern.js +52 -0
  297. package/dist/utils/match-pattern.js.map +1 -0
  298. package/dist/utils/normalize-headings.d.ts +8 -0
  299. package/dist/utils/normalize-headings.d.ts.map +1 -0
  300. package/dist/utils/normalize-headings.js +19 -0
  301. package/dist/utils/normalize-headings.js.map +1 -0
  302. package/dist/utils/parse-table.d.ts +7 -0
  303. package/dist/utils/parse-table.d.ts.map +1 -0
  304. package/dist/utils/parse-table.js +17 -0
  305. package/dist/utils/parse-table.js.map +1 -0
  306. package/dist/utils/read-directory.d.ts +5 -0
  307. package/dist/utils/read-directory.d.ts.map +1 -0
  308. package/dist/utils/read-directory.js +29 -0
  309. package/dist/utils/read-directory.js.map +1 -0
  310. package/dist/utils/stringify-ast.d.ts +6 -0
  311. package/dist/utils/stringify-ast.d.ts.map +1 -0
  312. package/dist/utils/stringify-ast.js +8 -0
  313. package/dist/utils/stringify-ast.js.map +1 -0
  314. package/dist/utils/strip-markdown.d.ts +11 -0
  315. package/dist/utils/strip-markdown.d.ts.map +1 -0
  316. package/dist/utils/strip-markdown.js +48 -0
  317. package/dist/utils/strip-markdown.js.map +1 -0
  318. package/dist/validator.d.ts +10 -0
  319. package/dist/validator.d.ts.map +1 -0
  320. package/dist/validator.js +55 -0
  321. package/dist/validator.js.map +1 -0
  322. package/package.json +3 -3
  323. package/src/document.ts +26 -8
@@ -0,0 +1,117 @@
1
+ import { z } from 'zod';
2
+ import { commands } from '../registry.js';
3
+ import { loadCollection } from '../load-collection.js';
4
+ const argsSchema = z.object({
5
+ contentFolder: z.string().optional(),
6
+ });
7
+ async function handler(options, context) {
8
+ const container = context.container;
9
+ const ui = container.feature('ui');
10
+ const collection = await loadCollection({
11
+ contentFolder: options.contentFolder,
12
+ });
13
+ const featureContext = {
14
+ collection,
15
+ };
16
+ // Expose all container features
17
+ for (const name of container.features.available) {
18
+ try {
19
+ featureContext[name] = container.feature(name);
20
+ }
21
+ catch { }
22
+ }
23
+ // Load user console module if present
24
+ const consoleModulePath = container.paths.resolve('cnotes.console.ts');
25
+ let consoleModuleLoaded = false;
26
+ let consoleModuleError = null;
27
+ if (container.fs.exists(consoleModulePath)) {
28
+ try {
29
+ const vmFeature = container.feature('vm');
30
+ const userExports = vmFeature.loadModule(consoleModulePath, { container, console, collection });
31
+ Object.assign(featureContext, userExports);
32
+ consoleModuleLoaded = true;
33
+ }
34
+ catch (err) {
35
+ consoleModuleError = err;
36
+ }
37
+ }
38
+ const prompt = ui.colors.cyan('cnotes') + ui.colors.dim(' > ');
39
+ console.log();
40
+ console.log(ui.colors.dim(' Contentbase REPL — collection and container features in scope. Tab to autocomplete.'));
41
+ if (consoleModuleLoaded) {
42
+ console.log(ui.colors.dim(' Loaded cnotes.console.ts exports into scope.'));
43
+ }
44
+ else if (consoleModuleError) {
45
+ console.log(ui.colors.yellow(' Warning: Failed to load cnotes.console.ts:'));
46
+ console.log(ui.colors.yellow(` ${consoleModuleError.message}`));
47
+ console.log(ui.colors.dim(' The REPL will start without your custom exports.'));
48
+ }
49
+ console.log(ui.colors.dim(' Type .exit to quit.'));
50
+ console.log();
51
+ const repl = container.feature('repl', { prompt });
52
+ await repl.start({
53
+ context: {
54
+ ...featureContext,
55
+ console,
56
+ setTimeout,
57
+ setInterval,
58
+ clearTimeout,
59
+ clearInterval,
60
+ fetch,
61
+ Bun,
62
+ },
63
+ });
64
+ }
65
+ commands.register('console', {
66
+ description: 'Start an interactive REPL with collection and container features in scope',
67
+ help: `# cnotes console
68
+
69
+ Start an interactive REPL with the loaded collection, all container features, and optional user-defined exports in scope. Useful for exploring and debugging your content.
70
+
71
+ ## Usage
72
+
73
+ \`\`\`
74
+ cnotes console [options]
75
+ \`\`\`
76
+
77
+ ## Options
78
+
79
+ | Option | Description |
80
+ |--------|-------------|
81
+ | \`--contentFolder\` | Path to content folder |
82
+
83
+ ## Scope
84
+
85
+ The REPL has these variables available:
86
+
87
+ - \`collection\` — The loaded Collection instance
88
+ - All luca container features (fs, ui, grep, etc.)
89
+ - Exports from \`cnotes.console.ts\` if present in the project root
90
+
91
+ ## Custom Console Module
92
+
93
+ Create a \`cnotes.console.ts\` file in your project root to add custom helpers to the REPL scope:
94
+
95
+ \`\`\`typescript
96
+ export const myHelper = () => "hello from console"
97
+ \`\`\`
98
+
99
+ ## Examples
100
+
101
+ \`\`\`bash
102
+ # Start the REPL
103
+ cnotes console
104
+
105
+ # Start with a specific content folder
106
+ cnotes console --contentFolder ./docs
107
+
108
+ # Once inside the REPL:
109
+ # collection.available — list all document IDs
110
+ # collection.document('posts/hello') — load a document
111
+ # .exit — quit
112
+ \`\`\`
113
+ `,
114
+ argsSchema,
115
+ handler,
116
+ });
117
+ //# sourceMappingURL=console.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"console.js","sourceRoot":"","sources":["../../../src/cli/commands/console.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAEtD,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1B,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACrC,CAAC,CAAA;AAEF,KAAK,UAAU,OAAO,CAAC,OAAmC,EAAE,OAA2B;IACrF,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAA;IACnC,MAAM,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAElC,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC;QACtC,aAAa,EAAE,OAAO,CAAC,aAAa;KACrC,CAAC,CAAA;IAEF,MAAM,cAAc,GAAwB;QAC1C,UAAU;KACX,CAAA;IAED,gCAAgC;IAChC,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;QAChD,IAAI,CAAC;YACH,cAAc,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QAChD,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC;IAED,sCAAsC;IACtC,MAAM,iBAAiB,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAA;IACtE,IAAI,mBAAmB,GAAG,KAAK,CAAA;IAC/B,IAAI,kBAAkB,GAAiB,IAAI,CAAA;IAE3C,IAAI,SAAS,CAAC,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAC3C,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YACzC,MAAM,WAAW,GAAG,SAAS,CAAC,UAAU,CAAC,iBAAiB,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAA;YAC/F,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,WAAW,CAAC,CAAA;YAC1C,mBAAmB,GAAG,IAAI,CAAA;QAC5B,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,kBAAkB,GAAG,GAAG,CAAA;QAC1B,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IAE9D,OAAO,CAAC,GAAG,EAAE,CAAA;IACb,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,uFAAuF,CAAC,CAAC,CAAA;IACnH,IAAI,mBAAmB,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC,CAAA;IAC9E,CAAC;SAAM,IAAI,kBAAkB,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,8CAA8C,CAAC,CAAC,CAAA;QAC7E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,kBAAkB,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;QAClE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC,CAAA;IAClF,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,CAAA;IACnD,OAAO,CAAC,GAAG,EAAE,CAAA;IAEb,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAA;IAClD,MAAM,IAAI,CAAC,KAAK,CAAC;QACf,OAAO,EAAE;YACP,GAAG,cAAc;YACjB,OAAO;YACP,UAAU;YACV,WAAW;YACX,YAAY;YACZ,aAAa;YACb,KAAK;YACL,GAAG;SACJ;KACF,CAAC,CAAA;AACJ,CAAC;AAED,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAAE;IAC3B,WAAW,EAAE,2EAA2E;IACxF,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8CP;IACC,UAAU;IACV,OAAO;CACR,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/create.ts"],"names":[],"mappings":""}
@@ -0,0 +1,185 @@
1
+ import { z } from 'zod';
2
+ import fs from 'fs/promises';
3
+ import path from 'path';
4
+ import matter from 'gray-matter';
5
+ import { execSync } from 'child_process';
6
+ import { commands } from '../registry.js';
7
+ import { loadCollection } from '../load-collection.js';
8
+ import { kebabCase } from '../../utils/inflect.js';
9
+ import { introspectMetaSchema } from '../../collection.js';
10
+ const argsSchema = z.object({
11
+ title: z.string().optional(),
12
+ contentFolder: z.string().optional(),
13
+ openEditor: z.boolean().optional(),
14
+ });
15
+ async function handler(options, context) {
16
+ const collection = await loadCollection({
17
+ contentFolder: options.contentFolder,
18
+ });
19
+ const modelName = context.container.argv._[1];
20
+ if (!modelName) {
21
+ console.error('Usage: cnotes create <model> --title "Document Title"');
22
+ process.exit(1);
23
+ }
24
+ const title = options.title;
25
+ if (!title) {
26
+ console.error('--title is required');
27
+ process.exit(1);
28
+ }
29
+ const def = collection.getModelDefinition(modelName) ??
30
+ collection.modelDefinitions.find((d) => d.name.toLowerCase() === modelName.toLowerCase());
31
+ if (!def) {
32
+ console.error(`Model "${modelName}" not found. Available: ${collection.modelDefinitions.map((d) => d.name).join(', ')}`);
33
+ process.exit(1);
34
+ }
35
+ // Parse --meta.* flags from raw argv
36
+ // minimist nests dotted keys: --meta.status active → { meta: { status: 'active' } }
37
+ const metaOverrides = {};
38
+ const rawMeta = context.container.argv.meta;
39
+ if (rawMeta && typeof rawMeta === 'object') {
40
+ Object.assign(metaOverrides, rawMeta);
41
+ }
42
+ // Build meta from priority layers: zod defaults < definition.defaults < template frontmatter < CLI overrides
43
+ const zodDefaults = {};
44
+ for (const field of introspectMetaSchema(def.meta)) {
45
+ if (field.defaultValue !== undefined) {
46
+ zodDefaults[field.name] = field.defaultValue;
47
+ }
48
+ }
49
+ const definitionDefaults = def.defaults ?? {};
50
+ // Template lookup
51
+ const templateExtensions = ['md', 'mdx'];
52
+ let templateContent = null;
53
+ for (const ext of templateExtensions) {
54
+ const templatePath = path.resolve(collection.rootPath, 'templates', `${modelName.toLowerCase()}.${ext}`);
55
+ try {
56
+ templateContent = await fs.readFile(templatePath, 'utf8');
57
+ break;
58
+ }
59
+ catch {
60
+ // template not found, try next extension
61
+ }
62
+ }
63
+ let content;
64
+ if (templateContent) {
65
+ const parsed = matter(templateContent);
66
+ const mergedMeta = {
67
+ ...zodDefaults,
68
+ ...definitionDefaults,
69
+ ...parsed.data,
70
+ ...metaOverrides,
71
+ };
72
+ const body = parsed.content.replace(/^# .+$/m, `# ${title}`);
73
+ content = matter.stringify(body, mergedMeta);
74
+ }
75
+ else {
76
+ const mergedMeta = {
77
+ ...zodDefaults,
78
+ ...definitionDefaults,
79
+ ...metaOverrides,
80
+ };
81
+ const lines = [];
82
+ lines.push(`# ${title}`);
83
+ lines.push('');
84
+ const sections = def.sections ?? {};
85
+ for (const [, sec] of Object.entries(sections)) {
86
+ const s = sec;
87
+ lines.push(`## ${s.heading}`);
88
+ lines.push('');
89
+ if (s.schema?.description) {
90
+ lines.push(s.schema.description);
91
+ lines.push('');
92
+ }
93
+ }
94
+ content = matter.stringify(lines.join('\n'), mergedMeta);
95
+ }
96
+ const slug = kebabCase(title.toLowerCase());
97
+ const pathId = `${def.prefix}/${slug}`;
98
+ const filePath = path.resolve(collection.rootPath, `${pathId}.md`);
99
+ await fs.mkdir(path.dirname(filePath), { recursive: true });
100
+ await fs.writeFile(filePath, content, 'utf8');
101
+ console.log(`Created ${filePath}`);
102
+ if (options.openEditor) {
103
+ const editor = process.env.EDITOR;
104
+ if (editor) {
105
+ execSync(`${editor} ${filePath}`, { stdio: 'inherit' });
106
+ }
107
+ else {
108
+ const candidates = ['cursor', 'code', 'vim'];
109
+ let found = false;
110
+ for (const cmd of candidates) {
111
+ try {
112
+ execSync(`which ${cmd}`, { stdio: 'ignore' });
113
+ execSync(`${cmd} ${filePath}`, { stdio: 'inherit' });
114
+ found = true;
115
+ break;
116
+ }
117
+ catch {
118
+ // not available, try next
119
+ }
120
+ }
121
+ if (!found) {
122
+ console.error('No editor found. Tried: cursor, code, vim. Set $EDITOR to your preferred editor.');
123
+ process.exit(1);
124
+ }
125
+ }
126
+ }
127
+ }
128
+ commands.register('create', {
129
+ description: 'Create a new document for a model type',
130
+ usage: '<model>',
131
+ help: `# cnotes create
132
+
133
+ Create a new document for a registered model, with proper frontmatter defaults and section scaffolding.
134
+
135
+ ## Usage
136
+
137
+ \`\`\`
138
+ cnotes create <model> --title "Document Title" [options]
139
+ \`\`\`
140
+
141
+ ## Arguments
142
+
143
+ | Argument | Description |
144
+ |----------|-------------|
145
+ | \`model\` | Model name (e.g. \`Post\`, \`Epic\`, \`Task\`) |
146
+
147
+ ## Options
148
+
149
+ | Option | Description |
150
+ |--------|-------------|
151
+ | \`--title\` | **Required.** Title for the new document (used as H1 and slug) |
152
+ | \`--meta.*\` | Set frontmatter fields (e.g. \`--meta.status active\`) |
153
+ | \`--open-editor\` | Open the new file in your editor ($EDITOR, or tries cursor/code/vim) |
154
+ | \`--contentFolder\` | Path to content folder |
155
+
156
+ ## Template Lookup
157
+
158
+ If \`templates/<model>.md\` (or \`.mdx\`) exists in the content root, it will be used as the document scaffold. Template frontmatter is merged with schema defaults and CLI overrides.
159
+
160
+ ## Meta Priority
161
+
162
+ Frontmatter values are merged in this order (last wins):
163
+
164
+ 1. Zod schema defaults
165
+ 2. Model definition defaults
166
+ 3. Template frontmatter
167
+ 4. CLI \`--meta.*\` overrides
168
+
169
+ ## Examples
170
+
171
+ \`\`\`bash
172
+ # Create a new post
173
+ cnotes create Post --title "My First Post"
174
+
175
+ # Create with meta overrides
176
+ cnotes create Task --title "Fix login bug" --meta.status active --meta.priority high
177
+
178
+ # Create from a different content folder
179
+ cnotes create Epic --title "Auth System" --contentFolder ./docs
180
+ \`\`\`
181
+ `,
182
+ argsSchema,
183
+ handler,
184
+ });
185
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/cli/commands/create.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=embed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embed.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/embed.ts"],"names":[],"mappings":""}
@@ -0,0 +1,231 @@
1
+ import { z } from 'zod';
2
+ import { existsSync, accessSync, constants as fsConstants } from 'node:fs';
3
+ import path from 'node:path';
4
+ import { commands } from '../registry.js';
5
+ import { loadCollection } from '../load-collection.js';
6
+ import { collectDocumentInputs } from '../../search/document-inputs.js';
7
+ import { createSemanticSearch, ensureSemanticSearchAttached, getInitializedSemanticSearch, hasSearchIndex, loadSemanticSearchClass } from '../../search/luca-semantic-search.js';
8
+ const argsSchema = z.object({
9
+ force: z.boolean().default(false),
10
+ provider: z.enum(['local', 'openai']).default('openai'),
11
+ status: z.boolean().default(false),
12
+ local: z.boolean().default(false),
13
+ installLocal: z.boolean().default(false),
14
+ contentFolder: z.string().optional(),
15
+ });
16
+ function isLocalInstalled() {
17
+ const modulePath = path.join(process.cwd(), 'node_modules', 'node-llama-cpp');
18
+ try {
19
+ return existsSync(modulePath);
20
+ }
21
+ catch {
22
+ return false;
23
+ }
24
+ }
25
+ async function installLocal(SemanticSearch, container) {
26
+ const cwd = process.cwd();
27
+ const nodeModules = path.join(cwd, 'node_modules');
28
+ // Check permissions
29
+ try {
30
+ if (existsSync(nodeModules)) {
31
+ accessSync(nodeModules, fsConstants.W_OK);
32
+ }
33
+ }
34
+ catch {
35
+ const version = SemanticSearch.PINNED_LLAMA_VERSION;
36
+ const cmd = detectInstallCommand(cwd, version);
37
+ console.error(`Cannot write to ${nodeModules}.`);
38
+ console.error(`Run manually with elevated permissions:\n ${cmd}`);
39
+ process.exit(1);
40
+ }
41
+ console.error(`Installing node-llama-cpp@${SemanticSearch.PINNED_LLAMA_VERSION}...`);
42
+ // Create a temporary instance to use the install method
43
+ await ensureSemanticSearchAttached(container, SemanticSearch);
44
+ const ss = await createSemanticSearch(container, cwd, {
45
+ dbPath: path.join(cwd, '.contentbase/search.sqlite'),
46
+ embeddingProvider: 'local',
47
+ });
48
+ try {
49
+ await ss.installLocalEmbeddings(cwd);
50
+ console.log(`node-llama-cpp@${SemanticSearch.PINNED_LLAMA_VERSION} installed successfully.`);
51
+ }
52
+ catch (err) {
53
+ const msg = err?.message ?? String(err);
54
+ if (msg.includes('network') || msg.includes('ETIMEDOUT') || msg.includes('ENOTFOUND')) {
55
+ console.error(`Install failed (network unreachable). To use local embeddings offline, manually install node-llama-cpp@${SemanticSearch.PINNED_LLAMA_VERSION} into this project.`);
56
+ }
57
+ else {
58
+ console.error(msg);
59
+ }
60
+ process.exit(1);
61
+ }
62
+ }
63
+ function detectInstallCommand(cwd, version) {
64
+ const pkg = `node-llama-cpp@${version}`;
65
+ if (existsSync(path.join(cwd, 'bun.lockb')) || existsSync(path.join(cwd, 'bun.lock'))) {
66
+ return `bun add --optional ${pkg}`;
67
+ }
68
+ else if (existsSync(path.join(cwd, 'pnpm-lock.yaml'))) {
69
+ return `pnpm add --save-optional ${pkg}`;
70
+ }
71
+ else if (existsSync(path.join(cwd, 'yarn.lock'))) {
72
+ return `yarn add --optional ${pkg}`;
73
+ }
74
+ return `npm install --save-optional ${pkg}`;
75
+ }
76
+ async function handler(options, { container }) {
77
+ const SemanticSearch = await loadSemanticSearchClass();
78
+ // --install-local: install node-llama-cpp only, then exit
79
+ if (options.installLocal) {
80
+ if (isLocalInstalled()) {
81
+ console.log('node-llama-cpp is already installed. Skipping.');
82
+ return;
83
+ }
84
+ await installLocal(SemanticSearch, container);
85
+ return;
86
+ }
87
+ // Resolve effective provider: --local flag overrides --provider
88
+ const provider = options.local ? 'local' : options.provider;
89
+ // --local: auto-install if needed
90
+ if (options.local && !isLocalInstalled()) {
91
+ await installLocal(SemanticSearch, container);
92
+ }
93
+ const collection = await loadCollection({
94
+ contentFolder: options.contentFolder,
95
+ });
96
+ // --status: show index health without modifying anything
97
+ if (options.status) {
98
+ if (!hasSearchIndex(collection.rootPath)) {
99
+ console.log('No search index found.');
100
+ console.log(`Documents in collection: ${collection.available.length}`);
101
+ console.log(`\nRun: cnotes embed`);
102
+ return;
103
+ }
104
+ const ss = await getInitializedSemanticSearch(container, collection.rootPath, {
105
+ embeddingProvider: provider,
106
+ });
107
+ const stats = ss.getStats();
108
+ console.log('Search Index Status');
109
+ console.log('-------------------');
110
+ console.log(`Documents indexed: ${stats.documentCount}`);
111
+ console.log(`Chunks created: ${stats.chunkCount}`);
112
+ console.log(`Embeddings stored: ${stats.embeddingCount}`);
113
+ console.log(`Last indexed: ${stats.lastIndexedAt ?? 'never'}`);
114
+ console.log(`Provider: ${stats.provider}`);
115
+ console.log(`Model: ${stats.model}`);
116
+ console.log(`Dimensions: ${stats.dimensions}`);
117
+ console.log(`Database size: ${formatBytes(stats.dbSizeBytes)}`);
118
+ console.log(`Collection docs: ${collection.available.length}`);
119
+ // Check for staleness
120
+ const docs = collectDocumentInputs(collection);
121
+ const stale = docs.filter((d) => ss.needsReindex(d)).length;
122
+ if (stale > 0) {
123
+ console.log(`Stale documents: ${stale}`);
124
+ }
125
+ else {
126
+ console.log(`Status: up to date`);
127
+ }
128
+ return;
129
+ }
130
+ // Embed / re-embed
131
+ const ss = await getInitializedSemanticSearch(container, collection.rootPath, {
132
+ embeddingProvider: provider,
133
+ });
134
+ const docs = collectDocumentInputs(collection);
135
+ const startTime = Date.now();
136
+ if (options.force) {
137
+ console.error('Clearing existing index...');
138
+ await ss.reindex();
139
+ }
140
+ const toIndex = options.force ? docs : docs.filter((d) => ss.needsReindex(d));
141
+ // Remove stale
142
+ ss.removeStale(docs.map((d) => d.pathId));
143
+ if (toIndex.length === 0) {
144
+ console.log('All documents are up to date. Nothing to embed.');
145
+ const stats = ss.getStats();
146
+ printStats(stats, 0, Date.now() - startTime);
147
+ return;
148
+ }
149
+ console.error(`Embedding ${toIndex.length} of ${docs.length} document(s)...`);
150
+ console.error(`Provider: ${provider}`);
151
+ const batchSize = 5;
152
+ for (let i = 0; i < toIndex.length; i += batchSize) {
153
+ const batch = toIndex.slice(i, i + batchSize);
154
+ await ss.indexDocuments(batch);
155
+ const done = Math.min(i + batchSize, toIndex.length);
156
+ const pct = Math.round((done / toIndex.length) * 100);
157
+ const elapsed = Date.now() - startTime;
158
+ const eta = toIndex.length > done
159
+ ? Math.round((elapsed / done) * (toIndex.length - done) / 1000)
160
+ : 0;
161
+ const etaStr = eta > 0 ? ` ETA: ${eta}s` : '';
162
+ console.error(` [${pct}%] ${done}/${toIndex.length} documents${etaStr}`);
163
+ }
164
+ const elapsed = Date.now() - startTime;
165
+ const stats = ss.getStats();
166
+ printStats(stats, toIndex.length, elapsed);
167
+ }
168
+ function printStats(stats, indexed, elapsedMs) {
169
+ console.log();
170
+ console.log('Embedding complete.');
171
+ if (indexed > 0)
172
+ console.log(` Documents indexed: ${indexed}`);
173
+ console.log(` Total documents: ${stats.documentCount}`);
174
+ console.log(` Total chunks: ${stats.chunkCount}`);
175
+ console.log(` Embeddings: ${stats.embeddingCount}`);
176
+ console.log(` Time elapsed: ${(elapsedMs / 1000).toFixed(1)}s`);
177
+ console.log(` Database size: ${formatBytes(stats.dbSizeBytes)}`);
178
+ }
179
+ function formatBytes(bytes) {
180
+ if (bytes < 1024)
181
+ return `${bytes} B`;
182
+ if (bytes < 1024 * 1024)
183
+ return `${(bytes / 1024).toFixed(1)} KB`;
184
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
185
+ }
186
+ commands.register('embed', {
187
+ description: 'Generate embeddings for collection documents',
188
+ help: `# cnotes embed
189
+
190
+ Generate or update vector embeddings for all documents in the collection. Required before using \`cnotes search\`.
191
+
192
+ ## Usage
193
+
194
+ \`\`\`
195
+ cnotes embed [options]
196
+ \`\`\`
197
+
198
+ ## Options
199
+
200
+ | Option | Default | Description |
201
+ |--------|---------|-------------|
202
+ | \`--force\` | \`false\` | Re-embed everything (ignore content hashes) |
203
+ | \`--provider\` | \`openai\` | Embedding provider: \`openai\` or \`local\` |
204
+ | \`--status\` | \`false\` | Show index health without embedding |
205
+ | \`--local\` | \`false\` | Use local embeddings; auto-installs node-llama-cpp if not found |
206
+ | \`--install-local\` | \`false\` | Only install node-llama-cpp (no embedding), then exit |
207
+ | \`--contentFolder\` | | Path to content folder |
208
+
209
+ ## Examples
210
+
211
+ \`\`\`bash
212
+ # Generate/update embeddings (uses OpenAI by default)
213
+ cnotes embed
214
+
215
+ # Re-embed everything from scratch
216
+ cnotes embed --force
217
+
218
+ # Use local embeddings (auto-installs node-llama-cpp if needed)
219
+ cnotes embed --local
220
+
221
+ # Only install node-llama-cpp without embedding
222
+ cnotes embed --install-local
223
+
224
+ # Show index health
225
+ cnotes embed --status
226
+ \`\`\`
227
+ `,
228
+ argsSchema,
229
+ handler,
230
+ });
231
+ //# sourceMappingURL=embed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embed.js","sourceRoot":"","sources":["../../../src/cli/commands/embed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,IAAI,WAAW,EAAE,MAAM,SAAS,CAAA;AAC1E,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAA;AACvE,OAAO,EAAE,oBAAoB,EAAE,4BAA4B,EAAE,4BAA4B,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAA;AAEhL,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1B,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IACjC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;IACvD,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IAClC,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IACjC,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IACxC,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACrC,CAAC,CAAA;AAEF,SAAS,gBAAgB;IACvB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,gBAAgB,CAAC,CAAA;IAC7E,IAAI,CAAC;QACH,OAAO,UAAU,CAAC,UAAU,CAAC,CAAA;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,cAAmB,EAAE,SAAc;IAC7D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAA;IACzB,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAA;IAElD,oBAAoB;IACpB,IAAI,CAAC;QACH,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC5B,UAAU,CAAC,WAAW,EAAE,WAAW,CAAC,IAAI,CAAC,CAAA;QAC3C,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,OAAO,GAAG,cAAc,CAAC,oBAAoB,CAAA;QACnD,MAAM,GAAG,GAAG,oBAAoB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;QAC9C,OAAO,CAAC,KAAK,CAAC,mBAAmB,WAAW,GAAG,CAAC,CAAA;QAChD,OAAO,CAAC,KAAK,CAAC,8CAA8C,GAAG,EAAE,CAAC,CAAA;QAClE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,6BAA6B,cAAc,CAAC,oBAAoB,KAAK,CAAC,CAAA;IAEpF,wDAAwD;IACxD,MAAM,4BAA4B,CAAC,SAAS,EAAE,cAAc,CAAC,CAAA;IAC7D,MAAM,EAAE,GAAG,MAAM,oBAAoB,CAAC,SAAS,EAAE,GAAG,EAAE;QACpD,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,4BAA4B,CAAC;QACpD,iBAAiB,EAAE,OAAO;KAC3B,CAAC,CAAA;IAEF,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAA;QACpC,OAAO,CAAC,GAAG,CAAC,kBAAkB,cAAc,CAAC,oBAAoB,0BAA0B,CAAC,CAAA;IAC9F,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,MAAM,GAAG,GAAG,GAAG,EAAE,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,CAAA;QACvC,IAAI,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YACtF,OAAO,CAAC,KAAK,CAAC,0GAA0G,cAAc,CAAC,oBAAoB,qBAAqB,CAAC,CAAA;QACnL,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACpB,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,GAAW,EAAE,OAAe;IACxD,MAAM,GAAG,GAAG,kBAAkB,OAAO,EAAE,CAAA;IACvC,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC;QACtF,OAAO,sBAAsB,GAAG,EAAE,CAAA;IACpC,CAAC;SAAM,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC;QACxD,OAAO,4BAA4B,GAAG,EAAE,CAAA;IAC1C,CAAC;SAAM,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC;QACnD,OAAO,uBAAuB,GAAG,EAAE,CAAA;IACrC,CAAC;IACD,OAAO,+BAA+B,GAAG,EAAE,CAAA;AAC7C,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,OAAmC,EAAE,EAAE,SAAS,EAAsB;IAC3F,MAAM,cAAc,GAAG,MAAM,uBAAuB,EAAE,CAAA;IAEtD,0DAA0D;IAC1D,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;QACzB,IAAI,gBAAgB,EAAE,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAA;YAC7D,OAAM;QACR,CAAC;QACD,MAAM,YAAY,CAAC,cAAc,EAAE,SAAS,CAAC,CAAA;QAC7C,OAAM;IACR,CAAC;IAED,gEAAgE;IAChE,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAA;IAE3D,kCAAkC;IAClC,IAAI,OAAO,CAAC,KAAK,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC;QACzC,MAAM,YAAY,CAAC,cAAc,EAAE,SAAS,CAAC,CAAA;IAC/C,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC;QACtC,aAAa,EAAE,OAAO,CAAC,aAAa;KACrC,CAAC,CAAA;IAEF,yDAAyD;IACzD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzC,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAA;YACrC,OAAO,CAAC,GAAG,CAAC,4BAA4B,UAAU,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAA;YACtE,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAA;YAClC,OAAM;QACR,CAAC;QAED,MAAM,EAAE,GAAG,MAAM,4BAA4B,CAAC,SAAS,EAAE,UAAU,CAAC,QAAQ,EAAE;YAC5E,iBAAiB,EAAE,QAAQ;SAC5B,CAAC,CAAA;QAEF,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAA;QAC3B,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAA;QAClC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAA;QAClC,OAAO,CAAC,GAAG,CAAC,uBAAuB,KAAK,CAAC,aAAa,EAAE,CAAC,CAAA;QACzD,OAAO,CAAC,GAAG,CAAC,uBAAuB,KAAK,CAAC,UAAU,EAAE,CAAC,CAAA;QACtD,OAAO,CAAC,GAAG,CAAC,uBAAuB,KAAK,CAAC,cAAc,EAAE,CAAC,CAAA;QAC1D,OAAO,CAAC,GAAG,CAAC,uBAAuB,KAAK,CAAC,aAAa,IAAI,OAAO,EAAE,CAAC,CAAA;QACpE,OAAO,CAAC,GAAG,CAAC,uBAAuB,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAA;QACpD,OAAO,CAAC,GAAG,CAAC,uBAAuB,KAAK,CAAC,KAAK,EAAE,CAAC,CAAA;QACjD,OAAO,CAAC,GAAG,CAAC,uBAAuB,KAAK,CAAC,UAAU,EAAE,CAAC,CAAA;QACtD,OAAO,CAAC,GAAG,CAAC,uBAAuB,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,CAAA;QACpE,OAAO,CAAC,GAAG,CAAC,uBAAuB,UAAU,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAA;QAEjE,sBAAsB;QACtB,MAAM,IAAI,GAAG,qBAAqB,CAAC,UAAU,CAAC,CAAA;QAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;QAChE,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,uBAAuB,KAAK,EAAE,CAAC,CAAA;QAC7C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAA;QAC/C,CAAC;QACD,OAAM;IACR,CAAC;IAED,mBAAmB;IACnB,MAAM,EAAE,GAAG,MAAM,4BAA4B,CAAC,SAAS,EAAE,UAAU,CAAC,QAAQ,EAAE;QAC5E,iBAAiB,EAAE,QAAQ;KAC5B,CAAC,CAAA;IAEF,MAAM,IAAI,GAAG,qBAAqB,CAAC,UAAU,CAAC,CAAA;IAC9C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IAE5B,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAA;QAC3C,MAAM,EAAE,CAAC,OAAO,EAAE,CAAA;IACpB,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAA;IAElF,eAAe;IACf,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAA;IAE9C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAA;QAC9D,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAA;QAC3B,UAAU,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAA;QAC5C,OAAM;IACR,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,aAAa,OAAO,CAAC,MAAM,OAAO,IAAI,CAAC,MAAM,iBAAiB,CAAC,CAAA;IAC7E,OAAO,CAAC,KAAK,CAAC,aAAa,QAAQ,EAAE,CAAC,CAAA;IAEtC,MAAM,SAAS,GAAG,CAAC,CAAA;IAEnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC;QACnD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAAA;QAC7C,MAAM,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,CAAA;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;QACpD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAA;QACrD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAA;QACtC,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI;YAC/B,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;YAC/D,CAAC,CAAC,CAAC,CAAA;QACL,MAAM,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;QAC7C,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,IAAI,IAAI,OAAO,CAAC,MAAM,aAAa,MAAM,EAAE,CAAC,CAAA;IAC3E,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAA;IACtC,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAA;IAC3B,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAC5C,CAAC;AAED,SAAS,UAAU,CAAC,KAAU,EAAE,OAAe,EAAE,SAAiB;IAChE,OAAO,CAAC,GAAG,EAAE,CAAA;IACb,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAA;IAClC,IAAI,OAAO,GAAG,CAAC;QAAE,OAAO,CAAC,GAAG,CAAC,wBAAwB,OAAO,EAAE,CAAC,CAAA;IAC/D,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,CAAC,aAAa,EAAE,CAAC,CAAA;IAC1D,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,CAAC,UAAU,EAAE,CAAC,CAAA;IACvD,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,CAAC,cAAc,EAAE,CAAC,CAAA;IAC3D,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;IACrE,OAAO,CAAC,GAAG,CAAC,wBAAwB,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,CAAA;AACvE,CAAC;AAED,SAAS,WAAW,CAAC,KAAa;IAChC,IAAI,KAAK,GAAG,IAAI;QAAE,OAAO,GAAG,KAAK,IAAI,CAAA;IACrC,IAAI,KAAK,GAAG,IAAI,GAAG,IAAI;QAAE,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAA;IACjE,OAAO,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAA;AACnD,CAAC;AAED,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE;IACzB,WAAW,EAAE,8CAA8C;IAC3D,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuCP;IACC,UAAU;IACV,OAAO;CACR,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=export.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/export.ts"],"names":[],"mappings":""}
@@ -0,0 +1,55 @@
1
+ import { z } from 'zod';
2
+ import { commands } from '../registry.js';
3
+ import { loadCollection } from '../load-collection.js';
4
+ const argsSchema = z.object({
5
+ contentFolder: z.string().optional(),
6
+ });
7
+ async function handler(options) {
8
+ const collection = await loadCollection({
9
+ contentFolder: options.contentFolder,
10
+ });
11
+ const data = await collection.export();
12
+ console.log(JSON.stringify(data, null, 2));
13
+ }
14
+ commands.register('export', {
15
+ description: 'Export collection as JSON',
16
+ help: `# cnotes export
17
+
18
+ Export the entire collection as a JSON object. Each document includes its path ID, title, frontmatter, content, and model info.
19
+
20
+ ## Usage
21
+
22
+ \`\`\`
23
+ cnotes export [options]
24
+ \`\`\`
25
+
26
+ ## Options
27
+
28
+ | Option | Description |
29
+ |--------|-------------|
30
+ | \`--contentFolder\` | Path to content folder |
31
+
32
+ ## Output
33
+
34
+ Writes JSON to stdout. Pipe to a file or another tool.
35
+
36
+ ## Examples
37
+
38
+ \`\`\`bash
39
+ # Export to stdout
40
+ cnotes export
41
+
42
+ # Save to a file
43
+ cnotes export > backup.json
44
+
45
+ # Export a specific content folder
46
+ cnotes export --contentFolder ./docs > docs.json
47
+
48
+ # Pipe to jq for filtering
49
+ cnotes export | jq '.[] | select(.meta.status == "published")'
50
+ \`\`\`
51
+ `,
52
+ argsSchema,
53
+ handler,
54
+ });
55
+ //# sourceMappingURL=export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.js","sourceRoot":"","sources":["../../../src/cli/commands/export.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAEtD,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1B,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACrC,CAAC,CAAA;AAEF,KAAK,UAAU,OAAO,CAAC,OAAmC;IACxD,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC;QACtC,aAAa,EAAE,OAAO,CAAC,aAAa;KACrC,CAAC,CAAA;IAEF,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,CAAA;IACtC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;AAC5C,CAAC;AAED,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE;IAC1B,WAAW,EAAE,2BAA2B;IACxC,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmCP;IACC,UAAU;IACV,OAAO;CACR,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=extract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/extract.ts"],"names":[],"mappings":""}