contentbase 0.2.0 → 0.4.1

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 (360) hide show
  1. package/CNAME +1 -0
  2. package/LAUNCH-PLAN.md +419 -0
  3. package/dist/adapters/node-fs.d.ts +17 -0
  4. package/dist/adapters/node-fs.d.ts.map +1 -0
  5. package/dist/adapters/node-fs.js +71 -0
  6. package/dist/adapters/node-fs.js.map +1 -0
  7. package/dist/ast-query.d.ts +44 -0
  8. package/dist/ast-query.d.ts.map +1 -0
  9. package/dist/ast-query.js +95 -0
  10. package/dist/ast-query.js.map +1 -0
  11. package/dist/base-model.d.ts +8 -0
  12. package/dist/base-model.d.ts.map +1 -0
  13. package/dist/base-model.js +12 -0
  14. package/dist/base-model.js.map +1 -0
  15. package/dist/cli/commands/action.d.ts +2 -0
  16. package/dist/cli/commands/action.d.ts.map +1 -0
  17. package/dist/cli/commands/action.js +73 -0
  18. package/dist/cli/commands/action.js.map +1 -0
  19. package/dist/cli/commands/api/endpoints/actions.d.ts +13 -0
  20. package/dist/cli/commands/api/endpoints/actions.d.ts.map +1 -0
  21. package/dist/cli/commands/api/endpoints/actions.js +28 -0
  22. package/dist/cli/commands/api/endpoints/actions.js.map +1 -0
  23. package/dist/cli/commands/api/endpoints/doc.d.ts +5 -0
  24. package/dist/cli/commands/api/endpoints/doc.d.ts.map +1 -0
  25. package/dist/cli/commands/api/endpoints/doc.js +186 -0
  26. package/dist/cli/commands/api/endpoints/doc.js.map +1 -0
  27. package/dist/cli/commands/api/endpoints/docs-index.d.ts +8 -0
  28. package/dist/cli/commands/api/endpoints/docs-index.d.ts.map +1 -0
  29. package/dist/cli/commands/api/endpoints/docs-index.js +23 -0
  30. package/dist/cli/commands/api/endpoints/docs-index.js.map +1 -0
  31. package/dist/cli/commands/api/endpoints/document.d.ts +47 -0
  32. package/dist/cli/commands/api/endpoints/document.d.ts.map +1 -0
  33. package/dist/cli/commands/api/endpoints/document.js +146 -0
  34. package/dist/cli/commands/api/endpoints/document.js.map +1 -0
  35. package/dist/cli/commands/api/endpoints/documents.d.ts +35 -0
  36. package/dist/cli/commands/api/endpoints/documents.d.ts.map +1 -0
  37. package/dist/cli/commands/api/endpoints/documents.js +56 -0
  38. package/dist/cli/commands/api/endpoints/documents.js.map +1 -0
  39. package/dist/cli/commands/api/endpoints/index.d.ts +22 -0
  40. package/dist/cli/commands/api/endpoints/index.d.ts.map +1 -0
  41. package/dist/cli/commands/api/endpoints/index.js +38 -0
  42. package/dist/cli/commands/api/endpoints/index.js.map +1 -0
  43. package/dist/cli/commands/api/endpoints/inspect.d.ts +10 -0
  44. package/dist/cli/commands/api/endpoints/inspect.d.ts.map +1 -0
  45. package/dist/cli/commands/api/endpoints/inspect.js +15 -0
  46. package/dist/cli/commands/api/endpoints/inspect.js.map +1 -0
  47. package/dist/cli/commands/api/endpoints/models.d.ts +5 -0
  48. package/dist/cli/commands/api/endpoints/models.d.ts.map +1 -0
  49. package/dist/cli/commands/api/endpoints/models.js +9 -0
  50. package/dist/cli/commands/api/endpoints/models.js.map +1 -0
  51. package/dist/cli/commands/api/endpoints/query.d.ts +40 -0
  52. package/dist/cli/commands/api/endpoints/query.d.ts.map +1 -0
  53. package/dist/cli/commands/api/endpoints/query.js +106 -0
  54. package/dist/cli/commands/api/endpoints/query.js.map +1 -0
  55. package/dist/cli/commands/api/endpoints/root.d.ts +5 -0
  56. package/dist/cli/commands/api/endpoints/root.d.ts.map +1 -0
  57. package/dist/cli/commands/api/endpoints/root.js +7 -0
  58. package/dist/cli/commands/api/endpoints/root.js.map +1 -0
  59. package/dist/cli/commands/api/endpoints/search-reindex.d.ts +10 -0
  60. package/dist/cli/commands/api/endpoints/search-reindex.d.ts.map +1 -0
  61. package/dist/cli/commands/api/endpoints/search-reindex.js +38 -0
  62. package/dist/cli/commands/api/endpoints/search-reindex.js.map +1 -0
  63. package/dist/cli/commands/api/endpoints/search-status.d.ts +7 -0
  64. package/dist/cli/commands/api/endpoints/search-status.d.ts.map +1 -0
  65. package/dist/cli/commands/api/endpoints/search-status.js +33 -0
  66. package/dist/cli/commands/api/endpoints/search-status.js.map +1 -0
  67. package/dist/cli/commands/api/endpoints/search.d.ts +24 -0
  68. package/dist/cli/commands/api/endpoints/search.d.ts.map +1 -0
  69. package/dist/cli/commands/api/endpoints/search.js +61 -0
  70. package/dist/cli/commands/api/endpoints/search.js.map +1 -0
  71. package/dist/cli/commands/api/endpoints/semantic-search.d.ts +28 -0
  72. package/dist/cli/commands/api/endpoints/semantic-search.d.ts.map +1 -0
  73. package/dist/cli/commands/api/endpoints/semantic-search.js +76 -0
  74. package/dist/cli/commands/api/endpoints/semantic-search.js.map +1 -0
  75. package/dist/cli/commands/api/endpoints/text-search.d.ts +17 -0
  76. package/dist/cli/commands/api/endpoints/text-search.d.ts.map +1 -0
  77. package/dist/cli/commands/api/endpoints/text-search.js +55 -0
  78. package/dist/cli/commands/api/endpoints/text-search.js.map +1 -0
  79. package/dist/cli/commands/api/endpoints/validate.d.ts +12 -0
  80. package/dist/cli/commands/api/endpoints/validate.d.ts.map +1 -0
  81. package/dist/cli/commands/api/endpoints/validate.js +27 -0
  82. package/dist/cli/commands/api/endpoints/validate.js.map +1 -0
  83. package/dist/cli/commands/api/helpers.d.ts +8 -0
  84. package/dist/cli/commands/api/helpers.d.ts.map +1 -0
  85. package/dist/cli/commands/api/helpers.js +89 -0
  86. package/dist/cli/commands/api/helpers.js.map +1 -0
  87. package/dist/cli/commands/console.d.ts +2 -0
  88. package/dist/cli/commands/console.d.ts.map +1 -0
  89. package/dist/cli/commands/console.js +117 -0
  90. package/dist/cli/commands/console.js.map +1 -0
  91. package/dist/cli/commands/create.d.ts +2 -0
  92. package/dist/cli/commands/create.d.ts.map +1 -0
  93. package/dist/cli/commands/create.js +185 -0
  94. package/dist/cli/commands/create.js.map +1 -0
  95. package/dist/cli/commands/embed.d.ts +2 -0
  96. package/dist/cli/commands/embed.d.ts.map +1 -0
  97. package/dist/cli/commands/embed.js +231 -0
  98. package/dist/cli/commands/embed.js.map +1 -0
  99. package/dist/cli/commands/export.d.ts +2 -0
  100. package/dist/cli/commands/export.d.ts.map +1 -0
  101. package/dist/cli/commands/export.js +55 -0
  102. package/dist/cli/commands/export.js.map +1 -0
  103. package/dist/cli/commands/extract.d.ts +2 -0
  104. package/dist/cli/commands/extract.d.ts.map +1 -0
  105. package/dist/cli/commands/extract.js +149 -0
  106. package/dist/cli/commands/extract.js.map +1 -0
  107. package/dist/cli/commands/help.d.ts +2 -0
  108. package/dist/cli/commands/help.d.ts.map +1 -0
  109. package/dist/cli/commands/help.js +58 -0
  110. package/dist/cli/commands/help.js.map +1 -0
  111. package/dist/cli/commands/index.d.ts +18 -0
  112. package/dist/cli/commands/index.d.ts.map +1 -0
  113. package/dist/cli/commands/index.js +19 -0
  114. package/dist/cli/commands/index.js.map +1 -0
  115. package/dist/cli/commands/init.d.ts +2 -0
  116. package/dist/cli/commands/init.d.ts.map +1 -0
  117. package/dist/cli/commands/init.js +82 -0
  118. package/dist/cli/commands/init.js.map +1 -0
  119. package/dist/cli/commands/inspect.d.ts +2 -0
  120. package/dist/cli/commands/inspect.d.ts.map +1 -0
  121. package/dist/cli/commands/inspect.js +53 -0
  122. package/dist/cli/commands/inspect.js.map +1 -0
  123. package/dist/cli/commands/mcp.d.ts +2 -0
  124. package/dist/cli/commands/mcp.d.ts.map +1 -0
  125. package/dist/cli/commands/mcp.js +92 -0
  126. package/dist/cli/commands/mcp.js.map +1 -0
  127. package/dist/cli/commands/search.d.ts +2 -0
  128. package/dist/cli/commands/search.d.ts.map +1 -0
  129. package/dist/cli/commands/search.js +212 -0
  130. package/dist/cli/commands/search.js.map +1 -0
  131. package/dist/cli/commands/serve.d.ts +2 -0
  132. package/dist/cli/commands/serve.d.ts.map +1 -0
  133. package/dist/cli/commands/serve.js +298 -0
  134. package/dist/cli/commands/serve.js.map +1 -0
  135. package/dist/cli/commands/summary.d.ts +2 -0
  136. package/dist/cli/commands/summary.d.ts.map +1 -0
  137. package/dist/cli/commands/summary.js +58 -0
  138. package/dist/cli/commands/summary.js.map +1 -0
  139. package/dist/cli/commands/teach.d.ts +2 -0
  140. package/dist/cli/commands/teach.d.ts.map +1 -0
  141. package/dist/cli/commands/teach.js +80 -0
  142. package/dist/cli/commands/teach.js.map +1 -0
  143. package/dist/cli/commands/text-search.d.ts +2 -0
  144. package/dist/cli/commands/text-search.d.ts.map +1 -0
  145. package/dist/cli/commands/text-search.js +125 -0
  146. package/dist/cli/commands/text-search.js.map +1 -0
  147. package/dist/cli/commands/update.d.ts +2 -0
  148. package/dist/cli/commands/update.d.ts.map +1 -0
  149. package/dist/cli/commands/update.js +167 -0
  150. package/dist/cli/commands/update.js.map +1 -0
  151. package/dist/cli/commands/validate.d.ts +2 -0
  152. package/dist/cli/commands/validate.d.ts.map +1 -0
  153. package/dist/cli/commands/validate.js +129 -0
  154. package/dist/cli/commands/validate.js.map +1 -0
  155. package/dist/cli/index.d.ts +3 -0
  156. package/dist/cli/index.d.ts.map +1 -0
  157. package/dist/cli/index.js +84 -0
  158. package/dist/cli/index.js.map +1 -0
  159. package/dist/cli/load-collection.d.ts +7 -0
  160. package/dist/cli/load-collection.d.ts.map +1 -0
  161. package/dist/cli/load-collection.js +201 -0
  162. package/dist/cli/load-collection.js.map +1 -0
  163. package/dist/cli/registry.d.ts +17 -0
  164. package/dist/cli/registry.d.ts.map +1 -0
  165. package/dist/cli/registry.js +16 -0
  166. package/dist/cli/registry.js.map +1 -0
  167. package/dist/cnotes +0 -0
  168. package/dist/collection.d.ts +145 -0
  169. package/dist/collection.d.ts.map +1 -0
  170. package/dist/collection.js +684 -0
  171. package/dist/collection.js.map +1 -0
  172. package/dist/define-model.d.ts +45 -0
  173. package/dist/define-model.d.ts.map +1 -0
  174. package/dist/define-model.js +106 -0
  175. package/dist/define-model.js.map +1 -0
  176. package/dist/document.d.ts +119 -0
  177. package/dist/document.d.ts.map +1 -0
  178. package/dist/document.js +418 -0
  179. package/dist/document.js.map +1 -0
  180. package/dist/extract-sections.d.ts +46 -0
  181. package/dist/extract-sections.d.ts.map +1 -0
  182. package/dist/extract-sections.js +153 -0
  183. package/dist/extract-sections.js.map +1 -0
  184. package/dist/index.d.ts +28 -0
  185. package/dist/index.d.ts.map +1 -0
  186. package/dist/index.js +31 -0
  187. package/dist/index.js.map +1 -0
  188. package/dist/mcp/helpers.d.ts +14 -0
  189. package/dist/mcp/helpers.d.ts.map +1 -0
  190. package/dist/mcp/helpers.js +7 -0
  191. package/dist/mcp/helpers.js.map +1 -0
  192. package/dist/mcp/model-info.d.ts +2 -0
  193. package/dist/mcp/model-info.d.ts.map +1 -0
  194. package/dist/mcp/model-info.js +94 -0
  195. package/dist/mcp/model-info.js.map +1 -0
  196. package/dist/mcp/prompts.d.ts +2 -0
  197. package/dist/mcp/prompts.d.ts.map +1 -0
  198. package/dist/mcp/prompts.js +180 -0
  199. package/dist/mcp/prompts.js.map +1 -0
  200. package/dist/mcp/readme.d.ts +2 -0
  201. package/dist/mcp/readme.d.ts.map +1 -0
  202. package/dist/mcp/readme.js +71 -0
  203. package/dist/mcp/readme.js.map +1 -0
  204. package/dist/mcp/resources.d.ts +2 -0
  205. package/dist/mcp/resources.d.ts.map +1 -0
  206. package/dist/mcp/resources.js +85 -0
  207. package/dist/mcp/resources.js.map +1 -0
  208. package/dist/mcp/server.d.ts +18 -0
  209. package/dist/mcp/server.d.ts.map +1 -0
  210. package/dist/mcp/server.js +83 -0
  211. package/dist/mcp/server.js.map +1 -0
  212. package/dist/mcp/tools/mutation.d.ts +2 -0
  213. package/dist/mcp/tools/mutation.d.ts.map +1 -0
  214. package/dist/mcp/tools/mutation.js +155 -0
  215. package/dist/mcp/tools/mutation.js.map +1 -0
  216. package/dist/mcp/tools/query.d.ts +2 -0
  217. package/dist/mcp/tools/query.d.ts.map +1 -0
  218. package/dist/mcp/tools/query.js +130 -0
  219. package/dist/mcp/tools/query.js.map +1 -0
  220. package/dist/mcp/tools/search.d.ts +2 -0
  221. package/dist/mcp/tools/search.d.ts.map +1 -0
  222. package/dist/mcp/tools/search.js +168 -0
  223. package/dist/mcp/tools/search.js.map +1 -0
  224. package/dist/model-instance.d.ts +11 -0
  225. package/dist/model-instance.d.ts.map +1 -0
  226. package/dist/model-instance.js +208 -0
  227. package/dist/model-instance.js.map +1 -0
  228. package/dist/node-shortcuts.d.ts +25 -0
  229. package/dist/node-shortcuts.d.ts.map +1 -0
  230. package/dist/node-shortcuts.js +67 -0
  231. package/dist/node-shortcuts.js.map +1 -0
  232. package/dist/parse.d.ts +45 -0
  233. package/dist/parse.d.ts.map +1 -0
  234. package/dist/parse.js +98 -0
  235. package/dist/parse.js.map +1 -0
  236. package/dist/query/collection-query.d.ts +39 -0
  237. package/dist/query/collection-query.d.ts.map +1 -0
  238. package/dist/query/collection-query.js +184 -0
  239. package/dist/query/collection-query.js.map +1 -0
  240. package/dist/query/index.d.ts +8 -0
  241. package/dist/query/index.d.ts.map +1 -0
  242. package/dist/query/index.js +5 -0
  243. package/dist/query/index.js.map +1 -0
  244. package/dist/query/operators.d.ts +3 -0
  245. package/dist/query/operators.d.ts.map +1 -0
  246. package/dist/query/operators.js +18 -0
  247. package/dist/query/operators.js.map +1 -0
  248. package/dist/query/query-builder.d.ts +34 -0
  249. package/dist/query/query-builder.d.ts.map +1 -0
  250. package/dist/query/query-builder.js +84 -0
  251. package/dist/query/query-builder.js.map +1 -0
  252. package/dist/query/query-dsl.d.ts +36 -0
  253. package/dist/query/query-dsl.d.ts.map +1 -0
  254. package/dist/query/query-dsl.js +195 -0
  255. package/dist/query/query-dsl.js.map +1 -0
  256. package/dist/relationships/belongs-to.d.ts +9 -0
  257. package/dist/relationships/belongs-to.d.ts.map +1 -0
  258. package/dist/relationships/belongs-to.js +34 -0
  259. package/dist/relationships/belongs-to.js.map +1 -0
  260. package/dist/relationships/has-many.d.ts +23 -0
  261. package/dist/relationships/has-many.d.ts.map +1 -0
  262. package/dist/relationships/has-many.js +136 -0
  263. package/dist/relationships/has-many.js.map +1 -0
  264. package/dist/relationships/index.d.ts +26 -0
  265. package/dist/relationships/index.d.ts.map +1 -0
  266. package/dist/relationships/index.js +32 -0
  267. package/dist/relationships/index.js.map +1 -0
  268. package/dist/relationships/types.d.ts +2 -0
  269. package/dist/relationships/types.d.ts.map +1 -0
  270. package/dist/relationships/types.js +2 -0
  271. package/dist/relationships/types.js.map +1 -0
  272. package/dist/search/document-inputs.d.ts +30 -0
  273. package/dist/search/document-inputs.d.ts.map +1 -0
  274. package/dist/search/document-inputs.js +52 -0
  275. package/dist/search/document-inputs.js.map +1 -0
  276. package/dist/search/luca-semantic-search.d.ts +27 -0
  277. package/dist/search/luca-semantic-search.d.ts.map +1 -0
  278. package/dist/search/luca-semantic-search.js +56 -0
  279. package/dist/search/luca-semantic-search.js.map +1 -0
  280. package/dist/section.d.ts +21 -0
  281. package/dist/section.d.ts.map +1 -0
  282. package/dist/section.js +21 -0
  283. package/dist/section.js.map +1 -0
  284. package/dist/types.d.ts +185 -0
  285. package/dist/types.d.ts.map +1 -0
  286. package/dist/types.js +2 -0
  287. package/dist/types.js.map +1 -0
  288. package/dist/utils/index.d.ts +9 -0
  289. package/dist/utils/index.d.ts.map +1 -0
  290. package/dist/utils/index.js +8 -0
  291. package/dist/utils/index.js.map +1 -0
  292. package/dist/utils/inflect.d.ts +6 -0
  293. package/dist/utils/inflect.d.ts.map +1 -0
  294. package/dist/utils/inflect.js +75 -0
  295. package/dist/utils/inflect.js.map +1 -0
  296. package/dist/utils/match-pattern.d.ts +25 -0
  297. package/dist/utils/match-pattern.d.ts.map +1 -0
  298. package/dist/utils/match-pattern.js +52 -0
  299. package/dist/utils/match-pattern.js.map +1 -0
  300. package/dist/utils/normalize-headings.d.ts +8 -0
  301. package/dist/utils/normalize-headings.d.ts.map +1 -0
  302. package/dist/utils/normalize-headings.js +19 -0
  303. package/dist/utils/normalize-headings.js.map +1 -0
  304. package/dist/utils/parse-table.d.ts +7 -0
  305. package/dist/utils/parse-table.d.ts.map +1 -0
  306. package/dist/utils/parse-table.js +17 -0
  307. package/dist/utils/parse-table.js.map +1 -0
  308. package/dist/utils/read-directory.d.ts +5 -0
  309. package/dist/utils/read-directory.d.ts.map +1 -0
  310. package/dist/utils/read-directory.js +29 -0
  311. package/dist/utils/read-directory.js.map +1 -0
  312. package/dist/utils/stringify-ast.d.ts +6 -0
  313. package/dist/utils/stringify-ast.d.ts.map +1 -0
  314. package/dist/utils/stringify-ast.js +8 -0
  315. package/dist/utils/stringify-ast.js.map +1 -0
  316. package/dist/utils/strip-markdown.d.ts +11 -0
  317. package/dist/utils/strip-markdown.d.ts.map +1 -0
  318. package/dist/utils/strip-markdown.js +48 -0
  319. package/dist/utils/strip-markdown.js.map +1 -0
  320. package/dist/validator.d.ts +10 -0
  321. package/dist/validator.d.ts.map +1 -0
  322. package/dist/validator.js +55 -0
  323. package/dist/validator.js.map +1 -0
  324. package/index.html +1636 -0
  325. package/package.json +5 -4
  326. package/src/adapters/node-fs.ts +80 -0
  327. package/src/cli/commands/api/endpoints/doc.ts +2 -2
  328. package/src/cli/commands/api/endpoints/document.ts +2 -2
  329. package/src/cli/commands/api/endpoints/search-reindex.ts +6 -25
  330. package/src/cli/commands/api/endpoints/search-status.ts +3 -20
  331. package/src/cli/commands/api/endpoints/search.ts +3 -33
  332. package/src/cli/commands/api/endpoints/semantic-search.ts +3 -33
  333. package/src/cli/commands/embed.ts +8 -81
  334. package/src/cli/commands/mcp.ts +5 -1128
  335. package/src/cli/commands/search.ts +4 -76
  336. package/src/cli/commands/serve.ts +7 -32
  337. package/src/cli/index.ts +1 -1
  338. package/src/cli/load-collection.ts +2 -2
  339. package/src/collection.ts +31 -30
  340. package/src/document.ts +18 -0
  341. package/src/extract-sections.ts +3 -0
  342. package/src/index.ts +10 -0
  343. package/src/mcp/helpers.ts +7 -0
  344. package/src/mcp/model-info.ts +102 -0
  345. package/src/mcp/prompts.ts +199 -0
  346. package/src/mcp/readme.ts +153 -0
  347. package/src/mcp/resources.ts +89 -0
  348. package/src/mcp/server.ts +103 -0
  349. package/src/mcp/tools/mutation.ts +176 -0
  350. package/src/mcp/tools/query.ts +141 -0
  351. package/src/mcp/tools/search.ts +180 -0
  352. package/src/parse.ts +5 -0
  353. package/src/query/query-dsl.ts +1 -1
  354. package/src/relationships/has-many.ts +2 -2
  355. package/src/search/document-inputs.ts +85 -0
  356. package/src/search/luca-semantic-search.ts +75 -0
  357. package/src/types.ts +54 -0
  358. package/src/utils/index.ts +2 -0
  359. package/src/utils/match-pattern.ts +2 -2
  360. package/src/utils/strip-markdown.ts +59 -0
@@ -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":"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"}
@@ -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":""}
@@ -0,0 +1,149 @@
1
+ import { z } from 'zod';
2
+ import picomatch from 'picomatch';
3
+ import yaml from 'js-yaml';
4
+ import { commands } from '../registry.js';
5
+ import { loadCollection } from '../load-collection.js';
6
+ import { stringifyAst } from '../../utils/stringify-ast.js';
7
+ const argsSchema = z.object({
8
+ sections: z.string().optional(),
9
+ s: z.string().optional(),
10
+ title: z.string().optional(),
11
+ t: z.string().optional(),
12
+ frontmatter: z.boolean().default(false),
13
+ noNormalizeHeadings: z.boolean().default(false),
14
+ contentFolder: z.string().optional(),
15
+ });
16
+ async function handler(options, context) {
17
+ const collection = await loadCollection({
18
+ contentFolder: options.contentFolder,
19
+ });
20
+ const target = context.container.argv._[1];
21
+ if (!target) {
22
+ console.error('Usage: cnotes extract <target> --sections "Section1,Section2"');
23
+ process.exit(1);
24
+ }
25
+ const sectionsArg = options.sections || options.s;
26
+ if (!sectionsArg) {
27
+ console.error('--sections is required');
28
+ process.exit(1);
29
+ }
30
+ const sectionNames = sectionsArg
31
+ .split(',')
32
+ .map((s) => s.trim())
33
+ .filter(Boolean);
34
+ const includeFrontmatter = options.frontmatter;
35
+ const noNormalize = options.noNormalizeHeadings;
36
+ const title = options.title || options.t;
37
+ const isMatch = picomatch(target);
38
+ const matchingIds = collection.available.filter((id) => isMatch(id));
39
+ if (matchingIds.length === 0) {
40
+ console.error(`No documents matched: ${target}`);
41
+ process.exit(1);
42
+ }
43
+ const allNodes = [];
44
+ if (title) {
45
+ allNodes.push({
46
+ type: 'heading',
47
+ depth: 1,
48
+ children: [{ type: 'text', value: title }],
49
+ });
50
+ }
51
+ for (const id of matchingIds) {
52
+ const doc = collection.document(id);
53
+ if (includeFrontmatter && Object.keys(doc.meta).length > 0) {
54
+ allNodes.push({
55
+ type: 'yaml',
56
+ value: yaml.dump(doc.meta).trim(),
57
+ });
58
+ }
59
+ const docNodes = [];
60
+ const titleNode = doc.nodes.firstHeading;
61
+ if (titleNode) {
62
+ docNodes.push(titleNode);
63
+ }
64
+ const leading = doc.nodes.leadingElementsAfterTitle;
65
+ if (leading.length > 0) {
66
+ docNodes.push(...leading);
67
+ }
68
+ for (const name of sectionNames) {
69
+ try {
70
+ const sectionNodes = doc.extractSection(name);
71
+ if (sectionNodes.length > 0) {
72
+ docNodes.push(...sectionNodes);
73
+ }
74
+ }
75
+ catch {
76
+ // Section not found — skip
77
+ }
78
+ }
79
+ if (!noNormalize && docNodes.length > 0) {
80
+ const headings = docNodes.filter((n) => n.type === 'heading');
81
+ if (headings.length > 0) {
82
+ const minDepth = Math.min(...headings.map((h) => h.depth));
83
+ const targetDepth = title ? 2 : 1;
84
+ const shift = targetDepth - minDepth;
85
+ if (shift !== 0) {
86
+ for (const h of headings) {
87
+ h.depth = Math.max(1, Math.min(6, h.depth + shift));
88
+ }
89
+ }
90
+ }
91
+ }
92
+ allNodes.push(...docNodes);
93
+ }
94
+ const combinedAst = { type: 'root', children: allNodes };
95
+ console.log(stringifyAst(combinedAst).trim());
96
+ }
97
+ commands.register('extract', {
98
+ description: 'Extract specific sections from documents',
99
+ usage: '<glob>',
100
+ help: `# cnotes extract
101
+
102
+ Extract specific sections from one or more documents. Supports glob patterns for matching multiple documents and outputs clean markdown with normalized headings.
103
+
104
+ ## Usage
105
+
106
+ \`\`\`
107
+ cnotes extract <target> --sections "Section1,Section2" [options]
108
+ \`\`\`
109
+
110
+ ## Arguments
111
+
112
+ | Argument | Description |
113
+ |----------|-------------|
114
+ | \`target\` | Path ID or glob pattern (e.g. \`epics/*\`, \`tasks/auth-*\`) |
115
+
116
+ ## Options
117
+
118
+ | Option | Alias | Description |
119
+ |--------|-------|-------------|
120
+ | \`--sections\` | \`-s\` | **Required.** Comma-separated section headings to extract |
121
+ | \`--title\` | \`-t\` | Add a top-level H1 title to the output |
122
+ | \`--frontmatter\` | | Include YAML frontmatter in the output |
123
+ | \`--noNormalizeHeadings\` | | Skip heading depth normalization |
124
+ | \`--contentFolder\` | | Path to content folder |
125
+
126
+ ## Heading Normalization
127
+
128
+ By default, extracted headings are re-leveled so the output starts at H1 (or H2 when \`--title\` is used). Use \`--noNormalizeHeadings\` to preserve original depths.
129
+
130
+ ## Examples
131
+
132
+ \`\`\`bash
133
+ # Extract Overview from a single document
134
+ cnotes extract epics/auth-system --sections "Overview"
135
+
136
+ # Extract multiple sections
137
+ cnotes extract tasks/login-bug -s "Overview,Requirements,Acceptance Criteria"
138
+
139
+ # Extract from all epics with a title wrapper
140
+ cnotes extract "epics/*" -s "Overview" -t "Epic Summaries"
141
+
142
+ # Include frontmatter in output
143
+ cnotes extract epics/auth-system -s "Overview" --frontmatter
144
+ \`\`\`
145
+ `,
146
+ argsSchema,
147
+ handler,
148
+ });
149
+ //# sourceMappingURL=extract.js.map