oh-my-second-brain 0.1.7 → 0.1.8

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 (351) hide show
  1. package/adapters/README.md +2 -1
  2. package/adapters/claude-code/.claude-plugin/plugin.json +4 -3
  3. package/adapters/claude-code/hooks/oms-guard.mjs +127 -0
  4. package/adapters/claude-code/hooks/oms-post-guard.mjs +108 -0
  5. package/adapters/claude-code/skills/compile/SKILL.md +52 -0
  6. package/adapters/claude-code/skills/distill/SKILL.md +48 -0
  7. package/adapters/claude-code/skills/retrieve/SKILL.md +52 -10
  8. package/adapters/claude-code/skills/setup/SKILL.md +10 -3
  9. package/adapters/claude-code/skills/update/SKILL.md +45 -0
  10. package/adapters/claude-code/skills/vault-decision-record/SKILL.md +52 -0
  11. package/adapters/claude-code/skills/vault-lint/SKILL.md +47 -0
  12. package/adapters/claude-code/skills/vault-scaffold/SKILL.md +47 -0
  13. package/adapters/claude-code/skills/wiki/SKILL.md +57 -0
  14. package/adapters/codex/.codex-plugin/plugin.json +1 -1
  15. package/adapters/codex/skills/oms-compile/SKILL.md +18 -0
  16. package/adapters/codex/skills/oms-distill/SKILL.md +19 -0
  17. package/adapters/codex/skills/oms-retrieve/SKILL.md +21 -6
  18. package/adapters/codex/skills/oms-setup/SKILL.md +13 -1
  19. package/adapters/codex/skills/oms-update/SKILL.md +22 -0
  20. package/adapters/codex/skills/oms-vault-lint/SKILL.md +19 -0
  21. package/adapters/codex/skills/oms-wiki/SKILL.md +19 -0
  22. package/adapters/hermes/manifest.json +1 -1
  23. package/adapters/hermes/skills/compile/SKILL.md +15 -0
  24. package/adapters/hermes/skills/distill/SKILL.md +12 -0
  25. package/adapters/hermes/skills/retrieve/SKILL.md +21 -6
  26. package/adapters/hermes/skills/setup/SKILL.md +13 -1
  27. package/adapters/hermes/skills/update/SKILL.md +22 -0
  28. package/adapters/hermes/skills/wiki/SKILL.md +12 -0
  29. package/core/ontology/schemas/README.md +49 -0
  30. package/core/ontology/schemas/concept.schema.yaml +70 -0
  31. package/core/ontology/schemas/note.schema.yaml +40 -0
  32. package/core/skills/compile/CHANGELOG.md +24 -0
  33. package/core/skills/compile/SKILL.md +56 -0
  34. package/core/skills/distill/CHANGELOG.md +39 -0
  35. package/core/skills/distill/SKILL.md +73 -0
  36. package/core/skills/retrieve/SKILL.md +17 -6
  37. package/core/skills/setup/CHANGELOG.md +49 -0
  38. package/core/skills/setup/SKILL.md +222 -18
  39. package/core/skills/vault-decision-record/CHANGELOG.md +24 -0
  40. package/core/skills/vault-decision-record/SKILL.md +93 -0
  41. package/core/skills/vault-lint/CHANGELOG.md +35 -0
  42. package/core/skills/vault-lint/SKILL.md +58 -0
  43. package/core/skills/vault-scaffold/CHANGELOG.md +21 -0
  44. package/core/skills/vault-scaffold/SKILL.md +72 -0
  45. package/core/skills/wiki/CHANGELOG.md +23 -0
  46. package/core/skills/wiki/SKILL.md +80 -0
  47. package/dist/cli/oms.d.ts +15 -0
  48. package/dist/cli/oms.js +436 -37
  49. package/dist/cli/oms.js.map +1 -1
  50. package/dist/cli/semantic-args.d.ts +14 -0
  51. package/dist/cli/semantic-args.js +112 -0
  52. package/dist/cli/semantic-args.js.map +1 -0
  53. package/dist/cli/semantic-http.d.ts +14 -0
  54. package/dist/cli/semantic-http.js +161 -0
  55. package/dist/cli/semantic-http.js.map +1 -0
  56. package/dist/cli/semantic-metadata-commands.d.ts +3 -0
  57. package/dist/cli/semantic-metadata-commands.js +115 -0
  58. package/dist/cli/semantic-metadata-commands.js.map +1 -0
  59. package/dist/cli/semantic-usage.d.ts +1 -0
  60. package/dist/cli/semantic-usage.js +19 -0
  61. package/dist/cli/semantic-usage.js.map +1 -0
  62. package/dist/cli/semantic.d.ts +9 -0
  63. package/dist/cli/semantic.js +208 -0
  64. package/dist/cli/semantic.js.map +1 -0
  65. package/dist/conventions/lint.d.ts +20 -0
  66. package/dist/conventions/lint.js +92 -0
  67. package/dist/conventions/lint.js.map +1 -0
  68. package/dist/engine/assemble.d.ts +117 -0
  69. package/dist/engine/assemble.js +146 -0
  70. package/dist/engine/assemble.js.map +1 -0
  71. package/dist/engine/compile/cascade.d.ts +35 -0
  72. package/dist/engine/compile/cascade.js +59 -0
  73. package/dist/engine/compile/cascade.js.map +1 -0
  74. package/dist/engine/compile/cot.d.ts +30 -0
  75. package/dist/engine/compile/cot.js +153 -0
  76. package/dist/engine/compile/cot.js.map +1 -0
  77. package/dist/engine/compile/phases.d.ts +47 -0
  78. package/dist/engine/compile/phases.js +101 -0
  79. package/dist/engine/compile/phases.js.map +1 -0
  80. package/dist/engine/compile/provenance.d.ts +45 -0
  81. package/dist/engine/compile/provenance.js +103 -0
  82. package/dist/engine/compile/provenance.js.map +1 -0
  83. package/dist/engine/compile/sha-cache.d.ts +42 -0
  84. package/dist/engine/compile/sha-cache.js +86 -0
  85. package/dist/engine/compile/sha-cache.js.map +1 -0
  86. package/dist/engine/compile/types.d.ts +71 -0
  87. package/dist/engine/compile/types.js +9 -0
  88. package/dist/engine/compile/types.js.map +1 -0
  89. package/dist/engine/compile/worker.d.ts +47 -0
  90. package/dist/engine/compile/worker.js +75 -0
  91. package/dist/engine/compile/worker.js.map +1 -0
  92. package/dist/engine/conventions/vault-lint.d.ts +79 -0
  93. package/dist/engine/conventions/vault-lint.js +231 -0
  94. package/dist/engine/conventions/vault-lint.js.map +1 -0
  95. package/dist/engine/distill/analyzer.d.ts +51 -0
  96. package/dist/engine/distill/analyzer.js +279 -0
  97. package/dist/engine/distill/analyzer.js.map +1 -0
  98. package/dist/engine/distill/clean-room.d.ts +46 -0
  99. package/dist/engine/distill/clean-room.js +131 -0
  100. package/dist/engine/distill/clean-room.js.map +1 -0
  101. package/dist/engine/distill/report.d.ts +23 -0
  102. package/dist/engine/distill/report.js +107 -0
  103. package/dist/engine/distill/report.js.map +1 -0
  104. package/dist/engine/distill/types.d.ts +89 -0
  105. package/dist/engine/distill/types.js +9 -0
  106. package/dist/engine/distill/types.js.map +1 -0
  107. package/dist/engine/embed/chunker.d.ts +24 -0
  108. package/dist/engine/embed/chunker.js +131 -0
  109. package/dist/engine/embed/chunker.js.map +1 -0
  110. package/dist/engine/embed/deferred.d.ts +36 -0
  111. package/dist/engine/embed/deferred.js +67 -0
  112. package/dist/engine/embed/deferred.js.map +1 -0
  113. package/dist/engine/embed/hash-stub.test-helper.d.ts +18 -0
  114. package/dist/engine/embed/hash-stub.test-helper.js +62 -0
  115. package/dist/engine/embed/hash-stub.test-helper.js.map +1 -0
  116. package/dist/engine/embed/provider.d.ts +67 -0
  117. package/dist/engine/embed/provider.js +263 -0
  118. package/dist/engine/embed/provider.js.map +1 -0
  119. package/dist/engine/embed/pull.d.ts +51 -0
  120. package/dist/engine/embed/pull.js +90 -0
  121. package/dist/engine/embed/pull.js.map +1 -0
  122. package/dist/engine/embed/store.d.ts +45 -0
  123. package/dist/engine/embed/store.js +233 -0
  124. package/dist/engine/embed/store.js.map +1 -0
  125. package/dist/engine/embed/sync.d.ts +75 -0
  126. package/dist/engine/embed/sync.js +157 -0
  127. package/dist/engine/embed/sync.js.map +1 -0
  128. package/dist/engine/graph/builder.d.ts +66 -0
  129. package/dist/engine/graph/builder.js +402 -0
  130. package/dist/engine/graph/builder.js.map +1 -0
  131. package/dist/engine/graph/community.d.ts +38 -0
  132. package/dist/engine/graph/community.js +122 -0
  133. package/dist/engine/graph/community.js.map +1 -0
  134. package/dist/engine/graph/explore.d.ts +61 -0
  135. package/dist/engine/graph/explore.js +0 -0
  136. package/dist/engine/graph/explore.js.map +1 -0
  137. package/dist/engine/graph/node.d.ts +70 -0
  138. package/dist/engine/graph/node.js +110 -0
  139. package/dist/engine/graph/node.js.map +1 -0
  140. package/dist/engine/graph/resolver.d.ts +44 -0
  141. package/dist/engine/graph/resolver.js +103 -0
  142. package/dist/engine/graph/resolver.js.map +1 -0
  143. package/dist/engine/graph/traverse.d.ts +27 -0
  144. package/dist/engine/graph/traverse.js +124 -0
  145. package/dist/engine/graph/traverse.js.map +1 -0
  146. package/dist/engine/index.d.ts +5 -0
  147. package/dist/engine/index.js +2 -0
  148. package/dist/engine/index.js.map +1 -0
  149. package/dist/engine/mcp/facade.d.ts +110 -0
  150. package/dist/engine/mcp/facade.js +678 -0
  151. package/dist/engine/mcp/facade.js.map +1 -0
  152. package/dist/engine/mcp/index.d.ts +15 -0
  153. package/dist/engine/mcp/index.js +19 -0
  154. package/dist/engine/mcp/index.js.map +1 -0
  155. package/dist/engine/mcp/op-mappers.d.ts +69 -0
  156. package/dist/engine/mcp/op-mappers.js +195 -0
  157. package/dist/engine/mcp/op-mappers.js.map +1 -0
  158. package/dist/engine/mcp/query-mapper.d.ts +38 -0
  159. package/dist/engine/mcp/query-mapper.js +102 -0
  160. package/dist/engine/mcp/query-mapper.js.map +1 -0
  161. package/dist/engine/mcp/retrieve-mapper.d.ts +38 -0
  162. package/dist/engine/mcp/retrieve-mapper.js +96 -0
  163. package/dist/engine/mcp/retrieve-mapper.js.map +1 -0
  164. package/dist/engine/mcp/types.d.ts +322 -0
  165. package/dist/engine/mcp/types.js +9 -0
  166. package/dist/engine/mcp/types.js.map +1 -0
  167. package/dist/engine/retrieval/dispatcher.d.ts +65 -0
  168. package/dist/engine/retrieval/dispatcher.js +145 -0
  169. package/dist/engine/retrieval/dispatcher.js.map +1 -0
  170. package/dist/engine/retrieval/index.d.ts +55 -0
  171. package/dist/engine/retrieval/index.js +52 -0
  172. package/dist/engine/retrieval/index.js.map +1 -0
  173. package/dist/engine/retrieval/reranker.d.ts +46 -0
  174. package/dist/engine/retrieval/reranker.js +29 -0
  175. package/dist/engine/retrieval/reranker.js.map +1 -0
  176. package/dist/engine/retrieval/rrf.d.ts +23 -0
  177. package/dist/engine/retrieval/rrf.js +54 -0
  178. package/dist/engine/retrieval/rrf.js.map +1 -0
  179. package/dist/engine/setup/ambiguity.d.ts +39 -0
  180. package/dist/engine/setup/ambiguity.js +50 -0
  181. package/dist/engine/setup/ambiguity.js.map +1 -0
  182. package/dist/engine/setup/types.d.ts +71 -0
  183. package/dist/engine/setup/types.js +22 -0
  184. package/dist/engine/setup/types.js.map +1 -0
  185. package/dist/engine/setup/writer.d.ts +32 -0
  186. package/dist/engine/setup/writer.js +77 -0
  187. package/dist/engine/setup/writer.js.map +1 -0
  188. package/dist/engine/tracer.d.ts +62 -0
  189. package/dist/engine/tracer.js +169 -0
  190. package/dist/engine/tracer.js.map +1 -0
  191. package/dist/engine/types.d.ts +129 -0
  192. package/dist/engine/types.js +8 -0
  193. package/dist/engine/types.js.map +1 -0
  194. package/dist/engine/wiki/collection.d.ts +91 -0
  195. package/dist/engine/wiki/collection.js +188 -0
  196. package/dist/engine/wiki/collection.js.map +1 -0
  197. package/dist/engine/wiki/ledger.d.ts +59 -0
  198. package/dist/engine/wiki/ledger.js +130 -0
  199. package/dist/engine/wiki/ledger.js.map +1 -0
  200. package/dist/engine/wiki/lint.d.ts +38 -0
  201. package/dist/engine/wiki/lint.js +186 -0
  202. package/dist/engine/wiki/lint.js.map +1 -0
  203. package/dist/engine/wiki/navigation.d.ts +40 -0
  204. package/dist/engine/wiki/navigation.js +83 -0
  205. package/dist/engine/wiki/navigation.js.map +1 -0
  206. package/dist/engine/wiki/types.d.ts +54 -0
  207. package/dist/engine/wiki/types.js +7 -0
  208. package/dist/engine/wiki/types.js.map +1 -0
  209. package/dist/hook/post-tool-use.d.ts +17 -0
  210. package/dist/hook/post-tool-use.js +124 -0
  211. package/dist/hook/post-tool-use.js.map +1 -0
  212. package/dist/hook/pre-tool-use.d.ts +16 -0
  213. package/dist/hook/pre-tool-use.js +110 -0
  214. package/dist/hook/pre-tool-use.js.map +1 -0
  215. package/dist/hook/stdin.d.ts +5 -0
  216. package/dist/hook/stdin.js +42 -0
  217. package/dist/hook/stdin.js.map +1 -0
  218. package/dist/index.d.ts +1 -1
  219. package/dist/index.js +1 -1
  220. package/dist/index.js.map +1 -1
  221. package/dist/install/hosts.d.ts +32 -0
  222. package/dist/install/hosts.js +175 -0
  223. package/dist/install/hosts.js.map +1 -1
  224. package/dist/mcp/engine-morning-backend.d.ts +33 -0
  225. package/dist/mcp/engine-morning-backend.js +167 -0
  226. package/dist/mcp/engine-morning-backend.js.map +1 -0
  227. package/dist/mcp/semantic-retrieve-args.d.ts +35 -0
  228. package/dist/mcp/semantic-retrieve-args.js +187 -0
  229. package/dist/mcp/semantic-retrieve-args.js.map +1 -0
  230. package/dist/mcp/semantic-retrieve-schema.d.ts +138 -0
  231. package/dist/mcp/semantic-retrieve-schema.js +50 -0
  232. package/dist/mcp/semantic-retrieve-schema.js.map +1 -0
  233. package/dist/mcp/semantic-retrieve.d.ts +31 -0
  234. package/dist/mcp/semantic-retrieve.js +134 -0
  235. package/dist/mcp/semantic-retrieve.js.map +1 -0
  236. package/dist/mcp/semantic-schemas.d.ts +2 -0
  237. package/dist/mcp/semantic-schemas.js +3 -0
  238. package/dist/mcp/semantic-schemas.js.map +1 -0
  239. package/dist/mcp/semantic-tool-schemas.d.ts +2 -0
  240. package/dist/mcp/semantic-tool-schemas.js +174 -0
  241. package/dist/mcp/semantic-tool-schemas.js.map +1 -0
  242. package/dist/mcp/server.js +139 -28
  243. package/dist/mcp/server.js.map +1 -1
  244. package/dist/retrieve/embedding-sync.d.ts +3 -0
  245. package/dist/retrieve/embedding-sync.js +21 -0
  246. package/dist/retrieve/embedding-sync.js.map +1 -0
  247. package/dist/retrieve/morning-test-fixtures.d.ts +1 -0
  248. package/dist/retrieve/morning-test-fixtures.js +35 -0
  249. package/dist/retrieve/morning-test-fixtures.js.map +1 -0
  250. package/dist/retrieve/morning.d.ts +78 -11
  251. package/dist/retrieve/morning.js +120 -24
  252. package/dist/retrieve/morning.js.map +1 -1
  253. package/dist/search/semantic-collections.d.ts +32 -0
  254. package/dist/search/semantic-collections.js +68 -0
  255. package/dist/search/semantic-collections.js.map +1 -0
  256. package/dist/search/semantic-contexts.d.ts +21 -0
  257. package/dist/search/semantic-contexts.js +28 -0
  258. package/dist/search/semantic-contexts.js.map +1 -0
  259. package/dist/search/semantic-diagnostics.d.ts +16 -0
  260. package/dist/search/semantic-diagnostics.js +110 -0
  261. package/dist/search/semantic-diagnostics.js.map +1 -0
  262. package/dist/search/semantic-documents.d.ts +3 -0
  263. package/dist/search/semantic-documents.js +150 -0
  264. package/dist/search/semantic-documents.js.map +1 -0
  265. package/dist/search/semantic-embedding-hash.d.ts +3 -0
  266. package/dist/search/semantic-embedding-hash.js +30 -0
  267. package/dist/search/semantic-embedding-hash.js.map +1 -0
  268. package/dist/search/semantic-embedding-provider.d.ts +9 -0
  269. package/dist/search/semantic-embedding-provider.js +58 -0
  270. package/dist/search/semantic-embedding-provider.js.map +1 -0
  271. package/dist/search/semantic-index-build.d.ts +13 -0
  272. package/dist/search/semantic-index-build.js +101 -0
  273. package/dist/search/semantic-index-build.js.map +1 -0
  274. package/dist/search/semantic-index-core.d.ts +21 -0
  275. package/dist/search/semantic-index-core.js +106 -0
  276. package/dist/search/semantic-index-core.js.map +1 -0
  277. package/dist/search/semantic-index-io.d.ts +19 -0
  278. package/dist/search/semantic-index-io.js +214 -0
  279. package/dist/search/semantic-index-io.js.map +1 -0
  280. package/dist/search/semantic-index-types.d.ts +50 -0
  281. package/dist/search/semantic-index-types.js +2 -0
  282. package/dist/search/semantic-index-types.js.map +1 -0
  283. package/dist/search/semantic-index.d.ts +4 -0
  284. package/dist/search/semantic-index.js +4 -0
  285. package/dist/search/semantic-index.js.map +1 -0
  286. package/dist/search/semantic-listing.d.ts +12 -0
  287. package/dist/search/semantic-listing.js +64 -0
  288. package/dist/search/semantic-listing.js.map +1 -0
  289. package/dist/search/semantic-maintenance-shared.d.ts +15 -0
  290. package/dist/search/semantic-maintenance-shared.js +43 -0
  291. package/dist/search/semantic-maintenance-shared.js.map +1 -0
  292. package/dist/search/semantic-maintenance-types.d.ts +103 -0
  293. package/dist/search/semantic-maintenance-types.js +2 -0
  294. package/dist/search/semantic-maintenance-types.js.map +1 -0
  295. package/dist/search/semantic-maintenance.d.ts +4 -0
  296. package/dist/search/semantic-maintenance.js +5 -0
  297. package/dist/search/semantic-maintenance.js.map +1 -0
  298. package/dist/search/semantic-provider-types.d.ts +34 -0
  299. package/dist/search/semantic-provider-types.js +2 -0
  300. package/dist/search/semantic-provider-types.js.map +1 -0
  301. package/dist/search/semantic-query-types.d.ts +83 -0
  302. package/dist/search/semantic-query-types.js +2 -0
  303. package/dist/search/semantic-query-types.js.map +1 -0
  304. package/dist/search/semantic-query.d.ts +2 -0
  305. package/dist/search/semantic-query.js +188 -0
  306. package/dist/search/semantic-query.js.map +1 -0
  307. package/dist/search/semantic-sqlite-db.d.ts +18 -0
  308. package/dist/search/semantic-sqlite-db.js +87 -0
  309. package/dist/search/semantic-sqlite-db.js.map +1 -0
  310. package/dist/search/semantic-sqlite-query.d.ts +2 -0
  311. package/dist/search/semantic-sqlite-query.js +128 -0
  312. package/dist/search/semantic-sqlite-query.js.map +1 -0
  313. package/dist/search/semantic-sqlite-read.d.ts +5 -0
  314. package/dist/search/semantic-sqlite-read.js +104 -0
  315. package/dist/search/semantic-sqlite-read.js.map +1 -0
  316. package/dist/search/semantic-sqlite-write.d.ts +7 -0
  317. package/dist/search/semantic-sqlite-write.js +66 -0
  318. package/dist/search/semantic-sqlite-write.js.map +1 -0
  319. package/dist/search/semantic-store.d.ts +15 -0
  320. package/dist/search/semantic-store.js +17 -0
  321. package/dist/search/semantic-store.js.map +1 -0
  322. package/dist/search/semantic-sync-types.d.ts +47 -0
  323. package/dist/search/semantic-sync-types.js +2 -0
  324. package/dist/search/semantic-sync-types.js.map +1 -0
  325. package/dist/search/semantic-sync.d.ts +13 -0
  326. package/dist/search/semantic-sync.js +131 -0
  327. package/dist/search/semantic-sync.js.map +1 -0
  328. package/dist/search/semantic-test-fixtures.d.ts +1 -0
  329. package/dist/search/semantic-test-fixtures.js +38 -0
  330. package/dist/search/semantic-test-fixtures.js.map +1 -0
  331. package/dist/search/semantic-token.d.ts +25 -0
  332. package/dist/search/semantic-token.js +114 -0
  333. package/dist/search/semantic-token.js.map +1 -0
  334. package/dist/search/semantic-types.d.ts +5 -0
  335. package/dist/search/semantic-types.js +2 -0
  336. package/dist/search/semantic-types.js.map +1 -0
  337. package/dist/search/semantic.d.ts +6 -0
  338. package/dist/search/semantic.js +6 -0
  339. package/dist/search/semantic.js.map +1 -0
  340. package/dist/setup/axis.d.ts +17 -0
  341. package/dist/setup/axis.js +185 -0
  342. package/dist/setup/axis.js.map +1 -0
  343. package/dist/update/update.d.ts +55 -0
  344. package/dist/update/update.js +225 -0
  345. package/dist/update/update.js.map +1 -0
  346. package/docs/install.md +35 -2
  347. package/docs/release.md +2 -1
  348. package/package.json +13 -3
  349. package/dist/search/qmd.d.ts +0 -59
  350. package/dist/search/qmd.js +0 -141
  351. package/dist/search/qmd.js.map +0 -1
@@ -82,7 +82,8 @@ In the current repository, `src/mcp/server.ts` starts a real stdio MCP server vi
82
82
 
83
83
  The MCP server currently exposes status/read/cache/retrieve/capture tools:
84
84
  `oms_graph_status`, `oms_graph_build`, `oms_list_concepts`,
85
- `oms_retrieve_context`, `oms_retrieve_by_axis`, `oms_lazy_load_note`,
85
+ `oms_retrieve_context`, `oms_sync_embeddings`, `oms_get_document`, `oms_multi_get_documents`,
86
+ `oms_retrieve_by_axis`, `oms_lazy_load_note`,
86
87
  `oms_validate_contract`, `oms_capture_prepare`, and `oms_capture_commit`.
87
88
  Capture commit is gated by path-safety, vault-confinement, and contract validation. The CLI (`oms setup`, `oms install`, `oms uninstall`, `oms doctor`) remains the real surface for lifecycle commands.
88
89
 
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "oms",
3
- "version": "0.1.7",
4
- "description": "Oh My Second Brain convention layer for Obsidian vaults \u2014 capture, retrieve, and validate knowledge under a declared semantic convention.",
3
+ "version": "0.1.8",
4
+ "description": "Oh My Second Brain convention layer for Obsidian vaults capture, retrieve, and validate knowledge under a declared semantic convention.",
5
5
  "author": {
6
6
  "name": "gobeumsu"
7
7
  },
@@ -19,6 +19,7 @@
19
19
  "./skills/define/",
20
20
  "./skills/capture/",
21
21
  "./skills/retrieve/",
22
- "./skills/uninstall/"
22
+ "./skills/uninstall/",
23
+ "./skills/update/"
23
24
  ]
24
25
  }
@@ -0,0 +1,127 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * oms-guard — thin PreToolUse wrapper for Claude Code settings.json.
4
+ *
5
+ * Filters vault-relevant Write/Edit tool calls and delegates to
6
+ * `oms hook pre-tool-use --vault <vault>` only when the target path is
7
+ * inside a configured vault. Vault 무관 호출은 spawn 없이 즉시 통과.
8
+ *
9
+ * Configuration (env vars set by the settings.json hook definition):
10
+ * OMS_VAULT — primary vault path (e.g. /Users/…/Ataraxia)
11
+ * OMS_AGENT_VAULT — agent vault path (e.g. /Users/…/agent)
12
+ * OMS_GUARD — set to "off" to bypass all checks
13
+ *
14
+ * Fail-open: any error (oms crash, timeout, invalid JSON) → {"continue": true}.
15
+ */
16
+
17
+ import { spawnSync } from "node:child_process";
18
+ import { existsSync } from "node:fs";
19
+ import { dirname, resolve } from "node:path";
20
+ import { fileURLToPath } from "node:url";
21
+
22
+ const WRITE_TOOLS = new Set(["Write", "write", "Edit", "edit"]);
23
+
24
+ /**
25
+ * Resolve how to invoke the oms CLI for the hook.
26
+ *
27
+ * Prefer running the co-located dist entry via `node <dist>` so the guard is
28
+ * immune to the `oms` bin losing its executable bit on a bare `tsc` rebuild
29
+ * (which silently breaks `spawnSync("oms")` with EACCES and fails the guard
30
+ * open). Fall back to the `oms` bin on PATH only if dist can't be located.
31
+ */
32
+ function resolveOmsCommand() {
33
+ try {
34
+ const here = dirname(fileURLToPath(import.meta.url));
35
+ const dist = resolve(here, "../../../dist/cli/oms.js");
36
+ if (existsSync(dist)) return { cmd: process.execPath, prefix: [dist] };
37
+ } catch {
38
+ // fall through to PATH lookup
39
+ }
40
+ return { cmd: "oms", prefix: [] };
41
+ }
42
+
43
+ function allow() {
44
+ process.stdout.write(JSON.stringify({ continue: true, suppressOutput: true }) + "\n");
45
+ }
46
+
47
+ async function readStdin(timeoutMs = 5000) {
48
+ return new Promise((resolve) => {
49
+ const chunks = [];
50
+ let settled = false;
51
+ const timer = setTimeout(() => {
52
+ if (!settled) {
53
+ settled = true;
54
+ process.stdin.removeAllListeners();
55
+ resolve(Buffer.concat(chunks).toString("utf-8"));
56
+ }
57
+ }, timeoutMs);
58
+ process.stdin.on("data", (c) => chunks.push(c));
59
+ process.stdin.on("end", () => {
60
+ if (!settled) { settled = true; clearTimeout(timer); resolve(Buffer.concat(chunks).toString("utf-8")); }
61
+ });
62
+ process.stdin.on("error", () => {
63
+ if (!settled) { settled = true; clearTimeout(timer); resolve(""); }
64
+ });
65
+ if (process.stdin.readableEnded) {
66
+ if (!settled) { settled = true; clearTimeout(timer); resolve(Buffer.concat(chunks).toString("utf-8")); }
67
+ }
68
+ });
69
+ }
70
+
71
+ async function main() {
72
+ // Global escape hatch.
73
+ if (process.env.OMS_GUARD === "off") { allow(); return; }
74
+
75
+ const vaultPaths = [
76
+ process.env.OMS_VAULT,
77
+ process.env.OMS_AGENT_VAULT,
78
+ ].filter(Boolean);
79
+
80
+ // No vaults configured → pass through.
81
+ if (vaultPaths.length === 0) { allow(); return; }
82
+
83
+ let rawInput;
84
+ try { rawInput = await readStdin(); }
85
+ catch { allow(); return; }
86
+
87
+ let data;
88
+ try { data = JSON.parse(rawInput); }
89
+ catch { allow(); return; }
90
+
91
+ const toolName = data.tool_name || data.toolName || "";
92
+
93
+ // Skip non-Write/Edit tools immediately — zero spawn overhead.
94
+ if (!WRITE_TOOLS.has(toolName)) { allow(); return; }
95
+
96
+ const toolInput = data.tool_input || data.toolInput || {};
97
+ const filePath = String(toolInput.path || toolInput.file_path || "");
98
+ if (!filePath) { allow(); return; }
99
+
100
+ // Determine which vault this path belongs to.
101
+ const targetVault = vaultPaths.find(
102
+ (v) => filePath === v || filePath.startsWith(v + "/"),
103
+ );
104
+ if (!targetVault) { allow(); return; }
105
+
106
+ // Spawn `oms hook pre-tool-use --vault <vault>` with the raw stdin payload.
107
+ try {
108
+ const { cmd, prefix } = resolveOmsCommand();
109
+ const result = spawnSync(
110
+ cmd,
111
+ [...prefix, "hook", "pre-tool-use", "--vault", targetVault],
112
+ { input: rawInput, encoding: "utf-8", timeout: 10000 },
113
+ );
114
+ if (result.status === 0 && result.stdout && result.stdout.trim()) {
115
+ process.stdout.write(result.stdout);
116
+ } else {
117
+ // oms exited non-zero or produced no output → fail-open.
118
+ if (result.stderr) process.stderr.write("[oms-guard] " + result.stderr);
119
+ allow();
120
+ }
121
+ } catch {
122
+ // spawn failure → fail-open.
123
+ allow();
124
+ }
125
+ }
126
+
127
+ main().catch(() => allow());
@@ -0,0 +1,108 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * oms-post-guard — thin PostToolUse wrapper for Claude Code settings.json.
4
+ *
5
+ * Filters vault-relevant Write/Edit completions and delegates to
6
+ * `oms hook post-tool-use --vault <vault>` for frontmatter audit and
7
+ * graph cache debounce. Vault 무관 호출은 spawn 없이 즉시 통과.
8
+ *
9
+ * Configuration (env vars set by the settings.json hook definition):
10
+ * OMS_VAULT — primary vault path
11
+ * OMS_AGENT_VAULT — agent vault path
12
+ *
13
+ * Fail-open: any error → silent return (PostToolUse hooks are advisory).
14
+ */
15
+
16
+ import { spawnSync } from "node:child_process";
17
+ import { existsSync } from "node:fs";
18
+ import { dirname, resolve } from "node:path";
19
+ import { fileURLToPath } from "node:url";
20
+
21
+ const WRITE_TOOLS = new Set(["Write", "write", "Edit", "edit"]);
22
+
23
+ /**
24
+ * Resolve how to invoke the oms CLI. Prefer `node <dist>` over the `oms` bin so
25
+ * the hook survives a bare `tsc` rebuild stripping the bin's executable bit
26
+ * (which makes spawnSync("oms") fail with EACCES). Fall back to PATH `oms`.
27
+ */
28
+ function resolveOmsCommand() {
29
+ try {
30
+ const here = dirname(fileURLToPath(import.meta.url));
31
+ const dist = resolve(here, "../../../dist/cli/oms.js");
32
+ if (existsSync(dist)) return { cmd: process.execPath, prefix: [dist] };
33
+ } catch {
34
+ // fall through to PATH lookup
35
+ }
36
+ return { cmd: "oms", prefix: [] };
37
+ }
38
+
39
+ async function readStdin(timeoutMs = 5000) {
40
+ return new Promise((resolve) => {
41
+ const chunks = [];
42
+ let settled = false;
43
+ const timer = setTimeout(() => {
44
+ if (!settled) {
45
+ settled = true;
46
+ process.stdin.removeAllListeners();
47
+ resolve(Buffer.concat(chunks).toString("utf-8"));
48
+ }
49
+ }, timeoutMs);
50
+ process.stdin.on("data", (c) => chunks.push(c));
51
+ process.stdin.on("end", () => {
52
+ if (!settled) { settled = true; clearTimeout(timer); resolve(Buffer.concat(chunks).toString("utf-8")); }
53
+ });
54
+ process.stdin.on("error", () => {
55
+ if (!settled) { settled = true; clearTimeout(timer); resolve(""); }
56
+ });
57
+ if (process.stdin.readableEnded) {
58
+ if (!settled) { settled = true; clearTimeout(timer); resolve(Buffer.concat(chunks).toString("utf-8")); }
59
+ }
60
+ });
61
+ }
62
+
63
+ async function main() {
64
+ const vaultPaths = [
65
+ process.env.OMS_VAULT,
66
+ process.env.OMS_AGENT_VAULT,
67
+ ].filter(Boolean);
68
+
69
+ if (vaultPaths.length === 0) return;
70
+
71
+ let rawInput;
72
+ try { rawInput = await readStdin(); }
73
+ catch { return; }
74
+
75
+ let data;
76
+ try { data = JSON.parse(rawInput); }
77
+ catch { return; }
78
+
79
+ const toolName = data.tool_name || data.toolName || "";
80
+ if (!WRITE_TOOLS.has(toolName)) return;
81
+
82
+ const toolInput = data.tool_input || data.toolInput || {};
83
+ const filePath = String(toolInput.path || toolInput.file_path || "");
84
+ if (!filePath) return;
85
+
86
+ const targetVault = vaultPaths.find(
87
+ (v) => filePath === v || filePath.startsWith(v + "/"),
88
+ );
89
+ if (!targetVault) return;
90
+
91
+ try {
92
+ const { cmd, prefix } = resolveOmsCommand();
93
+ const result = spawnSync(
94
+ cmd,
95
+ [...prefix, "hook", "post-tool-use", "--vault", targetVault],
96
+ { input: rawInput, encoding: "utf-8", timeout: 30000 },
97
+ );
98
+ // Forward any additionalContext output from the post-tool-use hook.
99
+ if (result.status === 0 && result.stdout && result.stdout.trim()) {
100
+ process.stdout.write(result.stdout);
101
+ }
102
+ if (result.stderr) process.stderr.write("[oms-post-guard] " + result.stderr);
103
+ } catch {
104
+ // Fail silently — post-tool-use is advisory.
105
+ }
106
+ }
107
+
108
+ main().catch(() => {});
@@ -0,0 +1,52 @@
1
+ ---
2
+ name: oms-compile
3
+ description: Stateless per-concept compile worker — synthesizes a concept wiki page from source materials with SHA-incremental skip, provenance weighting, and cascade backlinks.
4
+ ---
5
+
6
+ # Skill: oms-compile (Claude Code)
7
+
8
+ Synthesize a concept wiki page from source materials using the OMS compile engine.
9
+
10
+ ## Invocation
11
+
12
+ ```
13
+ /oms-compile
14
+ ```
15
+
16
+ ## What this skill does
17
+
18
+ Conceptually shells out to:
19
+
20
+ ```bash
21
+ oms compile <concept>
22
+ ```
23
+
24
+ Thin pointer to `core/skills/compile`. The engine runs Phase A (load + grade
25
+ materials, pure read) then Phase B (write body to `processed/` tier). Promotion
26
+ from `processed/` to `wiki/` is the M3 collection owner's responsibility.
27
+
28
+ ## Agent-guided steps (v0)
29
+
30
+ 1. Identify the **concept** name and locate its source materials.
31
+ 2. Run **Phase A** — load and grade all materials; resolve backlinks from the compile graph.
32
+ 3. Call `compile(opts)` with materials, graph, llm, and `dotLlmwiki` cache path.
33
+ 4. Check `wasSkipped(result)` — if the material SHA is unchanged, skip downstream.
34
+ 5. Run **Phase B** — write `result.body` to the `processed/` tier only.
35
+ 6. Pass `result.affected_backlinks` to the wiki collection owner (M3) to mark stale pages.
36
+
37
+ ## Provenance order
38
+
39
+ Authored > curated > external-raw. Authored materials carry a
40
+ `[AUTHORED — preserve individual voice]` label in the LLM prompt.
41
+
42
+ ## Runtime
43
+
44
+ No MCP tool is required for compile itself — it is a pure TypeScript call.
45
+ Use `oms_retrieve_context` or `oms_get_document` to gather source materials
46
+ before invoking compile. Delete `{dotLlmwiki}/sha-cache.json` to force a
47
+ full recompile of all concepts.
48
+
49
+ ## NOTES
50
+
51
+ Wiki mirror deferred — the `wiki` skill is built by a parallel milestone (M3)
52
+ and its adapter mirror is intentionally deferred until that milestone lands.
@@ -0,0 +1,48 @@
1
+ ---
2
+ name: oms-distill
3
+ description: Standalone meta-absorption skill — analyzes any target (repo, document, skill, concept) in a clean-room context and produces a structured absorption report with patterns, risks, and attribution.
4
+ ---
5
+
6
+ # Skill: oms-distill (Claude Code)
7
+
8
+ Run adversarial absorption analysis on a target and produce a structured report.
9
+
10
+ ## Invocation
11
+
12
+ ```
13
+ /oms-distill <target-path-or-text>
14
+ ```
15
+
16
+ ## What this skill does
17
+
18
+ Thin pointer to `core/skills/distill`. Vault-agnostic — `OMS_VAULT` is NOT
19
+ required. The target is treated as inert read-only text and is never executed.
20
+
21
+ ## Agent-guided steps (v0)
22
+
23
+ 1. Load the target via `prepareCleanRoom(target)` — treat as inert data only.
24
+ 2. Snapshot system state SHA before analysis (`snapshotSha`).
25
+ 3. Run red-team adversarial analysis via `runAnalysis(spec, provider)`.
26
+ Inject a stub provider for dry-runs; a real LLM client for production.
27
+ 4. Generate the report via `generateReport(result, targetName)`.
28
+ The report has exactly three sections: §1 Patterns, §2 Risks, §3 Attribution.
29
+ 5. Verify the mutation detector: SHA after must equal SHA before (`detectMutation`).
30
+ Throw if state was mutated — distill must be fully stateless.
31
+ 6. Return the report string. Write it only if the user explicitly requests it.
32
+
33
+ ## Report sections
34
+
35
+ - **§1 Patterns** — ranked by `absorb_confidence` (highest first), with `file:line` citations.
36
+ - **§2 Risks** — ranked by severity: critical → high → medium → low.
37
+ - **§3 Attribution** — repo, URL, and license note for `ACKNOWLEDGMENTS.md`.
38
+
39
+ ## Runtime
40
+
41
+ No vault write occurs inside distill. Does not import from `src/engine/compile/`
42
+ or `src/engine/wiki/`. Use `createStubAnalyzerProvider()` from
43
+ `src/engine/distill/analyzer.js` for deterministic offline testing.
44
+
45
+ ## NOTES
46
+
47
+ Wiki mirror deferred — the `wiki` skill is built by a parallel milestone (M3)
48
+ and its adapter mirror is intentionally deferred until that milestone lands.
@@ -22,21 +22,59 @@ oms retrieve
22
22
  ```
23
23
 
24
24
  **Runtime note:** Retrieval is available through MCP tools. Prefer
25
- `oms_retrieve_context` for live graph + qmd context retrieval, then
26
- `oms_lazy_load_note` after selecting candidate notes. `oms_retrieve_by_axis`
25
+ `oms_retrieve_context` for live graph + semantic context retrieval, use
26
+ `oms_sync_embeddings` when the native semantic index must be refreshed, then
27
+ `oms_get_document` or `oms_multi_get_documents` for selected semantic evidence
28
+ or `oms_semantic_query`/`oms_semantic_status` for qmd-compatible follow-ups,
29
+ and `oms_lazy_load_note` for selected vault-note bodies. `oms_retrieve_by_axis`
27
30
  remains available for legacy cache-backed axis retrieval.
28
31
 
32
+ ## Typed query interface
33
+
34
+ Pass `semanticSearches` to issue typed sub-queries in a single call:
35
+
36
+ | type | behaviour |
37
+ |---------|--------------------------------------------------|
38
+ | `lex` | BM25 keyword search (exact terms, fast) |
39
+ | `vec` | SQLite-vector semantic search (meaning-based) |
40
+ | `hyde` | Hypothetical-document expansion before search |
41
+ | `graph` | Semantic candidates confined to graph neighbors |
42
+
43
+ ```
44
+ semanticSearches: [
45
+ { type: "lex", query: "transformer attention" },
46
+ { type: "vec", query: "self-attention replaces recurrence" },
47
+ { type: "hyde", query: "a paper about attention mechanisms" },
48
+ { type: "graph", query: "related concepts in my notes" }
49
+ ]
50
+ ```
51
+
52
+ Use `semanticScope: "global"` (default) for vault-wide semantic search.
53
+ Use `semanticScope: "graph"` (**gph mode**) to confine semantic candidates
54
+ to the set already selected by the OMS graph traversal.
55
+
29
56
  ## Agent-guided steps (v0)
30
57
 
31
58
  1. Clarify the user's **retrieval purpose** (synthesize, audit, plan, review, etc.).
32
59
  2. Narrow by declared **folder/concept/property/wikilink axes** where possible.
33
60
  3. Match the purpose to a declared **retrieval view** (`lenses` in YAML) in `vault/.oms/concepts/*.yaml`.
34
61
  4. Call MCP `oms_retrieve_context` with the best available axes and query.
35
- 5. Use default `qmdScope: "global"` for broad semantic search; use
36
- `qmdScope: "graph"` only when qmd must stay inside the selected graph
37
- candidates.
38
- 6. For each note, return the retrieval-view fields and lazy-load body only when needed.
39
- 7. Return results grouped by concept/folder with retrieval-view frontmatter.
62
+ 5. Choose semantic scope: `semanticScope: "global"` for broad vault-wide search;
63
+ `semanticScope: "graph"` (gph mode) when candidates must stay inside the
64
+ selected graph neighbors. Pass typed sub-queries via `semanticSearches`
65
+ using `lex`, `vec`, `hyde`, or `graph` types as appropriate.
66
+ Pass `semanticMode`, `semanticIntent`, `semanticLex`, `semanticVec`,
67
+ `semanticHyde`, and `semanticMinScore` for additional control.
68
+ Use `semanticStorage: "qmd-sqlite"` for the default qmd-compatible SQLite
69
+ store; set `embeddingSyncBeforeSearch: true` only when the native semantic
70
+ index must be refreshed before retrieval.
71
+ 6. Use `oms_sync_embeddings` for explicit update/embed sync.
72
+ 7. Use `oms_semantic_query`, `oms_semantic_status`, `oms_semantic_collections`,
73
+ or `oms_semantic_contexts` for qmd-compatible follow-ups on the native OMS index.
74
+ 8. Use read-only `oms_get_document` or `oms_multi_get_documents` to rehydrate
75
+ selected docids, paths, globs, or line ranges.
76
+ 9. For each note, return the retrieval-view fields and lazy-load body only when needed.
77
+ 10. Return results grouped by concept/folder with retrieval-view frontmatter.
40
78
 
41
79
  ## Example
42
80
 
@@ -55,6 +93,10 @@ Purpose: "Synthesize my transformer papers"
55
93
 
56
94
  ## Runtime
57
95
 
58
- Use MCP `oms_retrieve_context` for live graph/qmd retrieval. Use MCP
59
- `oms_retrieve_by_axis` only for legacy axis-first cache retrieval. Use MCP
60
- `oms_lazy_load_note` only after selecting candidate notes.
96
+ Use MCP `oms_retrieve_context` for live graph/semantic retrieval. Pass typed
97
+ sub-queries via `semanticSearches` (types: `lex`, `vec`, `hyde`, `graph`).
98
+ Use `semanticScope: "graph"` (gph mode) to confine semantic candidates to
99
+ graph neighbors. Use MCP `oms_sync_embeddings` for native semantic-index sync.
100
+ Use MCP `oms_get_document` or `oms_multi_get_documents` for document rehydration.
101
+ Use MCP `oms_retrieve_by_axis` only for legacy axis-first cache retrieval.
102
+ Use MCP `oms_lazy_load_note` only after selecting candidate notes.
@@ -19,14 +19,17 @@ This skill is **REAL in v0** — it shells out to the fully-implemented CLI.
19
19
  Shells out to:
20
20
 
21
21
  ```bash
22
- oms setup [--vault <path>] [--yes] [--install-claude]
22
+ oms setup [--vault <path>] [--yes] [--suggest-fields] [--install-claude]
23
23
  oms install [--runtime <auto|all|claude|codex|hermes>] [--vault <path>] [--dry-run] [--execute] [--yes]
24
24
  ```
25
25
 
26
26
  The CLI will:
27
27
  1. Scan your vault's existing top-level folders (does NOT impose a structure).
28
- 2. Interactively ask the `intent` for each folder (use `--yes` to skip prompts).
29
- 3. Write `vault/.oms/taxonomy.yaml` and copy default concept schemas.
28
+ 2. Interactively ask each folder's intent and concept binding (use `--yes` to accept defaults).
29
+ 3. Summarize observed frontmatter fields without changing notes.
30
+ 4. Optionally add selected observed fields to concept schemas with `--suggest-fields`.
31
+ 5. Ask for retrieval lenses and reject lenses that reference unknown fields.
32
+ 6. Write `vault/.oms/taxonomy.yaml` and preserve existing `vault/.oms/concepts/` files while adding missing defaults.
30
33
 
31
34
  ## Options
32
35
 
@@ -34,6 +37,7 @@ The CLI will:
34
37
  |------|-------------|
35
38
  | `--vault <path>` | Path to your Obsidian vault root (default: current directory) |
36
39
  | `--yes` | Non-interactive: accept all defaults, no prompts |
40
+ | `--suggest-fields` | Merge observed note frontmatter fields into concept schemas without mutating notes. |
37
41
  | `--install-claude` | Legacy setup-only dry-run that prints Claude Code plugin install and MCP registration commands. |
38
42
  | `install --runtime <name>` | Install host adapter/MCP registration for `auto`, `all`, `claude`, `codex`, or `hermes`. |
39
43
  | `install --dry-run` | Preview host writes without mutating config. |
@@ -45,6 +49,9 @@ The CLI will:
45
49
  # Interactive (recommended first run):
46
50
  oms setup --vault ~/Documents/MyVault
47
51
 
52
+ # Interactive setup with observed frontmatter field suggestions:
53
+ oms setup --vault ~/Documents/MyVault --suggest-fields
54
+
48
55
  # Non-interactive (CI / scripted):
49
56
  oms setup --vault ~/Documents/MyVault --yes
50
57
 
@@ -0,0 +1,45 @@
1
+ ---
2
+ name: oms-update
3
+ description: Update Oh My Second Brain and refresh installed host adapters.
4
+ ---
5
+
6
+ # Skill: oms-update (Claude Code)
7
+
8
+ Update the globally installed Oh My Second Brain package and reconcile host adapter surfaces.
9
+
10
+ ## Invocation
11
+
12
+ ```
13
+ /oms-update
14
+ ```
15
+
16
+ ## What this skill does
17
+
18
+ Shells out to:
19
+
20
+ ```bash
21
+ oms update [--runtime <auto|all|claude|codex|hermes>] [--vault <path>] [--dry-run] [--yes]
22
+ ```
23
+
24
+ The CLI will:
25
+ 1. Check the latest `oh-my-second-brain` version on npm.
26
+ 2. Print the planned package update and adapter reconciliation commands unless `--yes` is provided.
27
+ 3. With `--yes`, run `npm install -g oh-my-second-brain@latest`.
28
+ 4. Refresh host adapter/MCP registrations for the selected runtime.
29
+
30
+ ## Options
31
+
32
+ | Flag | Description |
33
+ |------|-------------|
34
+ | `--vault <path>` | Vault path used for MCP registration refresh. |
35
+ | `--runtime <name>` | Refresh `auto`, `all`, `claude`, `codex`, or `hermes`. |
36
+ | `--dry-run` | Preview update and reconciliation commands without mutating anything. |
37
+ | `--yes` | Perform the package update and adapter reconciliation. |
38
+ | `--execute` | Allow external host CLIs during reconciliation where available. |
39
+
40
+ ## Example
41
+
42
+ ```bash
43
+ oms update --dry-run --runtime all --vault ~/Documents/MyVault
44
+ oms update --yes --runtime all --vault ~/Documents/MyVault
45
+ ```
@@ -0,0 +1,52 @@
1
+ ---
2
+ name: oms-vault-decision-record
3
+ description: Records vault structural changes as ADR markdown in .oms/governance/decisions/. Update rule is SUPERSEDE-ONLY — new ADRs supersede old ones; existing ADRs are never deleted.
4
+ ---
5
+
6
+ # Skill: oms-vault-decision-record (Claude Code)
7
+
8
+ Record a vault structural decision as an Architecture Decision Record (ADR).
9
+
10
+ ## Invocation
11
+
12
+ ```
13
+ /oms-vault-decision-record
14
+ ```
15
+
16
+ ## What this skill does
17
+
18
+ Thin pointer to `core/skills/vault-decision-record`. Writes append-only ADR
19
+ files to `vaultRoot/.oms/governance/decisions/`. History is permanent — ADRs
20
+ are never deleted or renamed.
21
+
22
+ ## Agent-guided steps (v0)
23
+
24
+ 1. Scan `vaultRoot/.oms/governance/decisions/` for existing `ADR-NNNN-*.md` files
25
+ to determine the next sequential number. Create the directory if it does not exist.
26
+ 2. Slugify `title` (lowercase, hyphens, no special characters).
27
+ 3. Write `ADR-{NNNN}-{slug}.md` with the required frontmatter and three body sections:
28
+ **Context**, **Decision**, **Consequences**.
29
+ 4. If `supersedes` is provided, open the referenced ADR and set its `superseded_by`
30
+ field to the new ADR id. Never delete or rename the old file.
31
+ 5. Return `adrPath`, `adrId`, and `supersededPath` (or `null`).
32
+
33
+ ## Update rule — SUPERSEDE-ONLY
34
+
35
+ - Never delete an existing ADR.
36
+ - Never edit the `decision` or `consequences` body of an existing ADR.
37
+ - To revise a decision, write a new ADR with `supersedes: ADR-{old}`.
38
+ - `superseded_by` in the old ADR is the only mutation allowed on existing files.
39
+
40
+ ## Layer 1 CONTRACT guard
41
+
42
+ Never read, write, or modify `core/ontology/taxonomy.yaml`,
43
+ `core/ontology/concepts/*.yaml`, or `vaultRoot/.oms/taxonomy.yaml`.
44
+
45
+ ## Runtime
46
+
47
+ No MCP tool required — this is a pure TypeScript call against the filesystem.
48
+
49
+ ## NOTES
50
+
51
+ Wiki mirror deferred — the `wiki` skill is built by a parallel milestone (M3)
52
+ and its adapter mirror is intentionally deferred until that milestone lands.
@@ -0,0 +1,47 @@
1
+ ---
2
+ name: oms-vault-lint
3
+ description: Checker-lane-only vault linter — enforces the Layer 1 CONTRACT (taxonomy.yaml + concepts/*.yaml) across all notes in a vault via five checks. Never mutates vault files.
4
+ ---
5
+
6
+ # Skill: oms-vault-lint (Claude Code)
7
+
8
+ Verify that every markdown note in a vault conforms to its declared ontology.
9
+
10
+ ## Invocation
11
+
12
+ ```
13
+ /oms-vault-lint
14
+ ```
15
+
16
+ ## What this skill does
17
+
18
+ Thin pointer to `core/skills/vault-lint`. Runs five CONTRACT checks
19
+ (allowlist, required, type, enum, routing-law) across all notes. Read-only by
20
+ default; autofix requires explicit human-gate approval.
21
+
22
+ ## Agent-guided steps (v0)
23
+
24
+ 1. Load the ontology: `await loadOntology(path.join(vaultRoot, ".oms/ontology"))`.
25
+ 2. Call `lintVault(vaultRoot, ontology)`.
26
+ 3. If `report.clean` is false, surface `report.violations` to the user.
27
+ **Do NOT autofix without explicit user approval.**
28
+ 4. If autofix is explicitly approved, re-call with `{ autofixEnabled: true }`.
29
+ (Autofix is a no-op in v0.1.0 — reserved for a future human-gate protocol.)
30
+
31
+ ## Five checks
32
+
33
+ 1. **allowlist** — no frontmatter key outside the concept's declared field list.
34
+ 2. **required** — required fields must be present and non-empty.
35
+ 3. **type** — values must match the declared `FieldType` (string / url / date / list / number / boolean).
36
+ 4. **enum** — string fields with an `enum` array must use a listed value.
37
+ 5. **routing-law** — notes in agent-writable taxonomy zones must carry `created_by`.
38
+
39
+ ## Runtime
40
+
41
+ `lintVault` returns a `VaultLintReport`: `violations`, `scannedNotes`, `clean`.
42
+ No MCP tool is required — this is a pure TypeScript call against the filesystem.
43
+
44
+ ## NOTES
45
+
46
+ Wiki mirror deferred — the `wiki` skill is built by a parallel milestone (M3)
47
+ and its adapter mirror is intentionally deferred until that milestone lands.