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.
- package/dist/adapters/node-fs.d.ts +17 -0
- package/dist/adapters/node-fs.d.ts.map +1 -0
- package/dist/adapters/node-fs.js +71 -0
- package/dist/adapters/node-fs.js.map +1 -0
- package/dist/ast-query.d.ts +44 -0
- package/dist/ast-query.d.ts.map +1 -0
- package/dist/ast-query.js +95 -0
- package/dist/ast-query.js.map +1 -0
- package/dist/base-model.d.ts +8 -0
- package/dist/base-model.d.ts.map +1 -0
- package/dist/base-model.js +12 -0
- package/dist/base-model.js.map +1 -0
- package/dist/cli/commands/action.d.ts +2 -0
- package/dist/cli/commands/action.d.ts.map +1 -0
- package/dist/cli/commands/action.js +73 -0
- package/dist/cli/commands/action.js.map +1 -0
- package/dist/cli/commands/api/endpoints/actions.d.ts +13 -0
- package/dist/cli/commands/api/endpoints/actions.d.ts.map +1 -0
- package/dist/cli/commands/api/endpoints/actions.js +28 -0
- package/dist/cli/commands/api/endpoints/actions.js.map +1 -0
- package/dist/cli/commands/api/endpoints/doc.d.ts +5 -0
- package/dist/cli/commands/api/endpoints/doc.d.ts.map +1 -0
- package/dist/cli/commands/api/endpoints/doc.js +186 -0
- package/dist/cli/commands/api/endpoints/doc.js.map +1 -0
- package/dist/cli/commands/api/endpoints/docs-index.d.ts +8 -0
- package/dist/cli/commands/api/endpoints/docs-index.d.ts.map +1 -0
- package/dist/cli/commands/api/endpoints/docs-index.js +23 -0
- package/dist/cli/commands/api/endpoints/docs-index.js.map +1 -0
- package/dist/cli/commands/api/endpoints/document.d.ts +47 -0
- package/dist/cli/commands/api/endpoints/document.d.ts.map +1 -0
- package/dist/cli/commands/api/endpoints/document.js +146 -0
- package/dist/cli/commands/api/endpoints/document.js.map +1 -0
- package/dist/cli/commands/api/endpoints/documents.d.ts +35 -0
- package/dist/cli/commands/api/endpoints/documents.d.ts.map +1 -0
- package/dist/cli/commands/api/endpoints/documents.js +56 -0
- package/dist/cli/commands/api/endpoints/documents.js.map +1 -0
- package/dist/cli/commands/api/endpoints/index.d.ts +22 -0
- package/dist/cli/commands/api/endpoints/index.d.ts.map +1 -0
- package/dist/cli/commands/api/endpoints/index.js +38 -0
- package/dist/cli/commands/api/endpoints/index.js.map +1 -0
- package/dist/cli/commands/api/endpoints/inspect.d.ts +10 -0
- package/dist/cli/commands/api/endpoints/inspect.d.ts.map +1 -0
- package/dist/cli/commands/api/endpoints/inspect.js +15 -0
- package/dist/cli/commands/api/endpoints/inspect.js.map +1 -0
- package/dist/cli/commands/api/endpoints/models.d.ts +5 -0
- package/dist/cli/commands/api/endpoints/models.d.ts.map +1 -0
- package/dist/cli/commands/api/endpoints/models.js +9 -0
- package/dist/cli/commands/api/endpoints/models.js.map +1 -0
- package/dist/cli/commands/api/endpoints/query.d.ts +40 -0
- package/dist/cli/commands/api/endpoints/query.d.ts.map +1 -0
- package/dist/cli/commands/api/endpoints/query.js +106 -0
- package/dist/cli/commands/api/endpoints/query.js.map +1 -0
- package/dist/cli/commands/api/endpoints/root.d.ts +5 -0
- package/dist/cli/commands/api/endpoints/root.d.ts.map +1 -0
- package/dist/cli/commands/api/endpoints/root.js +7 -0
- package/dist/cli/commands/api/endpoints/root.js.map +1 -0
- package/dist/cli/commands/api/endpoints/search-reindex.d.ts +10 -0
- package/dist/cli/commands/api/endpoints/search-reindex.d.ts.map +1 -0
- package/dist/cli/commands/api/endpoints/search-reindex.js +38 -0
- package/dist/cli/commands/api/endpoints/search-reindex.js.map +1 -0
- package/dist/cli/commands/api/endpoints/search-status.d.ts +7 -0
- package/dist/cli/commands/api/endpoints/search-status.d.ts.map +1 -0
- package/dist/cli/commands/api/endpoints/search-status.js +33 -0
- package/dist/cli/commands/api/endpoints/search-status.js.map +1 -0
- package/dist/cli/commands/api/endpoints/search.d.ts +24 -0
- package/dist/cli/commands/api/endpoints/search.d.ts.map +1 -0
- package/dist/cli/commands/api/endpoints/search.js +61 -0
- package/dist/cli/commands/api/endpoints/search.js.map +1 -0
- package/dist/cli/commands/api/endpoints/semantic-search.d.ts +28 -0
- package/dist/cli/commands/api/endpoints/semantic-search.d.ts.map +1 -0
- package/dist/cli/commands/api/endpoints/semantic-search.js +76 -0
- package/dist/cli/commands/api/endpoints/semantic-search.js.map +1 -0
- package/dist/cli/commands/api/endpoints/text-search.d.ts +17 -0
- package/dist/cli/commands/api/endpoints/text-search.d.ts.map +1 -0
- package/dist/cli/commands/api/endpoints/text-search.js +55 -0
- package/dist/cli/commands/api/endpoints/text-search.js.map +1 -0
- package/dist/cli/commands/api/endpoints/validate.d.ts +12 -0
- package/dist/cli/commands/api/endpoints/validate.d.ts.map +1 -0
- package/dist/cli/commands/api/endpoints/validate.js +27 -0
- package/dist/cli/commands/api/endpoints/validate.js.map +1 -0
- package/dist/cli/commands/api/helpers.d.ts +8 -0
- package/dist/cli/commands/api/helpers.d.ts.map +1 -0
- package/dist/cli/commands/api/helpers.js +89 -0
- package/dist/cli/commands/api/helpers.js.map +1 -0
- package/dist/cli/commands/console.d.ts +2 -0
- package/dist/cli/commands/console.d.ts.map +1 -0
- package/dist/cli/commands/console.js +117 -0
- package/dist/cli/commands/console.js.map +1 -0
- package/dist/cli/commands/create.d.ts +2 -0
- package/dist/cli/commands/create.d.ts.map +1 -0
- package/dist/cli/commands/create.js +185 -0
- package/dist/cli/commands/create.js.map +1 -0
- package/dist/cli/commands/embed.d.ts +2 -0
- package/dist/cli/commands/embed.d.ts.map +1 -0
- package/dist/cli/commands/embed.js +231 -0
- package/dist/cli/commands/embed.js.map +1 -0
- package/dist/cli/commands/export.d.ts +2 -0
- package/dist/cli/commands/export.d.ts.map +1 -0
- package/dist/cli/commands/export.js +55 -0
- package/dist/cli/commands/export.js.map +1 -0
- package/dist/cli/commands/extract.d.ts +2 -0
- package/dist/cli/commands/extract.d.ts.map +1 -0
- package/dist/cli/commands/extract.js +149 -0
- package/dist/cli/commands/extract.js.map +1 -0
- package/dist/cli/commands/help.d.ts +2 -0
- package/dist/cli/commands/help.d.ts.map +1 -0
- package/dist/cli/commands/help.js +58 -0
- package/dist/cli/commands/help.js.map +1 -0
- package/dist/cli/commands/index.d.ts +18 -0
- package/dist/cli/commands/index.d.ts.map +1 -0
- package/dist/cli/commands/index.js +19 -0
- package/dist/cli/commands/index.js.map +1 -0
- package/dist/cli/commands/init.d.ts +2 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +82 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/inspect.d.ts +2 -0
- package/dist/cli/commands/inspect.d.ts.map +1 -0
- package/dist/cli/commands/inspect.js +53 -0
- package/dist/cli/commands/inspect.js.map +1 -0
- package/dist/cli/commands/mcp.d.ts +2 -0
- package/dist/cli/commands/mcp.d.ts.map +1 -0
- package/dist/cli/commands/mcp.js +92 -0
- package/dist/cli/commands/mcp.js.map +1 -0
- package/dist/cli/commands/search.d.ts +2 -0
- package/dist/cli/commands/search.d.ts.map +1 -0
- package/dist/cli/commands/search.js +212 -0
- package/dist/cli/commands/search.js.map +1 -0
- package/dist/cli/commands/serve.d.ts +2 -0
- package/dist/cli/commands/serve.d.ts.map +1 -0
- package/dist/cli/commands/serve.js +298 -0
- package/dist/cli/commands/serve.js.map +1 -0
- package/dist/cli/commands/summary.d.ts +2 -0
- package/dist/cli/commands/summary.d.ts.map +1 -0
- package/dist/cli/commands/summary.js +58 -0
- package/dist/cli/commands/summary.js.map +1 -0
- package/dist/cli/commands/teach.d.ts +2 -0
- package/dist/cli/commands/teach.d.ts.map +1 -0
- package/dist/cli/commands/teach.js +80 -0
- package/dist/cli/commands/teach.js.map +1 -0
- package/dist/cli/commands/text-search.d.ts +2 -0
- package/dist/cli/commands/text-search.d.ts.map +1 -0
- package/dist/cli/commands/text-search.js +125 -0
- package/dist/cli/commands/text-search.js.map +1 -0
- package/dist/cli/commands/update.d.ts +2 -0
- package/dist/cli/commands/update.d.ts.map +1 -0
- package/dist/cli/commands/update.js +167 -0
- package/dist/cli/commands/update.js.map +1 -0
- package/dist/cli/commands/validate.d.ts +2 -0
- package/dist/cli/commands/validate.d.ts.map +1 -0
- package/dist/cli/commands/validate.js +129 -0
- package/dist/cli/commands/validate.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +84 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/load-collection.d.ts +7 -0
- package/dist/cli/load-collection.d.ts.map +1 -0
- package/dist/cli/load-collection.js +201 -0
- package/dist/cli/load-collection.js.map +1 -0
- package/dist/cli/registry.d.ts +17 -0
- package/dist/cli/registry.d.ts.map +1 -0
- package/dist/cli/registry.js +16 -0
- package/dist/cli/registry.js.map +1 -0
- package/dist/cnotes +0 -0
- package/dist/collection.d.ts +145 -0
- package/dist/collection.d.ts.map +1 -0
- package/dist/collection.js +684 -0
- package/dist/collection.js.map +1 -0
- package/dist/define-model.d.ts +45 -0
- package/dist/define-model.d.ts.map +1 -0
- package/dist/define-model.js +106 -0
- package/dist/define-model.js.map +1 -0
- package/dist/document.d.ts +123 -0
- package/dist/document.d.ts.map +1 -0
- package/dist/document.js +434 -0
- package/dist/document.js.map +1 -0
- package/dist/extract-sections.d.ts +46 -0
- package/dist/extract-sections.d.ts.map +1 -0
- package/dist/extract-sections.js +153 -0
- package/dist/extract-sections.js.map +1 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/helpers.d.ts +14 -0
- package/dist/mcp/helpers.d.ts.map +1 -0
- package/dist/mcp/helpers.js +7 -0
- package/dist/mcp/helpers.js.map +1 -0
- package/dist/mcp/model-info.d.ts +2 -0
- package/dist/mcp/model-info.d.ts.map +1 -0
- package/dist/mcp/model-info.js +94 -0
- package/dist/mcp/model-info.js.map +1 -0
- package/dist/mcp/prompts.d.ts +2 -0
- package/dist/mcp/prompts.d.ts.map +1 -0
- package/dist/mcp/prompts.js +180 -0
- package/dist/mcp/prompts.js.map +1 -0
- package/dist/mcp/readme.d.ts +2 -0
- package/dist/mcp/readme.d.ts.map +1 -0
- package/dist/mcp/readme.js +71 -0
- package/dist/mcp/readme.js.map +1 -0
- package/dist/mcp/resources.d.ts +2 -0
- package/dist/mcp/resources.d.ts.map +1 -0
- package/dist/mcp/resources.js +85 -0
- package/dist/mcp/resources.js.map +1 -0
- package/dist/mcp/server.d.ts +18 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +83 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools/mutation.d.ts +2 -0
- package/dist/mcp/tools/mutation.d.ts.map +1 -0
- package/dist/mcp/tools/mutation.js +155 -0
- package/dist/mcp/tools/mutation.js.map +1 -0
- package/dist/mcp/tools/query.d.ts +2 -0
- package/dist/mcp/tools/query.d.ts.map +1 -0
- package/dist/mcp/tools/query.js +130 -0
- package/dist/mcp/tools/query.js.map +1 -0
- package/dist/mcp/tools/search.d.ts +2 -0
- package/dist/mcp/tools/search.d.ts.map +1 -0
- package/dist/mcp/tools/search.js +168 -0
- package/dist/mcp/tools/search.js.map +1 -0
- package/dist/model-instance.d.ts +11 -0
- package/dist/model-instance.d.ts.map +1 -0
- package/dist/model-instance.js +208 -0
- package/dist/model-instance.js.map +1 -0
- package/dist/node-shortcuts.d.ts +25 -0
- package/dist/node-shortcuts.d.ts.map +1 -0
- package/dist/node-shortcuts.js +67 -0
- package/dist/node-shortcuts.js.map +1 -0
- package/dist/parse.d.ts +45 -0
- package/dist/parse.d.ts.map +1 -0
- package/dist/parse.js +98 -0
- package/dist/parse.js.map +1 -0
- package/dist/query/collection-query.d.ts +39 -0
- package/dist/query/collection-query.d.ts.map +1 -0
- package/dist/query/collection-query.js +184 -0
- package/dist/query/collection-query.js.map +1 -0
- package/dist/query/index.d.ts +8 -0
- package/dist/query/index.d.ts.map +1 -0
- package/dist/query/index.js +5 -0
- package/dist/query/index.js.map +1 -0
- package/dist/query/operators.d.ts +3 -0
- package/dist/query/operators.d.ts.map +1 -0
- package/dist/query/operators.js +18 -0
- package/dist/query/operators.js.map +1 -0
- package/dist/query/query-builder.d.ts +34 -0
- package/dist/query/query-builder.d.ts.map +1 -0
- package/dist/query/query-builder.js +84 -0
- package/dist/query/query-builder.js.map +1 -0
- package/dist/query/query-dsl.d.ts +36 -0
- package/dist/query/query-dsl.d.ts.map +1 -0
- package/dist/query/query-dsl.js +195 -0
- package/dist/query/query-dsl.js.map +1 -0
- package/dist/relationships/belongs-to.d.ts +9 -0
- package/dist/relationships/belongs-to.d.ts.map +1 -0
- package/dist/relationships/belongs-to.js +34 -0
- package/dist/relationships/belongs-to.js.map +1 -0
- package/dist/relationships/has-many.d.ts +23 -0
- package/dist/relationships/has-many.d.ts.map +1 -0
- package/dist/relationships/has-many.js +136 -0
- package/dist/relationships/has-many.js.map +1 -0
- package/dist/relationships/index.d.ts +26 -0
- package/dist/relationships/index.d.ts.map +1 -0
- package/dist/relationships/index.js +32 -0
- package/dist/relationships/index.js.map +1 -0
- package/dist/relationships/types.d.ts +2 -0
- package/dist/relationships/types.d.ts.map +1 -0
- package/dist/relationships/types.js +2 -0
- package/dist/relationships/types.js.map +1 -0
- package/dist/search/document-inputs.d.ts +30 -0
- package/dist/search/document-inputs.d.ts.map +1 -0
- package/dist/search/document-inputs.js +52 -0
- package/dist/search/document-inputs.js.map +1 -0
- package/dist/search/luca-semantic-search.d.ts +27 -0
- package/dist/search/luca-semantic-search.d.ts.map +1 -0
- package/dist/search/luca-semantic-search.js +56 -0
- package/dist/search/luca-semantic-search.js.map +1 -0
- package/dist/section.d.ts +21 -0
- package/dist/section.d.ts.map +1 -0
- package/dist/section.js +21 -0
- package/dist/section.js.map +1 -0
- package/dist/types.d.ts +185 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/index.d.ts +9 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +8 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/inflect.d.ts +6 -0
- package/dist/utils/inflect.d.ts.map +1 -0
- package/dist/utils/inflect.js +75 -0
- package/dist/utils/inflect.js.map +1 -0
- package/dist/utils/match-pattern.d.ts +25 -0
- package/dist/utils/match-pattern.d.ts.map +1 -0
- package/dist/utils/match-pattern.js +52 -0
- package/dist/utils/match-pattern.js.map +1 -0
- package/dist/utils/normalize-headings.d.ts +8 -0
- package/dist/utils/normalize-headings.d.ts.map +1 -0
- package/dist/utils/normalize-headings.js +19 -0
- package/dist/utils/normalize-headings.js.map +1 -0
- package/dist/utils/parse-table.d.ts +7 -0
- package/dist/utils/parse-table.d.ts.map +1 -0
- package/dist/utils/parse-table.js +17 -0
- package/dist/utils/parse-table.js.map +1 -0
- package/dist/utils/read-directory.d.ts +5 -0
- package/dist/utils/read-directory.d.ts.map +1 -0
- package/dist/utils/read-directory.js +29 -0
- package/dist/utils/read-directory.js.map +1 -0
- package/dist/utils/stringify-ast.d.ts +6 -0
- package/dist/utils/stringify-ast.d.ts.map +1 -0
- package/dist/utils/stringify-ast.js +8 -0
- package/dist/utils/stringify-ast.js.map +1 -0
- package/dist/utils/strip-markdown.d.ts +11 -0
- package/dist/utils/strip-markdown.d.ts.map +1 -0
- package/dist/utils/strip-markdown.js +48 -0
- package/dist/utils/strip-markdown.js.map +1 -0
- package/dist/validator.d.ts +10 -0
- package/dist/validator.d.ts.map +1 -0
- package/dist/validator.js +55 -0
- package/dist/validator.js.map +1 -0
- package/package.json +3 -3
- 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":"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"}
|
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/extract.ts"],"names":[],"mappings":""}
|