oh-my-second-brain 0.1.9 → 0.2.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.
Files changed (96) hide show
  1. package/CHANGELOG.md +89 -0
  2. package/adapters/claude-code/.claude-plugin/plugin.json +1 -1
  3. package/adapters/claude-code/skills/link/SKILL.md +87 -0
  4. package/adapters/codex/.codex-plugin/plugin.json +1 -1
  5. package/adapters/codex/skills/oms-link/SKILL.md +35 -0
  6. package/adapters/hermes/README.md +2 -0
  7. package/adapters/hermes/manifest.json +1 -1
  8. package/adapters/hermes/skills/link/SKILL.md +18 -0
  9. package/core/ontology/concepts/term.yaml +12 -0
  10. package/core/ontology/taxonomy.yaml +3 -0
  11. package/core/skills/link/SKILL.md +130 -0
  12. package/dist/capture/safe.d.ts +32 -2
  13. package/dist/capture/safe.js +223 -37
  14. package/dist/capture/safe.js.map +1 -1
  15. package/dist/cli/args.d.ts +2 -0
  16. package/dist/cli/args.js +6 -0
  17. package/dist/cli/args.js.map +1 -1
  18. package/dist/cli/global-writeback.d.ts +31 -0
  19. package/dist/cli/global-writeback.js +73 -0
  20. package/dist/cli/global-writeback.js.map +1 -0
  21. package/dist/cli/host-commands.d.ts +30 -0
  22. package/dist/cli/host-commands.js +89 -0
  23. package/dist/cli/host-commands.js.map +1 -0
  24. package/dist/cli/linkify.d.ts +23 -0
  25. package/dist/cli/linkify.js +118 -0
  26. package/dist/cli/linkify.js.map +1 -0
  27. package/dist/cli/oms.d.ts +1 -0
  28. package/dist/cli/oms.js +52 -66
  29. package/dist/cli/oms.js.map +1 -1
  30. package/dist/cli/usage.js +11 -1
  31. package/dist/cli/usage.js.map +1 -1
  32. package/dist/conventions/write-protocol.d.ts +39 -0
  33. package/dist/conventions/write-protocol.js +44 -0
  34. package/dist/conventions/write-protocol.js.map +1 -0
  35. package/dist/core/runtime/assets.d.ts +6 -0
  36. package/dist/core/runtime/assets.js +27 -0
  37. package/dist/core/runtime/assets.js.map +1 -1
  38. package/dist/engine/graph/resolver.d.ts +17 -0
  39. package/dist/engine/graph/resolver.js +46 -11
  40. package/dist/engine/graph/resolver.js.map +1 -1
  41. package/dist/engine/linkify/apply.d.ts +56 -0
  42. package/dist/engine/linkify/apply.js +65 -0
  43. package/dist/engine/linkify/apply.js.map +1 -0
  44. package/dist/engine/linkify/josa.d.ts +58 -0
  45. package/dist/engine/linkify/josa.js +133 -0
  46. package/dist/engine/linkify/josa.js.map +1 -0
  47. package/dist/engine/linkify/mask.d.ts +29 -0
  48. package/dist/engine/linkify/mask.js +173 -0
  49. package/dist/engine/linkify/mask.js.map +1 -0
  50. package/dist/engine/linkify/suggest.d.ts +52 -0
  51. package/dist/engine/linkify/suggest.js +181 -0
  52. package/dist/engine/linkify/suggest.js.map +1 -0
  53. package/dist/engine/linkify/types.d.ts +68 -0
  54. package/dist/engine/linkify/types.js +12 -0
  55. package/dist/engine/linkify/types.js.map +1 -0
  56. package/dist/harness/surface-registry.d.ts +1 -0
  57. package/dist/harness/surface-registry.js +27 -0
  58. package/dist/harness/surface-registry.js.map +1 -1
  59. package/dist/harness/validation.js +30 -1
  60. package/dist/harness/validation.js.map +1 -1
  61. package/dist/install/claude-marketplace.d.ts +44 -0
  62. package/dist/install/claude-marketplace.js +89 -0
  63. package/dist/install/claude-marketplace.js.map +1 -0
  64. package/dist/install/claude.js +14 -7
  65. package/dist/install/claude.js.map +1 -1
  66. package/dist/install/codex.d.ts +15 -0
  67. package/dist/install/codex.js +15 -0
  68. package/dist/install/codex.js.map +1 -1
  69. package/dist/install/common.d.ts +11 -2
  70. package/dist/install/common.js +19 -12
  71. package/dist/install/common.js.map +1 -1
  72. package/dist/install/hermes.js +15 -15
  73. package/dist/install/hermes.js.map +1 -1
  74. package/dist/install/hosts.js +31 -15
  75. package/dist/install/hosts.js.map +1 -1
  76. package/dist/link/global-config.d.ts +22 -0
  77. package/dist/link/global-config.js +69 -0
  78. package/dist/link/global-config.js.map +1 -0
  79. package/dist/link/link.d.ts +6 -3
  80. package/dist/link/link.js +12 -2
  81. package/dist/link/link.js.map +1 -1
  82. package/dist/mcp/link-tools.d.ts +81 -0
  83. package/dist/mcp/link-tools.js +157 -0
  84. package/dist/mcp/link-tools.js.map +1 -0
  85. package/dist/mcp/server.d.ts +7 -0
  86. package/dist/mcp/server.js +107 -8
  87. package/dist/mcp/server.js.map +1 -1
  88. package/dist/mcp/update-notice.d.ts +51 -0
  89. package/dist/mcp/update-notice.js +196 -0
  90. package/dist/mcp/update-notice.js.map +1 -0
  91. package/dist/update/update.d.ts +12 -0
  92. package/dist/update/update.js +2 -2
  93. package/dist/update/update.js.map +1 -1
  94. package/docs/install.md +38 -2
  95. package/docs/release.md +109 -17
  96. package/package.json +4 -2
@@ -0,0 +1,73 @@
1
+ import { stat } from "node:fs/promises";
2
+ import { readGlobalConfig, writeGlobalConfig } from "../link/global-config.js";
3
+ /**
4
+ * Register `vault` in the global config (`<homeDir>/.oms/config.yaml`).
5
+ * When `overwrite` is false, does nothing if a global config already exists
6
+ * (including when reading the existing config throws, e.g. a corrupt file -
7
+ * a corrupt-but-present config is treated as "config exists, do not touch").
8
+ */
9
+ export async function registerGlobalVault(options) {
10
+ const { vault, homeDir, overwrite } = options;
11
+ if (!overwrite) {
12
+ let existing;
13
+ try {
14
+ existing = await readGlobalConfig(homeDir);
15
+ }
16
+ catch {
17
+ return { wrote: false, reason: "existing global config is present but unreadable" };
18
+ }
19
+ if (existing !== null) {
20
+ return { wrote: false, reason: "existing global config present" };
21
+ }
22
+ }
23
+ await writeGlobalConfig({ version: 1, vault }, homeDir);
24
+ return { wrote: true };
25
+ }
26
+ /**
27
+ * Migration backfill: when no global config exists yet and `OMS_VAULT` points
28
+ * at an existing directory, register it. Never overwrites an existing config
29
+ * (including a corrupt-but-present one).
30
+ */
31
+ export async function backfillGlobalVaultFromEnv(options) {
32
+ const { env, homeDir } = options;
33
+ const omsVault = env["OMS_VAULT"];
34
+ if (omsVault === undefined || omsVault.trim().length === 0) {
35
+ return { wrote: false, reason: "OMS_VAULT not set" };
36
+ }
37
+ let existing;
38
+ try {
39
+ existing = await readGlobalConfig(homeDir);
40
+ }
41
+ catch {
42
+ return { wrote: false, reason: "existing global config is present but unreadable" };
43
+ }
44
+ if (existing !== null) {
45
+ return { wrote: false, reason: "existing global config present" };
46
+ }
47
+ try {
48
+ const stats = await stat(omsVault);
49
+ if (!stats.isDirectory()) {
50
+ return { wrote: false, reason: "OMS_VAULT does not point at a directory" };
51
+ }
52
+ }
53
+ catch {
54
+ return { wrote: false, reason: "OMS_VAULT does not point at an existing directory" };
55
+ }
56
+ await writeGlobalConfig({ version: 1, vault: omsVault }, homeDir);
57
+ return { wrote: true };
58
+ }
59
+ /**
60
+ * Run a global write-back action, swallowing any failure into a single
61
+ * `[oms] warning:` line on stderr. Never throws.
62
+ */
63
+ export async function nonFatalGlobalWriteback(action) {
64
+ try {
65
+ return await action();
66
+ }
67
+ catch (error) {
68
+ const message = error instanceof Error ? error.message : String(error);
69
+ console.error(`[oms] warning: could not update global vault registry (${message})`);
70
+ return { wrote: false, reason: message };
71
+ }
72
+ }
73
+ //# sourceMappingURL=global-writeback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-writeback.js","sourceRoot":"","sources":["../../src/cli/global-writeback.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Host-lifecycle CLI commands: `install`, `uninstall`, `update`, and the
3
+ * internal `update-reconcile`.
4
+ *
5
+ * These four are the only commands that mutate host adapter state (and, for
6
+ * install, the global vault record), so they live together and away from the
7
+ * router, which owns dispatch alone.
8
+ */
9
+ import { type RuntimeSelection } from "../install/hosts.js";
10
+ /** Everything the host commands need from the parsed argv, plus the adapter root. */
11
+ export interface HostCommandContext {
12
+ readonly vault: string;
13
+ readonly vaultExplicit: boolean;
14
+ readonly runtime: RuntimeSelection | undefined;
15
+ readonly agentVault: string | undefined;
16
+ readonly dryRun: boolean;
17
+ readonly executeExternal: boolean;
18
+ readonly yes: boolean;
19
+ readonly json: boolean;
20
+ readonly checkUpdate: boolean;
21
+ readonly timeoutMs: number | undefined;
22
+ readonly unknownFlags: readonly string[];
23
+ readonly adapterRoot: string;
24
+ }
25
+ /** `oms install` / `oms uninstall`. Returns the process exit code. */
26
+ export declare function runInstallOrUninstall(action: "install" | "uninstall", context: HostCommandContext): Promise<number>;
27
+ /** `oms update`. Returns the process exit code. */
28
+ export declare function runUpdateCommand(context: HostCommandContext): Promise<number>;
29
+ /** `oms update-reconcile` — internal; re-runs install after a package update. */
30
+ export declare function runUpdateReconcile(context: HostCommandContext): Promise<number>;
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Host-lifecycle CLI commands: `install`, `uninstall`, `update`, and the
3
+ * internal `update-reconcile`.
4
+ *
5
+ * These four are the only commands that mutate host adapter state (and, for
6
+ * install, the global vault record), so they live together and away from the
7
+ * router, which owns dispatch alone.
8
+ */
9
+ import path from "node:path";
10
+ import { formatHostOperationResults, formatHostOperationResultsJson, runHostOperation, } from "../install/hosts.js";
11
+ import { formatUpdateResult, runUpdate } from "../update/update.js";
12
+ import { backfillGlobalVaultFromEnv, nonFatalGlobalWriteback, registerGlobalVault, } from "./global-writeback.js";
13
+ import { readCurrentPackageVersion } from "./update-notice.js";
14
+ /** Persist the vault the install just configured into the global record. */
15
+ async function recordInstalledVault(context) {
16
+ if (context.vaultExplicit) {
17
+ await nonFatalGlobalWriteback(() => registerGlobalVault({ vault: path.resolve(context.vault), homeDir: undefined, overwrite: true }));
18
+ return;
19
+ }
20
+ await nonFatalGlobalWriteback(() => backfillGlobalVaultFromEnv({ env: process.env, homeDir: undefined }));
21
+ }
22
+ /** `oms install` / `oms uninstall`. Returns the process exit code. */
23
+ export async function runInstallOrUninstall(action, context) {
24
+ if (action === "uninstall" && !context.yes && !context.dryRun && process.env["OMS_NON_INTERACTIVE"] !== "1") {
25
+ console.error("[oms] Refusing uninstall without --yes or --dry-run.");
26
+ return 1;
27
+ }
28
+ const results = await runHostOperation({
29
+ action,
30
+ runtime: context.runtime ?? (action === "install" ? "auto" : "all"),
31
+ vault: context.vault,
32
+ agentVault: context.agentVault,
33
+ dryRun: context.dryRun,
34
+ executeExternal: context.executeExternal,
35
+ yes: context.yes,
36
+ adapterRoot: context.adapterRoot,
37
+ });
38
+ console.log(context.json
39
+ ? formatHostOperationResultsJson(results, context.dryRun)
40
+ : formatHostOperationResults(results, context.dryRun));
41
+ if (action === "install" && !context.dryRun)
42
+ await recordInstalledVault(context);
43
+ return 0;
44
+ }
45
+ /** `oms update`. Returns the process exit code. */
46
+ export async function runUpdateCommand(context) {
47
+ if (context.unknownFlags.length > 0) {
48
+ console.error(`[oms] Unsupported update option: ${context.unknownFlags.join(", ")}`);
49
+ return 1;
50
+ }
51
+ const result = await runUpdate({
52
+ currentVersion: await readCurrentPackageVersion(),
53
+ latestVersion: process.env["OMS_UPDATE_LATEST_VERSION"],
54
+ runtime: context.runtime ?? "all",
55
+ vault: context.vault,
56
+ check: context.checkUpdate,
57
+ dryRun: context.dryRun,
58
+ yes: context.yes,
59
+ executeExternal: context.executeExternal,
60
+ timeoutMs: context.timeoutMs,
61
+ reconcileCommand: {
62
+ command: process.execPath,
63
+ argsPrefix: process.argv[1] === undefined ? [] : [process.argv[1]],
64
+ },
65
+ });
66
+ console.log(formatUpdateResult(result));
67
+ return result.success ? 0 : 1;
68
+ }
69
+ /** `oms update-reconcile` — internal; re-runs install after a package update. */
70
+ export async function runUpdateReconcile(context) {
71
+ if (process.env["OMS_UPDATE_RECONCILE"] !== "1" && !context.dryRun) {
72
+ console.error("[oms] update-reconcile is internal; run `oms update --yes` instead.");
73
+ return 1;
74
+ }
75
+ const results = await runHostOperation({
76
+ action: "install",
77
+ runtime: context.runtime ?? "all",
78
+ vault: context.vault,
79
+ dryRun: context.dryRun,
80
+ executeExternal: context.executeExternal,
81
+ yes: true,
82
+ adapterRoot: context.adapterRoot,
83
+ });
84
+ console.log(context.json
85
+ ? formatHostOperationResultsJson(results, context.dryRun)
86
+ : formatHostOperationResults(results, context.dryRun));
87
+ return 0;
88
+ }
89
+ //# sourceMappingURL=host-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-commands.js","sourceRoot":"","sources":["../../src/cli/host-commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * `oms linkify` — batch retrofit of `[[wikilinks]]` over EXISTING vault notes.
3
+ *
4
+ * Report-only by default. Mutation requires BOTH `--apply` and `--yes`, checked
5
+ * before any note is read, so a half-typed command can never reach the disk.
6
+ *
7
+ * The command owns scope and reporting only: span detection stays in
8
+ * engine/linkify (pure), and every write goes through the capture kernel's
9
+ * `writeNote`, which keeps path safety, the concept contract, and the
10
+ * postcondition read-back unduplicated here.
11
+ */
12
+ export interface LinkifyOptions {
13
+ readonly vault: string;
14
+ /** Restrict both scan and writes to one top-level vault folder. */
15
+ readonly folder?: string;
16
+ readonly apply: boolean;
17
+ readonly yes: boolean;
18
+ }
19
+ /**
20
+ * Scan (and optionally link) a vault, restricting link TARGETS to notes bound
21
+ * to the `term` concept.
22
+ */
23
+ export declare function runLinkify(options: LinkifyOptions): Promise<number>;
@@ -0,0 +1,118 @@
1
+ /**
2
+ * `oms linkify` — batch retrofit of `[[wikilinks]]` over EXISTING vault notes.
3
+ *
4
+ * Report-only by default. Mutation requires BOTH `--apply` and `--yes`, checked
5
+ * before any note is read, so a half-typed command can never reach the disk.
6
+ *
7
+ * The command owns scope and reporting only: span detection stays in
8
+ * engine/linkify (pure), and every write goes through the capture kernel's
9
+ * `writeNote`, which keeps path safety, the concept contract, and the
10
+ * postcondition read-back unduplicated here.
11
+ */
12
+ import { readFile } from "node:fs/promises";
13
+ import path from "node:path";
14
+ import { parseNote } from "../conventions/frontmatter.js";
15
+ import { mapWithConcurrency, walkVaultMarkdown } from "../conventions/vault-walk.js";
16
+ import { writeNote } from "../capture/safe.js";
17
+ import { resolveConcept } from "../core/ontology/resolver.js";
18
+ import { applyLinks, hashBody } from "../engine/linkify/apply.js";
19
+ import { suggestLinks, termBoundNotes } from "../engine/linkify/suggest.js";
20
+ import { validateVaultLintFolder } from "../engine/conventions/vault-lint.js";
21
+ import { resolveActiveOntology } from "../ontology/active.js";
22
+ /** Parallel note reads; the walk itself is cheap, contents are the hot cost. */
23
+ const READ_CONCURRENCY = 16;
24
+ /** Flatten an unknown frontmatter `aliases` value to trimmed non-empty strings. */
25
+ function aliasStrings(value) {
26
+ if (Array.isArray(value))
27
+ return value.flatMap(aliasStrings);
28
+ if (typeof value !== "string")
29
+ return [];
30
+ const trimmed = value.trim();
31
+ return trimmed ? [trimmed] : [];
32
+ }
33
+ /** Read every markdown note in the vault, parsed into body + surface forms. */
34
+ async function scanVault(vault, ontology) {
35
+ const paths = [];
36
+ for await (const notePath of walkVaultMarkdown(vault))
37
+ paths.push(notePath);
38
+ return mapWithConcurrency(paths, READ_CONCURRENCY, async (notePath) => {
39
+ const raw = await readFile(path.join(vault, notePath), "utf-8");
40
+ const parsed = parseNote(raw);
41
+ return {
42
+ path: notePath,
43
+ body: parsed.body,
44
+ concept: resolveConcept(ontology, notePath)?.concept ?? null,
45
+ aliases: aliasStrings(parsed.frontmatter["aliases"]),
46
+ };
47
+ });
48
+ }
49
+ /** True when `notePath` sits inside `folder` (or when no scope was requested). */
50
+ function inScope(notePath, folder) {
51
+ return folder === undefined || notePath.startsWith(`${folder}/`);
52
+ }
53
+ function toTermNote(note) {
54
+ return { path: note.path, concept: note.concept, aliases: note.aliases };
55
+ }
56
+ function describeCandidate(candidate) {
57
+ const ambiguity = candidate.ambiguous ? ` (ambiguous: ${candidate.rivalPaths.join(", ")})` : "";
58
+ return ` ${candidate.matchedText} → ${candidate.renderedReplacement} [${candidate.targetPath}]${ambiguity}`;
59
+ }
60
+ /** Print one note's proposals; returns how many candidates it had. */
61
+ function reportNote(notePath, candidates) {
62
+ console.log(`\n ${notePath}`);
63
+ for (const candidate of candidates)
64
+ console.log(describeCandidate(candidate));
65
+ }
66
+ /** Persist one note's candidates through the capture kernel. */
67
+ async function applyNote(vault, ontology, note, candidates) {
68
+ const result = await applyLinks({
69
+ body: note.body,
70
+ baseContentHash: hashBody(note.body),
71
+ accepted: candidates,
72
+ writeNote,
73
+ target: { target: { vault, source: "explicit" }, ontology, notePath: note.path },
74
+ });
75
+ if (result.applied)
76
+ return true;
77
+ console.error(`[oms] linkify skipped ${note.path}: ${result.reason}`);
78
+ return false;
79
+ }
80
+ /**
81
+ * Scan (and optionally link) a vault, restricting link TARGETS to notes bound
82
+ * to the `term` concept.
83
+ */
84
+ export async function runLinkify(options) {
85
+ if (options.apply && !options.yes) {
86
+ console.error("[oms] linkify --apply rewrites notes in place; re-run with --yes to confirm. Nothing was written.");
87
+ return 1;
88
+ }
89
+ try {
90
+ const { ontology } = await resolveActiveOntology(options.vault);
91
+ await validateVaultLintFolder(options.vault, ontology, options.folder);
92
+ const notes = await scanVault(options.vault, ontology);
93
+ const targets = termBoundNotes(notes.map(toTermNote));
94
+ const scoped = notes.filter((note) => inScope(note.path, options.folder));
95
+ console.log(`\nOh My Second Brain linkify: ${String(scoped.length)} note(s) in scope, ${String(targets.length)} term note(s) available as link targets.`);
96
+ let candidateCount = 0;
97
+ let appliedNotes = 0;
98
+ for (const note of scoped) {
99
+ const candidates = suggestLinks(note.body, targets, { notePath: note.path });
100
+ if (candidates.length === 0)
101
+ continue;
102
+ candidateCount += candidates.length;
103
+ reportNote(note.path, candidates);
104
+ if (options.apply && (await applyNote(options.vault, ontology, note, candidates))) {
105
+ appliedNotes++;
106
+ }
107
+ }
108
+ console.log(options.apply
109
+ ? `\n${String(candidateCount)} candidate(s); applied to ${String(appliedNotes)} note(s).\n`
110
+ : `\n${String(candidateCount)} candidate(s) proposed across ${String(scoped.length)} note(s). Report only — nothing was written. Re-run with --apply --yes to write.\n`);
111
+ return 0;
112
+ }
113
+ catch (error) {
114
+ console.error(`[oms] linkify could not complete: ${error instanceof Error ? error.message : String(error)}`);
115
+ return 1;
116
+ }
117
+ }
118
+ //# sourceMappingURL=linkify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linkify.js","sourceRoot":"","sources":["../../src/cli/linkify.ts"],"names":[],"mappings":"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"}
package/dist/cli/oms.d.ts CHANGED
@@ -4,5 +4,6 @@ export type { ClaudeInstallPlan } from "./claude-install-plan.js";
4
4
  export { runDoctor, runLint } from "./doctor-lint.js";
5
5
  export { runAudit } from "./audit.js";
6
6
  export { formatLinkResult, runLink, } from "./link-command.js";
7
+ export { runLinkify } from "./linkify.js";
7
8
  export { runSetup, type SetupPrompt, } from "./setup-command.js";
8
9
  export { maybePrintUpdateNotice } from "./update-notice.js";
package/dist/cli/oms.js CHANGED
@@ -4,32 +4,32 @@ import path from "node:path";
4
4
  import { fileURLToPath } from "node:url";
5
5
  import { runPostToolUse } from "../hook/post-tool-use.js";
6
6
  import { runPreToolUse } from "../hook/pre-tool-use.js";
7
- import { formatHostOperationResults, formatHostOperationResultsJson, runHostOperation, } from "../install/hosts.js";
8
7
  import { resolveEffectiveVault } from "../link/link.js";
9
8
  import { runMcpServer } from "../mcp/server.js";
10
9
  import { resolveBundledAssetPaths } from "../core/runtime/assets.js";
11
- import { formatUpdateResult, runUpdate, } from "../update/update.js";
12
10
  import { parseCliArgs } from "./args.js";
13
11
  import { runAudit } from "./audit.js";
14
12
  import { runDoctor, runLint } from "./doctor-lint.js";
13
+ import { runInstallOrUninstall, runUpdateCommand, runUpdateReconcile, } from "./host-commands.js";
14
+ import { nonFatalGlobalWriteback, registerGlobalVault } from "./global-writeback.js";
15
15
  import { runLink } from "./link-command.js";
16
+ import { runLinkify } from "./linkify.js";
16
17
  import { isSemanticCliCommand, runSemanticCli } from "./semantic.js";
17
18
  import { runSetup } from "./setup-command.js";
18
- import { maybePrintUpdateNotice, readCurrentPackageVersion } from "./update-notice.js";
19
+ import { maybePrintUpdateNotice } from "./update-notice.js";
19
20
  import { printUsage } from "./usage.js";
20
21
  export { buildClaudeInstallPlan } from "./claude-install-plan.js";
21
22
  export { runDoctor, runLint } from "./doctor-lint.js";
22
23
  export { runAudit } from "./audit.js";
23
24
  export { formatLinkResult, runLink, } from "./link-command.js";
25
+ export { runLinkify } from "./linkify.js";
24
26
  export { runSetup, } from "./setup-command.js";
25
27
  export { maybePrintUpdateNotice } from "./update-notice.js";
26
28
  const bundledAssets = resolveBundledAssetPaths();
27
- function bundledAdapterRoot() {
28
- return bundledAssets.adapterRoot;
29
- }
30
29
  function shouldResolveBridgeVault(command, vaultExplicit) {
31
30
  return (!vaultExplicit &&
32
31
  (command === "audit" ||
32
+ command === "linkify" ||
33
33
  command === "doctor" ||
34
34
  command === "lint" ||
35
35
  command === "mcp" ||
@@ -43,12 +43,22 @@ async function main() {
43
43
  process.exitCode = 1;
44
44
  return;
45
45
  }
46
- let { command, vault, vaultExplicit, yes, installClaude, suggestFields, runtime, dryRun, executeExternal, checkUpdate, timeoutMs, agentVault, verbose, json, maxPerConcept, folders, conventionNote, unknownFlags, } = parsedArgs;
47
- if (shouldResolveBridgeVault(command, vaultExplicit)) {
46
+ let { command, vault, vaultExplicit, yes, apply, installClaude, suggestFields, runtime, dryRun, executeExternal, checkUpdate, timeoutMs, agentVault, verbose, json, maxPerConcept, folders, conventionNote, unknownFlags, } = parsedArgs;
47
+ // `mcp` keeps the FULL resolution result: the write surface trusts every
48
+ // source except `cwd`, so the server needs the source, not just the path.
49
+ let mcpTarget;
50
+ if (command === "mcp") {
51
+ mcpTarget = vaultExplicit
52
+ ? { vault, scope: null, source: "explicit" }
53
+ : await resolveEffectiveVault(process.cwd(), process.env);
54
+ vault = mcpTarget.vault;
55
+ }
56
+ else if (shouldResolveBridgeVault(command, vaultExplicit)) {
48
57
  vault = (await resolveEffectiveVault(process.cwd(), process.env)).vault;
49
58
  }
50
59
  if (command === "setup") {
51
60
  await runSetup({ vault, yes, installClaude, suggestFields });
61
+ await nonFatalGlobalWriteback(() => registerGlobalVault({ vault: path.resolve(vault), homeDir: undefined, overwrite: true }));
52
62
  await maybePrintUpdateNotice();
53
63
  }
54
64
  else if (command === "link") {
@@ -62,67 +72,15 @@ async function main() {
62
72
  await maybePrintUpdateNotice();
63
73
  }
64
74
  else if (command === "install" || command === "uninstall") {
65
- const selectedRuntime = runtime ?? (command === "install" ? "auto" : "all");
66
- if (command === "uninstall" && !yes && !dryRun && process.env["OMS_NON_INTERACTIVE"] !== "1") {
67
- console.error("[oms] Refusing uninstall without --yes or --dry-run.");
68
- process.exitCode = 1;
69
- return;
70
- }
71
- const results = await runHostOperation({
72
- action: command,
73
- runtime: selectedRuntime,
74
- vault,
75
- agentVault,
76
- dryRun,
77
- executeExternal,
78
- yes,
79
- adapterRoot: bundledAdapterRoot(),
80
- });
81
- console.log(json ? formatHostOperationResultsJson(results, dryRun) : formatHostOperationResults(results, dryRun));
82
- await maybePrintUpdateNotice();
75
+ process.exitCode = await runInstallOrUninstall(command, hostContext());
76
+ if (process.exitCode === 0)
77
+ await maybePrintUpdateNotice();
83
78
  }
84
79
  else if (command === "update") {
85
- if (unknownFlags.length > 0) {
86
- console.error(`[oms] Unsupported update option: ${unknownFlags.join(", ")}`);
87
- process.exitCode = 1;
88
- return;
89
- }
90
- const currentVersion = await readCurrentPackageVersion();
91
- const latestVersion = process.env["OMS_UPDATE_LATEST_VERSION"];
92
- const result = await runUpdate({
93
- currentVersion,
94
- latestVersion,
95
- runtime: runtime ?? "all",
96
- vault,
97
- check: checkUpdate,
98
- dryRun,
99
- yes,
100
- executeExternal,
101
- timeoutMs,
102
- reconcileCommand: {
103
- command: process.execPath,
104
- argsPrefix: process.argv[1] === undefined ? [] : [process.argv[1]],
105
- },
106
- });
107
- console.log(formatUpdateResult(result));
108
- process.exitCode = result.success ? 0 : 1;
80
+ process.exitCode = await runUpdateCommand(hostContext());
109
81
  }
110
82
  else if (command === "update-reconcile") {
111
- if (process.env["OMS_UPDATE_RECONCILE"] !== "1" && !dryRun) {
112
- console.error("[oms] update-reconcile is internal; run `oms update --yes` instead.");
113
- process.exitCode = 1;
114
- return;
115
- }
116
- const results = await runHostOperation({
117
- action: "install",
118
- runtime: runtime ?? "all",
119
- vault,
120
- dryRun,
121
- executeExternal,
122
- yes: true,
123
- adapterRoot: bundledAdapterRoot(),
124
- });
125
- console.log(json ? formatHostOperationResultsJson(results, dryRun) : formatHostOperationResults(results, dryRun));
83
+ process.exitCode = await runUpdateReconcile(hostContext());
126
84
  }
127
85
  else if (command === "doctor") {
128
86
  process.exitCode = await runDoctor({ vault, verbose, json, maxPerConcept });
@@ -137,6 +95,15 @@ async function main() {
137
95
  });
138
96
  await maybePrintUpdateNotice();
139
97
  }
98
+ else if (command === "linkify") {
99
+ process.exitCode = await runLinkify({
100
+ vault,
101
+ folder: folders[0],
102
+ apply,
103
+ yes,
104
+ });
105
+ await maybePrintUpdateNotice();
106
+ }
140
107
  else if (command === "lint") {
141
108
  process.exitCode = await runLint({ vault, verbose, json });
142
109
  await maybePrintUpdateNotice();
@@ -149,7 +116,10 @@ async function main() {
149
116
  await maybePrintUpdateNotice();
150
117
  }
151
118
  else if (command === "mcp") {
152
- await runMcpServer({ vault });
119
+ await runMcpServer({
120
+ vault,
121
+ source: mcpTarget?.source ?? "explicit",
122
+ });
153
123
  }
154
124
  else if (command === "hook") {
155
125
  const subcommand = argv[1];
@@ -169,6 +139,22 @@ async function main() {
169
139
  printUsage();
170
140
  process.exitCode = 0;
171
141
  }
142
+ function hostContext() {
143
+ return {
144
+ vault,
145
+ vaultExplicit,
146
+ runtime,
147
+ agentVault,
148
+ dryRun,
149
+ executeExternal,
150
+ yes,
151
+ json,
152
+ checkUpdate,
153
+ timeoutMs,
154
+ unknownFlags,
155
+ adapterRoot: bundledAssets.adapterRoot,
156
+ };
157
+ }
172
158
  }
173
159
  const __filename = fileURLToPath(import.meta.url);
174
160
  function sameEntrypoint(left, right) {
@@ -1 +1 @@
1
- {"version":3,"file":"oms.js","sourceRoot":"","sources":["../../src/cli/oms.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"oms.js","sourceRoot":"","sources":["../../src/cli/oms.ts"],"names":[],"mappings":"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"}
package/dist/cli/usage.js CHANGED
@@ -16,6 +16,14 @@ const MAIN_USAGE_COMMANDS = [
16
16
  },
17
17
  { name: "lint", line: " lint Check vault link health: broken [[wikilinks]] and orphan notes." },
18
18
  { name: "link", line: " link Bridge an external repo to scoped vault folders via gitignored symlinks." },
19
+ {
20
+ name: "linkify",
21
+ line: " linkify Propose [[wikilinks]] to term notes across existing notes; report-only by default.",
22
+ detailLines: [
23
+ " --folder <name> Restrict the scan and writes to one top-level vault folder.",
24
+ " --apply --yes Rewrite notes in place; --apply alone refuses and writes nothing.",
25
+ ],
26
+ },
19
27
  { name: "semantic", line: " semantic Native markdown semantic index/search/get commands." },
20
28
  { name: "mcp", line: " mcp Start the read/status MCP stdio server." },
21
29
  {
@@ -60,6 +68,7 @@ Usage:
60
68
  oh-my-second-brain audit [--vault <path>] [--folder <name>] [--json] [--suggest-fields]
61
69
  oh-my-second-brain lint [--vault <path>] [--verbose] [--json]
62
70
  oh-my-second-brain link --vault <path> --folder <name> [--folder <name> ...] [--no-convention-note]
71
+ oh-my-second-brain linkify [--vault <path>] [--folder <name>] [--apply --yes]
63
72
  oh-my-second-brain semantic <status|sync|query|search|vsearch|get|multi-get|collection> [options]
64
73
  oh-my-second-brain mcp [--vault <path>]
65
74
  oh-my-second-brain hook pre-tool-use [--vault <path>]
@@ -81,7 +90,8 @@ Options:
81
90
  --verbose doctor/lint: list every affected note instead of a summary.
82
91
  --json doctor/lint/audit: emit machine-readable output as JSON.
83
92
  --max <n> doctor --verbose: max notes listed per concept (default 50).
84
- --folder <name> audit: restrict scan; link: vault folder/subpath to expose (repeatable for link).
93
+ --folder <name> audit/linkify: restrict scan; link: vault folder/subpath to expose (repeatable for link).
94
+ --apply linkify: rewrite notes in place; must be combined with --yes.
85
95
  --no-convention-note
86
96
  link: skip writing the managed OMS usage block to AGENTS.md.
87
97
  `;
@@ -1 +1 @@
1
- {"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/cli/usage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/cli/usage.ts"],"names":[],"mappings":"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"}