@bodhi-ventures/aiocs 0.3.1 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +63 -141
- package/dist/chunk-6CY4TABN.js +5373 -0
- package/dist/cli.js +2 -340
- package/dist/mcp-server.js +1 -686
- package/docs/codex-integration.md +20 -60
- package/docs/json-contract.md +1 -426
- package/package.json +2 -5
- package/skills/aiocs/SKILL.md +22 -47
- package/skills/aiocs-curation/SKILL.md +13 -48
- package/dist/chunk-TJG2DPJU.js +0 -10497
package/dist/cli.js
CHANGED
|
@@ -2,56 +2,36 @@
|
|
|
2
2
|
import {
|
|
3
3
|
AIOCS_ERROR_CODES,
|
|
4
4
|
AiocsError,
|
|
5
|
-
answerWorkspace,
|
|
6
5
|
backfillEmbeddings,
|
|
7
|
-
bindWorkspaceSources,
|
|
8
6
|
clearEmbeddings,
|
|
9
|
-
compileWorkspaceArtifacts,
|
|
10
|
-
createWorkspace,
|
|
11
7
|
diffSnapshotsForSource,
|
|
12
8
|
exportCatalogBackup,
|
|
13
9
|
fetchSources,
|
|
14
|
-
generateWorkspaceArtifactOutput,
|
|
15
10
|
getAiocsConfigDir,
|
|
16
11
|
getAiocsDataDir,
|
|
17
12
|
getDoctorReport,
|
|
18
13
|
getEmbeddingStatus,
|
|
19
14
|
getManagedSourceSpecDirectories,
|
|
20
|
-
getWorkspaceStatus,
|
|
21
15
|
importCatalogBackup,
|
|
22
|
-
ingestWorkspaceRawInput,
|
|
23
16
|
initManagedSources,
|
|
24
17
|
linkProjectSources,
|
|
25
|
-
lintWorkspaceArtifacts,
|
|
26
18
|
listSnapshotsForSource,
|
|
27
19
|
listSources,
|
|
28
|
-
listWorkspaceArtifacts,
|
|
29
|
-
listWorkspaceRawInputsRecord,
|
|
30
|
-
listWorkspaceRecords,
|
|
31
20
|
openCatalog,
|
|
32
21
|
packageName,
|
|
33
22
|
packageVersion,
|
|
34
23
|
parseDaemonConfig,
|
|
35
24
|
refreshDueSources,
|
|
36
|
-
removeWorkspaceRawInput,
|
|
37
25
|
runEmbeddingWorker,
|
|
38
|
-
runQueuedWorkspaceCompiles,
|
|
39
26
|
runSourceCanaries,
|
|
40
27
|
searchCatalog,
|
|
41
|
-
searchWorkspaceCatalog,
|
|
42
|
-
searchWorkspaceRawInputCatalog,
|
|
43
28
|
showChunk,
|
|
44
|
-
showWorkspaceArtifact,
|
|
45
|
-
showWorkspaceRawInput,
|
|
46
29
|
startDaemon,
|
|
47
|
-
syncWorkspaceToObsidianVault,
|
|
48
30
|
toAiocsError,
|
|
49
|
-
unbindWorkspaceSources,
|
|
50
31
|
unlinkProjectSources,
|
|
51
|
-
updateWorkspaceSettings,
|
|
52
32
|
upsertSourceFromSpecFile,
|
|
53
33
|
verifyCoverage
|
|
54
|
-
} from "./chunk-
|
|
34
|
+
} from "./chunk-6CY4TABN.js";
|
|
55
35
|
|
|
56
36
|
// src/cli.ts
|
|
57
37
|
import { Command, CommanderError as CommanderError2 } from "commander";
|
|
@@ -144,21 +124,6 @@ function renderSearchResult(result) {
|
|
|
144
124
|
""
|
|
145
125
|
].join("\n");
|
|
146
126
|
}
|
|
147
|
-
function renderWorkspaceSearchResult(result) {
|
|
148
|
-
if (result.kind === "source") {
|
|
149
|
-
return renderSearchResult(result);
|
|
150
|
-
}
|
|
151
|
-
return [
|
|
152
|
-
`Artifact: ${result.artifactPath}`,
|
|
153
|
-
`Kind: ${result.artifactKind}`,
|
|
154
|
-
`Section: ${result.sectionTitle}`,
|
|
155
|
-
`Stale: ${String(result.stale)}`,
|
|
156
|
-
`Score: ${result.score.toFixed(4)}`,
|
|
157
|
-
"",
|
|
158
|
-
result.markdown,
|
|
159
|
-
""
|
|
160
|
-
].join("\n");
|
|
161
|
-
}
|
|
162
127
|
function parsePositiveIntegerOption(value, field) {
|
|
163
128
|
if (typeof value === "undefined") {
|
|
164
129
|
return void 0;
|
|
@@ -280,7 +245,7 @@ function createDaemonLogger(json) {
|
|
|
280
245
|
};
|
|
281
246
|
}
|
|
282
247
|
var program = new Command();
|
|
283
|
-
program.name("
|
|
248
|
+
program.name("aiocs").description("Local-only documentation fetch and search CLI for AI agents.").option("-V, --version", "emit the current aiocs version").option("--json", "emit machine-readable JSON output").showHelpAfterError();
|
|
284
249
|
program.configureOutput({
|
|
285
250
|
writeOut(output) {
|
|
286
251
|
if (!argvWantsJson(process.argv)) {
|
|
@@ -475,309 +440,6 @@ project.command("unlink").argument("<project-path>").argument("[source-ids...]")
|
|
|
475
440
|
};
|
|
476
441
|
});
|
|
477
442
|
});
|
|
478
|
-
var workspace = program.command("workspace");
|
|
479
|
-
workspace.command("create").argument("<workspace-id>").requiredOption("--label <label>", "workspace label").option("--purpose <purpose>", "workspace purpose/description").option("--auto-compile", "automatically recompile after bound-source or raw-input changes").option("--output <format>", "default output format", (value, current) => {
|
|
480
|
-
current.push(value);
|
|
481
|
-
return current;
|
|
482
|
-
}, []).action(async (workspaceId, options, command) => {
|
|
483
|
-
await executeCommand(command, "workspace.create", async () => {
|
|
484
|
-
const result = await createWorkspace({
|
|
485
|
-
workspaceId,
|
|
486
|
-
label: options.label,
|
|
487
|
-
...options.purpose ? { purpose: options.purpose } : {},
|
|
488
|
-
...options.autoCompile ? { autoCompileEnabled: true } : {},
|
|
489
|
-
...options.output && options.output.length > 0 ? { defaultOutputFormats: options.output } : {}
|
|
490
|
-
});
|
|
491
|
-
return {
|
|
492
|
-
data: result,
|
|
493
|
-
human: `Created workspace ${result.workspace.id}`
|
|
494
|
-
};
|
|
495
|
-
});
|
|
496
|
-
});
|
|
497
|
-
workspace.command("configure").argument("<workspace-id>").requiredOption("--auto-compile <enabled>", "set workspace auto-compile to true or false").action(async (workspaceId, options, command) => {
|
|
498
|
-
await executeCommand(command, "workspace.configure", async () => {
|
|
499
|
-
const normalized = options.autoCompile.trim().toLowerCase();
|
|
500
|
-
if (normalized !== "true" && normalized !== "false") {
|
|
501
|
-
throw new AiocsError(
|
|
502
|
-
AIOCS_ERROR_CODES.invalidArgument,
|
|
503
|
-
"--auto-compile must be true or false"
|
|
504
|
-
);
|
|
505
|
-
}
|
|
506
|
-
const result = await updateWorkspaceSettings({
|
|
507
|
-
workspaceId,
|
|
508
|
-
autoCompileEnabled: normalized === "true"
|
|
509
|
-
});
|
|
510
|
-
return {
|
|
511
|
-
data: result,
|
|
512
|
-
human: `Updated ${workspaceId}: autoCompile=${result.workspace.autoCompileEnabled}`
|
|
513
|
-
};
|
|
514
|
-
});
|
|
515
|
-
});
|
|
516
|
-
workspace.command("list").action(async (_options, command) => {
|
|
517
|
-
await executeCommand(command, "workspace.list", async () => {
|
|
518
|
-
const result = await listWorkspaceRecords();
|
|
519
|
-
return {
|
|
520
|
-
data: result,
|
|
521
|
-
human: result.workspaces.length === 0 ? "No workspaces registered." : result.workspaces.map((item) => [
|
|
522
|
-
item.id,
|
|
523
|
-
item.label,
|
|
524
|
-
`bindings=${item.bindingCount}`,
|
|
525
|
-
`artifacts=${item.artifactCount}`,
|
|
526
|
-
item.lastCompileStatus ? `last=${item.lastCompileStatus}` : "never compiled"
|
|
527
|
-
].join(" | "))
|
|
528
|
-
};
|
|
529
|
-
});
|
|
530
|
-
});
|
|
531
|
-
workspace.command("bind").argument("<workspace-id>").argument("<source-ids...>").action(async (workspaceId, sourceIds, _options, command) => {
|
|
532
|
-
await executeCommand(command, "workspace.bind", async () => {
|
|
533
|
-
const result = await bindWorkspaceSources({ workspaceId, sourceIds });
|
|
534
|
-
return {
|
|
535
|
-
data: result,
|
|
536
|
-
human: `Bound ${workspaceId} -> ${sourceIds.join(", ")}`
|
|
537
|
-
};
|
|
538
|
-
});
|
|
539
|
-
});
|
|
540
|
-
workspace.command("unbind").argument("<workspace-id>").argument("[source-ids...]").action(async (workspaceId, sourceIds, _options, command) => {
|
|
541
|
-
await executeCommand(command, "workspace.unbind", async () => {
|
|
542
|
-
const result = await unbindWorkspaceSources({
|
|
543
|
-
workspaceId,
|
|
544
|
-
...sourceIds.length > 0 ? { sourceIds } : {}
|
|
545
|
-
});
|
|
546
|
-
return {
|
|
547
|
-
data: result,
|
|
548
|
-
human: sourceIds.length > 0 ? `Unbound ${workspaceId} -> ${sourceIds.join(", ")}` : `Unbound all sources from ${workspaceId}`
|
|
549
|
-
};
|
|
550
|
-
});
|
|
551
|
-
});
|
|
552
|
-
workspace.command("compile").argument("<workspace-id>").action(async (workspaceId, _options, command) => {
|
|
553
|
-
await executeCommand(command, "workspace.compile", async () => {
|
|
554
|
-
const result = await compileWorkspaceArtifacts(workspaceId);
|
|
555
|
-
return {
|
|
556
|
-
data: result,
|
|
557
|
-
human: result.skipped ? `Workspace ${workspaceId} is already up to date.` : [
|
|
558
|
-
`Compiled ${workspaceId}`,
|
|
559
|
-
`Changed sources: ${result.changedSourceIds.join(", ") || "(none)"}`,
|
|
560
|
-
`Changed raw inputs: ${result.changedRawInputIds.join(", ") || "(none)"}`,
|
|
561
|
-
...result.updatedArtifactPaths.map((path) => `- ${path}`)
|
|
562
|
-
]
|
|
563
|
-
};
|
|
564
|
-
});
|
|
565
|
-
});
|
|
566
|
-
workspace.command("status").argument("<workspace-id>").action(async (workspaceId, _options, command) => {
|
|
567
|
-
await executeCommand(command, "workspace.status", async () => {
|
|
568
|
-
const result = await getWorkspaceStatus(workspaceId);
|
|
569
|
-
return {
|
|
570
|
-
data: result,
|
|
571
|
-
human: [
|
|
572
|
-
`${result.workspace.id} | ${result.workspace.label}`,
|
|
573
|
-
`Bindings=${result.bindings.length} | RawInputs=${result.rawInputs.length} | Artifacts=${result.artifacts.length} | Runs=${result.compileRuns.length}`,
|
|
574
|
-
`AutoCompile=${result.workspace.autoCompileEnabled} | Health=${result.health.status} | PendingJobs=${result.health.pendingCompileJobs} | FailedJobs=${result.health.failedCompileJobs}`,
|
|
575
|
-
`Links=${result.graph.linkCount} | BrokenLinks=${result.graph.brokenLinkCount} | Orphans=${result.graph.orphanArtifactCount}`
|
|
576
|
-
]
|
|
577
|
-
};
|
|
578
|
-
});
|
|
579
|
-
});
|
|
580
|
-
workspace.command("queue-run").option("--max-jobs <count>", "maximum queued workspace compile jobs to process").action(async (options, command) => {
|
|
581
|
-
await executeCommand(command, "workspace.queue-run", async () => {
|
|
582
|
-
const maxJobs = parsePositiveIntegerOption(options.maxJobs, "max-jobs");
|
|
583
|
-
const result = await runQueuedWorkspaceCompiles({
|
|
584
|
-
...typeof maxJobs === "number" ? { maxJobs } : {}
|
|
585
|
-
});
|
|
586
|
-
return {
|
|
587
|
-
data: result,
|
|
588
|
-
human: [
|
|
589
|
-
`Processed ${result.processedJobs} workspace compile job(s)`,
|
|
590
|
-
...result.succeededJobs.map((job) => `success | ${job.workspaceId} | sources=${job.changedSourceIds.length} | raw=${job.changedRawInputIds.length}`),
|
|
591
|
-
...result.failedJobs.map((job) => `failed | ${job.workspaceId} | ${job.errorMessage}`)
|
|
592
|
-
]
|
|
593
|
-
};
|
|
594
|
-
});
|
|
595
|
-
});
|
|
596
|
-
workspace.command("search").argument("<workspace-id>").argument("<query>").option("--scope <scope>", "source, derived, or mixed").option("--mode <mode>", "search mode: auto, lexical, hybrid, semantic").option("--path <glob>", "restrict source-side search to file paths matching a glob", (value, current) => {
|
|
597
|
-
current.push(value);
|
|
598
|
-
return current;
|
|
599
|
-
}, []).option("--language <name>", "restrict source-side search to a language", (value, current) => {
|
|
600
|
-
current.push(value);
|
|
601
|
-
return current;
|
|
602
|
-
}, []).option("--limit <count>", "maximum number of results to return").option("--offset <count>", "number of results to skip before returning matches").action(async (workspaceId, query, options, command) => {
|
|
603
|
-
await executeCommand(command, "workspace.search", async () => {
|
|
604
|
-
const limit = parsePositiveIntegerOption(options.limit, "limit");
|
|
605
|
-
const offset = parsePositiveIntegerOption(options.offset, "offset");
|
|
606
|
-
const mode = parseSearchModeOption(options.mode);
|
|
607
|
-
const result = await searchWorkspaceCatalog(workspaceId, query, {
|
|
608
|
-
...options.scope ? { scope: options.scope } : {},
|
|
609
|
-
...mode ? { mode } : {},
|
|
610
|
-
...options.path && options.path.length > 0 ? { path: options.path } : {},
|
|
611
|
-
...options.language && options.language.length > 0 ? { language: options.language } : {},
|
|
612
|
-
...typeof limit === "number" ? { limit } : {},
|
|
613
|
-
...typeof offset === "number" ? { offset } : {}
|
|
614
|
-
});
|
|
615
|
-
return {
|
|
616
|
-
data: result,
|
|
617
|
-
human: result.results.length === 0 ? `No workspace results for "${query}" (${result.scope})` : [
|
|
618
|
-
`Showing ${result.offset + 1}-${result.offset + result.results.length} of ${result.total} workspace result(s)`,
|
|
619
|
-
...result.results.map((entry) => renderWorkspaceSearchResult(entry))
|
|
620
|
-
]
|
|
621
|
-
};
|
|
622
|
-
});
|
|
623
|
-
});
|
|
624
|
-
var workspaceArtifact = workspace.command("artifact");
|
|
625
|
-
workspaceArtifact.command("list").argument("<workspace-id>").action(async (workspaceId, _options, command) => {
|
|
626
|
-
await executeCommand(command, "workspace.artifact.list", async () => {
|
|
627
|
-
const result = await listWorkspaceArtifacts(workspaceId);
|
|
628
|
-
return {
|
|
629
|
-
data: result,
|
|
630
|
-
human: result.artifacts.length === 0 ? `No artifacts for ${workspaceId}` : result.artifacts.map((artifact) => [
|
|
631
|
-
artifact.path,
|
|
632
|
-
artifact.kind,
|
|
633
|
-
artifact.stale ? "stale" : "fresh",
|
|
634
|
-
`chunks=${artifact.chunkCount}`
|
|
635
|
-
].join(" | "))
|
|
636
|
-
};
|
|
637
|
-
});
|
|
638
|
-
});
|
|
639
|
-
workspaceArtifact.command("show").argument("<workspace-id>").argument("<artifact-path>").action(async (workspaceId, artifactPath, _options, command) => {
|
|
640
|
-
await executeCommand(command, "workspace.artifact.show", async () => {
|
|
641
|
-
const result = await showWorkspaceArtifact(workspaceId, artifactPath);
|
|
642
|
-
return {
|
|
643
|
-
data: result,
|
|
644
|
-
human: result.content
|
|
645
|
-
};
|
|
646
|
-
});
|
|
647
|
-
});
|
|
648
|
-
var workspaceIngest = workspace.command("ingest");
|
|
649
|
-
workspaceIngest.command("add").argument("<workspace-id>").argument("<kind>").argument("<path>").option("--label <label>", "display label for the raw input").action(async (workspaceId, kind, path, options, command) => {
|
|
650
|
-
await executeCommand(command, "workspace.ingest.add", async () => {
|
|
651
|
-
const result = await ingestWorkspaceRawInput({
|
|
652
|
-
workspaceId,
|
|
653
|
-
kind,
|
|
654
|
-
sourcePath: path,
|
|
655
|
-
...options.label ? { label: options.label } : {}
|
|
656
|
-
});
|
|
657
|
-
return {
|
|
658
|
-
data: result,
|
|
659
|
-
human: `Ingested ${result.rawInput.kind} ${result.rawInput.id} into ${workspaceId}`
|
|
660
|
-
};
|
|
661
|
-
});
|
|
662
|
-
});
|
|
663
|
-
workspaceIngest.command("list").argument("<workspace-id>").action(async (workspaceId, _options, command) => {
|
|
664
|
-
await executeCommand(command, "workspace.ingest.list", async () => {
|
|
665
|
-
const result = await listWorkspaceRawInputsRecord(workspaceId);
|
|
666
|
-
return {
|
|
667
|
-
data: result,
|
|
668
|
-
human: result.rawInputs.length === 0 ? `No raw inputs for ${workspaceId}` : result.rawInputs.map((rawInput) => [
|
|
669
|
-
rawInput.id,
|
|
670
|
-
rawInput.kind,
|
|
671
|
-
rawInput.label,
|
|
672
|
-
`chunks=${rawInput.chunkCount}`
|
|
673
|
-
].join(" | "))
|
|
674
|
-
};
|
|
675
|
-
});
|
|
676
|
-
});
|
|
677
|
-
workspaceIngest.command("show").argument("<workspace-id>").argument("<raw-input-id>").action(async (workspaceId, rawInputId, _options, command) => {
|
|
678
|
-
await executeCommand(command, "workspace.ingest.show", async () => {
|
|
679
|
-
const result = await showWorkspaceRawInput(workspaceId, rawInputId);
|
|
680
|
-
return {
|
|
681
|
-
data: result,
|
|
682
|
-
human: [
|
|
683
|
-
`${result.rawInput.id} | ${result.rawInput.kind} | ${result.rawInput.label}`,
|
|
684
|
-
...result.chunks.map((chunk) => `${chunk.section_title} | ${chunk.file_path ?? "(root)"}`)
|
|
685
|
-
]
|
|
686
|
-
};
|
|
687
|
-
});
|
|
688
|
-
});
|
|
689
|
-
workspaceIngest.command("search").argument("<workspace-id>").argument("<query>").option("--kind <kind>", "raw input kind filter", (value, current) => {
|
|
690
|
-
current.push(value);
|
|
691
|
-
return current;
|
|
692
|
-
}, []).option("--limit <count>", "maximum number of results to return").option("--offset <count>", "number of results to skip").action(async (workspaceId, query, options, command) => {
|
|
693
|
-
await executeCommand(command, "workspace.ingest.search", async () => {
|
|
694
|
-
const limit = parsePositiveIntegerOption(options.limit, "limit");
|
|
695
|
-
const offset = parsePositiveIntegerOption(options.offset, "offset");
|
|
696
|
-
const result = await searchWorkspaceRawInputCatalog({
|
|
697
|
-
workspaceId,
|
|
698
|
-
query,
|
|
699
|
-
...options.kind && options.kind.length > 0 ? { kinds: options.kind } : {},
|
|
700
|
-
...typeof limit === "number" ? { limit } : {},
|
|
701
|
-
...typeof offset === "number" ? { offset } : {}
|
|
702
|
-
});
|
|
703
|
-
return {
|
|
704
|
-
data: result,
|
|
705
|
-
human: result.results.length === 0 ? `No raw-input matches for "${query}"` : [
|
|
706
|
-
`Showing ${result.offset + 1}-${result.offset + result.results.length} of ${result.total} raw-input result(s)`,
|
|
707
|
-
...result.results.map((entry) => [
|
|
708
|
-
entry.rawInputId,
|
|
709
|
-
entry.kind,
|
|
710
|
-
entry.label,
|
|
711
|
-
entry.sectionTitle,
|
|
712
|
-
entry.filePath ?? "(root)"
|
|
713
|
-
].join(" | "))
|
|
714
|
-
]
|
|
715
|
-
};
|
|
716
|
-
});
|
|
717
|
-
});
|
|
718
|
-
workspaceIngest.command("remove").argument("<workspace-id>").argument("<raw-input-id>").action(async (workspaceId, rawInputId, _options, command) => {
|
|
719
|
-
await executeCommand(command, "workspace.ingest.remove", async () => {
|
|
720
|
-
const result = await removeWorkspaceRawInput({ workspaceId, rawInputId });
|
|
721
|
-
return {
|
|
722
|
-
data: result,
|
|
723
|
-
human: `Removed raw input ${rawInputId} from ${workspaceId}`
|
|
724
|
-
};
|
|
725
|
-
});
|
|
726
|
-
});
|
|
727
|
-
workspace.command("lint").argument("<workspace-id>").action(async (workspaceId, _options, command) => {
|
|
728
|
-
await executeCommand(command, "workspace.lint", async () => {
|
|
729
|
-
const result = await lintWorkspaceArtifacts(workspaceId);
|
|
730
|
-
return {
|
|
731
|
-
data: result,
|
|
732
|
-
human: [
|
|
733
|
-
`${workspaceId} lint status=${result.summary.status}`,
|
|
734
|
-
...result.findings.map((finding) => `${finding.kind} | ${finding.artifactPath ?? finding.sourceId ?? "(workspace)"} | ${finding.summary}`)
|
|
735
|
-
]
|
|
736
|
-
};
|
|
737
|
-
});
|
|
738
|
-
});
|
|
739
|
-
workspace.command("output").argument("<workspace-id>").argument("<format>").option("--name <name>", "output file slug").option("--prompt <prompt>", "extra output instructions").action(async (workspaceId, format, options, command) => {
|
|
740
|
-
await executeCommand(command, "workspace.output", async () => {
|
|
741
|
-
const result = await generateWorkspaceArtifactOutput({
|
|
742
|
-
workspaceId,
|
|
743
|
-
format,
|
|
744
|
-
...options.name ? { name: options.name } : {},
|
|
745
|
-
...options.prompt ? { prompt: options.prompt } : {}
|
|
746
|
-
});
|
|
747
|
-
return {
|
|
748
|
-
data: result,
|
|
749
|
-
human: `Generated ${result.format} at ${result.path}`
|
|
750
|
-
};
|
|
751
|
-
});
|
|
752
|
-
});
|
|
753
|
-
workspace.command("answer").argument("<workspace-id>").argument("<format>").argument("<question>").option("--name <name>", "output file slug").action(async (workspaceId, format, question, options, command) => {
|
|
754
|
-
await executeCommand(command, "workspace.answer", async () => {
|
|
755
|
-
const result = await answerWorkspace({
|
|
756
|
-
workspaceId,
|
|
757
|
-
format,
|
|
758
|
-
question,
|
|
759
|
-
...options.name ? { name: options.name } : {}
|
|
760
|
-
});
|
|
761
|
-
return {
|
|
762
|
-
data: result,
|
|
763
|
-
human: `Answered into ${result.path} (${result.format})`
|
|
764
|
-
};
|
|
765
|
-
});
|
|
766
|
-
});
|
|
767
|
-
var workspaceSync = workspace.command("sync");
|
|
768
|
-
workspaceSync.command("obsidian").argument("<workspace-id>").argument("<vault-path>").option("--export-subdir <subdir>", "vault subdirectory to sync into").action(async (workspaceId, vaultPath, options, command) => {
|
|
769
|
-
await executeCommand(command, "workspace.sync.obsidian", async () => {
|
|
770
|
-
const result = await syncWorkspaceToObsidianVault({
|
|
771
|
-
workspaceId,
|
|
772
|
-
vaultPath,
|
|
773
|
-
...options.exportSubdir ? { exportSubdir: options.exportSubdir } : {}
|
|
774
|
-
});
|
|
775
|
-
return {
|
|
776
|
-
data: result,
|
|
777
|
-
human: `Synced ${workspaceId} to ${result.targetPath}`
|
|
778
|
-
};
|
|
779
|
-
});
|
|
780
|
-
});
|
|
781
443
|
var backup = program.command("backup");
|
|
782
444
|
backup.command("export").argument("<output-dir>").option("--replace-existing", "replace an existing non-empty export directory").action(
|
|
783
445
|
async (outputDir, options, command) => {
|