oh-my-second-brain 0.18.3 → 0.19.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 (199) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +3 -4
  3. package/.codex-plugin/plugin.json +2 -2
  4. package/CHANGELOG-assets.md +8 -0
  5. package/CHANGELOG-cli.md +18 -0
  6. package/CHANGELOG-kernel.md +15 -0
  7. package/CHANGELOG-mcp.md +10 -0
  8. package/CHANGELOG-vendors.md +5 -0
  9. package/CHANGELOG.md +6 -0
  10. package/README.ko.md +235 -54
  11. package/README.md +235 -54
  12. package/assets/claude/CLAUDE.md +11 -6
  13. package/assets/claude/hooks/oms-guard.mjs +6 -6
  14. package/assets/codex/AGENTS.md +5 -4
  15. package/assets/codex/rules/oms.md +6 -6
  16. package/assets/hermes/README.md +6 -6
  17. package/assets/hermes/SOUL.md +8 -7
  18. package/assets/hermes-manifest.json +2 -2
  19. package/assets/readme/hero.svg +23 -0
  20. package/assets/skills/distill/SKILL.md +1 -1
  21. package/assets/skills/doctor/SKILL.md +7 -5
  22. package/assets/skills/interview/SKILL.md +39 -0
  23. package/assets/skills/search/SKILL.md +5 -2
  24. package/assets/skills/setup/SKILL.md +18 -11
  25. package/assets/skills/write/SKILL.md +10 -6
  26. package/dist/cli/audit.js +2 -2
  27. package/dist/cli/contract-command.d.ts +9 -0
  28. package/dist/cli/contract-command.js +117 -41
  29. package/dist/cli/contract-command.js.map +1 -1
  30. package/dist/cli/doctor-command.d.ts +7 -0
  31. package/dist/cli/doctor-command.js +125 -0
  32. package/dist/cli/doctor-command.js.map +1 -0
  33. package/dist/cli/engine-session.js +1 -1
  34. package/dist/cli/engine-session.js.map +1 -1
  35. package/dist/cli/graph-command.js +5 -12
  36. package/dist/cli/graph-command.js.map +1 -1
  37. package/dist/cli/host-commands.d.ts +1 -1
  38. package/dist/cli/host-commands.js +7 -7
  39. package/dist/cli/host-commands.js.map +1 -1
  40. package/dist/cli/index-command.js +9 -9
  41. package/dist/cli/index-command.js.map +1 -1
  42. package/dist/cli/interview-command.d.ts +10 -0
  43. package/dist/cli/interview-command.js +72 -0
  44. package/dist/cli/interview-command.js.map +1 -0
  45. package/dist/cli/model-command.js +1 -1
  46. package/dist/cli/model-command.js.map +1 -1
  47. package/dist/cli/note-command.js +1 -3
  48. package/dist/cli/note-command.js.map +1 -1
  49. package/dist/cli/oms.d.ts +0 -3
  50. package/dist/cli/oms.js +61 -95
  51. package/dist/cli/oms.js.map +1 -1
  52. package/dist/cli/package-command.js +7 -7
  53. package/dist/cli/package-command.js.map +1 -1
  54. package/dist/cli/removed-families.d.ts +6 -0
  55. package/dist/cli/removed-families.js +39 -0
  56. package/dist/cli/removed-families.js.map +1 -0
  57. package/dist/cli/search-usage.js +18 -9
  58. package/dist/cli/search-usage.js.map +1 -1
  59. package/dist/cli/search.d.ts +9 -1
  60. package/dist/cli/search.js +92 -50
  61. package/dist/cli/search.js.map +1 -1
  62. package/dist/cli/setup-command.d.ts +1 -1
  63. package/dist/cli/setup-command.js +46 -13
  64. package/dist/cli/setup-command.js.map +1 -1
  65. package/dist/cli/status-command.d.ts +5 -0
  66. package/dist/cli/status-command.js +63 -59
  67. package/dist/cli/status-command.js.map +1 -1
  68. package/dist/cli/usage.js +29 -35
  69. package/dist/cli/usage.js.map +1 -1
  70. package/dist/cli/write-command.d.ts +14 -0
  71. package/dist/cli/write-command.js +105 -0
  72. package/dist/cli/write-command.js.map +1 -0
  73. package/dist/kernel/contract/interpretation-fixture.d.ts +5 -0
  74. package/dist/kernel/contract/interpretation-fixture.js +97 -0
  75. package/dist/kernel/contract/interpretation-fixture.js.map +1 -0
  76. package/dist/kernel/contract/interpretation.d.ts +102 -0
  77. package/dist/kernel/contract/interpretation.js +211 -0
  78. package/dist/kernel/contract/interpretation.js.map +1 -0
  79. package/dist/kernel/contract/interview-log.d.ts +50 -0
  80. package/dist/kernel/contract/interview-log.js +194 -0
  81. package/dist/kernel/contract/interview-log.js.map +1 -0
  82. package/dist/kernel/contract/interview-resume.d.ts +65 -0
  83. package/dist/kernel/contract/interview-resume.js +163 -0
  84. package/dist/kernel/contract/interview-resume.js.map +1 -0
  85. package/dist/kernel/contract/interview.d.ts +71 -1
  86. package/dist/kernel/contract/interview.js +163 -61
  87. package/dist/kernel/contract/interview.js.map +1 -1
  88. package/dist/kernel/contract/scripted-interview.d.ts +28 -1
  89. package/dist/kernel/contract/scripted-interview.js +71 -4
  90. package/dist/kernel/contract/scripted-interview.js.map +1 -1
  91. package/dist/kernel/contract/state-dir.d.ts +50 -0
  92. package/dist/kernel/contract/state-dir.js +234 -0
  93. package/dist/kernel/contract/state-dir.js.map +1 -0
  94. package/dist/kernel/contract/status.d.ts +12 -1
  95. package/dist/kernel/contract/status.js +19 -7
  96. package/dist/kernel/contract/status.js.map +1 -1
  97. package/dist/kernel/contract/store.d.ts +7 -0
  98. package/dist/kernel/contract/store.js +13 -4
  99. package/dist/kernel/contract/store.js.map +1 -1
  100. package/dist/kernel/contract/types.d.ts +3 -1
  101. package/dist/kernel/contract/types.js +23 -23
  102. package/dist/kernel/contract/types.js.map +1 -1
  103. package/dist/kernel/conventions/note-exclude.js +2 -2
  104. package/dist/kernel/conventions/report.js +1 -1
  105. package/dist/kernel/conventions/report.js.map +1 -1
  106. package/dist/kernel/doctor/service.js +12 -2
  107. package/dist/kernel/doctor/service.js.map +1 -1
  108. package/dist/kernel/engine/embed/config.js +3 -3
  109. package/dist/kernel/engine/embed/config.js.map +1 -1
  110. package/dist/kernel/engine/index-update.d.ts +41 -0
  111. package/dist/kernel/engine/index-update.js +133 -0
  112. package/dist/kernel/engine/index-update.js.map +1 -0
  113. package/dist/kernel/engine/retrieval/folder-context.js +1 -1
  114. package/dist/kernel/engine/retrieval/template-source.js +3 -3
  115. package/dist/kernel/harness/surface-registry.d.ts +2 -0
  116. package/dist/kernel/harness/surface-registry.js +11 -19
  117. package/dist/kernel/harness/surface-registry.js.map +1 -1
  118. package/dist/kernel/install/asset-health.js +1 -1
  119. package/dist/kernel/install/asset-health.js.map +1 -1
  120. package/dist/kernel/link/convention-note.js +3 -3
  121. package/dist/kernel/link/convention-note.js.map +1 -1
  122. package/dist/kernel/search/read-exact.d.ts +43 -0
  123. package/dist/kernel/search/read-exact.js +135 -0
  124. package/dist/kernel/search/read-exact.js.map +1 -0
  125. package/dist/kernel/text/nfc.d.ts +11 -0
  126. package/dist/kernel/text/nfc.js +16 -0
  127. package/dist/kernel/text/nfc.js.map +1 -0
  128. package/dist/kernel/update/update.js +8 -8
  129. package/dist/kernel/update/update.js.map +1 -1
  130. package/dist/kernel/write/conform.d.ts +23 -0
  131. package/dist/kernel/write/conform.js +155 -0
  132. package/dist/kernel/write/conform.js.map +1 -0
  133. package/dist/kernel/write/frame.d.ts +40 -0
  134. package/dist/kernel/write/frame.js +67 -0
  135. package/dist/kernel/write/frame.js.map +1 -0
  136. package/dist/{mcp → kernel/write}/note-write.js +1 -1
  137. package/dist/kernel/write/note-write.js.map +1 -0
  138. package/dist/kernel/write/payload.d.ts +40 -0
  139. package/dist/kernel/write/payload.js +39 -0
  140. package/dist/kernel/write/payload.js.map +1 -0
  141. package/dist/kernel/write/pipeline.d.ts +59 -0
  142. package/dist/kernel/write/pipeline.js +84 -0
  143. package/dist/kernel/write/pipeline.js.map +1 -0
  144. package/dist/kernel/write/receipt.d.ts +42 -0
  145. package/dist/kernel/write/receipt.js +21 -0
  146. package/dist/kernel/write/receipt.js.map +1 -0
  147. package/dist/mcp/server.d.ts +2 -0
  148. package/dist/mcp/server.js +68 -443
  149. package/dist/mcp/server.js.map +1 -1
  150. package/dist/mcp/tools/doctor.d.ts +4 -0
  151. package/dist/mcp/tools/doctor.js +71 -0
  152. package/dist/mcp/tools/doctor.js.map +1 -0
  153. package/dist/mcp/tools/interview.d.ts +27 -0
  154. package/dist/mcp/tools/interview.js +261 -0
  155. package/dist/mcp/tools/interview.js.map +1 -0
  156. package/dist/mcp/tools/link.d.ts +4 -0
  157. package/dist/mcp/tools/link.js +24 -0
  158. package/dist/mcp/tools/link.js.map +1 -0
  159. package/dist/mcp/tools/search.d.ts +11 -0
  160. package/dist/mcp/tools/search.js +254 -0
  161. package/dist/mcp/tools/search.js.map +1 -0
  162. package/dist/mcp/tools/shared.d.ts +28 -0
  163. package/dist/mcp/tools/shared.js +34 -0
  164. package/dist/mcp/tools/shared.js.map +1 -0
  165. package/dist/mcp/tools/status.d.ts +9 -0
  166. package/dist/mcp/tools/status.js +39 -0
  167. package/dist/mcp/tools/status.js.map +1 -0
  168. package/dist/mcp/tools/write.d.ts +8 -0
  169. package/dist/mcp/tools/write.js +40 -0
  170. package/dist/mcp/tools/write.js.map +1 -0
  171. package/dist/mcp/update-notice.js +1 -1
  172. package/dist/mcp/update-notice.js.map +1 -1
  173. package/dist/vendors/codex/codex.js +2 -2
  174. package/dist/vendors/codex/codex.js.map +1 -1
  175. package/dist/vendors/hermes/hermes.js +18 -9
  176. package/dist/vendors/hermes/hermes.js.map +1 -1
  177. package/docs/adapters.md +4 -4
  178. package/docs/architecture.md +9 -9
  179. package/docs/cli-map.md +56 -46
  180. package/docs/conventions.md +7 -7
  181. package/docs/install.md +27 -28
  182. package/docs/migration-0.19.md +48 -0
  183. package/docs/verified-target.md +5 -5
  184. package/package.json +4 -2
  185. package/skills/distill/SKILL.md +1 -1
  186. package/skills/doctor/SKILL.md +7 -5
  187. package/skills/interview/SKILL.md +39 -0
  188. package/skills/search/SKILL.md +5 -2
  189. package/skills/setup/SKILL.md +18 -11
  190. package/skills/write/SKILL.md +10 -6
  191. package/assets/skills/link/SKILL.md +0 -30
  192. package/assets/skills/status/SKILL.md +0 -34
  193. package/dist/kernel/contract/extract.d.ts +0 -37
  194. package/dist/kernel/contract/extract.js +0 -101
  195. package/dist/kernel/contract/extract.js.map +0 -1
  196. package/dist/mcp/note-write.js.map +0 -1
  197. package/skills/link/SKILL.md +0 -30
  198. package/skills/status/SKILL.md +0 -34
  199. /package/dist/{mcp → kernel/write}/note-write.d.ts +0 -0
package/README.md CHANGED
@@ -1,90 +1,271 @@
1
- # Oh My Second Brain
1
+ <p align="center">
2
+ <img src="./assets/readme/hero.svg" alt="Oh My Second Brain. A quiet constellation of connected thoughts." width="100%" />
3
+ </p>
4
+
5
+ <h1 align="center">Oh My Second Brain</h1>
6
+
7
+ <p align="center">
8
+ <strong>A constellation of knowledge, still yours.</strong><br />
9
+ A user-owned knowledge and convention layer for Obsidian, Markdown, and AI agents.
10
+ </p>
11
+
12
+ <p align="center">
13
+ <a href="https://www.npmjs.com/package/oh-my-second-brain"><img src="https://img.shields.io/npm/v/oh-my-second-brain?style=flat-square&amp;color=8b9daa&amp;label=npm" alt="npm version" /></a>
14
+ <a href="https://nodejs.org/"><img src="https://img.shields.io/badge/Node.js-%E2%89%A520-80b89b?style=flat-square" alt="Node.js 20 or later" /></a>
15
+ <a href="#mcp-tools--integrations"><img src="https://img.shields.io/badge/MCP-4_tools-97a8b1?style=flat-square" alt="4 MCP tools" /></a>
16
+ <a href="https://github.com/GoBeromsu/oh-my-second-brain/blob/main/package.json"><img src="https://img.shields.io/badge/license-MIT-d7c7a8?style=flat-square" alt="Package license: MIT" /></a>
17
+ </p>
18
+
19
+ <p align="center">
20
+ <a href="#quick-start"><strong>Quick start</strong></a> ·
21
+ <a href="#how-it-works">How it works</a> ·
22
+ <a href="#documentation">Documentation</a> ·
23
+ <a href="https://github.com/GoBeromsu/oh-my-second-brain/releases">Releases</a> ·
24
+ <a href="https://github.com/GoBeromsu/oh-my-second-brain/blob/main/README.ko.md">한국어</a>
25
+ </p>
26
+
27
+ ---
28
+
29
+ Your vault already holds ideas, decisions, and things you learned. **OMS helps your agents find that knowledge and write within the conventions you defined.** No new note format. No prescribed folder system. No handover of your knowledge to a single host.
30
+
31
+ Obsidian stays the command center. Your notes stay plain Markdown, readable and editable even when OMS is not running. Connect Claude Code, Codex, or Hermes to the same vault through their host integrations.
32
+
33
+ ## Why OMS?
34
+
35
+ <table>
36
+ <tr>
37
+ <td width="50%" valign="top">
38
+ <h3>Recall what you already know</h3>
39
+ Search your existing notes with lexical retrieval. Choose vector, HyDE, query expansion, or reranking explicitly when you need them.
40
+ </td>
41
+ <td width="50%" valign="top">
42
+ <h3>Your vault, your vocabulary</h3>
43
+ Define the meaning of folders, properties, and templates. OMS records your conventions instead of shipping a system you have to adopt.
44
+ </td>
45
+ </tr>
46
+ <tr>
47
+ <td width="50%" valign="top">
48
+ <h3>Give agents a shared contract</h3>
49
+ Seal your vault conventions through setup. Supported write paths check the whole note against that contract before saving it.
50
+ </td>
51
+ <td width="50%" valign="top">
52
+ <h3>Keep the files you own</h3>
53
+ Keep using your Markdown notes and templates. Setup does not rewrite them, and the sealed contract lives outside the vault.
54
+ </td>
55
+ </tr>
56
+ <tr>
57
+ <td width="50%" valign="top">
58
+ <h3>Connect across hosts</h3>
59
+ Use native integrations for Claude Code, Codex, and Hermes, with four MCP tools and six shared workflow skills.
60
+ </td>
61
+ <td width="50%" valign="top">
62
+ <h3>Inspect, don't guess</h3>
63
+ Check contract state, audit notes, inspect indexes, and review wikilink suggestions. Search and `doctor status` stay read-only.
64
+ </td>
65
+ </tr>
66
+ </table>
67
+
68
+ ## Quick start
69
+
70
+ **Requires Node.js 20 or later and an existing Obsidian or Markdown vault.** Replace `/path/to/vault` with your vault's absolute path.
71
+
72
+ ### 1. Install
2
73
 
3
- Oh My Second Brain (`oms`) connects an existing Obsidian or Markdown vault to AI hosts without taking ownership of its notes. The vault remains plain Markdown. Obsidian stays the command center: the notes are still files a person can read and edit when OMS is not running. OMS does not invent the meaning of a property, a folder, or a heading.
4
-
5
- ## Vault contract
74
+ ```bash
75
+ npm install -g oh-my-second-brain
76
+ oms --help
77
+ ```
6
78
 
7
- Meaning stays with the user. The user seals the vault's contract once, in an interactive `oms setup` run at a terminal. The interview covers three parts together: folders (what each folder means and what may be placed there), the property pool (each property's type and intent), and templates (what each template in the template folder declares). The product hardcodes no property names, folders, or personas, and it has no Inbox fallback.
79
+ ### 2. Define your vault's conventions
8
80
 
9
- The sealed contract lives outside the vault, under `~/.oms/vaults/<vault-id>/`. The only OMS file inside the vault is `.oms/settings.json`, which holds `version`, `vaultId`, `templateFolder`, `embedding`, and `agentRepair`. Any other entry in `.oms/` is reported by `oms contract doctor` as an unexpected control file and is otherwise ignored. `.obsidian/types.json` is a read-only observation and never overrides the seal.
81
+ Run setup in your terminal. The interview covers folders, properties, and templates, then seals the contract. Existing notes are not modified.
10
82
 
11
- A template stays the user's own Markdown file in `templateFolder`. Sealing records what it declares; OMS never rewrites, copies, or applies it. `oms contract status` reports each sealed template as `active`, `drift`, or `missing` against the live file. A drifted template is reported, never re-sealed silently; the user re-seals it with `oms setup`. OMS does not parse or execute Templater, JavaScript, or a private token language.
83
+ ```bash
84
+ oms setup --vault /path/to/vault
85
+ oms setup status --vault /path/to/vault
86
+ ```
12
87
 
13
- The agent writes notes. One judge decides every write against the seal. A denied write leaves the file unchanged and returns only `{field, kind}` violations and one guidance command, never a rule value, a store path, or the contract body. A vault with no seal on this machine is not judged. When this machine holds seal evidence that no longer matches the vault, writes are refused as `contract-unreadable` until the user runs `oms setup` again. OMS has no completion call and no reviewer conversation: an allowed write means the note fits the sealed structure, not that it is worth keeping.
88
+ ### 3. Connect your agent
14
89
 
15
- The vault contract is recorded in ADR-007 (`docs/decisions/` in the source repository), which replaces the former ADR-013 through ADR-016. [ACKNOWLEDGMENTS](./ACKNOWLEDGMENTS.md) credits Ouroboros and Gajae Code's deep-interview as design ideas. Those credits are not a copied runtime and not a research result. Diagrams in this repository are explanatory sketches. These pages record the approved architecture. They are not a host-smoke result and not a product-gate pass.
90
+ Install the integration for the host you use:
16
91
 
17
- The authority model is in [architecture](./docs/architecture.md). Vault files are in [conventions](./docs/conventions.md). Leaves are in [the CLI map](./docs/cli-map.md).
92
+ ```bash
93
+ oms setup host install --runtime claude --vault /path/to/vault --yes
94
+ ```
18
95
 
19
- ## Setup
96
+ Replace `claude` with `codex` or `hermes`; use `all` to install all three. Host integration is optional if you only need the CLI. See the [installation guide](./docs/install.md) for Hermes profiles, model setup, and removal.
20
97
 
21
- `oms setup` is the same command as `oms contract setup`. It interviews the whole vault and seals the contract. It writes only `.oms/settings.json` inside the vault and never modifies notes. The interactive interview refuses to run without a terminal or under `OMS_NON_INTERACTIVE=1`. An agent seals only through the `setup` skill: `oms setup --questions` prints the questions, the agent asks the owner each one, and `oms setup --answers <file|->` seals a first or stricter contract. A reseal that loosens is refused there and left to the owner's terminal. Run it again at any time to re-seal.
98
+ ### 4. Put your knowledge to work
22
99
 
23
100
  ```bash
24
- oms setup --vault /path/to/vault
25
- oms contract status --vault /path/to/vault
101
+ # Build the derived search index explicitly.
102
+ oms doctor sync-embeddings --mode sync --vault /path/to/vault
103
+
104
+ # Start with lexical search. No vector model required.
105
+ oms search "project decisions" --vault /path/to/vault
26
106
  ```
27
107
 
28
- `oms contract extract --template <path>` shows what one template declares without printing values. `oms contract doctor` diagnoses the seal, stale locks, orphaned generations, unexpected control files, and hook transport failures; `--fix` only re-indexes a moved or unindexed vault. Any other broken seal is recovered by running `oms setup` again. Model lifecycle stands alone as `oms model install|select|waive|status`.
108
+ **Try asking your connected agent:**
29
109
 
30
- ## CLI
110
+ > Find my notes about this project and surface the decisions I have already made.
31
111
 
32
- ```text
33
- oms bridge add|remove|status Manage repository-to-vault target bridges
34
- oms contract setup|extract|status|doctor Seal the vault contract, or inspect and diagnose it
35
- oms graph build|status Build or inspect the note graph
36
- oms hook pre Judge a Claude write against the vault contract
37
- oms host install|remove|sync|status Manage host assets and MCP registrations
38
- oms index sync|embed|repair|status|clean Manage derived search state
39
- oms link suggest|check Suggest or check note wikilinks
40
- oms model install|select|waive|status Manage local model selection
41
- oms note audit|get Audit notes against the contract, or read them
42
- oms package check|update Check or update the OMS package
43
- oms search query|context Run an explicit query or retrieve structured context
44
- oms serve mcp|http Start the stdio MCP or local HTTP server
45
- oms setup Interview the vault and seal its contract
46
- oms status Show the read-only aggregate status
47
- ```
112
+ > Check this note against my vault contract and show me what needs attention.
48
113
 
49
- `oh-my-second-brain` is the full command; `oms` is its short alias. These fourteen families, the seven skills, and the five MCP tools are three different sets. The leaf map is [the CLI map](./docs/cli-map.md).
114
+ > Suggest related notes I could link to, without changing any files.
50
115
 
51
- ### Help contract
116
+ These are example requests, not captured run results. Available workflows and write enforcement differ by host as described below.
52
117
 
53
- Every recognized command accepts `--help` and `-h`, exits 0, and performs no side effects. An unknown command combined with `--help` exits 1.
118
+ ## How it works
54
119
 
55
- A plain `oms search query <text>` is lexical-only. `--vec` and `--hyde` select their respective channels; `--expand` explicitly enables G004 expansion, `--max-queries` accepts an integer from 1 through 32, and `--rerank` is opt-in. `oms search context` is the separate structured-context surface. Embedding is `oms index embed`; sync and repair are distinct index modes. `oms index status --view status|collections|contexts` preserves all three read-only views, while `oms index clean` removes eligible derived state.
120
+ **You define the meaning. Your agent writes the content. OMS checks the structure.**
56
121
 
57
- Lexical, vector, HyDE, and typed-axis queries still include notes that would fail the contract. A missing or damaged contract does not stop search. Vector search requires a complete `OMS_EMBEDDING_PROVIDER`/`OMS_EMBEDDING_MODEL` pair. HyDE also requires `OMS_GENERATE_PROVIDER`/`OMS_GENERATE_MODEL`. Reranking requires `OMS_RERANK_PROVIDER`/`OMS_RERANK_MODEL`. Missing, incomplete, or uninstalled selections fail loudly. G004 expansion is an explicit available capability; it makes no replacement, parity, or outperformance claim.
122
+ | Layer | What belongs there |
123
+ | :--- | :--- |
124
+ | **Your vault** | Your Markdown notes, folders, properties, and original templates. Obsidian remains the command center. |
125
+ | **Your contract** | The conventions confirmed through `oms setup`, sealed outside the vault under `~/.oms/vaults/<vault-id>/`. |
126
+ | **OMS** | Retrieval, contract judgment on supported writes, link inspection, and explicit index maintenance. |
127
+ | **Your agent** | Reads context, composes notes, and uses the appropriate host workflow. You and the agent decide what is worth keeping. |
58
128
 
59
- `oms note audit` judges existing notes against the seal and reports `{path, field, kind}` entries; it never rewrites a note. Create, append, update, and backfill are retired note operations. Link apply is not an operation. There is no note renderer or compatibility path for retired operations.
129
+ > [!IMPORTANT]
130
+ > **Set up the contract before relying on write checks.** A vault with no seal on this machine is not contract-judged; general path and input safeguards still apply. A contract violation leaves the file unchanged. An allowed write means structural compliance, not factual accuracy or quality approval.
60
131
 
61
- ## MCP tools
132
+ <details>
133
+ <summary><strong>The vault contract, in detail</strong></summary>
62
134
 
63
- `oms serve mcp` exposes exactly five public tools:
135
+ - **Meaning is user-owned.** The interview covers folders, the property pool, and templates together. OMS hardcodes no property names, folders, or personas and has no Inbox fallback.
136
+ - **One control file inside the vault.** `.oms/settings.json` holds `version`, `vaultId`, `templateFolder`, `embedding`, and `agentRepair`. Other `.oms/` entries are ignored and reported as unexpected control files by `oms doctor contract`. `.obsidian/types.json` is a read-only observation, not an override of the seal.
137
+ - **Templates stay yours.** OMS records what each template declares. It never rewrites or copies a template file, and does not parse or execute Templater, JavaScript, or a private token language. A write only fills what is mechanical in the note being written: `{{title}}`, `{{date}}` and `{{time}}` variables, date and datetime defaults on a new note, and the chosen template's missing headings. It never supplies a required value.
138
+ - **Drift is visible.** `oms setup status` reports templates as `active`, `drift`, or `missing`. It never silently re-seals a changed template.
139
+ - **One judge, bounded feedback.** Denied writes return `{field, kind}` violations and one guidance command, not rule values, store paths, or the contract body.
140
+ - **Mismatched seal evidence blocks writes.** When this machine's evidence no longer matches the vault, writes fail with `contract-unreadable` until the owner runs `oms setup` again. A machine with no seal is a different case: its vault is not contract-judged.
64
141
 
65
- `write` · `search` · `link` · `status` · `doctor`
142
+ See [architecture](./docs/architecture.md), [conventions](./docs/conventions.md), and [ADR-007](https://github.com/GoBeromsu/oh-my-second-brain/blob/main/docs/decisions/ADR-007-vault-contract-ontology.md).
66
143
 
67
- The seven skills (`distill`, `doctor`, `link`, `search`, `setup`, `status`, `write`) are host workflows. `distill` and `setup` are tool-less; `setup` asks the owner each setup question and seals a first or stricter contract.
144
+ </details>
68
145
 
69
- The five tools are a subset of those skills, and neither set is the fourteen CLI families. Detail capabilities remain `op` values under the five tools. Sealing has no MCP operation and no skill.
146
+ <details>
147
+ <summary><strong>Setup, template interpretation, and recovery</strong></summary>
70
148
 
71
- `write {path, content, template?}` judges the whole note and saves it only when it is allowed. `template` is optional and names the sealed template the note follows. `status` and every search operation are read-only. The `doctor` tool validates the seal, audits notes, and runs explicit index maintenance; it does not backfill notes. Claude's native Write, Edit, MultiEdit, and NotebookEdit inside the vault reach the same judge through `oms hook pre`; Codex and Hermes have no write hook, so their notes are judged only through MCP `write`.
149
+ `oms setup` in a terminal runs the interactive interview and seals the contract. `oms interview` is the same terminal interview on its own command; it requires a terminal and refuses to run under `OMS_NON_INTERACTIVE=1`.
72
150
 
73
- ## Install
151
+ The `setup` skill asks the owner each question via `oms setup --questions` and submits answers with `oms setup --answers <file|->`. This path can seal a first or stricter contract; a loosening reseal stays with the owner's terminal. The MCP `interview` tool continues the interview across calls: `op: questions` is read-only, and `answer`, `confirm`, and `seal` record to the interview log on a verified target. It seals only the proposal the owner confirmed and never reclaims a stale seal lock.
74
152
 
75
- Node.js 20 or later is required.
153
+ `oms setup extract --template <path>` returns a template source and its computed hash. The agent reads each template and submits its interpretation with `oms setup --interpretations <file>`. The owner confirms that interpretation before it drives the interview.
76
154
 
77
- ```bash
78
- npm install -g oh-my-second-brain
79
- oms host install --runtime all --vault /path/to/vault --yes
155
+ `oms doctor contract` diagnoses seal problems, stale locks, orphaned generations, unexpected control files, and hook transport failures. Its `--fix` only re-indexes a moved or unindexed vault. Other broken seals are recovered through `oms setup`.
156
+
157
+ Model lifecycle is separate: `oms setup model install|select|waive|status`.
158
+
159
+ </details>
160
+
161
+ ## MCP tools & integrations
162
+
163
+ **One domain kernel, with host-native integrations.**
164
+
165
+ `write` · `search` · `interview` · `doctor`
166
+
167
+ | MCP tool | Purpose |
168
+ | :--- | :--- |
169
+ | `write` | Judge a whole note against the sealed contract and save an allowed write. |
170
+ | `search` | Retrieve notes, structured context, or wikilink suggestions without changing the vault. |
171
+ | `interview` | Continue the vault interview: list open questions, record answers, and seal only the proposal the owner confirmed. |
172
+ | `doctor` | Read-only `status`; diagnose the contract, audit notes, check links, and run explicit index maintenance. |
173
+
174
+ The six skills are `distill`, `doctor`, `interview`, `search`, `setup`, and `write`.
175
+
176
+ `distill` and `setup` are tool-less workflows; sealing has no MCP operation. Detail capabilities use `op` values under the four tools. Tool annotations are per tool: only `search` is marked read-only, because `write` and the `doctor` repairs mutate and `interview` is kept conservative.
177
+
178
+ | Host | Integration | Write checks |
179
+ | :--- | :--- | :--- |
180
+ | **Claude Code** | Native plugin assets, skills, and MCP | MCP `write` plus `oms hook pre` for native Write, Edit, MultiEdit, and NotebookEdit. |
181
+ | **Codex** | Native plugin assets, guidance, and MCP | MCP `write`; no native write hook. |
182
+ | **Hermes** | Profile-scoped skills, guidance, and MCP | MCP `write`; no native write hook. |
183
+
184
+ > [!NOTE]
185
+ > Claude's hook rejects a judged contract violation, but allows the write with a warning if the hook itself cannot run. Native file writes in Codex and Hermes do not pass through the OMS judge. This is not a filesystem-wide sandbox.
186
+
187
+ For Gajae-Code, install the marketplace plugin with `gjc plugin install oms@oms`; it discovers the six skills at the package-root `skills/` path. See [host assets](./docs/adapters.md) for integration details.
188
+
189
+ <details>
190
+ <summary><strong>Host maintenance and vault targeting</strong></summary>
191
+
192
+ Host installation stores a signed maintenance pointer at `${XDG_CONFIG_HOME:-~/.config}/oms/vault.json` and stamps `oms serve mcp --vault /path/to/vault` into managed host entries. Only `oms setup host install|remove|sync|status` use that pointer to maintain integrations.
193
+
194
+ Runtime target resolution does not read it. Precedence is **explicit target → local vault controls → bridge → `OMS_VAULT` → current directory**. The current-directory fallback is read-only: sealing, note writes, and derived-state repair cannot use it.
195
+
196
+ `oms setup package update` updates the package only. Run `oms setup host sync` separately to synchronize installed host assets. See [verified targets](./docs/verified-target.md).
197
+
198
+ </details>
199
+
200
+ ## Search your way
201
+
202
+ **Lexical by default. Additional retrieval channels by choice.** Search includes notes that fail the contract; a missing or damaged contract does not stop retrieval.
203
+
204
+ | Capability | How to select it | Requirement |
205
+ | :--- | :--- | :--- |
206
+ | Lexical search | `oms search <text>` | No vector model required. |
207
+ | Vector search | `--vec <text>` | Complete `OMS_EMBEDDING_PROVIDER` / `OMS_EMBEDDING_MODEL` pair. |
208
+ | HyDE | `--hyde <text>` | Embedding pair plus `OMS_GENERATE_PROVIDER` / `OMS_GENERATE_MODEL`. |
209
+ | Query expansion | `--expand` | Explicit G004 expansion; `--max-queries` accepts 1–32. |
210
+ | Reranking | `--rerank` | Complete `OMS_RERANK_PROVIDER` / `OMS_RERANK_MODEL` pair. |
211
+
212
+ Missing, incomplete, or uninstalled model selections fail loudly rather than silently switching to another capability. These are available retrieval options, not a claim of parity or superiority over another engine.
213
+
214
+ Use `oms search --context` for structured context and `oms search --path <note>` to read one note exactly. Indexing is explicit: `oms doctor sync-embeddings --mode sync|embed|repair` selects one of three distinct modes. See [the CLI map](./docs/cli-map.md) for all operations.
215
+
216
+ ## CLI reference
217
+
218
+ `oms` is the short alias of `oh-my-second-brain`, with seven CLI families. 0.19 replaced the 0.18 families; see the [0.19 migration guide](./docs/migration-0.19.md).
219
+
220
+ ```text
221
+ oms search <text> Search notes; lexical by default
222
+ oms search --path|--context|--link Read one note, gather context, or suggest links
223
+ oms interview Interview the vault owner in a terminal and seal
224
+ oms write <path> Save a note from stdin when the contract allows it
225
+ oms setup Seal the contract (--questions/--answers for agents)
226
+ oms setup extract|status Show a template source or the contract posture
227
+ oms setup host install|remove|sync|status Manage host assets and MCP registrations
228
+ oms setup model install|select|waive|status Manage local model selection
229
+ oms setup package check|update Check or update the OMS package
230
+ oms setup bridge add|remove|status Manage repository-to-vault bridges
231
+ oms doctor status Show read-only vault health
232
+ oms doctor contract|audit|link-check Diagnose the contract, notes, or wikilinks
233
+ oms doctor sync-embeddings|cleanup|build-graph Maintain the derived index and graph
234
+ oms serve mcp|http Start the MCP or local HTTP server
235
+ oms hook pre Judge a Claude write against the contract
80
236
  ```
81
237
 
82
- For Gajae-Code, install the npm package as a marketplace plugin: `gjc plugin install oms@oms`. GJC discovers the six OMS skills at the package-root `skills/` convention path.
238
+ <details>
239
+ <summary><strong>Command behavior and removed commands</strong></summary>
240
+
241
+ Every recognized command accepts `--help` and `-h`, exits 0, and has no side effects. An unknown command combined with `--help` exits 1. A family removed in 0.19 exits 1 and names its replacement.
242
+
243
+ `oms doctor audit` reports `{path, field, kind}` entries without rewriting notes. Notes are written as whole content through `oms write <path> < note.md` or MCP `write {path, content, template?, ifMatch?, check?}`; both take the same write pipeline, and `template` optionally names the sealed template being followed. Overwriting an existing note needs `ifMatch` (`--if-match`) with its current `sha256:` revision; `check` (`--check`) judges without touching disk. An allowed write returns a receipt with the new revision and updates the keyword index of an existing engine store in the same call, so the note is searchable at once. There is no completion call or reviewer conversation.
244
+
245
+ `oms doctor cleanup` removes eligible derived state. `oms doctor build-graph` rebuilds the note graph.
246
+
247
+ Note `create`, `append`, `update`, and `backfill` are retired operations. There is no `link apply`, note renderer, or compatibility path for those retired operations.
248
+
249
+ </details>
250
+
251
+ ## Documentation
252
+
253
+ | Start here | Go deeper |
254
+ | :--- | :--- |
255
+ | [Installation](./docs/install.md): install, setup, models, removal | [Architecture](./docs/architecture.md): authority and domain boundaries |
256
+ | [Vault conventions](./docs/conventions.md): settings and sealed contracts | [CLI map](./docs/cli-map.md): command and MCP operation mapping |
257
+ | [Host integrations](./docs/adapters.md): Claude Code, Codex, Hermes | [Verified targets](./docs/verified-target.md): safe vault resolution |
258
+ | [Releases](https://github.com/GoBeromsu/oh-my-second-brain/releases): published versions | [Changelog](./CHANGELOG.md): what changed and why |
259
+
260
+ ## Contributing & credits
83
261
 
84
- Host installation records the canonical vault in `${XDG_CONFIG_HOME:-~/.config}/oms/vault.json` and stamps `oms serve mcp --vault /path/to/vault` into each managed host entry. `oms host install|remove|sync|status` use that signed pointer only to maintain host integrations. `oms package update` updates the package but never syncs hosts implicitly; run `oms host sync` separately.
262
+ Contributions are welcome. Start with the [contributing guide](https://github.com/GoBeromsu/oh-my-second-brain/blob/main/CONTRIBUTING.md), or [open an issue](https://github.com/GoBeromsu/oh-my-second-brain/issues) with a reproducible problem or a focused proposal.
85
263
 
86
- Runtime target resolution never reads the host-maintenance pointer. Its precedence is explicit target, local vault controls, bridge, `OMS_VAULT`, then the current directory only as a safe read-only fallback. Sealing, note writes, and derived-state repair cannot use that fallback.
264
+ [ACKNOWLEDGMENTS](./ACKNOWLEDGMENTS.md) records design influences, including Ouroboros and Gajae Code's deep-interview. Those credits describe ideas, not a copied runtime or a research result. The original constellation illustration is inspired by the connected-note landscape at [beomsukoh.com](https://beomsukoh.com/). Illustrations explain concepts; they are not product screenshots, host-smoke evidence, or product-gate results.
87
265
 
88
- `OMS_VAULT` is the supported environment fallback when no explicit, local, or bridge target exists.
266
+ ---
89
267
 
90
- See [installation](./docs/install.md), [architecture](./docs/architecture.md), [conventions](./docs/conventions.md), [the CLI map](./docs/cli-map.md), [host assets](./docs/adapters.md), and [verified targets](./docs/verified-target.md).
268
+ <p align="center">
269
+ <strong>Your notes stay yours.</strong><br />
270
+ Built by <a href="https://github.com/GoBeromsu">Beomsu Koh</a> · Package licensed MIT
271
+ </p>
@@ -9,7 +9,7 @@ outside the vault, and it is not yours to read.
9
9
 
10
10
  ## Writing
11
11
 
12
- Write vault notes with MCP `write {path, content, template?}` (the `/write`
12
+ Write vault notes with MCP `write {path, content, template?, ifMatch?, check?}` (the `/write`
13
13
  skill). A denial gives only `{field, kind}` and a guidance command. Never ask
14
14
  about or guess the contract's location or values.
15
15
 
@@ -33,12 +33,17 @@ about or guess the contract's location or values.
33
33
  - `/search` is read-only across lexical, vector, HyDE, and axis retrieval. It
34
34
  also returns notes that would fail the contract. It never writes or repairs.
35
35
  Unavailable backends fail loudly and are never replaced with a fake match.
36
- - `/status` reads health. `oms contract status` and `oms contract doctor` are
37
- for diagnosis. They report the seal's posture and template drift without
38
- printing any value.
36
+ - `/doctor status` reads health, and `/doctor link-check` checks a note's
37
+ wikilinks; both are read-only. `oms doctor status`, `oms setup status`, and
38
+ `oms doctor contract` are for diagnosis. They report the seal's posture and
39
+ template drift without printing any value.
40
+ - `/search link` suggests wikilinks for a note; you apply only the ones the
41
+ user accepts.
42
+ - `/interview` continues the vault interview: it lists open questions, records
43
+ the user's answers, and seals only a proposal the user confirmed.
39
44
  - `/doctor` runs explicit, supported index and control repairs. It never
40
45
  backfills notes. A broken or missing seal is fixed by the user running
41
46
  `oms setup`.
42
47
 
43
- Seven skills share five MCP tools: `write`, `search`, `link`, `distill`,
44
- `setup`, `status`, and `doctor`. `distill` and `setup` have no tool.
48
+ Six skills share four MCP tools: `write`, `search`, `interview`, `distill`,
49
+ `setup`, and `doctor`. `distill` and `setup` have no tool.
@@ -14,7 +14,7 @@
14
14
  *
15
15
  * The judge's deny is forwarded as is. When the judge cannot be reached (spawn failure,
16
16
  * non-zero exit, timeout, malformed output) the write is allowed with one stderr line and
17
- * the failure kind is recorded in `~/.oms/guard-events.jsonl` for `oms contract doctor`.
17
+ * the failure kind is recorded in `~/.oms/guard-events.jsonl` for `oms doctor contract`.
18
18
  * A payload that cannot be parsed (or exceeds the stdin cap) is denied when its raw text
19
19
  * names a configured vault or `~/.oms`, and otherwise allowed with one stderr line.
20
20
  *
@@ -43,10 +43,10 @@ const WRITE_TOOLS = new Set(["write", "edit", "multiedit", "notebookedit"]);
43
43
  const READ_TOOLS = new Set(["read", "grep", "glob"]);
44
44
 
45
45
  const ALLOW = JSON.stringify({ continue: true, suppressOutput: true });
46
- const CONTROL_PATH_REASON = `[oms] write denied: ${JSON.stringify([{ field: "path", kind: "control-path" }])} Run: oms status`;
47
- const SEARCH_REASON = `[oms] write denied: ${JSON.stringify([{ field: "path", kind: "control-path" }])} Narrow the search path or glob so it cannot reach ~/.oms. Run: oms status`;
48
- const UNSAFE_PATH_REASON = `[oms] write denied: ${JSON.stringify([{ field: "path", kind: "path-unsafe" }])} Run: oms status`;
49
- const INPUT_REASON = `[oms] write denied: ${JSON.stringify([{ field: "input", kind: "unsupported-input" }])} Run: oms host sync`;
46
+ const CONTROL_PATH_REASON = `[oms] write denied: ${JSON.stringify([{ field: "path", kind: "control-path" }])} Run: oms doctor status`;
47
+ const SEARCH_REASON = `[oms] write denied: ${JSON.stringify([{ field: "path", kind: "control-path" }])} Narrow the search path or glob so it cannot reach ~/.oms. Run: oms doctor status`;
48
+ const UNSAFE_PATH_REASON = `[oms] write denied: ${JSON.stringify([{ field: "path", kind: "path-unsafe" }])} Run: oms doctor status`;
49
+ const INPUT_REASON = `[oms] write denied: ${JSON.stringify([{ field: "input", kind: "unsupported-input" }])} Run: oms setup host sync`;
50
50
 
51
51
  /**
52
52
  * Prefer the co-located dist entry via `node <dist>` so the guard does not depend on the
@@ -172,7 +172,7 @@ function recordGuardEvent(kind) {
172
172
  function transportFailure(kind) {
173
173
  recordGuardEvent(kind);
174
174
  if (TRANSPORT_FAILURE_POLICY === "allow-warn") {
175
- process.stderr.write("[oms] guard could not reach the judge; write allowed. Run: oms contract doctor\n");
175
+ process.stderr.write("[oms] guard could not reach the judge; write allowed. Run: oms doctor contract\n");
176
176
  allow();
177
177
  }
178
178
  }
@@ -14,7 +14,7 @@ the only OMS file.
14
14
 
15
15
  ## Writing
16
16
 
17
- Write vault notes with MCP `write {path, content, template?}` (`$oms-write`). A
17
+ Write vault notes with MCP `write {path, content, template?, ifMatch?, check?}` (`$oms-write`). A
18
18
  denial gives only `{field, kind}` and a guidance command. Never ask about or
19
19
  guess the contract's location or values.
20
20
 
@@ -35,12 +35,13 @@ guess the contract's location or values.
35
35
  It also returns notes that would fail the contract. It never writes or
36
36
  repairs. Unavailable backends fail loudly and are never replaced with a fake
37
37
  match.
38
- - `$oms-status` reads health. `oms contract status` and `oms contract doctor`
38
+ - `$oms-doctor` reads health (`op: status`) and checks wikilinks
39
+ (`op: link-check`). `oms setup status` and `oms doctor contract`
39
40
  are for diagnosis. They report the seal's posture and template drift without
40
41
  printing any value.
41
42
  - `$oms-doctor` runs explicit, supported index and control repairs. It never
42
43
  backfills notes. A broken or missing seal is fixed by the user running
43
44
  `oms setup`.
44
45
 
45
- Codex installs seven shared skills (`write`, `search`, `link`, `distill`,
46
- `setup`, `status`, `doctor`) backed by the five public MCP tools.
46
+ Codex installs six shared skills (`write`, `search`, `interview`, `distill`,
47
+ `setup`, `doctor`) backed by the four public MCP tools.
@@ -8,16 +8,16 @@ sealed contract is not yours to read.
8
8
  | User intent | Preferred surface |
9
9
  |---|---|
10
10
  | seal or change the vault contract | ask the user to run `oms setup` in a terminal |
11
- | install host integration | `oms host install --runtime codex --vault <path> --yes`, only when authorized |
12
- | write a note | `$oms-write`: MCP `write {path, content, template?}` |
11
+ | install host integration | `oms setup host install --runtime codex --vault <path> --yes`, only when authorized |
12
+ | write a note | `$oms-write`: MCP `write {path, content, template?, ifMatch?, check?}` |
13
13
  | retrieve knowledge | `$oms-search`; read-only, with no validation or repair side effects |
14
- | inspect health | `$oms-status`; `oms contract status` for the seal and template drift |
15
- | diagnose the seal | `oms contract doctor` |
14
+ | inspect health | `$oms-doctor` (`op: status`); `oms setup status` for the seal and template drift |
15
+ | diagnose the seal | `oms doctor contract` |
16
16
  | explicit supported control/index repair | `$oms-doctor` |
17
17
 
18
18
  ## Boundaries
19
19
 
20
- - Write vault notes with MCP `write {path, content, template?}`. A denial gives
20
+ - Write vault notes with MCP `write {path, content, template?, ifMatch?, check?}`. A denial gives
21
21
  only `{field, kind}` and a guidance command. Never ask about or guess the
22
22
  contract's location or values.
23
23
  - A denied write leaves the file unchanged. Fix the content from what the user
@@ -25,7 +25,7 @@ sealed contract is not yours to read.
25
25
  - Codex has no write hook. Notes written with host file tools are not judged.
26
26
  - `~/.oms` is off-limits. Inside the vault, `.oms/settings.json` is the only
27
27
  OMS file.
28
- - Search and status stay read-only. Notes that would fail the contract remain
28
+ - Search, interview, and `doctor` status stay read-only. Notes that would fail the contract remain
29
29
  searchable. Keep the requested backend's failure semantics, with no
30
30
  substitutes.
31
31
  - Uninstall removes only the integration assets OMS owns, never vault notes or
@@ -1,17 +1,17 @@
1
1
  # Oh My Second Brain Hermes Adapter
2
2
 
3
- Installed by `oms host install --runtime hermes` into:
3
+ Installed by `oms setup host install --runtime hermes` into:
4
4
 
5
5
  - `~/.hermes/skills/knowledge-management/oms/`
6
6
  - `~/.hermes/config.yaml` as `mcp_servers.oms`
7
7
 
8
- The shared skill bundle contains seven skills. Hermes resolves skills by bare
8
+ The shared skill bundle contains six skills. Hermes resolves skills by bare
9
9
  name across every installed bundle, so the installer copies them with an `oms-`
10
10
  prefix in both the directory and the frontmatter `name`: `oms-write`,
11
- `oms-search`, `oms-link`, `oms-distill`, `oms-setup`, `oms-status`, and
11
+ `oms-search`, `oms-interview`, `oms-distill`, `oms-setup`, and
12
12
  `oms-doctor`. The shared sources and the other hosts keep the unprefixed names.
13
13
  `SKILL_CAPABILITY_GUIDE.md` in the same directory maps each skill to its MCP
14
- tool or marks it as an agent recipe. Runtime operations use the five MCP tools
14
+ tool or marks it as an agent recipe. Runtime operations use the four MCP tools
15
15
  through `oms serve mcp`.
16
16
 
17
17
  Hermes takes a skill's category from the first path segment only, so these
@@ -19,7 +19,7 @@ skills are listed under `knowledge-management`. Filter with
19
19
  `skills_list(category="knowledge-management")`; the category
20
20
  `knowledge-management/oms` matches nothing.
21
21
 
22
- Agents write notes with MCP `write {path, content, template?}`. OMS judges each
22
+ Agents write notes with MCP `write {path, content, template?, ifMatch?, check?}`. OMS judges each
23
23
  note against the contract the user sealed with `oms setup`. A denial returns
24
24
  only `{field, kind}` and a guidance command. There is no completion operation
25
25
  and no reviewer protocol, so deciding whether a note is worth keeping and
@@ -28,4 +28,4 @@ repairing it belong to the user and the agent. See the [Hermes role guidance](./
28
28
  The adapter installs no model provider, no reviewer role, and no daemon.
29
29
  Installing assets proves only their presence, not that the host loaded them.
30
30
 
31
- Unlike Claude Code (`claude plugin install`), Hermes exposes no native marketplace or plugin-update command, so this adapter stays OMS-managed. `oms package update` updates OMS; `oms host sync --runtime hermes` separately refreshes registrations. Neither upgrades Hermes. `mcp_servers.oms` is edited surgically, leaving the rest of `~/.hermes/config.yaml` — including comments and key ordering — untouched. Existing profiles retain their own configuration and registration scope.
31
+ Unlike Claude Code (`claude plugin install`), Hermes exposes no native marketplace or plugin-update command, so this adapter stays OMS-managed. `oms setup package update` updates OMS; `oms setup host sync --runtime hermes` separately refreshes registrations. Neither upgrades Hermes. `mcp_servers.oms` is edited surgically, leaving the rest of `~/.hermes/config.yaml` — including comments and key ordering — untouched. Existing profiles retain their own configuration and registration scope.
@@ -10,7 +10,7 @@ the only OMS file.
10
10
 
11
11
  ## Writing
12
12
 
13
- Write vault notes with MCP `write {path, content, template?}` (the `write`
13
+ Write vault notes with MCP `write {path, content, template?, ifMatch?, check?}` (the `write`
14
14
  skill). A denial gives only `{field, kind}` and a guidance command. Never ask
15
15
  about or guess the contract's location or values.
16
16
 
@@ -30,17 +30,18 @@ about or guess the contract's location or values.
30
30
  - `search` is read-only across lexical, vector, HyDE, and axis retrieval. It
31
31
  also returns notes that would fail the contract. It never writes or repairs.
32
32
  Unavailable backends fail loudly.
33
- - `status` reads health. `oms contract status` and `oms contract doctor` are
34
- for diagnosis. They report the seal's posture and template drift without
33
+ - `doctor` with `op: status` reads health and `op: link-check` checks a
34
+ note's wikilinks; both are read-only. `oms setup status` and
35
+ `oms doctor contract` are for diagnosis. They report the seal's posture and template drift without
35
36
  printing any value.
36
37
  - `doctor` runs only explicit, supported repairs. It never rewrites ordinary
37
38
  notes or backfills guessed values. A broken or missing seal is fixed by the
38
39
  user running `oms setup`.
39
40
 
40
- Hermes uses the seven shared skills under an `oms-` prefix (`oms-write`,
41
- `oms-search`, `oms-link`, `oms-distill`, `oms-setup`, `oms-status`,
42
- `oms-doctor`) so their names never collide with another bundle's `setup` or
43
- `status`. Call them by the prefixed name. They are backed by the five public
41
+ Hermes uses the six shared skills under an `oms-` prefix (`oms-write`,
42
+ `oms-search`, `oms-interview`, `oms-distill`, `oms-setup`, `oms-doctor`) so
43
+ their names never collide with another bundle's `setup` or `doctor`. Call them
44
+ by the prefixed name. They are backed by the four public
44
45
  MCP tools; `SKILL_CAPABILITY_GUIDE.md` beside them maps each skill to its tool.
45
46
  Their skill category is `knowledge-management`, so list them with
46
47
  `skills_list(category="knowledge-management")`.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oms",
3
- "version": "0.18.3",
3
+ "version": "0.19.0",
4
4
  "description": "Oh My Second Brain convention layer for Obsidian vaults — Hermes skill bundle and MCP adapter.",
5
- "_note": "oms host install writes ~/.hermes/config.yaml mcp_servers.oms and installs the seven shared skills, prefixed `oms-`, with provenance under ~/.hermes/skills/knowledge-management/oms/."
5
+ "_note": "oms setup host install writes ~/.hermes/config.yaml mcp_servers.oms and installs the six shared skills, prefixed `oms-`, with provenance under ~/.hermes/skills/knowledge-management/oms/."
6
6
  }