oh-my-second-brain 0.13.0 → 0.15.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 (255) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +2 -2
  3. package/.codex-plugin/plugin.json +2 -2
  4. package/.mcp.codex.json +1 -0
  5. package/.mcp.json +1 -1
  6. package/CHANGELOG-assets.md +10 -0
  7. package/CHANGELOG-cli.md +14 -0
  8. package/CHANGELOG-kernel.md +18 -0
  9. package/CHANGELOG-mcp.md +20 -0
  10. package/CHANGELOG-vendors.md +7 -0
  11. package/CHANGELOG.md +11 -0
  12. package/README.ko.md +93 -24
  13. package/README.md +85 -23
  14. package/assets/claude/CLAUDE.md +5 -0
  15. package/assets/claude/hooks/oms-guard.mjs +3 -3
  16. package/assets/claude/hooks/oms-post-guard.mjs +5 -5
  17. package/assets/codex/AGENTS.md +9 -1
  18. package/assets/codex/rules/oms.md +27 -2
  19. package/assets/hermes/README.md +3 -3
  20. package/assets/hermes/SOUL.md +23 -0
  21. package/assets/hermes-manifest.json +2 -2
  22. package/assets/skills/distill/SKILL.md +8 -2
  23. package/assets/skills/doctor/SKILL.md +4 -2
  24. package/assets/skills/link/SKILL.md +12 -3
  25. package/assets/skills/search/SKILL.md +33 -5
  26. package/assets/skills/status/SKILL.md +27 -1
  27. package/assets/skills/template/SKILL.md +49 -9
  28. package/assets/skills/write/SKILL.md +58 -6
  29. package/dist/cli/args.d.ts +2 -12
  30. package/dist/cli/args.js +55 -126
  31. package/dist/cli/args.js.map +1 -1
  32. package/dist/cli/audit.d.ts +1 -0
  33. package/dist/cli/audit.js +21 -2
  34. package/dist/cli/audit.js.map +1 -1
  35. package/dist/cli/doc-command.d.ts +16 -0
  36. package/dist/cli/doc-command.js +54 -24
  37. package/dist/cli/doc-command.js.map +1 -1
  38. package/dist/cli/graph-command.d.ts +1 -0
  39. package/dist/cli/graph-command.js +92 -0
  40. package/dist/cli/graph-command.js.map +1 -0
  41. package/dist/cli/host-commands.d.ts +8 -14
  42. package/dist/cli/host-commands.js +139 -57
  43. package/dist/cli/host-commands.js.map +1 -1
  44. package/dist/cli/index-command.d.ts +8 -0
  45. package/dist/cli/index-command.js +149 -27
  46. package/dist/cli/index-command.js.map +1 -1
  47. package/dist/cli/link-check.d.ts +5 -0
  48. package/dist/cli/link-check.js +19 -0
  49. package/dist/cli/link-check.js.map +1 -0
  50. package/dist/cli/link-command.d.ts +2 -0
  51. package/dist/cli/link-command.js +257 -1
  52. package/dist/cli/link-command.js.map +1 -1
  53. package/dist/cli/linkify.d.ts +2 -2
  54. package/dist/cli/linkify.js +2 -2
  55. package/dist/cli/model-command.d.ts +2 -0
  56. package/dist/cli/model-command.js +178 -0
  57. package/dist/cli/model-command.js.map +1 -0
  58. package/dist/cli/note-command.d.ts +2 -0
  59. package/dist/cli/note-command.js +277 -0
  60. package/dist/cli/note-command.js.map +1 -0
  61. package/dist/cli/oms.d.ts +0 -4
  62. package/dist/cli/oms.js +177 -124
  63. package/dist/cli/oms.js.map +1 -1
  64. package/dist/cli/package-command.d.ts +1 -0
  65. package/dist/cli/package-command.js +82 -0
  66. package/dist/cli/package-command.js.map +1 -0
  67. package/dist/cli/search-usage.js +6 -11
  68. package/dist/cli/search-usage.js.map +1 -1
  69. package/dist/cli/search.d.ts +2 -9
  70. package/dist/cli/search.js +164 -53
  71. package/dist/cli/search.js.map +1 -1
  72. package/dist/cli/serve-http.d.ts +3 -0
  73. package/dist/cli/serve-http.js +150 -30
  74. package/dist/cli/serve-http.js.map +1 -1
  75. package/dist/cli/setup-command.d.ts +1 -1
  76. package/dist/cli/setup-command.js +70 -4
  77. package/dist/cli/setup-command.js.map +1 -1
  78. package/dist/cli/status-command.d.ts +1 -0
  79. package/dist/cli/status-command.js +124 -0
  80. package/dist/cli/status-command.js.map +1 -0
  81. package/dist/cli/template-command.d.ts +2 -0
  82. package/dist/cli/template-command.js +398 -0
  83. package/dist/cli/template-command.js.map +1 -0
  84. package/dist/cli/usage.js +45 -69
  85. package/dist/cli/usage.js.map +1 -1
  86. package/dist/kernel/capture/safe.d.ts +5 -0
  87. package/dist/kernel/capture/safe.js +309 -33
  88. package/dist/kernel/capture/safe.js.map +1 -1
  89. package/dist/kernel/contracts/index.d.ts +2 -0
  90. package/dist/kernel/contracts/index.js +18 -12
  91. package/dist/kernel/contracts/index.js.map +1 -1
  92. package/dist/kernel/conventions/note-exclude.js +11 -58
  93. package/dist/kernel/conventions/note-exclude.js.map +1 -1
  94. package/dist/kernel/conventions/report.js +1 -1
  95. package/dist/kernel/conventions/report.js.map +1 -1
  96. package/dist/kernel/conventions/write-contract.d.ts +2 -1
  97. package/dist/kernel/conventions/write-contract.js +12 -1
  98. package/dist/kernel/conventions/write-contract.js.map +1 -1
  99. package/dist/kernel/doctor/service.d.ts +23 -1
  100. package/dist/kernel/doctor/service.js +105 -0
  101. package/dist/kernel/doctor/service.js.map +1 -1
  102. package/dist/kernel/engine/embed/model.d.ts +27 -0
  103. package/dist/kernel/engine/embed/model.js +119 -3
  104. package/dist/kernel/engine/embed/model.js.map +1 -1
  105. package/dist/kernel/engine/embed/read-snapshot.d.ts +16 -0
  106. package/dist/kernel/engine/embed/read-snapshot.js +116 -0
  107. package/dist/kernel/engine/embed/read-snapshot.js.map +1 -0
  108. package/dist/kernel/engine/embed/repair.js +19 -7
  109. package/dist/kernel/engine/embed/repair.js.map +1 -1
  110. package/dist/kernel/engine/embed/store.js +118 -103
  111. package/dist/kernel/engine/embed/store.js.map +1 -1
  112. package/dist/kernel/engine/mcp/facade.js +8 -8
  113. package/dist/kernel/engine/mcp/facade.js.map +1 -1
  114. package/dist/kernel/engine/mcp/query-mapper.d.ts +1 -1
  115. package/dist/kernel/engine/mcp/query-mapper.js +2 -2
  116. package/dist/kernel/engine/mcp/query-mapper.js.map +1 -1
  117. package/dist/kernel/engine/mcp/types.d.ts +1 -1
  118. package/dist/kernel/engine/retrieval/taxonomy-context.js +1 -1
  119. package/dist/kernel/engine/retrieval/taxonomy-context.js.map +1 -1
  120. package/dist/kernel/harness/surface-registry.js +11 -13
  121. package/dist/kernel/harness/surface-registry.js.map +1 -1
  122. package/dist/kernel/install/asset-health.js +2 -2
  123. package/dist/kernel/install/asset-health.js.map +1 -1
  124. package/dist/kernel/install/common.js +1 -1
  125. package/dist/kernel/install/common.js.map +1 -1
  126. package/dist/kernel/link/convention-note.js +4 -4
  127. package/dist/kernel/link/convention-note.js.map +1 -1
  128. package/dist/kernel/runtime/event-journal.d.ts +12 -0
  129. package/dist/kernel/runtime/event-journal.js +311 -0
  130. package/dist/kernel/runtime/event-journal.js.map +1 -0
  131. package/dist/kernel/runtime/event-read.d.ts +3 -0
  132. package/dist/kernel/runtime/event-read.js +80 -0
  133. package/dist/kernel/runtime/event-read.js.map +1 -0
  134. package/dist/kernel/runtime/event-summary.d.ts +20 -0
  135. package/dist/kernel/runtime/event-summary.js +49 -0
  136. package/dist/kernel/runtime/event-summary.js.map +1 -0
  137. package/dist/kernel/runtime/event-types.d.ts +91 -0
  138. package/dist/kernel/runtime/event-types.js +10 -0
  139. package/dist/kernel/runtime/event-types.js.map +1 -0
  140. package/dist/kernel/search/morning-test-fixtures.js +6 -4
  141. package/dist/kernel/search/morning-test-fixtures.js.map +1 -1
  142. package/dist/kernel/searchbackend/engine-search-backend.js +4 -4
  143. package/dist/kernel/searchbackend/engine-search-backend.js.map +1 -1
  144. package/dist/kernel/setup/documents.d.ts +16 -8
  145. package/dist/kernel/setup/documents.js +12 -4
  146. package/dist/kernel/setup/documents.js.map +1 -1
  147. package/dist/kernel/setup/service.d.ts +11 -2
  148. package/dist/kernel/setup/service.js +27 -6
  149. package/dist/kernel/setup/service.js.map +1 -1
  150. package/dist/kernel/templates/canonical.d.ts +2 -5
  151. package/dist/kernel/templates/canonical.js +40 -6
  152. package/dist/kernel/templates/canonical.js.map +1 -1
  153. package/dist/kernel/templates/census.d.ts +54 -0
  154. package/dist/kernel/templates/census.js +735 -0
  155. package/dist/kernel/templates/census.js.map +1 -0
  156. package/dist/kernel/templates/compose-add.d.ts +27 -0
  157. package/dist/kernel/templates/compose-add.js +29 -0
  158. package/dist/kernel/templates/compose-add.js.map +1 -0
  159. package/dist/kernel/templates/content-contract.d.ts +160 -0
  160. package/dist/kernel/templates/content-contract.js +608 -0
  161. package/dist/kernel/templates/content-contract.js.map +1 -0
  162. package/dist/kernel/templates/contract-from-notes.d.ts +32 -0
  163. package/dist/kernel/templates/contract-from-notes.js +285 -0
  164. package/dist/kernel/templates/contract-from-notes.js.map +1 -0
  165. package/dist/kernel/templates/doctor.d.ts +12 -3
  166. package/dist/kernel/templates/doctor.js +195 -58
  167. package/dist/kernel/templates/doctor.js.map +1 -1
  168. package/dist/kernel/templates/extract.d.ts +7 -8
  169. package/dist/kernel/templates/extract.js +27 -20
  170. package/dist/kernel/templates/extract.js.map +1 -1
  171. package/dist/kernel/templates/file-lock.d.ts +3 -0
  172. package/dist/kernel/templates/file-lock.js +86 -0
  173. package/dist/kernel/templates/file-lock.js.map +1 -0
  174. package/dist/kernel/templates/hints.d.ts +36 -0
  175. package/dist/kernel/templates/hints.js +279 -0
  176. package/dist/kernel/templates/hints.js.map +1 -0
  177. package/dist/kernel/templates/index.d.ts +5 -3
  178. package/dist/kernel/templates/index.js +1 -1
  179. package/dist/kernel/templates/index.js.map +1 -1
  180. package/dist/kernel/templates/interview-ledger.d.ts +51 -0
  181. package/dist/kernel/templates/interview-ledger.js +236 -0
  182. package/dist/kernel/templates/interview-ledger.js.map +1 -0
  183. package/dist/kernel/templates/interview-service.d.ts +49 -0
  184. package/dist/kernel/templates/interview-service.js +484 -0
  185. package/dist/kernel/templates/interview-service.js.map +1 -0
  186. package/dist/kernel/templates/interview.d.ts +33 -0
  187. package/dist/kernel/templates/interview.js +813 -0
  188. package/dist/kernel/templates/interview.js.map +1 -0
  189. package/dist/kernel/templates/migration.d.ts +31 -33
  190. package/dist/kernel/templates/migration.js +443 -716
  191. package/dist/kernel/templates/migration.js.map +1 -1
  192. package/dist/kernel/templates/obsidian-core-time.d.ts +19 -0
  193. package/dist/kernel/templates/obsidian-core-time.js +82 -0
  194. package/dist/kernel/templates/obsidian-core-time.js.map +1 -0
  195. package/dist/kernel/templates/operations.d.ts +8 -0
  196. package/dist/kernel/templates/operations.js +116 -0
  197. package/dist/kernel/templates/operations.js.map +1 -0
  198. package/dist/kernel/templates/paths.d.ts +5 -2
  199. package/dist/kernel/templates/paths.js +20 -5
  200. package/dist/kernel/templates/paths.js.map +1 -1
  201. package/dist/kernel/templates/policy.d.ts +88 -39
  202. package/dist/kernel/templates/policy.js +247 -57
  203. package/dist/kernel/templates/policy.js.map +1 -1
  204. package/dist/kernel/templates/reconcile.d.ts +12 -0
  205. package/dist/kernel/templates/reconcile.js +434 -0
  206. package/dist/kernel/templates/reconcile.js.map +1 -0
  207. package/dist/kernel/templates/renderer.d.ts +12 -0
  208. package/dist/kernel/templates/renderer.js +67 -0
  209. package/dist/kernel/templates/renderer.js.map +1 -0
  210. package/dist/kernel/templates/resolver.d.ts +50 -2
  211. package/dist/kernel/templates/resolver.js +575 -115
  212. package/dist/kernel/templates/resolver.js.map +1 -1
  213. package/dist/kernel/templates/review-context.d.ts +22 -0
  214. package/dist/kernel/templates/review-context.js +201 -0
  215. package/dist/kernel/templates/review-context.js.map +1 -0
  216. package/dist/kernel/templates/transaction.d.ts +1 -2
  217. package/dist/kernel/templates/transaction.js +183 -106
  218. package/dist/kernel/templates/transaction.js.map +1 -1
  219. package/dist/kernel/templates/types.d.ts +61 -22
  220. package/dist/kernel/update/update.d.ts +1 -7
  221. package/dist/kernel/update/update.js +36 -102
  222. package/dist/kernel/update/update.js.map +1 -1
  223. package/dist/mcp/server.d.ts +7 -0
  224. package/dist/mcp/server.js +822 -579
  225. package/dist/mcp/server.js.map +1 -1
  226. package/dist/mcp/template-notice.d.ts +52 -0
  227. package/dist/mcp/template-notice.js +222 -0
  228. package/dist/mcp/template-notice.js.map +1 -0
  229. package/dist/mcp/update-notice.d.ts +2 -2
  230. package/dist/mcp/update-notice.js +6 -4
  231. package/dist/mcp/update-notice.js.map +1 -1
  232. package/dist/vendors/codex/codex.js +7 -30
  233. package/dist/vendors/codex/codex.js.map +1 -1
  234. package/dist/vendors/hermes/hermes.js +7 -4
  235. package/dist/vendors/hermes/hermes.js.map +1 -1
  236. package/docs/adapters.md +39 -1
  237. package/docs/architecture.md +82 -4
  238. package/docs/cli-map.md +116 -0
  239. package/docs/conventions.md +137 -10
  240. package/docs/install.md +122 -32
  241. package/docs/verified-target.md +3 -3
  242. package/package.json +2 -1
  243. package/skills/distill/SKILL.md +8 -2
  244. package/skills/doctor/SKILL.md +4 -2
  245. package/skills/link/SKILL.md +12 -3
  246. package/skills/search/SKILL.md +33 -5
  247. package/skills/status/SKILL.md +27 -1
  248. package/skills/template/SKILL.md +49 -9
  249. package/skills/write/SKILL.md +58 -6
  250. package/dist/cli/doctor-lint.d.ts +0 -17
  251. package/dist/cli/doctor-lint.js +0 -105
  252. package/dist/cli/doctor-lint.js.map +0 -1
  253. package/dist/kernel/templates/register.d.ts +0 -9
  254. package/dist/kernel/templates/register.js +0 -120
  255. package/dist/kernel/templates/register.js.map +0 -1
@@ -10,7 +10,7 @@
10
10
  {
11
11
  "name": "oms",
12
12
  "description": "Oh My Second Brain convention layer for Obsidian vaults — capture, retrieve, and validate knowledge under a declared semantic convention.",
13
- "version": "0.13.0",
13
+ "version": "0.15.0",
14
14
  "author": {
15
15
  "name": "gobeumsu",
16
16
  "email": "gobeumsu@gmail.com"
@@ -37,5 +37,5 @@
37
37
  ]
38
38
  }
39
39
  ],
40
- "version": "0.13.0"
40
+ "version": "0.15.0"
41
41
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "oms",
3
- "version": "0.13.0",
4
- "description": "Oh My Second Brain convention layer for Obsidian vaults — capture, retrieve, and validate knowledge under a declared semantic convention.",
3
+ "version": "0.15.0",
4
+ "description": "Oh My Second Brain convention layer for Obsidian vaults — seven shared skills and five MCP tools under a declared semantic convention.",
5
5
  "author": {
6
6
  "name": "gobeumsu"
7
7
  },
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "oms",
3
- "version": "0.13.0",
3
+ "version": "0.15.0",
4
4
  "description": "Oh My Second Brain convention layer for Obsidian vaults — Codex native rules, skills, and MCP adapter.",
5
- "_note": "oms install writes Codex MCP config, installs ~/.codex/rules/oms.md, and installs ~/.codex/skills/oms-*.",
5
+ "_note": "oms host install writes Codex MCP config and provenance, installs ~/.codex/rules/oms.md, and installs the seven shared skills under ~/.codex/skills/oms-*.",
6
6
  "skills": "./assets/skills/",
7
7
  "mcpServers": "./.mcp.codex.json"
8
8
  }
package/.mcp.codex.json CHANGED
@@ -3,6 +3,7 @@
3
3
  "oms": {
4
4
  "command": "oms",
5
5
  "args": [
6
+ "serve",
6
7
  "mcp",
7
8
  "--vault",
8
9
  "."
package/.mcp.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "mcpServers": {
3
3
  "oms": {
4
4
  "command": "oms",
5
- "args": ["mcp"]
5
+ "args": ["serve", "mcp"]
6
6
  }
7
7
  }
8
8
  }
@@ -4,6 +4,16 @@ Skills, agents, templates, and host guidance changes belong here.
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.15.0] - 2026-09-19
8
+
9
+ - **Host guidance now teaches selected-folder template sources instead of per-file registration or folder modes.** It documents the exact `템플릿에 변경이 있습니다` / `확인하기` / `나중에` notice, host-only deferral, long-lived `templateNotice` results, and the resumable `interview-next` → `interview-answer` → `commit-contracts` flow that publishes only user-confirmed controls. Placement is write-time only (explicit destination, then taxonomy default, then `ask`); source review preserves Markdown bytes and does not invent a registration prerequisite, widget, or host configuration.
10
+
11
+ ## [0.14.0] - 2026-09-05
12
+
13
+ - Shared skills and runtime guidance use the final command families and exclusive MCP operations, with no obsolete command aliases. Authored assets and the shipped root skill mirror remain byte-identical. (#125)
14
+ - Template and write guidance share the guarded CLI/MCP verbs and distinguish default note bindings from source-folder creation defaults. (#124)
15
+ - Status guidance distinguishes permanent external observation history from vault-owned convention files and avoids claiming inactivity from missing events. (#123)
16
+ - **Template and write skills distinguish external renderers from OMS note creation.** (#122) Hosts propose converted copies or observed contracts for user approval; the kernel validates them without executing scripts. Guidance explains missing Obsidian-filled values, external-body refusals, and unobserved contracts.
7
17
  ## [0.13.0] - 2026-09-05
8
18
 
9
19
  - **The npm package now ships a generated root `skills/` mirror of the single authored `assets/skills/` source for Gajae-Code, whose convention scan previously found zero OMS skills silently.**
package/CHANGELOG-cli.md CHANGED
@@ -4,6 +4,20 @@ Changes to the `oms` command surface belong here.
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.15.0] - 2026-09-19
8
+
9
+ - **Breaking: the template CLI now exposes a selected-folder census and linear review flow.** The exact leaves are `scan|list|show|add|update|move|remove|default|check|regenerate-types|review|answer|commit`; `scan` is read-only, `add <folder>` selects source scope, and `add --id <id> --from <file>` remains explicit source authoring rather than contract review. `answer <question-id> --answer <JSON> --census-digest <digest> --ledger-digest <digest|null>` forwards server-returned CAS fields, while `commit` adds the existing dry-run or `--yes --approved-digest` guard. This removes the per-file registration ritual without weakening verified-target writes; note creation considers `--folder <note-folder>` before a taxonomy default and then `ask`, with no template-creation target-folder form.
10
+
11
+ ## [0.14.0] - 2026-09-05
12
+
13
+ - HTTP routes reject malformed bodies and fields instead of coercing them into empty queries. Status retains unaffected component evidence when convention, history, engine, or graph health is unavailable. (#125)
14
+ - **CLI operations now have explicit, non-overlapping families.** (#125) `note`, `template`, `link`, `bridge`, `search`, `index`, `graph`, `host`, `package`, `model`, `serve`, `hook`, and `status` retain real capabilities without retired aliases. Package updates no longer force host synchronization; read-only health and server startup do not create a vault store.
15
+ - **The template command family exposes guarded convention management.** (#124) Inspect, scan, register, create, update, move, remove, check, and select default bindings through shared kernel operations. Mutations require a reviewed dry-run digest rather than direct vault edits.
16
+
17
+ - **Breaking: `oms setup --template-folder <path>` is repeatable and template folders are always selected explicitly.** (#120) Repeated paths are registered in `auto` scan/proposal mode, with the first explicit path becoming the template-creation default (separate from the note `defaultTemplate`). Without flags, setup reuses saved v3 folder registrations only; Obsidian and Templater settings are displayed as numbered dry-run candidates but are never selected automatically. An unresolved selection is blocked with `TEMPLATE_FOLDER_SELECTION_REQUIRED` and no approval digest.
18
+ - **Setup dry-runs now expose `diagnostics` and `starterTemplates` instead of failing at the first incompatible file.** (#121) Each excluded template names its error, path, field when applicable, and remediation, while compatible files remain reviewable; an all-incompatible selection is blocked with `TEMPLATE_CANDIDATE_INCOMPATIBLE`. When the selected default folder is empty, `starterTemplates` shows the proposed `note.md`, which is written only by an approved apply.
19
+ - **Doctor now reports template drift one file at a time.** (#121) Every `TEMPLATE_SOURCE_DRIFT` result includes the path, expected and actual SHA-256 signatures, remediation, and the registered template ID when available, making `regenerate-types` review specific rather than generic.
20
+
7
21
  ## [0.13.0] - 2026-09-05
8
22
 
9
23
  - **`oms doctor` now verifies Claude hook events plus the managed Codex and Hermes MCP registrations, preserving unreadable or syntactically malformed registration evidence as explicit inspection errors.**
@@ -4,6 +4,24 @@ Domain logic changes belong here.
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.15.0] - 2026-09-19
8
+
9
+ - **Breaking: template contracts now reconcile from an explicit selected-folder census instead of per-file registration or auto/manual modes.** Every `.md` beneath the selected scope is classified for add, edit, delete, or rename; source bytes stay in place and only user-confirmed `.oms` controls publish. The two-tier freshness gate hashes raw shared authorities first and then isolates changed templates as pending while preserving unrelated note writes. Metadata and bounded body-node contracts (with per-node requiredness/order) replace opaque body assumptions; anchored resumable questions and a locked CAS preserve unaffected answers. Historical ledger census is not blanket stale rejection: current request CAS and per-answer anchors govern validity. Ambiguous repeated body nodes remain contextualized, missing required-body rules require explicit disposition, and placement is optional during review then resolves at note creation by explicit destination, taxonomy default, or `ask`.
10
+ - **Review approval is bound to independently recorded source/body evidence, the exact captured controls, and the complete selected census.** Derived descriptors alone cannot transfer template identity; approved raw-body evidence preserves confirmation-only rename hints after restart without inferring body requirements. New unbound sources invalidate the reviewed scope, other template operations cannot absorb pending sibling edits, and deferred deletions remain actionable. Mutation and taxonomy identities normalize before routing so NFC/NFD spelling cannot lose source updates or authored placement. Public confirmation omits raw source/control byte arrays.
11
+
12
+ ## [0.14.0] - 2026-09-05
13
+
14
+ - Read-only engine connections use stable vault-external SQLite snapshots, including committed WAL content, so source sidecars remain untouched even while the reader is open. Store rebuild/drop repairs share verified-target admission and server-checked postconditions across entrypoints. (#125)
15
+ - Package installation is independent of host registration synchronization, preserving a clear upgrade boundary instead of invoking a retired reconciliation command. Read-only entrypoints continue to resolve existing stores or ephemeral cores without creating vault state. (#125)
16
+ - **Folder registration, binding removal, and default selection share template transaction safeguards.** (#124) Server-derived current signatures, exact approval and readback protect every mode. Existing source files survive binding removal; only explicit deletion of managed sources is permitted. Note creation uses an explicitly declared default binding when no ID is supplied, never the first available template.
17
+ - **Runtime template and note observations are retained outside the vault.** (#123) A host-and-vault-scoped SQLite journal preserves individual invocation and mutation events without note bodies, keeps unknown external change times explicit, and never participates in approval digests. Authoritative contracts are reverified on use rather than trusted for a fixed number of days; logging failures remain visible without undoing successful writes. Completed transactions remove staging payloads while retaining replay evidence.
18
+ - **Template renderer contracts distinguish OMS-renderable sources from external Obsidian templates.** (#122) Templater fields require caller-supplied values instead of copying raw tags, and external bodies are rejected. Script-first sources can propose contracts from existing notes with sample counts and field coverage; missing observations are reported as unobserved. Source and sample limits fail visibly rather than silently truncating proposals; OMS never executes or transpiles Templater scripts.
19
+ - **Breaking: template policy v3 replaces singular `templateFolder` with structured `templateFolders` registrations.** (#120) Each folder records `path`, `auto|manual` mode, and at most one template-creation default; template bindings retain their source folder, while note placement remains explicit JSON taxonomy authority through the separate `defaultTemplate`. The runtime no longer invents an `Inbox` or template directory, and unsupported older policy versions stay protected and fail closed while setup produces an explicit v3 proposal.
20
+ - **Template discovery now reports incompatible files without hiding compatible siblings.** (#121) Setup emits per-file `TEMPLATE_EXPRESSION_UNSUPPORTED`, `TEMPLATE_SOURCE_INVALID`, and `TEMPLATE_ID_DUPLICATE` diagnostics with the affected path, field when applicable, and remediation; only the named file is excluded, while a selection with no compatible candidates is blocked as `TEMPLATE_CANDIDATE_INCOMPATIBLE`. Proposed IDs also remove `.template` and `.eta` suffixes before slugging, so common template filenames keep useful stable identities.
21
+ - **Obsidian core formatted date and time tags are validated instead of rejected as unknown expressions.** (#121) `{{date:FMT}}` and `{{time:FMT}}` accept the tokens `YYYY YY MM M DD D HH H hh h mm m ss s A a` with `-`, `/`, `.`, `:`, space, or `T` separators; bracket literals remain unsupported. Date and datetime properties containing these tags no longer produce false type-conflict diagnostics.
22
+ - **Template source drift is now actionable per changed file.** (#121) Doctor reports one `TEMPLATE_SOURCE_DRIFT` item per changed authority or registered template, including its template ID when available, path, projected and actual SHA-256 signatures, and regeneration remediation, so independent changes are no longer collapsed into one generic failure.
23
+ - **An empty selected default template folder now yields an explicit starter proposal.** (#121) Setup dry-runs include the starter `note.md` and diagnostics without writing the vault; the starter is created only after approval through the same guarded transaction as the rest of setup.
24
+
7
25
  ## [0.13.0] - 2026-09-05
8
26
 
9
27
  - **Replaying an identical completed template registration now returns a verified `already-complete` receipt instead of failing, while conflicting template IDs remain rejected.** Replay recomputes the canonical input and every current physical output, including every registered source, before accepting the completed marker; any drift requires a new dry-run. Template input authority construction is shared by registration, resolution, and repair to prevent digest drift.
package/CHANGELOG-mcp.md CHANGED
@@ -4,6 +4,26 @@ MCP server tools and resources belong here.
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.15.0] - 2026-09-19
8
+
9
+ - The bundled MCP SDK now resolves `hono` 4.13.8, clearing the moderate advisory group that affected its HTTP transport's body and query parsing. Only the lockfile moves; no declared dependency is added or changed.
10
+ - Pending body contracts and incomplete fresh projection coverage also surface the generic template notice when no new raw source diff exists, so successful source authoring cannot hide the remaining contract confirmation.
11
+
12
+ - **Template review now uses exactly `interview-next`, `interview-answer`, and `commit-contracts` under `write { op: "template" }`, with a minimal notice and long-lived carrier.** Selected-folder census changes preserve source bytes and publish only user-confirmed controls through the guarded flow; an affected template is pending without blocking unrelated templates, while shared-authority drift still fails closed vault-wide. The initial display is exactly `템플릿에 변경이 있습니다` with exactly `확인하기` and `나중에`; `나중에` is host-only with no server call or ledger mutation, and `templateNotice` is surfaced on tool results even when boot instructions are stale. The five-tool surface is unchanged.
13
+
14
+ ## [0.14.0] - 2026-09-05
15
+
16
+ ### Changed
17
+
18
+ - Conflicting index mutations are serialized within each MCP server through engine disposal, so repair cannot move a store still owned by another request. A failed close returns `ENGINE_LIFECYCLE_FAILED` and blocks further index mutations until server restart; read-only requests remain independent. (#125)
19
+ - `status { op: "graph" }` returns graph-only health, while omitted `op` retains aggregate health. Doctor `sync-embeddings` repair mode requires `repairMode: "rebuild"` or `"drop"`, matching CLI store repair rather than silently forcing embeddings. (#125)
20
+ - **MCP detail capabilities have exclusive operation and mode boundaries.** (#125) Document lookup, index views, template inspection and embedding synchronization no longer overlap through duplicate operations or booleans. All capabilities remain under the same five tools, with schema and dispatch validated together.
21
+ - Template operations include guarded `register-folder`, `remove`, and `default` modes, with current signatures derived by the server. Update move strategies are validated consistently; note creation may omit its ID only when a default binding is declared. No additional MCP tool is introduced. (#124)
22
+ - Status and template listings expose local runtime observation history separately from the vault contract. Missing observations are reported as gaps, not inactivity; reading history never creates a vault store. (#123)
23
+ - Template writes respect renderer and Obsidian-filled field contracts, rejecting external bodies and unresolved values without copying raw Templater tags. The five-tool surface and digest-approved transaction boundary are unchanged. (#122)
24
+ - The search receipt field `drift` was renamed to `indexDrift`; no compatibility alias is retained.
25
+ - **`write { op: "template", mode: "register-existing" }` now requires `sourceFolder` together with `sourcePath`.** The folder must be a registered v3 template source folder containing the existing Markdown file. This keeps template source identity distinct from taxonomy note placement while retaining the existing dry-run, approval-digest, and compare-and-swap flow. The MCP surface remains exactly five public tools.
26
+
7
27
  ## [0.13.0] - 2026-09-05
8
28
 
9
29
  ### Added
@@ -4,6 +4,13 @@ Per-host adapter and installer changes belong here.
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.15.0] - 2026-09-19
8
+
9
+ - **Claude, Codex, and Hermes guidance now aligns with folder-sourced template contracts.** Each native host surface explains selected-folder census without per-file registration or folder modes, the exact minimal notice and host-only `나중에`, and the resumable `interview-next` → `interview-answer` → `commit-contracts` flow. Review preserves source bytes and publishes only user-confirmed controls; affected-template pending remains scoped while shared-authority failures stay fail-closed globally. Note creation uses explicit folder, taxonomy default, then `ask`, without changing the host-specific skill/tool asymmetry.
10
+
11
+ ## [0.14.0] - 2026-09-05
12
+
13
+ - Native host launch manifests use `oms serve mcp`; registrations retain seven shared skills and exactly five MCP tools. Host synchronization updates OMS assets independently of package installation and never upgrades the host application. (#125)
7
14
  ## [0.13.0] - 2026-09-05
8
15
 
9
16
  - **The shipped GJC skills mirror is now checked file-for-file against authored skills, with drift failures directing contributors to `npm run sync:skills`.**
package/CHANGELOG.md CHANGED
@@ -10,6 +10,17 @@ This aggregate changelog contains changes that span multiple layers.
10
10
 
11
11
  ## [Unreleased]
12
12
 
13
+ ## [0.15.0] - 2026-09-19
14
+
15
+ - **Breaking: a selected template folder, not a per-file registration step, is what makes a template usable.** Every `.md` beneath a folder you explicitly select is a census candidate tracked by content hash, so adding, editing, deleting, or renaming a source is picked up without registering each file and without the retired auto/manual folder modes. This spans layers deliberately: the kernel owns the census, contract derivation, interview ledger, and guarded reconcile; the CLI gains `oms template review|answer|commit`; MCP gains the matching `interview-next`, `interview-answer`, and `commit-contracts` modes plus the notice carrier; and the shared skills and host guidance describe one vocabulary. The five MCP tools and seven skills are unchanged.
16
+
17
+ Your files stay yours. Review reads and verifies source bytes where they already are and publishes only `.oms` control files through the existing exact-digest transaction — it never rewrites a template or an existing note. A change surfaces as exactly `템플릿에 변경이 있습니다` with `확인하기` and `나중에`, naming nothing; `나중에` is handled by the host alone. Confirming opens one linear interview that asks only what it must, keeps confirmed answers that the edit did not touch, resumes after an interruption, re-asks only the answers whose anchored part of the source actually changed, and still ends at an explicit final confirmation even when nothing is left to ask. Contracts now describe frontmatter *and* a bounded body grammar with per-node requiredness and order; what OMS observed and what you confirmed stay separate, so an ambiguous source asks rather than inventing a rule.
18
+
19
+ A changed template no longer stalls the rest of the vault: shared authority files still fail closed vault-wide, but a single edited source makes only its own template pending while unrelated notes keep writing. Approval records independently derived source and body evidence, so a hand-edited projection can never transfer a template's identity. Note placement is no longer a precondition for having a contract — it is resolved when a note is created, from an explicit destination, then the taxonomy default, then by asking. See ADR-013.
20
+
21
+ ## [0.14.0] - 2026-09-05
22
+
23
+ - **Breaking: commands have one noun-and-verb home across CLI, MCP, skills, and host launchers.** (#125) Note, template, wikilink, bridge, index, graph, host, package, and model operations no longer overlap through legacy top-level aliases. The five MCP tools remain; exclusive operations retain the underlying capabilities. See `docs/cli-map.md` for the full map. Native MCP launch is `oms serve mcp`.
13
24
  ## [0.13.0] - 2026-09-05
14
25
 
15
26
  - **Breaking: the OMS namespace now renders exactly once. Tools appear as `oms_write`, not `oms_oms_write`.** The server was registered under the id `oms` while its tools were *also* named `oms_write`, `oms_search`, `oms_link`, `oms_status`, and `oms_doctor`, so every host that qualifies a tool as `<server>_<tool>` displayed the product namespace twice — Hermes showed `oms_oms_write`, internally `mcp__oms__oms_write`. The MCP-local names are now capability-only: `write`, `search`, `link`, `status`, `doctor`. Qualifying hosts render `oms_write` and its peers; Claude and Codex render `mcp__oms__write`. This spans layers deliberately — the tool surface, the bundled skills' `mcp_tool` values, the host manifests, and every piece of host guidance moved together, so there is one coherent five-capability surface and no aliases. **Raw MCP clients must migrate**: `oms_write` → `write`, `oms_search` → `search`, `oms_link` → `link`, `oms_status` → `status`, `oms_doctor` → `doctor`, and the `status.writeTools` response strings from `oms_write-*` → `write-*`. Hosts that qualify tool names need no change. The demoted operations behind `op` are untouched, and a parity gate now fails the build if any advertised tool name carries the `oms_` prefix or if a supported host would render a doubled namespace. (#107)
package/README.ko.md CHANGED
@@ -8,14 +8,16 @@ Oh My Second Brain(`oms`)은 기존 Obsidian/Markdown 볼트를 노트 소유권
8
8
  - 각 템플릿은 경로·digest와 독립적인 안정적 `templateId`를 가지며, 볼트 전체의 `BaseContract` 하나를 상속한다.
9
9
  - `.obsidian/types.json`은 읽기 전용 타입 권위다.
10
10
  - 사용자 소유 온톨로지는 계속 활성 상태다. `.oms/template-policy.json`은 노트·필드 의미와 필수값, 형식, 허용값, 기본값, 이름 규칙, 정체성, 바인딩을 기록한다.
11
- - `.oms/taxonomy.json`은 폴더·링크 의미와 배치를 소유하며, 작성된 폴더 의미는 `folder-ontology` 검색 축으로 노출된다. runtime의 유일한 권위이며, setup이 레거시 YAML을 한 번 변환한다.
11
+ - `.oms/taxonomy.json`은 폴더·링크 의미와 배치를 소유하며, 작성된 폴더 의미는 `folder-ontology` 검색 축으로 노출된다. runtime의 유일한 권위다.
12
12
  - `.oms/types.json`은 쓰기·검색용 검증된 파생 projection이다. 직접 편집하지 않는다.
13
13
 
14
14
  제거된 것은 노트 정체성으로서의 `concept`와 번들 runtime 기본값이지, 의미 계층으로서의 온톨로지가 아니다.
15
15
 
16
16
  ## 설정
17
17
 
18
- Setup은 기존 템플릿을 재귀 탐색하고 migration을 제안한다. 노트 타입 기본값을 번들로 강요하지 않으며 노트를 수정하지 않는다.
18
+ Setup은 명시적으로 선택한 템플릿 폴더 안의 기존 템플릿을 재귀 탐색하고
19
+ migration을 제안한다. 노트 타입 기본값을 번들로 강요하지 않으며 노트를
20
+ 수정하지 않는다.
19
21
 
20
22
  ```bash
21
23
  oms setup --vault /path/to/vault --dry-run
@@ -24,23 +26,69 @@ oms setup --vault /path/to/vault --yes --approved-digest <표시된-digest>
24
26
 
25
27
  관리 템플릿 변경도 dry-run, 호출자가 검토한 정확한 digest, CAS, transaction, 사후조건 receipt를 거친다.
26
28
 
29
+ ## 템플릿 흐름
30
+
31
+ 명시적으로 선택한 템플릿 폴더 아래의 모든 `.md`는 템플릿 원본
32
+ 후보가 된다. review는 원본을 검증하고 같은 위치의 바이트를 보존하며,
33
+ 파일별 등록 절차나 auto/manual 폴더 mode는 필요하지 않다. OMS는
34
+ 메타데이터 계약(frontmatter key·type·requiredness·`filledBy`)과 제한된
35
+ 본문 구조(ATX heading, fence code block, fence 밖의 ordered/unordered list
36
+ run, `<!-- oms:content -->`, 문서 순서/EOL/BOM/final-newline)를 함께
37
+ 도출한다. paragraph, setext heading, 모든 Markdown을 강제한다고 주장하지
38
+ 않는다. 원본이 바뀌면 의존하는 템플릿만 pending이 되므로 다른 템플릿
39
+ 쓰기는 계속 가능하며, shared authority 변경이나 불일치는 볼트 전체를
40
+ fail-closed 한다.
41
+
42
+ 선택한 폴더의 원본이 바뀌면 호스트에 처음 표시할 알림은 정확히
43
+ `템플릿에 변경이 있습니다`이며, 동작은 정확히 `확인하기`와 `나중에`다.
44
+ 처음 알림에는 템플릿 이름·hash·change class를 표시하지 않는다.
45
+ `나중에`는 host-only로 server를 호출하지 않고 interview ledger도 바꾸지
46
+ 않는다. `확인하기`는 MCP `write { op: "template", mode: "interview-next" }`로
47
+ 선형 resumable interview를 시작한다. 서버가 반환한 다음 질문을 따라
48
+ 진행하고 영향 없는 confirmed answer는 보존한다. 모든 필요한 질문 뒤에는
49
+ 정확한 최종 digest를 보여주고 사용자가 승인한 경우에만
50
+ `mode: "commit-contracts"`로 `.oms` control만 publish한다. self-approve하지
51
+ 않는다. `status`와 search는 계속 읽기 전용이며 boot instruction이 stale한
52
+ long-lived host도 반환된 `templateNotice`를 표시해야 한다.
53
+
54
+ 정확한 CLI review 흐름은 다음과 같다.
55
+
56
+ ```text
57
+ oms template review
58
+ oms template answer <question-id> --answer <JSON> --census-digest <digest> --ledger-digest <digest|null>
59
+ oms template commit --census-digest <digest> --ledger-digest <digest|null> --dry-run
60
+ oms template commit --census-digest <digest> --ledger-digest <digest|null> --yes --approved-digest <digest>
61
+ ```
62
+
63
+ answer는 서버가 반환한 question과 CAS 값을 사용한다. commit은 같은 CAS
64
+ 값과 기존 dry-run 또는 yes/approved-digest guard를 함께 사용한다.
65
+
66
+ 정확한 note 생성 사용법은 다음과 같다.
67
+
68
+ ```text
69
+ oms note create [template-id] --body <text>|--body-file <file> [--frontmatter <json>|--frontmatter-file <file>] [--folder <note-folder>]
70
+ ```
71
+
72
+ 노트 생성 시 배치 우선순위는 명시적 caller folder, taxonomy default, `ask`
73
+ 순서이며, 배치가 없다고 contract review를 막지 않는다.
74
+
27
75
  ## CLI
28
76
 
29
77
  ```text
30
- oms setup 기존 볼트 템플릿 탐색 및 채택
31
- oms install 호스트 어댑터와 관리형 MCP 등록 설치
32
- oms uninstall 호스트 어댑터와 관리형 MCP 등록 제거
33
- oms update 패키지 업데이트 확인/적용 후 어댑터 재조정
34
- oms reconcile 엄격한 전역 볼트 포인터로 호스트 재기록
35
- oms doctor 템플릿 권위와 파생 상태 진단
36
- oms lint 깨진 [[wikilink]]와 고아 노트 점검
37
- oms search <text> 일반 lexical 검색; --vec, --hyde, --expand, --max-queries 1..32, --rerank은 명시적 선택
38
- oms embed 색인된 노트의 임베딩 생성
39
- oms index sync|status|repair|cleanup|collections|contexts
40
- oms doc get|multi-get
41
- oms serve 로컬 검색 HTTP 서버 시작
42
- oms mcp stdio MCP 서버 시작
43
- oms hook Claude pre/post tool-use 볼트 가드 실행
78
+ oms setup 기존 볼트 템플릿 탐색 및 채택
79
+ oms template scan|list|show|add|update|move|remove|default|check|regenerate-types|review|answer|commit
80
+ oms note create|append|update|audit|backfill|get
81
+ oms link check|suggest|apply 노트 wikilink 점검·제안·적용
82
+ oms bridge add|remove|status 저장소-볼트 target bridge 관리
83
+ oms search query|context 명시적 query 실행 또는 구조화 context 조회
84
+ oms index sync|embed|repair|status|clean 파생 검색 상태 관리
85
+ oms graph build|status 노트 그래프 생성 또는 조회
86
+ oms host install|remove|sync|status 호스트 asset과 MCP 등록 관리
87
+ oms package check|update OMS 패키지 확인 또는 업데이트
88
+ oms model install|select|waive|status 로컬 모델 선택 관리
89
+ oms serve mcp|http stdio MCP 또는 로컬 HTTP 서버 시작
90
+ oms hook pre|post pre/post-tool-use 볼트 가드 실행
91
+ oms status 읽기 전용 종합 상태 표시
44
92
  ```
45
93
 
46
94
  `oh-my-second-brain`은 전체 명령이고 `oms`는 짧은 별칭이다.
@@ -50,11 +98,14 @@ oms hook Claude pre/post tool-use 볼트 가드 실행
50
98
  인식된 모든 명령은 `--help`와 `-h`를 받아들이며, exit 0으로 종료하고
51
99
  부작용을 수행하지 않는다. 알 수 없는 명령에 `--help`를 함께 주면 exit 1로 종료한다.
52
100
 
53
- `oms search <text>`는 lexical-only다. `--vec`, `--hyde`는 각각의 typed
54
- channel을 선택하고, `--expand`는 G004 expansion을 명시적으로 켜며,
55
- `--max-queries`는 1부터 32까지의 정수만 받는다. `--rerank`도 opt-in이다.
56
- `oms embed`가 유일한 embedding 명령이며 `oms index`에는 embedding
57
- subcommand가 없다.
101
+ `oms search query <text>`는 lexical-only다. `--vec`, `--hyde`는 각각의
102
+ typed channel을 선택하고, `--expand`는 G004 expansion을 명시적으로
103
+ 켜며, `--max-queries`는 1부터 32까지의 정수만 받는다. `--rerank`도
104
+ opt-in이다. `oms search context`는 별도의 구조화 context 표면이다.
105
+ Embedding은 명시적으로 `oms index embed`를 사용하며 sync와 repair는
106
+ 서로 다른 index mode다. `oms index status --view status|collections|contexts`는
107
+ 세 읽기 전용 view를 모두 보존하고, `oms index clean`은 제거 가능한 파생
108
+ 상태를 정리한다.
58
109
 
59
110
  Vector 검색에는 검증된 로컬 embedding capability가 필요하다. 선택 경로는
60
111
  완전한 `OMS_EMBEDDING_PROVIDER`/`OMS_EMBEDDING_MODEL` 쌍, vault의
@@ -71,7 +122,7 @@ Setup에서는 로컬 검증 acquisition 정책 하나를 선택한다:
71
122
 
72
123
  ## MCP 도구
73
124
 
74
- `oms mcp`는 정확히 다섯 개의 공개 도구를 노출한다:
125
+ `oms serve mcp`는 정확히 다섯 개의 공개 도구를 노출한다:
75
126
 
76
127
  `write` · `search` · `link` · `status` · `doctor`
77
128
 
@@ -79,6 +130,13 @@ Setup에서는 로컬 검증 acquisition 정책 하나를 선택한다:
79
130
 
80
131
  쓰기는 하나의 `ResolvedTemplate`을 해석해 create, append, update를 수행한다. 템플릿 변경, projection 재생성, 한 노트 정체성 backfill은 검증된 target과 명시적 승인 digest가 필요하다. `status`와 모든 검색 동작은 읽기 전용이다.
81
132
 
133
+ 템플릿 contract review는 `oms_write`의 `op: "template"`에서 정확히
134
+ `interview-next`, `interview-answer`, `commit-contracts` mode를 사용한다.
135
+ 정확한 CLI 대응은 `oms template review`, `oms template answer`,
136
+ `oms template commit`이다. answer는 서버가 반환한 question, request, CAS
137
+ field를 그대로 사용하며 parameter 이름을 만들지 않는다. 질문이 0개면
138
+ 곧바로 최종 확인으로 간다.
139
+
82
140
  일반 lexical 검색은 projection과 독립적이다. 템플릿·선언 필드·폴더·링크 축은 쓰기와 같은 projection을 사용하며 누락·stale 상태를 크게 실패시킨다. 관리 템플릿 원본은 검색 대상에서 제외한다. Vector/HyDE는 provider와 model이 모두 설정되지 않으면 가짜 대체 없이 실패한다.
83
141
 
84
142
  ## 설치
@@ -87,12 +145,23 @@ Node.js 20 이상이 필요하다.
87
145
 
88
146
  ```bash
89
147
  npm install -g oh-my-second-brain
90
- oms install --runtime all --vault /path/to/vault --yes
148
+ oms host install --runtime all --vault /path/to/vault --yes
91
149
  ```
92
150
 
93
151
  Gajae-Code에서는 npm 패키지를 marketplace plugin으로 설치한다: `gjc plugin install oms@oms`. GJC는 패키지 루트의 `skills/` convention path에서 일곱 OMS skill을 발견한다.
94
152
 
95
- 호스트 설치는 canonical 볼트를 `${XDG_CONFIG_HOME:-~/.config}/oms/vault.json`에 기록하고 각 관리형 등록에 `oms mcp --vault /path/to/vault`를 넣는다. `install`, `update`, `reconcile`, `uninstall`만 이 서명된 포인터를 호스트 stamp 관리에 사용한다. 런타임 쓰기·검색 target 해석은 포인터를 읽지 않으며 명시적 target, 로컬 볼트 control, bridge, `OMS_VAULT`, 읽기 전용 cwd fallback 순서를 유지한다.
153
+ 호스트 설치는 canonical 볼트를
154
+ `${XDG_CONFIG_HOME:-~/.config}/oms/vault.json`에 기록하고 각 관리형
155
+ 등록에 `oms serve mcp --vault /path/to/vault`를 넣는다.
156
+ `oms host install|remove|sync|status`만 이 서명된 포인터로 호스트 통합을
157
+ 관리한다.
158
+ `oms package update`는 패키지만 업데이트하고 호스트를 암묵적으로
159
+ 동기화하지 않는다. `oms host sync`는 별도로 실행한다.
160
+
161
+ 런타임 쓰기·검색 target 해석은 호스트 관리 포인터를 읽지 않는다.
162
+ 우선순위는 명시적 target, 로컬 볼트 control, bridge, `OMS_VAULT`, 그리고
163
+ 안전한 읽기 전용 fallback으로서의 cwd 순서다. 변경 작업은 cwd fallback을
164
+ 사용할 수 없다.
96
165
 
97
166
  `OMS_VAULT`는 명시적·로컬·bridge target이 없을 때 사용하는 지원 환경변수 fallback이다.
98
167
 
package/README.md CHANGED
@@ -8,14 +8,16 @@ Oh My Second Brain (`oms`) connects an existing Obsidian or Markdown vault to AI
8
8
  - Each template has a stable `templateId`, independent of its path and digest, and inherits one vault-wide `BaseContract`.
9
9
  - `.obsidian/types.json` is read-only type authority.
10
10
  - The user-owned ontology remains active: `.oms/template-policy.json` records note/field meaning alongside requiredness, formats, allowed values, defaults, naming, identity, and bindings.
11
- - `.oms/taxonomy.json` records folder/link meaning and owns placement; authored folder intents are exposed through the `folder-ontology` search axis. It is the sole runtime authority; setup performs the one-time legacy YAML conversion.
11
+ - `.oms/taxonomy.json` records folder/link meaning and owns placement; authored folder intents are exposed through the `folder-ontology` search axis. It is the sole runtime authority.
12
12
  - `.oms/types.json` is a validated derived write/search projection. Never hand-edit it.
13
13
 
14
14
  The retired model is `concept` as note identity and bundled runtime defaults—not ontology as semantic meaning.
15
15
 
16
16
  ## Setup
17
17
 
18
- Setup recursively discovers existing templates and proposes migration. It ships no note-type defaults and never modifies notes.
18
+ Setup recursively discovers existing templates within explicitly selected
19
+ template folders and proposes migration. It ships no note-type defaults and
20
+ never modifies notes.
19
21
 
20
22
  ```bash
21
23
  oms setup --vault /path/to/vault --dry-run
@@ -24,23 +26,68 @@ oms setup --vault /path/to/vault --yes --approved-digest <shown-digest>
24
26
 
25
27
  Managed-template changes use the same dry-run, exact caller approval, compare-and-swap, transaction, and postcondition receipt boundary.
26
28
 
29
+ ## Template workflow
30
+
31
+ An explicitly selected template folder makes every `.md` beneath it a template
32
+ source candidate. Review verifies the source and preserves its bytes in place;
33
+ no per-file registration or auto/manual folder mode is required. OMS derives
34
+ both metadata (frontmatter keys, types, requiredness, and `filledBy`) and a
35
+ bounded body structure (ATX headings, fenced code blocks, ordered/unordered
36
+ list runs outside fences, `<!-- oms:content -->`, and document
37
+ order/EOL/BOM/final-newline details). It does not claim to enforce paragraphs,
38
+ setext headings, or all Markdown. A changed source makes only its dependent
39
+ template pending, so unrelated writes remain available; shared-authority
40
+ changes or mismatches fail closed for the whole vault.
41
+
42
+ When a selected-folder source changes, the initial host notice is exactly
43
+ `템플릿에 변경이 있습니다` with exactly `확인하기` and `나중에`; it names no
44
+ template and shows no hash or change class. `나중에` is host-only and makes no
45
+ server call or ledger mutation. `확인하기` starts a linear, resumable interview
46
+ through MCP `write { op: "template", mode: "interview-next" }`. Continue with
47
+ the server-returned next question, preserving unaffected confirmed answers.
48
+ After all necessary questions, show the exact final digest and publish only
49
+ `.oms` controls after the user approves it with `mode: "commit-contracts"`; never
50
+ self-approve. `status` and search remain read-only, and long-lived hosts
51
+ surface a returned `templateNotice` even when boot instructions are stale.
52
+
53
+ The exact CLI review flow is:
54
+
55
+ ```text
56
+ oms template review
57
+ oms template answer <question-id> --answer <JSON> --census-digest <digest> --ledger-digest <digest|null>
58
+ oms template commit --census-digest <digest> --ledger-digest <digest|null> --dry-run
59
+ oms template commit --census-digest <digest> --ledger-digest <digest|null> --yes --approved-digest <digest>
60
+ ```
61
+
62
+ Answer uses the server-returned question and CAS values. Commit uses the same
63
+ CAS values plus the existing dry-run or yes/approved-digest guard.
64
+
65
+ The exact note-create usage is:
66
+
67
+ ```text
68
+ oms note create [template-id] --body <text>|--body-file <file> [--frontmatter <json>|--frontmatter-file <file>] [--folder <note-folder>]
69
+ ```
70
+
71
+ At note creation, placement is explicit caller folder, then the taxonomy
72
+ default, then `ask`; missing placement does not block contract review.
73
+
27
74
  ## CLI
28
75
 
29
76
  ```text
30
- oms setup Discover and adopt existing vault templates
31
- oms install Install host adapters and managed MCP registration
32
- oms uninstall Remove host adapters and managed MCP registration
33
- oms update Check/apply a package update and reconcile adapters
34
- oms reconcile Re-stamp hosts from the strict global vault pointer
35
- oms doctor Diagnose template authority and derived state
36
- oms lint Check broken [[wikilinks]] and orphan notes
37
- oms search <text> Plain lexical search; --vec, --hyde, --expand, --max-queries 1..32, and --rerank are explicit
38
- oms embed Generate embeddings for indexed notes
39
- oms index sync|status|repair|cleanup|collections|contexts
40
- oms doc get|multi-get
41
- oms serve Start the local search HTTP server
42
- oms mcp Start the stdio MCP server
43
- oms hook Run Claude pre/post tool-use vault guards
77
+ oms setup Discover and adopt existing vault templates
78
+ oms template scan|list|show|add|update|move|remove|default|check|regenerate-types|review|answer|commit
79
+ oms note create|append|update|audit|backfill|get
80
+ oms link check|suggest|apply Check, suggest, or apply note wikilinks
81
+ oms bridge add|remove|status Manage repository-to-vault target bridges
82
+ oms search query|context Run an explicit query or retrieve structured context
83
+ oms index sync|embed|repair|status|clean Manage derived search state
84
+ oms graph build|status Build or inspect the note graph
85
+ oms host install|remove|sync|status Manage host assets and MCP registrations
86
+ oms package check|update Check or update the OMS package
87
+ oms model install|select|waive|status Manage local model selection
88
+ oms serve mcp|http Start the stdio MCP or local HTTP server
89
+ oms hook pre|post Run pre- or post-tool-use vault guards
90
+ oms status Show the read-only aggregate status
44
91
  ```
45
92
 
46
93
  `oh-my-second-brain` is the full command; `oms` is its short alias.
@@ -50,10 +97,13 @@ oms hook Run Claude pre/post tool-use vault guards
50
97
  Every recognized command accepts `--help` and `-h`, exits 0, and performs no
51
98
  side effects. An unknown command combined with `--help` exits 1.
52
99
 
53
- `oms search <text>` is lexical-only. `--vec` and `--hyde` select their respective
54
- typed channels; `--expand` explicitly enables G004 expansion, `--max-queries`
55
- accepts an integer from 1 through 32, and `--rerank` is opt-in. `oms embed` is
56
- the sole embedding command; `oms index` has no embedding subcommand.
100
+ `oms search query <text>` is lexical-only. `--vec` and `--hyde` select their
101
+ respective typed channels; `--expand` explicitly enables G004 expansion,
102
+ `--max-queries` accepts an integer from 1 through 32, and `--rerank` is opt-in.
103
+ `oms search context` is the separate structured-context surface. Embedding is
104
+ explicitly `oms index embed`; sync and repair are distinct index modes.
105
+ `oms index status --view status|collections|contexts` preserves all three
106
+ read-only views, while `oms index clean` removes eligible derived state.
57
107
 
58
108
  Vector search requires a verified local embedding capability, selected by a
59
109
  complete `OMS_EMBEDDING_PROVIDER`/`OMS_EMBEDDING_MODEL` pair, the vault's
@@ -69,7 +119,7 @@ During setup, choose one local verified acquisition policy:
69
119
 
70
120
  ## MCP tools
71
121
 
72
- `oms mcp` exposes exactly five public tools:
122
+ `oms serve mcp` exposes exactly five public tools:
73
123
 
74
124
  `write` · `search` · `link` · `status` · `doctor`
75
125
 
@@ -77,6 +127,13 @@ The seven skills (`write`, `search`, `link`, `distill`, `status`, `doctor`, `tem
77
127
 
78
128
  Writes resolve one `ResolvedTemplate` and support create, append, and update. Template mutation, projection regeneration, and one-note identity backfill require a verified target and explicit approval digest. `status` and every search operation are read-only.
79
129
 
130
+ Template contract review uses `oms_write` with `op: "template"` and exactly
131
+ `interview-next`, `interview-answer`, and `commit-contracts` modes. The exact
132
+ CLI counterparts are `oms template review`, `oms template answer`, and
133
+ `oms template commit`. Answer submissions use the server-returned question,
134
+ request, and CAS fields; hosts must not invent parameter names. A zero-question
135
+ response proceeds directly to final confirmation.
136
+
80
137
  Plain lexical search is projection-independent. Typed template/declared-field/folder/link axes use the same projection as writes and fail loudly when it is missing or stale. Managed template sources are excluded. Vector and HyDE requests fail loudly unless both embedding provider and model are configured.
81
138
 
82
139
  ## Install
@@ -85,12 +142,17 @@ Node.js 20 or later is required.
85
142
 
86
143
  ```bash
87
144
  npm install -g oh-my-second-brain
88
- oms install --runtime all --vault /path/to/vault --yes
145
+ oms host install --runtime all --vault /path/to/vault --yes
89
146
  ```
90
147
 
91
148
  For Gajae-Code, install the npm package as a marketplace plugin: `gjc plugin install oms@oms`. GJC discovers the seven OMS skills at the package-root `skills/` convention path.
92
149
 
93
- Host installation records the canonical vault in `${XDG_CONFIG_HOME:-~/.config}/oms/vault.json` and stamps `oms mcp --vault /path/to/vault` into each managed host entry. `install`, `update`, `reconcile`, and `uninstall` use that signed pointer only to maintain host stamps. Runtime write/search target resolution never reads it and keeps this precedence: explicit target, local vault controls, bridge, `OMS_VAULT`, then read-only cwd fallback.
150
+ 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.
151
+
152
+ Runtime write/search target resolution never reads the host-maintenance pointer.
153
+ Its precedence is explicit target, local vault controls, bridge, `OMS_VAULT`,
154
+ then cwd only as a safe read-only fallback. Mutations cannot use the cwd
155
+ fallback.
94
156
 
95
157
  `OMS_VAULT` is the supported environment fallback when no explicit, local, or bridge target exists.
96
158
 
@@ -13,6 +13,11 @@ Writes:
13
13
  - Use `/write` and MCP `oms_write`; never host Write/Edit for vault notes or managed templates.
14
14
  - Notes use `op: "note"` with a stable template ID.
15
15
  - Template changes use `op: "template"`: dry-run first, then apply only with the exact reviewed `approvalDigest`.
16
+ - An explicitly selected template folder makes every `.md` beneath it a source candidate; no per-file registration or folder mode is required. Contract review verifies the source and leaves its bytes in place.
17
+ - A changed source makes only its dependent template pending; unrelated template writes remain available, while shared-authority failures fail closed for the whole vault.
18
+ - Surface the initial source-change notice exactly as `템플릿에 변경이 있습니다` with exactly `확인하기` and `나중에`; do not render a template name, hash, or change taxonomy. `나중에` is host-only and makes no server call or interview-ledger mutation. Surface returned `templateNotice` data in long-lived sessions even when boot instructions are stale.
19
+ - `확인하기` starts MCP `write { op: "template", mode: "interview-next" }`; answer with `interview-answer` and commit with `commit-contracts` only after all required questions and the user's approval of the exact final digest. Use server-returned next/request/CAS fields without inventing parameter names. The exact CLI counterparts are `oms template review`, `oms template answer`, and `oms template commit`; never self-approve.
20
+ - At note creation, choose placement by explicit caller folder, then taxonomy default, then `ask`; registration is not required and there is no Inbox fallback.
16
21
 
17
22
  Retrieval:
18
23
  - Use `/search`; discover identities with `op: "templates"`.
@@ -3,7 +3,7 @@
3
3
  * oms-guard — thin PreToolUse wrapper for Claude Code settings.json.
4
4
  *
5
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
6
+ * `oms hook pre --vault <vault>` only when the target path is
7
7
  * inside a configured vault. Vault 무관 호출은 spawn 없이 즉시 통과.
8
8
  *
9
9
  * Configuration (env vars set by the settings.json hook definition):
@@ -103,12 +103,12 @@ async function main() {
103
103
  );
104
104
  if (!targetVault) { allow(); return; }
105
105
 
106
- // Spawn `oms hook pre-tool-use --vault <vault>` with the raw stdin payload.
106
+ // Spawn `oms hook pre --vault <vault>` with the raw stdin payload.
107
107
  try {
108
108
  const { cmd, prefix } = resolveOmsCommand();
109
109
  const result = spawnSync(
110
110
  cmd,
111
- [...prefix, "hook", "pre-tool-use", "--vault", targetVault],
111
+ [...prefix, "hook", "pre", "--vault", targetVault],
112
112
  { input: rawInput, encoding: "utf-8", timeout: 10000 },
113
113
  );
114
114
  if (result.status === 0 && result.stdout && result.stdout.trim()) {
@@ -3,8 +3,8 @@
3
3
  * oms-post-guard — thin PostToolUse wrapper for Claude Code settings.json.
4
4
  *
5
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 없이 즉시 통과.
6
+ * `oms hook post --vault <vault>` for advisory frontmatter audit.
7
+ * Vault 무관 호출은 spawn 없이 즉시 통과.
8
8
  *
9
9
  * Configuration (env vars set by the settings.json hook definition):
10
10
  * OMS_VAULT — primary vault path
@@ -92,16 +92,16 @@ async function main() {
92
92
  const { cmd, prefix } = resolveOmsCommand();
93
93
  const result = spawnSync(
94
94
  cmd,
95
- [...prefix, "hook", "post-tool-use", "--vault", targetVault],
95
+ [...prefix, "hook", "post", "--vault", targetVault],
96
96
  { input: rawInput, encoding: "utf-8", timeout: 30000 },
97
97
  );
98
- // Forward any additionalContext output from the post-tool-use hook.
98
+ // Forward any additionalContext output from the post hook.
99
99
  if (result.status === 0 && result.stdout && result.stdout.trim()) {
100
100
  process.stdout.write(result.stdout);
101
101
  }
102
102
  if (result.stderr) process.stderr.write("[oms-post-guard] " + result.stderr);
103
103
  } catch {
104
- // Fail silently — post-tool-use is advisory.
104
+ // Fail silently — the post hook is advisory.
105
105
  }
106
106
  }
107
107