oh-my-second-brain 0.3.0 → 0.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/ACKNOWLEDGMENTS.md +8 -0
- package/CHANGELOG-assets.md +10 -0
- package/CHANGELOG-cli.md +11 -0
- package/CHANGELOG-kernel.md +31 -0
- package/CHANGELOG-mcp.md +12 -0
- package/CHANGELOG-vendors.md +6 -0
- package/CHANGELOG.md +35 -0
- package/assets/hermes-manifest.json +1 -1
- package/assets/skills/doctor/SKILL.md +2 -2
- package/assets/skills/search/SKILL.md +17 -1
- package/dist/cli/args.d.ts +2 -0
- package/dist/cli/args.js +13 -0
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/host-commands.js +2 -1
- package/dist/cli/host-commands.js.map +1 -1
- package/dist/cli/oms.d.ts +1 -1
- package/dist/cli/oms.js +26 -3
- package/dist/cli/oms.js.map +1 -1
- package/dist/cli/semantic-args.js +102 -3
- package/dist/cli/semantic-args.js.map +1 -1
- package/dist/cli/semantic.js +30 -6
- package/dist/cli/semantic.js.map +1 -1
- package/dist/cli/setup-command.d.ts +16 -0
- package/dist/cli/setup-command.js +50 -1
- package/dist/cli/setup-command.js.map +1 -1
- package/dist/kernel/contracts/index.d.ts +144 -0
- package/dist/kernel/contracts/index.js +401 -0
- package/dist/kernel/contracts/index.js.map +1 -0
- package/dist/kernel/conventions/note-exclude.d.ts +14 -0
- package/dist/kernel/conventions/note-exclude.js +95 -0
- package/dist/kernel/conventions/note-exclude.js.map +1 -0
- package/dist/kernel/engine/assemble.d.ts +22 -1
- package/dist/kernel/engine/assemble.js +202 -19
- package/dist/kernel/engine/assemble.js.map +1 -1
- package/dist/kernel/engine/axes/store.d.ts +90 -0
- package/dist/kernel/engine/axes/store.js +422 -0
- package/dist/kernel/engine/axes/store.js.map +1 -0
- package/dist/kernel/engine/conventions/vault-lint.d.ts +7 -2
- package/dist/kernel/engine/conventions/vault-lint.js +7 -21
- package/dist/kernel/engine/conventions/vault-lint.js.map +1 -1
- package/dist/kernel/engine/embed/identity.d.ts +14 -4
- package/dist/kernel/engine/embed/identity.js +33 -1
- package/dist/kernel/engine/embed/identity.js.map +1 -1
- package/dist/kernel/engine/embed/model.d.ts +134 -0
- package/dist/kernel/engine/embed/model.js +302 -0
- package/dist/kernel/engine/embed/model.js.map +1 -0
- package/dist/kernel/engine/embed/provider.d.ts +36 -5
- package/dist/kernel/engine/embed/provider.js +240 -103
- package/dist/kernel/engine/embed/provider.js.map +1 -1
- package/dist/kernel/engine/embed/store.d.ts +5 -1
- package/dist/kernel/engine/embed/store.js +136 -26
- package/dist/kernel/engine/embed/store.js.map +1 -1
- package/dist/kernel/engine/embed/sync.d.ts +53 -0
- package/dist/kernel/engine/embed/sync.js +489 -59
- package/dist/kernel/engine/embed/sync.js.map +1 -1
- package/dist/kernel/engine/graph/builder.d.ts +9 -5
- package/dist/kernel/engine/graph/builder.js +225 -82
- package/dist/kernel/engine/graph/builder.js.map +1 -1
- package/dist/kernel/engine/graph/node.d.ts +49 -1
- package/dist/kernel/engine/graph/node.js +205 -0
- package/dist/kernel/engine/graph/node.js.map +1 -1
- package/dist/kernel/engine/mcp/facade.d.ts +21 -1
- package/dist/kernel/engine/mcp/facade.js +523 -28
- package/dist/kernel/engine/mcp/facade.js.map +1 -1
- package/dist/kernel/engine/mcp/query-mapper.d.ts +27 -2
- package/dist/kernel/engine/mcp/query-mapper.js +157 -12
- package/dist/kernel/engine/mcp/query-mapper.js.map +1 -1
- package/dist/kernel/engine/mcp/types.d.ts +64 -2
- package/dist/kernel/engine/retrieval/dispatcher.d.ts +22 -0
- package/dist/kernel/engine/retrieval/dispatcher.js +84 -8
- package/dist/kernel/engine/retrieval/dispatcher.js.map +1 -1
- package/dist/kernel/engine/retrieval/index.d.ts +2 -1
- package/dist/kernel/engine/retrieval/index.js +1 -1
- package/dist/kernel/engine/retrieval/index.js.map +1 -1
- package/dist/kernel/engine/retrieval/reranker.d.ts +82 -4
- package/dist/kernel/engine/retrieval/reranker.js +178 -3
- package/dist/kernel/engine/retrieval/reranker.js.map +1 -1
- package/dist/kernel/engine/retrieval/rrf.d.ts +10 -2
- package/dist/kernel/engine/retrieval/rrf.js +39 -16
- package/dist/kernel/engine/retrieval/rrf.js.map +1 -1
- package/dist/kernel/engine/tracer.d.ts +13 -0
- package/dist/kernel/engine/tracer.js +63 -6
- package/dist/kernel/engine/tracer.js.map +1 -1
- package/dist/kernel/graph/cache.js +174 -23
- package/dist/kernel/graph/cache.js.map +1 -1
- package/dist/kernel/index.d.ts +2 -0
- package/dist/kernel/index.js +2 -0
- package/dist/kernel/index.js.map +1 -1
- package/dist/kernel/measurement/no-default-contract.d.ts +17 -0
- package/dist/kernel/measurement/no-default-contract.js +84 -0
- package/dist/kernel/measurement/no-default-contract.js.map +1 -0
- package/dist/kernel/searchbackend/engine-search-backend.js +93 -7
- package/dist/kernel/searchbackend/engine-search-backend.js.map +1 -1
- package/dist/kernel/searchbackend/search-backend.d.ts +11 -1
- package/dist/kernel/searchbackend/search-backend.js +66 -5
- package/dist/kernel/searchbackend/search-backend.js.map +1 -1
- package/dist/kernel/semantic/semantic-engine.js +31 -5
- package/dist/kernel/semantic/semantic-engine.js.map +1 -1
- package/dist/kernel/semantic/semantic-retrieve-args.d.ts +19 -2
- package/dist/kernel/semantic/semantic-retrieve-args.js +81 -7
- package/dist/kernel/semantic/semantic-retrieve-args.js.map +1 -1
- package/dist/kernel/update/update.d.ts +7 -0
- package/dist/kernel/update/update.js +106 -8
- package/dist/kernel/update/update.js.map +1 -1
- package/dist/mcp/server.js +84 -34
- package/dist/mcp/server.js.map +1 -1
- package/package.json +3 -2
|
@@ -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
|
+
"version": "0.6.2",
|
|
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.
|
|
40
|
+
"version": "0.6.2"
|
|
41
41
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "oms",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.2",
|
|
4
4
|
"description": "Oh My Second Brain convention layer for Obsidian vaults — Codex native rules, skills, and MCP adapter.",
|
|
5
5
|
"_note": "oms install writes Codex MCP config, installs ~/.codex/rules/oms.md, and installs ~/.codex/skills/oms-*.",
|
|
6
6
|
"skills": "./assets/skills/",
|
package/ACKNOWLEDGMENTS.md
CHANGED
|
@@ -34,6 +34,13 @@ oh-my-secondbrain은 아래 공개 작업들의 아이디어와 구현에 빚지
|
|
|
34
34
|
|
|
35
35
|
- https://github.com/safishamsi/graphify (후원: https://github.com/sponsors/safishamsi)
|
|
36
36
|
|
|
37
|
+
## Obsidian 플러그인
|
|
38
|
+
|
|
39
|
+
- [obsidian-linter](https://github.com/platers/obsidian-linter) — MIT, Victor Tao.
|
|
40
|
+
- [metadata-menu](https://github.com/mdelobelle/metadatamenu)
|
|
41
|
+
|
|
42
|
+
이 프로젝트의 convention contract에는 typed frontmatter fields, allowed values, 그리고 field-level metadata를 1급 계약으로 다루는 **개념만** 흡수했다. 서식화 및 lint 규칙은 의도적으로 obsidian-linter에 남겨두며, 여기서 재구현하지 않는다.
|
|
43
|
+
|
|
37
44
|
## Agent Skills 생태계
|
|
38
45
|
|
|
39
46
|
- https://github.com/anthropics/skills
|
|
@@ -60,6 +67,7 @@ oh-my-secondbrain은 아래 공개 작업들의 아이디어와 구현에 빚지
|
|
|
60
67
|
| Lazy-load + 5-minute idle unload guard (`src/kernel/engine/embed/provider.ts`): model/contexts not initialised until first `embed()` call; a `setTimeout` resets per call; no calls for 5 min → dispose pool; next `embed()` reloads lazily. The only permitted timer (plan.md:83, R2). | [qmd (tobi)](https://github.com/tobi/qmd) | MIT | **IDEA-ONLY — zero verbatim code** |
|
|
61
68
|
| Hardware-adaptive parallel embed pool (`src/kernel/engine/embed/provider.ts`): `poolSize = min(4, cpuCount-1)`, round-robin context selection across the pool, `Promise.all` parallel context init, 2-stage batch distribution. | [qmd (tobi)](https://github.com/tobi/qmd) | MIT | **IDEA-ONLY — zero verbatim code** |
|
|
62
69
|
| SHA-256 chunk-level incremental diff (`src/kernel/engine/embed/sync.ts`): compute SHA-256 of each chunk text; compare with stored SHA from `EngineStore.getShas()`; skip `embed()` call when SHA matches — only changed chunks are re-embedded. | [qmd (tobi)](https://github.com/tobi/qmd) | MIT | **IDEA-ONLY — zero verbatim code** |
|
|
70
|
+
| Axis-aware `query` fold (same-axis OR / cross-axis AND), bounded cursor pagination, facet counts, and deterministic query receipts (R4 FM-9 / SU-1..SU-6). | Oh My Second Brain R4 surface contract | Internal | **SELF-AUTHORED — no external code** |
|
|
63
71
|
|
|
64
72
|
> **⚠ License flag — gbrain**: The gbrain project was referenced for logic/architecture patterns only. The original repo URL and license are unconfirmed (`TODO(verify)`). No code was copied. Attribution will be updated once the license is confirmed.
|
|
65
73
|
|
package/CHANGELOG-assets.md
CHANGED
|
@@ -4,6 +4,16 @@ Skills, agents, and ontology data changes belong here.
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [0.6.2] - 2026-08-27
|
|
8
|
+
|
|
9
|
+
### Changed
|
|
10
|
+
|
|
11
|
+
- The `search` skill now documents axes, so a request that names a kind reaches the right notes. `query` matches text only; a note whose body never restates its own subject was unreachable by the bare query the skill described, even though the vault declares the kind as a frontmatter axis. The skill now says to put a named kind, declared property, or relationship on `axes.field.<key>`, `axes.folder`, or `axes.link`, to discover the available keys from the `facets` in every response and from `op: "concepts"` rather than guessing them, and to treat a refused axis — which returns `available: false` with a `reason`, not an error — as a signal to read `facets`. It also records the two constraints that silently return nothing when missed: an axis query matches lexically, so pairing it with explicit `vec`/`hyde` retrieval is refused, and `concept` is folder-derived rather than a property, so it is scoped with `axes.folder` or `op: "context"`. An axis filter with `query` omitted enumerates a whole kind.
|
|
12
|
+
|
|
13
|
+
## [0.6.1] - 2026-08-27
|
|
14
|
+
|
|
15
|
+
## [0.6.0] - 2026-08-27
|
|
16
|
+
|
|
7
17
|
## [0.3.0] - 2026-08-24
|
|
8
18
|
|
|
9
19
|
### Fixed
|
package/CHANGELOG-cli.md
CHANGED
|
@@ -4,6 +4,17 @@ Changes to the `oms` command surface belong here.
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [0.6.2] - 2026-08-27
|
|
8
|
+
|
|
9
|
+
## [0.6.1] - 2026-08-27
|
|
10
|
+
|
|
11
|
+
## [0.6.0] - 2026-08-27
|
|
12
|
+
|
|
13
|
+
### Changed
|
|
14
|
+
|
|
15
|
+
- `oms update` now requires confirmation before mutating from a TTY, refuses to mutate without `--yes` in non-TTY environments, and keeps `--dry-run`/`--check` read-only.
|
|
16
|
+
- Update reconciliation now propagates host installation failures to a non-zero exit status and resolves implicit vault targets through the verified vault chain, refusing an unverified current-directory target.
|
|
17
|
+
|
|
7
18
|
## [0.3.0] - 2026-08-24
|
|
8
19
|
|
|
9
20
|
### Changed
|
package/CHANGELOG-kernel.md
CHANGED
|
@@ -4,6 +4,37 @@ Domain logic changes belong here.
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [0.6.2] - 2026-08-27
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- **`taxonomy.yaml: exclude` now applies to retrieval, not just linting.** The exclude list was parsed into the ontology and resolved into globs for the lint and setup lanes, but the three walkers behind search, axis observation, and graph caching never consulted it and each threw on the first note whose frontmatter would not parse as YAML. Declaring a template source in `exclude` — the documented remedy, and necessary because pre-substitution template frontmatter is intentionally not valid YAML — therefore had no effect on those lanes. All three now filter their yielded paths against the resolved exclude list before parsing, so an excluded file is skipped instead of aborting the scan. Because excluded files no longer contribute to the node-index source signature, the first run after upgrading rebuilds that cache once.
|
|
12
|
+
- **A frontmatter field set to an empty string no longer aborts the axis scan.** `field: ""` states that a field is declared but unset, which is what `field:` already meant; only the explicit empty string was fatal, because empty strings were rejected while `null` and `undefined` were skipped silently. Empty and whitespace-only strings are now skipped the same way. The non-empty invariant still holds for every value that is actually recorded.
|
|
13
|
+
- **Axis value errors now name the note that caused them.** A rejected value threw with no path attached, so a whole-vault scan failure gave no indication of which of thousands of notes was responsible. These errors are now prefixed with the note path and preserve the original error as `cause`.
|
|
14
|
+
|
|
15
|
+
## [0.6.1] - 2026-08-27
|
|
16
|
+
|
|
17
|
+
### Fixed
|
|
18
|
+
|
|
19
|
+
- Measurement environment variables now treat empty or whitespace-only values as unset. This preserves CI behavior when an unset GitHub Actions variable expands to an empty string, while non-empty malformed digests, attestations, arms, and other measurement values still fail loudly.
|
|
20
|
+
|
|
21
|
+
## [0.6.0] - 2026-08-27
|
|
22
|
+
|
|
23
|
+
### Changed
|
|
24
|
+
|
|
25
|
+
- The shipped ranking default remains the released v0.3.0 `boost-additive` baseline — RRF score plus provenance boost with no per-list reordering — instead of an unmeasured multiplicative boost. The frozen `boost-k-scale`, `boost-per-list`, and `boost-zero` arms remain experiments, so released ranking behavior stays evidence-backed and reproducible.
|
|
26
|
+
- The `boost-c040` measurement gate now applies only when a release changes the shipped ranking default from that baseline. Baseline releases pass with a receipt and need no manifest, while adopting an experiment arm still requires the real-vault signed manifest with no waiver; this targets the strict evidence requirement at the decision that can change user results.
|
|
27
|
+
- Default embedding-model acquisition is deferred to a later release. No real-vault `model-default` measurement exists, so the vault owner invoked the preregistered E-1 Rule 1 fallback when authorising this release: no new default embedding model ships here. Explicit `OMS_EMBEDDING_PROVIDER` / `OMS_EMBEDDING_MODEL` behavior is unchanged, and `oms setup --embedding-descriptor <path>` accepts an operator-supplied descriptor with SHA-256 verification. The no-default contract is machine-verified and fails closed: it checks at runtime that no default descriptor pointer is introduced, that the explicit environment pair resolves identically with and without the fallback while a half pair still fails loudly naming both variables, and that the fallback and MCP paths perform zero downloads. `boost-c040` remains a separate required, never-waivable measurement. Choosing a different model would be a contract change requiring replanning, and the deferral closes only with a validator-accepted, green `model-default` manifest from the real vault owner. The repository records that decision under `docs/measurements/`.
|
|
28
|
+
|
|
29
|
+
### Fixed
|
|
30
|
+
|
|
31
|
+
- `oms update` now compares versions with SemVer prerelease and build-metadata precedence instead of treating every dotted component as a number.
|
|
32
|
+
- Embedding reindexing now builds and validates a complete shadow generation before an atomic swap, with cross-process writer locking and crash-point recovery coverage; a failed rebuild preserves the active generation.
|
|
33
|
+
- Embedding model resolution now rejects half-configured environment pairs, verifies setup artifacts by SHA-256 outside the vault, and reports unavailable vector capability with actionable `OMS_EMBEDDING_PROVIDER` / `OMS_EMBEDDING_MODEL` guidance.
|
|
34
|
+
- Lex-only retrieval remains available without a configured embedding provider, while the opt-in reranker lazy-loads with a bounded candidate set and no fake model fallback.
|
|
35
|
+
- Added the JSON frontmatter contract and typed EAV axis store with read-only `.obsidian/types.json` authority; legacy YAML remains ignored and unknown contract properties are preserved.
|
|
36
|
+
- Search query envelopes now expose total counts, cursors, facets, intent metadata, and folder/field/link axis filtering with same-axis OR and cross-axis AND semantics.
|
|
37
|
+
|
|
7
38
|
## [0.3.0] - 2026-08-24
|
|
8
39
|
|
|
9
40
|
### Fixed
|
package/CHANGELOG-mcp.md
CHANGED
|
@@ -4,6 +4,18 @@ MCP server tools and resources belong here.
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [0.6.2] - 2026-08-27
|
|
8
|
+
|
|
9
|
+
## [0.6.1] - 2026-08-27
|
|
10
|
+
|
|
11
|
+
## [0.6.0] - 2026-08-27
|
|
12
|
+
|
|
13
|
+
### Changed
|
|
14
|
+
|
|
15
|
+
- MCP semantic retrieval now forwards explicit rerank and candidate-limit requests through ephemeral lexical fallback paths without downloading models or silently dropping rerank behavior.
|
|
16
|
+
- **Breaking:** `oms_search` folds axis retrieval into the `query` operation. The retired `axis` and `semantic-query` operation names now fail loudly; collection, context, and status operations likewise drop their `semantic-` prefixes. Query responses expose `hits`, `totalCount`, `facets`, a cursor, and a deterministic receipt.
|
|
17
|
+
- **Breaking:** `oms_doctor` uses `op: "cleanup"` instead of the removed `semantic-cleanup` spelling. No compatibility aliases are retained.
|
|
18
|
+
|
|
7
19
|
## [0.3.0] - 2026-08-24
|
|
8
20
|
|
|
9
21
|
### Changed
|
package/CHANGELOG-vendors.md
CHANGED
package/CHANGELOG.md
CHANGED
|
@@ -10,6 +10,41 @@ This aggregate changelog contains changes that span multiple layers.
|
|
|
10
10
|
|
|
11
11
|
## [Unreleased]
|
|
12
12
|
|
|
13
|
+
## [0.6.2] - 2026-08-27
|
|
14
|
+
|
|
15
|
+
### Fixed
|
|
16
|
+
|
|
17
|
+
- **A single unparseable note no longer disables the entire vault.** Two independent whole-vault aborts meant that one bad file anywhere made `oms_search` return no results and `oms_status` report `ontologySource: "vault-invalid"` with write tools disabled. Both are fixed: `taxonomy.yaml: exclude` is now honoured by the walkers that feed retrieval, and a frontmatter field set to an empty string is treated as unset rather than as an error. Vaults that hit this will start returning results again with no configuration change.
|
|
18
|
+
|
|
19
|
+
- **A search for a kind of note now reaches that kind.** Asking for a person, a meeting, or a project matched only notes whose text happened to repeat the word, because the `search` skill described a text query and never mentioned the axes the engine already supports. The skill now routes a named kind onto a frontmatter axis and discovers the available axis keys from the response itself, so the vault's own declared structure is used instead of guessed at.
|
|
20
|
+
|
|
21
|
+
## [0.6.1] - 2026-08-27
|
|
22
|
+
|
|
23
|
+
### Fixed
|
|
24
|
+
|
|
25
|
+
- **0.6.1 is the first published build of the 0.6.0 changes.** The `oms-v0.6.0` tag was cut but its release job failed before publishing, so that version reached neither npm nor a GitHub Release. Tags are immutable here, so the fix ships forward rather than by retagging. Everything listed under 0.6.0 below is delivered by this release.
|
|
26
|
+
- **Measurement configuration no longer misreads an unset CI variable.** An unset GitHub Actions variable expands to an empty string, so the release job supplied an empty preregistered qrels digest and the evaluation harness rejected it as malformed. Empty and whitespace-only measurement environment values now mean not configured; a non-empty malformed value still fails loudly. The measurement test suites also read that ambient job configuration instead of the case under test, and are now isolated from it.
|
|
27
|
+
|
|
28
|
+
## [0.6.0] - 2026-08-27
|
|
29
|
+
|
|
30
|
+
### Breaking
|
|
31
|
+
|
|
32
|
+
- **MCP search and doctor operation names have changed.** Use `oms_search` with `op: "query"` for axis retrieval; the retired `axis` and `semantic-query` names now fail loudly. Collection, context, and status operations have likewise dropped their `semantic-` prefixes, and `oms_doctor` cleanup is now `op: "cleanup"` rather than `semantic-cleanup`. There are no compatibility aliases, so update MCP clients to these names. Every query response now includes `hits`, `totalCount`, `facets`, a cursor, and a receipt.
|
|
33
|
+
- **Existing vector indexes must be rebuilt.** The embedding metadata version is now `oms-embed-meta-v2`, and the index identity includes dimensions, context length, MRL dimension, normalization, and prefix scheme. OMS rejects an index whose metadata or identity does not match rather than using vectors produced under a different contract. Rebuild it with `oms semantic sync --force`.
|
|
34
|
+
|
|
35
|
+
### Added
|
|
36
|
+
|
|
37
|
+
- **Frontmatter axes are now typed and queryable.** The user-owned JSON contract lives at `.oms/types.json`; `.obsidian/types.json` is read as a read-only type authority. Legacy YAML is ignored without migration. Search can filter typed frontmatter axes, return their facets, and page results with a cursor.
|
|
38
|
+
|
|
39
|
+
### Changed
|
|
40
|
+
|
|
41
|
+
- **Released ranking stays evidence-backed.** The default remains the v0.3.0 additive provenance baseline, with no unmeasured ranking change in this release. The `boost-k-scale`, `boost-per-list`, and `boost-zero` arms remain candidates pending the C040 experiment.
|
|
42
|
+
- **Embedding setup remains explicit.** Default model acquisition is still deferred: configure `OMS_EMBEDDING_PROVIDER` and `OMS_EMBEDDING_MODEL` as before. To install an operator-supplied model, use `oms setup --embedding-descriptor <path>`; OMS verifies its SHA-256 before accepting it.
|
|
43
|
+
|
|
44
|
+
### Fixed
|
|
45
|
+
|
|
46
|
+
- **`oms update` is safer in interactive and automated use.** It asks for confirmation from a TTY, requires `--yes` without one, and keeps `--dry-run` and `--check` read-only. Version comparison now follows SemVer precedence, failed host reconciliation returns a non-zero exit status, and an unverified current-directory target is refused rather than updated.
|
|
47
|
+
|
|
13
48
|
## [0.3.0] - 2026-08-24
|
|
14
49
|
|
|
15
50
|
### Breaking
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "oms",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.2",
|
|
4
4
|
"description": "Oh My Second Brain convention layer for Obsidian vaults — Hermes skill bundle and MCP adapter.",
|
|
5
5
|
"_note": "oms install writes ~/.hermes/config.yaml mcp_servers.oms and installs skills under ~/.hermes/skills/knowledge-management/oms/."
|
|
6
6
|
}
|
|
@@ -17,7 +17,7 @@ Use this skill when a vault has convention violations, an unhealthy graph or sem
|
|
|
17
17
|
## Usage
|
|
18
18
|
|
|
19
19
|
```text
|
|
20
|
-
/doctor <audit|validate|build-graph|
|
|
20
|
+
/doctor <audit|validate|build-graph|cleanup|sync-embeddings>
|
|
21
21
|
```
|
|
22
22
|
|
|
23
|
-
`audit` and `validate` inspect notes against their declared concept schemas. `build-graph`, `
|
|
23
|
+
`audit` and `validate` inspect notes against their declared concept schemas. `build-graph`, `cleanup`, and `sync-embeddings` are repair operations and may write generated graph or semantic-index state. Review the diagnosis, then invoke only the repair needed.
|
|
@@ -4,7 +4,7 @@ description: Retrieve vault knowledge through declared retrieval lenses.
|
|
|
4
4
|
aliases: [retrieve]
|
|
5
5
|
mcp_tool: oms_search
|
|
6
6
|
mcp_args:
|
|
7
|
-
op: "
|
|
7
|
+
op: "query"
|
|
8
8
|
query: "$1"
|
|
9
9
|
---
|
|
10
10
|
|
|
@@ -23,3 +23,19 @@ Use this skill to find and assemble relevant vault knowledge without changing th
|
|
|
23
23
|
```
|
|
24
24
|
|
|
25
25
|
Choose the declared lens that matches the request, return only that lens's fields, and group results by concept or folder. Search may combine the live note, frontmatter, and wikilink graph with available semantic candidates; graph results remain available when the semantic index is unavailable.
|
|
26
|
+
|
|
27
|
+
## Axes
|
|
28
|
+
|
|
29
|
+
`query` scores text, so it reaches a note only where the words are actually written. A request that names a kind — a person, a meeting, a project — belongs on an axis instead: an entity note is titled with its subject and then seldom repeats it, which is precisely what text scoring cannot find.
|
|
30
|
+
|
|
31
|
+
Put the request on an axis whenever it names a kind, a declared property, or a relationship:
|
|
32
|
+
|
|
33
|
+
- `axes.field.<key>` filters on a frontmatter property declared by the vault contract. The value may be a scalar, a list of scalars (matching any of them), or a predicate object — `in`, `contains`, `containsAll`, `between`, `gte`/`gt`/`lte`/`lt`, `from`/`to`.
|
|
34
|
+
- `axes.folder` scopes to a top-level folder. It takes the folder's own name, not the concept name derived from it.
|
|
35
|
+
- `axes.link` follows the wikilink graph to reach the notes that reference an entity rather than the one describing it. It matches on filename alone: a bare title is enough, and a surrounding folder path or `.md` extension is ignored rather than narrowing the match.
|
|
36
|
+
|
|
37
|
+
Axes intersect, so a kind and a folder can be combined to narrow a single query. An axis filter is also a complete query by itself: omit `query` to enumerate a whole kind instead of searching inside it. Axis queries match lexically, so pair them with `query` or a `lex` sub-query; asking for `vec` or `hyde` retrieval alongside an axis returns nothing and says so.
|
|
38
|
+
|
|
39
|
+
Discover axes rather than guessing them. A successful query returns `facets` — the axis keys this vault actually uses, each with its observed values and their counts — and `op: "concepts"` reports the fields every concept declares. Which properties exist is a per-vault contract, so read it before filtering on it.
|
|
40
|
+
|
|
41
|
+
A rejected axis is not a failed call. The response returns `available: false` with a `reason` naming the key it refused, and comes back with `hits` and `facets` both empty — so recover by querying again without that axis and reading the facets that call returns, never by retrying the same guess. `concept` is derived from a note's folder rather than stored as a property, so scope it with `axes.folder` or with `op: "context"` — `axes.field.concept` is always refused.
|
package/dist/cli/args.d.ts
CHANGED
|
@@ -22,6 +22,8 @@ export interface ParsedCliArgs {
|
|
|
22
22
|
readonly maxPerConcept: number | undefined;
|
|
23
23
|
readonly folders: readonly string[];
|
|
24
24
|
readonly conventionNote: boolean;
|
|
25
|
+
readonly embeddingDescriptorPath: string | undefined;
|
|
26
|
+
readonly embeddingNoDefault: boolean;
|
|
25
27
|
readonly unknownFlags: readonly string[];
|
|
26
28
|
readonly error: CliArgumentError | undefined;
|
|
27
29
|
}
|
package/dist/cli/args.js
CHANGED
|
@@ -30,6 +30,8 @@ export function parseCliArgs(argv, cwd = process.cwd()) {
|
|
|
30
30
|
let maxPerConcept;
|
|
31
31
|
const folders = [];
|
|
32
32
|
let conventionNote = true;
|
|
33
|
+
let embeddingDescriptorPath;
|
|
34
|
+
let embeddingNoDefault = false;
|
|
33
35
|
const unknownFlags = [];
|
|
34
36
|
for (let i = 1; i < argv.length; i++) {
|
|
35
37
|
const arg = argv[i];
|
|
@@ -102,6 +104,13 @@ export function parseCliArgs(argv, cwd = process.cwd()) {
|
|
|
102
104
|
else if (arg === "--no-convention-note") {
|
|
103
105
|
conventionNote = false;
|
|
104
106
|
}
|
|
107
|
+
else if (arg === "--embedding-descriptor" && next) {
|
|
108
|
+
embeddingDescriptorPath = path.resolve(cwd, next);
|
|
109
|
+
i++;
|
|
110
|
+
}
|
|
111
|
+
else if (arg === "--embedding-no-default") {
|
|
112
|
+
embeddingNoDefault = true;
|
|
113
|
+
}
|
|
105
114
|
else if (arg !== undefined) {
|
|
106
115
|
unknownFlags.push(arg);
|
|
107
116
|
}
|
|
@@ -125,6 +134,8 @@ export function parseCliArgs(argv, cwd = process.cwd()) {
|
|
|
125
134
|
maxPerConcept,
|
|
126
135
|
folders,
|
|
127
136
|
conventionNote,
|
|
137
|
+
embeddingDescriptorPath,
|
|
138
|
+
embeddingNoDefault,
|
|
128
139
|
unknownFlags,
|
|
129
140
|
error: undefined,
|
|
130
141
|
};
|
|
@@ -148,6 +159,8 @@ export function parseCliArgs(argv, cwd = process.cwd()) {
|
|
|
148
159
|
maxPerConcept,
|
|
149
160
|
folders,
|
|
150
161
|
conventionNote,
|
|
162
|
+
embeddingDescriptorPath,
|
|
163
|
+
embeddingNoDefault,
|
|
151
164
|
unknownFlags,
|
|
152
165
|
error: new CliArgumentError(message),
|
|
153
166
|
};
|
package/dist/cli/args.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAG/E,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACzC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;
|
|
1
|
+
{"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"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"}
|
|
@@ -74,6 +74,7 @@ export async function runUpdateCommand(context) {
|
|
|
74
74
|
check: context.checkUpdate,
|
|
75
75
|
dryRun: context.dryRun,
|
|
76
76
|
yes: context.yes,
|
|
77
|
+
interactive: process.stdin.isTTY === true && process.env["OMS_NON_INTERACTIVE"] !== "1",
|
|
77
78
|
executeExternal: context.executeExternal,
|
|
78
79
|
timeoutMs: context.timeoutMs,
|
|
79
80
|
reconcileCommand: {
|
|
@@ -102,6 +103,6 @@ export async function runUpdateReconcile(context) {
|
|
|
102
103
|
console.log(context.json
|
|
103
104
|
? formatHostOperationResultsJson(results, context.dryRun)
|
|
104
105
|
: formatHostOperationResults(results, context.dryRun));
|
|
105
|
-
return 0;
|
|
106
|
+
return results.some((result) => result.messages.some((message) => message.startsWith("FAILED:"))) ? 1 : 0;
|
|
106
107
|
}
|
|
107
108
|
//# sourceMappingURL=host-commands.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"host-commands.js","sourceRoot":"","sources":["../../src/cli/host-commands.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"host-commands.js","sourceRoot":"","sources":["../../src/cli/host-commands.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/oms.d.ts
CHANGED
|
@@ -5,5 +5,5 @@ export { runDoctor, runLint } from "./doctor-lint.js";
|
|
|
5
5
|
export { runAudit } from "./audit.js";
|
|
6
6
|
export { formatLinkResult, runLink, } from "./link-command.js";
|
|
7
7
|
export { runLinkify } from "./linkify.js";
|
|
8
|
-
export { runSetup, type SetupPrompt, } from "./setup-command.js";
|
|
8
|
+
export { runSetup, type SetupPrompt, type SetupEmbeddingDescriptor, } from "./setup-command.js";
|
|
9
9
|
export { maybePrintUpdateNotice } from "./update-notice.js";
|
package/dist/cli/oms.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { realpathSync } from "node:fs";
|
|
2
|
+
import { readFileSync, realpathSync } from "node:fs";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import { fileURLToPath } from "node:url";
|
|
5
5
|
import { runPostToolUse } from "../vendors/claude/hook/post-tool-use.js";
|
|
@@ -43,21 +43,44 @@ async function main() {
|
|
|
43
43
|
process.exitCode = 1;
|
|
44
44
|
return;
|
|
45
45
|
}
|
|
46
|
-
let { command, vault, vaultExplicit, yes, apply, installClaude, suggestFields, runtime, dryRun, executeExternal, checkUpdate, timeoutMs, agentVault, verbose, json, maxPerConcept, folders, conventionNote, unknownFlags, } = parsedArgs;
|
|
46
|
+
let { command, vault, vaultExplicit, yes, apply, installClaude, suggestFields, runtime, dryRun, executeExternal, checkUpdate, timeoutMs, agentVault, verbose, json, maxPerConcept, folders, conventionNote, embeddingDescriptorPath, embeddingNoDefault, unknownFlags, } = parsedArgs;
|
|
47
47
|
// `mcp` keeps the FULL resolution result: the write surface trusts every
|
|
48
48
|
// source except `cwd`, so the server needs the source, not just the path.
|
|
49
49
|
let mcpTarget;
|
|
50
|
+
if ((command === "update" || command === "update-reconcile") && unknownFlags.length > 0) {
|
|
51
|
+
console.error(`[oms] Unsupported update option: ${unknownFlags.join(", ")}`);
|
|
52
|
+
process.exitCode = 1;
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
50
55
|
if (command === "mcp") {
|
|
51
56
|
mcpTarget = vaultExplicit
|
|
52
57
|
? { vault, scope: null, source: "explicit" }
|
|
53
58
|
: await resolveEffectiveVault(process.cwd(), process.env);
|
|
54
59
|
vault = mcpTarget.vault;
|
|
55
60
|
}
|
|
61
|
+
else if (command === "update" || command === "update-reconcile") {
|
|
62
|
+
if (!vaultExplicit) {
|
|
63
|
+
const resolved = await resolveEffectiveVault(process.cwd(), process.env);
|
|
64
|
+
if (resolved.source === "cwd") {
|
|
65
|
+
console.error("[oms] Refusing update: target-unverified; no verified vault target was resolved from the current directory. Pass --vault or configure OMS_VAULT instead.");
|
|
66
|
+
process.exitCode = 1;
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
vault = resolved.vault;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
56
72
|
else if (shouldResolveBridgeVault(command, vaultExplicit)) {
|
|
57
73
|
vault = (await resolveEffectiveVault(process.cwd(), process.env)).vault;
|
|
58
74
|
}
|
|
59
75
|
if (command === "setup") {
|
|
60
|
-
|
|
76
|
+
let embeddingDescriptor;
|
|
77
|
+
if (embeddingDescriptorPath !== undefined) {
|
|
78
|
+
embeddingDescriptor = JSON.parse(readFileSync(embeddingDescriptorPath, "utf8"));
|
|
79
|
+
}
|
|
80
|
+
else if (embeddingNoDefault) {
|
|
81
|
+
embeddingDescriptor = null;
|
|
82
|
+
}
|
|
83
|
+
await runSetup({ vault, yes, installClaude, suggestFields, dryRun, embeddingDescriptor });
|
|
61
84
|
if (!dryRun)
|
|
62
85
|
await nonFatalGlobalWriteback(() => registerGlobalVault({ vault: path.resolve(vault), homeDir: undefined, overwrite: true }));
|
|
63
86
|
if (!dryRun)
|
package/dist/cli/oms.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oms.js","sourceRoot":"","sources":["../../src/cli/oms.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"oms.js","sourceRoot":"","sources":["../../src/cli/oms.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
function appendStringOption(options, key, value) {
|
|
2
|
+
const prior = options[key];
|
|
3
|
+
// A NUL separator distinguishes repeated flags from comma-delimited axis
|
|
4
|
+
// values (`--field tags=one,two --field status=open`). It never appears in a
|
|
5
|
+
// shell argument, so the representation remains unambiguous until the axis
|
|
6
|
+
// object is built below.
|
|
7
|
+
options[key] = typeof prior === "string" && prior.length > 0 ? `${prior}\u0000${value}` : value;
|
|
8
|
+
}
|
|
1
9
|
export function parseSemanticArgs(argv) {
|
|
2
10
|
const positional = [];
|
|
3
11
|
const options = {};
|
|
@@ -22,6 +30,15 @@ export function parseSemanticArgs(argv) {
|
|
|
22
30
|
options[camelOption(arg)] = argv[i + 1] ?? "";
|
|
23
31
|
i++;
|
|
24
32
|
}
|
|
33
|
+
else if (arg === "--cursor"
|
|
34
|
+
|| arg === "--collection-path"
|
|
35
|
+
|| arg === "--mode"
|
|
36
|
+
|| arg === "--folder"
|
|
37
|
+
|| arg === "--field"
|
|
38
|
+
|| arg === "--link") {
|
|
39
|
+
appendStringOption(options, camelOption(arg), argv[i + 1] ?? "");
|
|
40
|
+
i++;
|
|
41
|
+
}
|
|
25
42
|
else if (arg === "--intent" || arg === "--lex" || arg === "--vec" || arg === "--hyde") {
|
|
26
43
|
options[arg.slice(2)] = argv[i + 1] ?? "";
|
|
27
44
|
i++;
|
|
@@ -85,6 +102,21 @@ export function printJson(write, value) {
|
|
|
85
102
|
write(JSON.stringify(value, null, 2));
|
|
86
103
|
}
|
|
87
104
|
export function semanticQueryOptions(mode, vault, args, query) {
|
|
105
|
+
const requestedMode = stringOption(args, "mode");
|
|
106
|
+
if (requestedMode !== undefined && requestedMode !== mode) {
|
|
107
|
+
throw new Error(`CLI mode "${requestedMode}" contradicts the "${mode}" query command.`);
|
|
108
|
+
}
|
|
109
|
+
const axes = queryAxesFromCli(args);
|
|
110
|
+
const vec = stringOption(args, "vec");
|
|
111
|
+
const hyde = stringOption(args, "hyde");
|
|
112
|
+
// The query/search CLI commands are intentionally lexical by default. A
|
|
113
|
+
// model is only consulted when the caller opts into --vec, --hyde, or the
|
|
114
|
+
// dedicated vsearch command; this keeps plain searches useful on a
|
|
115
|
+
// model-less vault without approximating a vector result.
|
|
116
|
+
const lex = stringOption(args, "lex")
|
|
117
|
+
?? (mode === "vsearch" || vec !== undefined || hyde !== undefined || query.trim().length === 0
|
|
118
|
+
? undefined
|
|
119
|
+
: query);
|
|
88
120
|
return {
|
|
89
121
|
vault,
|
|
90
122
|
query,
|
|
@@ -94,15 +126,82 @@ export function semanticQueryOptions(mode, vault, args, query) {
|
|
|
94
126
|
limit: numberOption(args, "limit"),
|
|
95
127
|
minScore: numberOption(args, "minScore"),
|
|
96
128
|
intent: stringOption(args, "intent"),
|
|
97
|
-
lex
|
|
98
|
-
vec
|
|
99
|
-
hyde
|
|
129
|
+
lex,
|
|
130
|
+
vec,
|
|
131
|
+
hyde,
|
|
132
|
+
cursor: stringOption(args, "cursor"),
|
|
133
|
+
collectionPath: stringOption(args, "collectionPath"),
|
|
134
|
+
...(axes === undefined ? {} : { axes }),
|
|
100
135
|
all: booleanOption(args, "all"),
|
|
101
136
|
full: booleanOption(args, "full"),
|
|
102
137
|
fullPath: booleanOption(args, "fullPath"),
|
|
103
138
|
candidateLimit: numberOption(args, "candidateLimit"),
|
|
104
139
|
};
|
|
105
140
|
}
|
|
141
|
+
function axisScalar(value) {
|
|
142
|
+
const trimmed = value.trim();
|
|
143
|
+
if (trimmed === "true")
|
|
144
|
+
return true;
|
|
145
|
+
if (trimmed === "false")
|
|
146
|
+
return false;
|
|
147
|
+
// Keep values such as "001" as strings; they are commonly identifiers, not
|
|
148
|
+
// numbers. Decimal and signed integer forms retain their typed axis meaning.
|
|
149
|
+
if (/^-?(?:0|[1-9]\d*)(?:\.\d+)?$/u.test(trimmed)) {
|
|
150
|
+
const parsed = Number(trimmed);
|
|
151
|
+
if (Number.isFinite(parsed))
|
|
152
|
+
return parsed;
|
|
153
|
+
}
|
|
154
|
+
return trimmed;
|
|
155
|
+
}
|
|
156
|
+
function axisList(value) {
|
|
157
|
+
if (value === undefined)
|
|
158
|
+
return undefined;
|
|
159
|
+
const values = value
|
|
160
|
+
.split(/[,\u0000]/u)
|
|
161
|
+
.map((item) => axisScalar(item))
|
|
162
|
+
.filter((item) => typeof item !== "string" || item.length > 0);
|
|
163
|
+
if (values.length === 0)
|
|
164
|
+
return undefined;
|
|
165
|
+
return values.length === 1 ? values[0] : values;
|
|
166
|
+
}
|
|
167
|
+
function queryAxesFromCli(args) {
|
|
168
|
+
const folder = axisList(stringOption(args, "folder"));
|
|
169
|
+
const link = axisList(stringOption(args, "link"));
|
|
170
|
+
const fieldsRaw = stringOption(args, "field");
|
|
171
|
+
let field;
|
|
172
|
+
if (fieldsRaw !== undefined) {
|
|
173
|
+
field = {};
|
|
174
|
+
for (const entry of fieldsRaw.split("\u0000")) {
|
|
175
|
+
const separator = entry.indexOf("=");
|
|
176
|
+
const colon = entry.indexOf(":");
|
|
177
|
+
const splitAt = separator >= 0 ? separator : colon;
|
|
178
|
+
if (splitAt <= 0) {
|
|
179
|
+
throw new Error(`Invalid --field "${entry}". Use --field name=value.`);
|
|
180
|
+
}
|
|
181
|
+
const key = entry.slice(0, splitAt).trim();
|
|
182
|
+
const value = axisList(entry.slice(splitAt + 1));
|
|
183
|
+
if (!key || value === undefined) {
|
|
184
|
+
throw new Error(`Invalid --field "${entry}". Use --field name=value.`);
|
|
185
|
+
}
|
|
186
|
+
const prior = field[key];
|
|
187
|
+
if (prior === undefined) {
|
|
188
|
+
field[key] = value;
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
const priorValues = Array.isArray(prior) ? prior : [prior];
|
|
192
|
+
const nextValues = Array.isArray(value) ? value : [value];
|
|
193
|
+
field[key] = [...priorValues, ...nextValues];
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
if (folder === undefined && link === undefined && field === undefined)
|
|
198
|
+
return undefined;
|
|
199
|
+
return {
|
|
200
|
+
...(folder === undefined ? {} : { folder }),
|
|
201
|
+
...(field === undefined ? {} : { field }),
|
|
202
|
+
...(link === undefined ? {} : { link }),
|
|
203
|
+
};
|
|
204
|
+
}
|
|
106
205
|
export function targetList(values) {
|
|
107
206
|
return values.flatMap((value) => value.split(",").map((item) => item.trim()).filter((item) => item.length > 0));
|
|
108
207
|
}
|