oh-my-second-brain 0.20.6 → 0.21.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.
- package/.claude-plugin/marketplace.json +4 -4
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/ACKNOWLEDGMENTS.md +1 -1
- package/CHANGELOG-assets.md +10 -0
- package/CHANGELOG-cli.md +10 -0
- package/CHANGELOG-kernel.md +57 -0
- package/CHANGELOG-mcp.md +16 -0
- package/CHANGELOG-vendors.md +4 -0
- package/CHANGELOG.md +10 -0
- package/README.ko.md +15 -51
- package/README.md +15 -51
- package/assets/hermes-manifest.json +1 -1
- package/assets/readme/ARTWORK.md +16 -0
- package/assets/readme-hero.webp +0 -0
- package/assets/skills/search/SKILL.md +15 -3
- package/assets/skills/write/SKILL.md +1 -1
- package/dist/cli/engine-session.d.ts +3 -0
- package/dist/cli/engine-session.js +5 -1
- package/dist/cli/engine-session.js.map +1 -1
- package/dist/cli/oms.js +38 -6
- package/dist/cli/oms.js.map +1 -1
- package/dist/cli/search-args.js +25 -1
- package/dist/cli/search-args.js.map +1 -1
- package/dist/cli/search-usage.js +6 -0
- package/dist/cli/search-usage.js.map +1 -1
- package/dist/cli/search.js +14 -8
- package/dist/cli/search.js.map +1 -1
- package/dist/cli/serve-http.d.ts +4 -0
- package/dist/cli/serve-http.js +73 -15
- package/dist/cli/serve-http.js.map +1 -1
- package/dist/cli/usage.js +1 -1
- package/dist/cli/usage.js.map +1 -1
- package/dist/kernel/conventions/file-snapshot.d.ts +9 -0
- package/dist/kernel/conventions/file-snapshot.js +75 -0
- package/dist/kernel/conventions/file-snapshot.js.map +1 -0
- package/dist/kernel/conventions/note-exclude.js +4 -0
- package/dist/kernel/conventions/note-exclude.js.map +1 -1
- package/dist/kernel/engine/assemble.d.ts +6 -0
- package/dist/kernel/engine/assemble.js +36 -0
- package/dist/kernel/engine/assemble.js.map +1 -1
- package/dist/kernel/engine/axes/observed-discovery.d.ts +50 -0
- package/dist/kernel/engine/axes/observed-discovery.js +68 -0
- package/dist/kernel/engine/axes/observed-discovery.js.map +1 -0
- package/dist/kernel/engine/axes/observed-exact.d.ts +16 -0
- package/dist/kernel/engine/axes/observed-exact.js +32 -0
- package/dist/kernel/engine/axes/observed-exact.js.map +1 -0
- package/dist/kernel/engine/axes/observed-options.d.ts +11 -0
- package/dist/kernel/engine/axes/observed-options.js +35 -0
- package/dist/kernel/engine/axes/observed-options.js.map +1 -0
- package/dist/kernel/engine/axes/observed-query.d.ts +15 -0
- package/dist/kernel/engine/axes/observed-query.js +87 -0
- package/dist/kernel/engine/axes/observed-query.js.map +1 -0
- package/dist/kernel/engine/axes/predicates.d.ts +24 -0
- package/dist/kernel/engine/axes/predicates.js +48 -0
- package/dist/kernel/engine/axes/predicates.js.map +1 -0
- package/dist/kernel/engine/axes/store.d.ts +53 -7
- package/dist/kernel/engine/axes/store.js +233 -47
- package/dist/kernel/engine/axes/store.js.map +1 -1
- package/dist/kernel/engine/axes/values.d.ts +8 -0
- package/dist/kernel/engine/axes/values.js +39 -0
- package/dist/kernel/engine/axes/values.js.map +1 -0
- package/dist/kernel/engine/embed/chunker.d.ts +2 -1
- package/dist/kernel/engine/embed/chunker.js +28 -10
- package/dist/kernel/engine/embed/chunker.js.map +1 -1
- package/dist/kernel/engine/embed/deferred.js +2 -0
- package/dist/kernel/engine/embed/deferred.js.map +1 -1
- package/dist/kernel/engine/embed/freshness.d.ts +24 -0
- package/dist/kernel/engine/embed/freshness.js +77 -0
- package/dist/kernel/engine/embed/freshness.js.map +1 -0
- package/dist/kernel/engine/embed/lexical-batch.d.ts +32 -0
- package/dist/kernel/engine/embed/lexical-batch.js +71 -0
- package/dist/kernel/engine/embed/lexical-batch.js.map +1 -0
- package/dist/kernel/engine/embed/live-lexical.d.ts +92 -0
- package/dist/kernel/engine/embed/live-lexical.js +499 -0
- package/dist/kernel/engine/embed/live-lexical.js.map +1 -0
- package/dist/kernel/engine/embed/maintenance.d.ts +44 -0
- package/dist/kernel/engine/embed/maintenance.js +246 -0
- package/dist/kernel/engine/embed/maintenance.js.map +1 -0
- package/dist/kernel/engine/embed/owned-temporary-directory.d.ts +13 -0
- package/dist/kernel/engine/embed/owned-temporary-directory.js +94 -0
- package/dist/kernel/engine/embed/owned-temporary-directory.js.map +1 -0
- package/dist/kernel/engine/embed/provider.d.ts +4 -0
- package/dist/kernel/engine/embed/provider.js +18 -8
- package/dist/kernel/engine/embed/provider.js.map +1 -1
- package/dist/kernel/engine/embed/read-snapshot.d.ts +4 -0
- package/dist/kernel/engine/embed/read-snapshot.js +100 -38
- package/dist/kernel/engine/embed/read-snapshot.js.map +1 -1
- package/dist/kernel/engine/embed/revision.d.ts +21 -0
- package/dist/kernel/engine/embed/revision.js +47 -0
- package/dist/kernel/engine/embed/revision.js.map +1 -0
- package/dist/kernel/engine/embed/source.d.ts +26 -0
- package/dist/kernel/engine/embed/source.js +174 -0
- package/dist/kernel/engine/embed/source.js.map +1 -0
- package/dist/kernel/engine/embed/store.d.ts +49 -2
- package/dist/kernel/engine/embed/store.js +233 -16
- package/dist/kernel/engine/embed/store.js.map +1 -1
- package/dist/kernel/engine/embed/sync.d.ts +11 -6
- package/dist/kernel/engine/embed/sync.js +119 -86
- package/dist/kernel/engine/embed/sync.js.map +1 -1
- package/dist/kernel/engine/graph/builder.d.ts +30 -2
- package/dist/kernel/engine/graph/builder.js +197 -36
- package/dist/kernel/engine/graph/builder.js.map +1 -1
- package/dist/kernel/engine/graph/node.d.ts +2 -13
- package/dist/kernel/engine/graph/node.js +1 -47
- package/dist/kernel/engine/graph/node.js.map +1 -1
- package/dist/kernel/engine/index-maintenance.d.ts +32 -0
- package/dist/kernel/engine/index-maintenance.js +138 -0
- package/dist/kernel/engine/index-maintenance.js.map +1 -0
- package/dist/kernel/engine/index-update.js +2 -10
- package/dist/kernel/engine/index-update.js.map +1 -1
- package/dist/kernel/engine/maintenance-controller.d.ts +84 -0
- package/dist/kernel/engine/maintenance-controller.js +286 -0
- package/dist/kernel/engine/maintenance-controller.js.map +1 -0
- package/dist/kernel/engine/maintenance-model.d.ts +12 -0
- package/dist/kernel/engine/maintenance-model.js +59 -0
- package/dist/kernel/engine/maintenance-model.js.map +1 -0
- package/dist/kernel/engine/maintenance-owner.d.ts +22 -0
- package/dist/kernel/engine/maintenance-owner.js +192 -0
- package/dist/kernel/engine/maintenance-owner.js.map +1 -0
- package/dist/kernel/engine/mcp/facade.d.ts +6 -1
- package/dist/kernel/engine/mcp/facade.js +131 -50
- package/dist/kernel/engine/mcp/facade.js.map +1 -1
- package/dist/kernel/engine/mcp/live-docid.d.ts +10 -0
- package/dist/kernel/engine/mcp/live-docid.js +27 -0
- package/dist/kernel/engine/mcp/live-docid.js.map +1 -0
- package/dist/kernel/engine/mcp/query-mapper.d.ts +5 -1
- package/dist/kernel/engine/mcp/query-mapper.js +42 -7
- package/dist/kernel/engine/mcp/query-mapper.js.map +1 -1
- package/dist/kernel/engine/mcp/types.d.ts +8 -0
- package/dist/kernel/graph/explore.js +2 -3
- package/dist/kernel/graph/explore.js.map +1 -1
- package/dist/kernel/searchbackend/engine-search-backend.js +1 -0
- package/dist/kernel/searchbackend/engine-search-backend.js.map +1 -1
- package/dist/kernel/searchbackend/search-backend.d.ts +3 -1
- package/dist/kernel/searchbackend/search-backend.js +10 -3
- package/dist/kernel/searchbackend/search-backend.js.map +1 -1
- package/dist/kernel/semantic/semantic-retrieve-args.d.ts +1 -0
- package/dist/kernel/semantic/semantic-retrieve-args.js +3 -0
- package/dist/kernel/semantic/semantic-retrieve-args.js.map +1 -1
- package/dist/kernel/write/live-templates.d.ts +9 -2
- package/dist/kernel/write/live-templates.js +37 -19
- package/dist/kernel/write/live-templates.js.map +1 -1
- package/dist/kernel/write/note-write.d.ts +8 -3
- package/dist/kernel/write/note-write.js +15 -3
- package/dist/kernel/write/note-write.js.map +1 -1
- package/dist/kernel/write/payload.d.ts +1 -1
- package/dist/kernel/write/payload.js +2 -0
- package/dist/kernel/write/payload.js.map +1 -1
- package/dist/kernel/write/pipeline.d.ts +1 -1
- package/dist/kernel/write/pipeline.js +10 -3
- package/dist/kernel/write/pipeline.js.map +1 -1
- package/dist/mcp/server.d.ts +6 -2
- package/dist/mcp/server.js +87 -22
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools/search.js +8 -29
- package/dist/mcp/tools/search.js.map +1 -1
- package/dist/mcp/tools/status.d.ts +4 -1
- package/dist/mcp/tools/status.js +2 -1
- package/dist/mcp/tools/status.js.map +1 -1
- package/dist/mcp/tools/write.d.ts +1 -1
- package/dist/mcp/tools/write.js +3 -1
- package/dist/mcp/tools/write.js.map +1 -1
- package/dist/vendors/claude/claude-marketplace.js +1 -1
- package/dist/vendors/claude/claude-marketplace.js.map +1 -1
- package/docs/adapters.md +3 -1
- package/docs/architecture.md +41 -0
- package/docs/cli-map.md +5 -2
- package/docs/conventions.md +2 -0
- package/docs/install.md +28 -0
- package/package.json +4 -4
- package/scripts/install.sh +1 -1
- package/scripts/uninstall.sh +1 -1
- package/skills/search/SKILL.md +15 -3
- package/skills/write/SKILL.md +1 -1
|
@@ -10,15 +10,15 @@
|
|
|
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.21.0",
|
|
14
14
|
"author": {
|
|
15
15
|
"name": "gobeumsu",
|
|
16
16
|
"email": "gobeumsu@gmail.com"
|
|
17
17
|
},
|
|
18
18
|
"source": "./",
|
|
19
19
|
"category": "productivity",
|
|
20
|
-
"homepage": "https://github.com/
|
|
21
|
-
"repository": "https://github.com/
|
|
20
|
+
"homepage": "https://github.com/Xia-Ataraxia/oh-my-second-brain#readme",
|
|
21
|
+
"repository": "https://github.com/Xia-Ataraxia/oh-my-second-brain",
|
|
22
22
|
"license": "MIT",
|
|
23
23
|
"keywords": [
|
|
24
24
|
"obsidian",
|
|
@@ -37,5 +37,5 @@
|
|
|
37
37
|
]
|
|
38
38
|
}
|
|
39
39
|
],
|
|
40
|
-
"version": "0.
|
|
40
|
+
"version": "0.21.0"
|
|
41
41
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "oms",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.21.0",
|
|
4
4
|
"description": "Oh My Second Brain convention layer for Obsidian vaults — Codex native rules, skills, and MCP adapter.",
|
|
5
5
|
"_note": "oms setup host install writes Codex MCP config and provenance, installs ~/.codex/rules/oms.md, and installs the six shared skills under ~/.codex/skills/oms-*.",
|
|
6
6
|
"skills": "./assets/skills/",
|
package/ACKNOWLEDGMENTS.md
CHANGED
|
@@ -4,7 +4,7 @@ oh-my-secondbrain은 아래 공개 작업들의 아이디어와 구현에 빚지
|
|
|
4
4
|
만들고 아낌없이 공개해주신 모든 분들께 진심으로 감사드린다.
|
|
5
5
|
|
|
6
6
|
> 우리가 무엇을 흡수했는지(설계 로직·근거)는 `docs/research/*` 에 기록한다.
|
|
7
|
-
> 관리 규칙: [`docs/rules/external-attribution.md`](https://github.com/
|
|
7
|
+
> 관리 규칙: [`docs/rules/external-attribution.md`](https://github.com/Xia-Ataraxia/oh-my-second-brain/blob/main/docs/rules/external-attribution.md)
|
|
8
8
|
|
|
9
9
|
## 계약·평가·인터뷰 설계
|
|
10
10
|
|
package/CHANGELOG-assets.md
CHANGED
|
@@ -4,6 +4,16 @@ Skills, agents, templates, and host guidance changes belong here.
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [0.21.0] - 2026-10-03
|
|
8
|
+
|
|
9
|
+
- **Use the selected dark library README artwork.** The English and Korean READMEs now share the finished native Blender scene with floating pages and knowledge-stars, with readable poster typography and material credits. Setup commands, safety guidance, links, and runtime behavior are unchanged.
|
|
10
|
+
|
|
11
|
+
- Search and write guidance explains the existing exact-path read-before-edit flow: use the complete source and its returned revision as `ifMatch`, and reread after a stale-write rejection rather than hashing a retrieved slice.
|
|
12
|
+
|
|
13
|
+
- The shipped search skill teaches optional-template observed discovery, exact typed facet selection, metadata-only zero-hit responses and the lexical-only/single-collection boundary. It distinguishes detached current-note validation from synchronization of persistent/vector indexes and warm-session speed from cold CLI calls.
|
|
14
|
+
|
|
15
|
+
- **Refresh the English and Korean README presentation.** Both READMEs now share a repository-specific 3D hero and a more compact overview while preserving setup, contract, host, safety, documentation, and credit guidance. Canonical repository links now point directly to `Xia-Ataraxia/oh-my-second-brain` after the ownership transfer.
|
|
16
|
+
|
|
7
17
|
## [0.20.6] - 2026-10-01
|
|
8
18
|
|
|
9
19
|
- **Skills and host guidance now say that contract findings warn instead of deny.** The `write`, `distill`, and `setup` skills, the Claude, Codex, and Hermes host guidance, and the README and docs had kept saying that a note breaking the contract is denied. Since the contract became warn-first, such a note is saved with each finding as a `{field, kind}` warning and one guidance command; only a safety refusal (a path outside the vault, a control or unsafe path, unsupported input, a tampered contract) denies, and in a sealed vault a note written through MCP or `oms write` whose frontmatter does not parse may be kept as a draft. Agents reading the old wording stopped and asked after a write that had already succeeded. The README also no longer says MCP cannot seal: `interview` `op: seal` seals a proposal the owner confirmed. Run `oms setup host sync` to refresh installed host guidance.
|
package/CHANGELOG-cli.md
CHANGED
|
@@ -4,6 +4,16 @@ Changes to the `oms` command surface belong here.
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [0.21.0] - 2026-10-03
|
|
8
|
+
|
|
9
|
+
- Enabled HTTP maintenance cancels immediately when shutdown is requested, even when a client leaves a request body unfinished. Connections have a bounded drain period and repeated close calls reuse one shutdown.
|
|
10
|
+
|
|
11
|
+
- `oms serve mcp|http --maintenance lexical|full` explicitly enables automatic maintenance of an existing canonical index. Default startup stays unchanged; unverified targets, missing indexes and incompatible full-mode models are rejected before serving.
|
|
12
|
+
|
|
13
|
+
- `oms search --observed '<JSON>'` and HTTP `/search` accept explicit current-note frontmatter filters and bounded key/value discovery. Metadata-only requests need no query text, and `-n 0`/`limit: 0` suppresses note hits while retaining discovery.
|
|
14
|
+
|
|
15
|
+
- **CLI and HTTP lexical search see unsynced note edits without repairing the persistent index.** HTTP reuses a server-owned detached native FTS corpus; each CLI invocation closes its own transient corpus. Requests that race an edit return a retry instead of stale matches with new previews.
|
|
16
|
+
|
|
7
17
|
## [0.20.6] - 2026-10-01
|
|
8
18
|
|
|
9
19
|
- **`oms doctor contract --fix` usage says what it repairs.** The `doctor` and contract usage text said `--fix` only re-indexes a moved or unindexed vault; it also rebuilds an unreadable index, and the usage now says so. The contract usage also names `oms interview` as the command that reseals a broken seal, matching the diagnosis's `recovery` field.
|
package/CHANGELOG-kernel.md
CHANGED
|
@@ -4,6 +4,63 @@ Domain logic changes belong here.
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [0.21.0] - 2026-10-03
|
|
8
|
+
|
|
9
|
+
- Default public facet summaries now bound payload bytes as well as cardinality: at most 20 entries and 32 KiB of serialized array JSON including the two-space CLI/MCP indentation, omitting keys or values over 512 UTF-8 bytes without changing their identities. Warnings disclose retained/total counts and byte-limit omissions; complete collection aggregation, hit ranking, counts and pagination remain unchanged. This bounds the facet array, not the whole response or aggregation memory.
|
|
10
|
+
|
|
11
|
+
- Temporary lexical spills and read-only snapshots retain the canonical directory's device/inode identity and recheck ownership before reuse, copying, and cleanup. Missing, replaced, symlinked, or unverifiable directories are left untouched with a bounded residue diagnostic; cleanup failures preserve the original operation error. These observations detect replacement but do not provide an atomic boundary against ongoing same-user tampering.
|
|
12
|
+
|
|
13
|
+
- Observed-only frontmatter filters and discovery capture current metadata without seeding detached lexical storage or chunking Markdown. Warm requests reuse the existing parsed projection cache and private EAV backing. A later lexical or mixed query reconciles the complete canonical chunk corpus, while concurrent upgrades wait for joined metadata selectors to finish; source witnesses, cursor validation, memory budgets and read-only persistence behavior are preserved.
|
|
14
|
+
|
|
15
|
+
- Detached lexical reconciliation skips clearing a document whose stored chunk set is already empty. Empty FTS deletes flush pending terms even without matching rows; avoiding them lets fresh notes share the intended bounded native batch while preserving existing-note cleanup and rollback.
|
|
16
|
+
|
|
17
|
+
- Live lexical capture groups disk-backed document updates into bounded synchronous transactions. The queue owns serialized chunks and source evidence, including title/heading metadata, and flushes residual records before retrieval. Dedicated reconciliation reuses its outer rollback boundary without redundant FTS savepoints; ordinary store methods retain independent atomicity. In-memory capture still commits and checks the spill budget one document at a time.
|
|
18
|
+
|
|
19
|
+
- Detached live lexical captures update each note's chunks and verified source evidence in one synchronous private transaction, reducing separate commits during cold corpus construction. A failed source publication rolls back that note's lexical changes. Persistent stores, SQLite durability settings, native ranking, memory budgets and final source validation keep their existing behavior.
|
|
20
|
+
|
|
21
|
+
- Live lexical capture shares one canonical frontmatter parse between its compact metadata projection and chunk title extraction. Malformed metadata diagnostics, title fallback, raw embedding text and copied projection values keep their existing semantics; unchanged warm notes still skip parsing.
|
|
22
|
+
|
|
23
|
+
- Chunking counts each line's script-aware token weight once and carries the exact weight through overlap, avoiding repeated scans of growing buffers on short-line notes. Canonical chunk text, title, heading paths, ordinals and digests remain unchanged; cold live search still captures the full corpus and performs its existing freshness checks.
|
|
24
|
+
|
|
25
|
+
- Automatic maintenance ignores excluded editor housekeeping watch hints while retaining known exclusion settings and their directory replacements. Uppercase Markdown hints remain incremental, and unsafe or uncertain paths still request complete reconciliation.
|
|
26
|
+
|
|
27
|
+
- Automatic full maintenance only loads an already installed native embedding backend; missing binaries fail with setup guidance instead of downloading or building llama.cpp in the background. Explicit provider callers retain their existing policy.
|
|
28
|
+
|
|
29
|
+
- Explicit automatic maintenance reuses the existing index and revisioned queue with bounded scheduling, complete-scan recovery and separate conservative process ownership. Watch hints never authorize mass deletion; cancelled or superseded embedding jobs cannot commit. The feature stays off unless a server invocation enables it, and existing source/target/model checks remain authoritative.
|
|
30
|
+
|
|
31
|
+
- Warm live lexical sessions keep their complete private corpus across persistent index writes, vector syncs, rebuilds, and index removal or replacement. Each query still refreshes current Markdown and validates returned sources; incomplete captures and changed or unknown vault identities retain conservative bootstrap checks. Private freshness never certifies persistent/vector synchronization, and searches still leave those stores untouched.
|
|
32
|
+
- Late embedding jobs validate their captured revision and model before initializing an existing store. Preflight, schema initialization, and publication share one connection and transaction, so replaced stores and cancelled legacy migrations remain unchanged when a job is rejected.
|
|
33
|
+
|
|
34
|
+
- Background embedding maintenance completes already-embedded queue entries only after checking real vector coverage, and repairs verified clean chunks whose vectors are missing. Legacy revision-less entries can be upgraded safely, preventing repeated stale retries after interrupted queue housekeeping. Pending-only paths remain visible to complete scans so excluded or deleted notes cannot strand orphaned work.
|
|
35
|
+
|
|
36
|
+
- Short index writers serialize stale-lock recovery with immutable per-attempt owner records, closing a race that could temporarily move a live successor and admit another writer. All concurrent writers must use the upgraded protocol; the legacy lock remains visible but cannot fence an already-running old reclaimer. Unreadable or malformed legacy owner records now fail closed instead of being reclaimed or retried indefinitely.
|
|
37
|
+
|
|
38
|
+
- Per-note write maintenance publishes lexical chunks, source evidence, and a revisioned embedding queue in one SQLite transaction. Background embedding results can commit only against the same source, chunks, model, and active owner; edits, deletions, or cancellation leave newer work intact. Explicit embedding sync also repairs missing vectors left by interrupted legacy lexical updates and retains pending work through lexical-only passes.
|
|
39
|
+
|
|
40
|
+
- Observed value facets include a directly reusable, JSON-safe exact typed selection. Selecting a date, date-looking string, numeric timestamp, boolean or string now reproduces its distinct-note count within an unchanged discovery scope, without changing declared-axis or legacy comparison behavior. Exact date selectors require canonical ISO strings rather than permissive date coercion.
|
|
41
|
+
- Ordinary live refresh prunes obsolete projection backing without invalidating unchanged observed-field rows. The next explicit observed query removes deleted/excluded canonical metadata and adds renamed notes through the existing authoritative snapshot reconciliation, avoiding a whole-corpus EAV rewrite while retaining cursor invalidation and current-source checks.
|
|
42
|
+
|
|
43
|
+
- Live lexical projection overflow now reuses the original compact parsed document from versioned binary rows in the existing session-private axis store. Unchanged notes beyond the object-cache budget no longer require repeated body reads or YAML parsing; edits and missing/incompatible rows are recaptured, deleted/excluded rows are removed, and ordinary declared-axis/facet behavior remains unchanged. The same private spill owner bounds retained SQLite pages and cleans up failed refreshes after readers drain.
|
|
44
|
+
|
|
45
|
+
- Explicit observed frontmatter queries now filter the same current-byte native FTS snapshot before candidate limits. Scalar/list predicates, bounded key/value discovery, cross-session cursors, and source-race rejection work without a sealed field declaration; existing declared axes retain their semantics. Dense observations spill the existing EAV repository to disposable session-private storage, never a new persistent index.
|
|
46
|
+
|
|
47
|
+
- The existing axis-observation repository gains an in-memory observed-field query foundation: shared scalar/list and range operators, parameterized pre-limit candidate intersection, current-source reconciliation, and bounded key/value discovery with distinct-note counts and snapshot-bound cursors. Declared typed axes keep their existing behavior, and cyclic YAML lists no longer recurse forever in the EAV importer.
|
|
48
|
+
|
|
49
|
+
- Hash-prefixed native document IDs resolve currently admitted Markdown paths, so new or renamed live-search hits can be opened before an explicit index sync. The reader checks current exclusions and captures confined, non-symlink source bytes without changing model/backend selection.
|
|
50
|
+
|
|
51
|
+
- Live lexical sessions pin candidate capture across concurrent generation changes, drain bounded readers before failed cleanup, and release oversized cores when spill fails. Compact facet projections own their retained string storage so previews, YAML scalars, and link targets cannot pin entire raw notes behind the cache budget.
|
|
52
|
+
|
|
53
|
+
- **Lexical search stays current between explicit index syncs.** A bounded, session-owned native SQLite FTS corpus refreshes changed/new notes and removes deleted or excluded notes without modifying the vault or persistent index. Native ranking, candidate limits, and complete totals are preserved; source evidence and preview-byte checks reject mid-query revision races. Missing legacy evidence is rebuilt only in the detached corpus, and oversized snapshots spill to disposable external storage.
|
|
54
|
+
|
|
55
|
+
- Skip per-note filesystem alias probes when source exclusions contain no alias targets, keeping ordinary vault scans responsive without changing exclusion decisions.
|
|
56
|
+
- Read-only SQLite snapshot capture now streams through one 1 MiB buffer instead of retaining two whole database/WAL images. The existing double-capture byte-digest and file-identity checks remain, opened handles are verified against the observed pathname, and failed captures close descriptors and discard their temporary files. Large indexes can be read without memory allocation proportional to multiple copies of the index.
|
|
57
|
+
|
|
58
|
+
- **Persisted searches report stale source evidence instead of presenting stale matches with fresh previews.** Explicit synchronization records per-note filesystem change evidence and byte digests, including empty notes. A read-only indexed query checks that evidence before retrieval and again after reading previews; missing legacy evidence or externally changed notes return `available: false`, `indexDrift: true`, and an explicit sync command. Unchanged checks do not read note bodies, and a byte-identical touch is verified by hashing only that note. Full or collection-scoped synchronization also removes deleted or newly excluded entries in its own scope; one-file write maintenance preserves unrelated entries. This is a correctness boundary, not live indexing: a subsequent change can add read-only live refresh without weakening the evidence checks.
|
|
59
|
+
- Graph and node-index construction bound concurrent note reads to 32 handles, preventing file-descriptor exhaustion on large vaults without changing the resulting projection or source signature. A failed read stops new work and drains open handles before its original error is returned.
|
|
60
|
+
|
|
61
|
+
- Warm node-cache reads validate a version-5 filesystem metadata witness instead of rereading every note body. Byte-identical touches still reuse the cache through the existing content hash; real edits and projection changes remain loud. Explicit graph builds derive edges, nodes, and the content hash from the same handle-verified captured bytes and verify note membership and metadata before publishing either cache, while read-only searches leave cache state untouched. Filesystems without trustworthy high-resolution identity evidence retain full-byte validation.
|
|
62
|
+
- **Writes revalidate live template sources before publishing a note.** New notes and writes naming a template carry a witness of the template-folder selector, discovered source paths, exact-byte digests and scan diagnostics. A changed observation returns retryable `WRITE_TEMPLATE_SOURCE_CHANGED` instead of saving stale scaffolding; retrying reads the current templates. Validation runs after the temporary note is staged, again before a hard-link fallback, and before keeping a draft. The target note is rechecked after source validation so concurrent user edits observed there are preserved. This is optimistic revalidation, not a multi-file transaction: changes after a source's last observation can still race publication, and the existing target check-to-rename limitations remain.
|
|
63
|
+
|
|
7
64
|
## [0.20.6] - 2026-10-01
|
|
8
65
|
|
|
9
66
|
## [0.20.5] - 2026-09-30
|
package/CHANGELOG-mcp.md
CHANGED
|
@@ -4,6 +4,22 @@ MCP server tools and resources belong here.
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [0.21.0] - 2026-10-03
|
|
8
|
+
|
|
9
|
+
- Default read-only MCP servers now close their resources on stdin EOF and termination signals, including disposable lexical disk files after a completed query. Previously that shutdown handler was installed only for opt-in maintenance servers, so ordinary client closure could leave scratch behind. Forced process termination may still leave an orphan directory.
|
|
10
|
+
|
|
11
|
+
- Tool guidance identifies `search {path}` as the existing revision-bearing exact read for a subsequent `write.ifMatch`. A read/edit regression covers successful use and stale-revision refusal without changing response contracts.
|
|
12
|
+
|
|
13
|
+
- An explicitly enabled server exposes maintenance status in doctor status, signals successful writes to its bounded update queue, and drains/cancels maintenance on shutdown. The four-tool surface and read-only search annotation stay unchanged.
|
|
14
|
+
|
|
15
|
+
- Observed predicates accept `exact: {valueType, value}` and value facets return `selection` for direct reuse. Type/value mismatches are refused; exact date values are canonical ISO strings. Selection objects remain included in the existing serialized discovery-page budget.
|
|
16
|
+
|
|
17
|
+
- `search` `op: query` accepts the distinct `observed: {field?, discover?}` namespace and returns bounded `observed.discovery` only on request. Metadata-only calls can use `limit: 0`; declared `axes.field` and ordinary response payloads are unchanged.
|
|
18
|
+
|
|
19
|
+
- Live lexical servers retain only the detached index between requests. Reranker/model adapters remain request-owned, so changed installed-model defaults are resolved on the next request and caller-owned rerankers are never disposed.
|
|
20
|
+
|
|
21
|
+
- **Repeated lexical queries reuse one read-only live snapshot per server.** Unsynced note edits are searchable immediately on the next stable request. The server no longer copies the entire persistent index once to probe existence and again to execute the same query; explicit vector operations retain their existing request-scoped validation.
|
|
22
|
+
|
|
7
23
|
## [0.20.6] - 2026-10-01
|
|
8
24
|
|
|
9
25
|
- **The server instructions no longer call a stale `ifMatch` a safety refusal.** They listed it beside the vault boundary and a tampered contract as something that denies `write`. A missing or stale `ifMatch` is a revision precondition: it returns `WRITE_IF_MATCH_REQUIRED` or the retryable `WRITE_TARGET_CHANGED` and writes nothing, and the safety list now also names unsupported input.
|
package/CHANGELOG-vendors.md
CHANGED
|
@@ -4,6 +4,10 @@ Per-host adapter and installer changes belong here.
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [0.21.0] - 2026-10-03
|
|
8
|
+
|
|
9
|
+
- **Claude's published marketplace fallback follows the new repository owner.** npm-installed copies now add `Xia-Ataraxia/oh-my-second-brain`, and the marketplace manifest's homepage and repository fields use the same canonical location. The marketplace and plugin names and versions are unchanged.
|
|
10
|
+
|
|
7
11
|
## [0.20.6] - 2026-10-01
|
|
8
12
|
|
|
9
13
|
## [0.20.5] - 2026-09-30
|
package/CHANGELOG.md
CHANGED
|
@@ -10,6 +10,16 @@ This aggregate changelog contains changes that span multiple layers.
|
|
|
10
10
|
|
|
11
11
|
## [Unreleased]
|
|
12
12
|
|
|
13
|
+
## [0.21.0] - 2026-10-03
|
|
14
|
+
|
|
15
|
+
- Release rehearsals use a read-only verification job with no OIDC grant and never invoke npm publish, including dry runs. Manual dispatch on a tag or with `rehearsal=false` cannot publish or create a GitHub Release; publication requires a verified `oms-v*` tag push in a separate privileged job. The npm trusted-publisher transfer hold still applies.
|
|
16
|
+
|
|
17
|
+
- Release instructions use the canonical `oms setup host` and `oms setup package` commands and describe the six skills and four MCP tools verified by the artifact rehearsal, so operators can follow the documented upgrade steps with the current package.
|
|
18
|
+
|
|
19
|
+
- Packaging and documentation checks accept npm 12's package-name-keyed `pack --json` output alongside npm 10/11 arrays. A shared strict parser rejects errors, unexpected packages, multi-package reports, and malformed file manifests instead of silently skipping checks.
|
|
20
|
+
|
|
21
|
+
- **Repository metadata follows the GitHub ownership transfer.** Package, issue, installer, attribution, measurement, release-check, and release-process links now point directly at `Xia-Ataraxia/oh-my-second-brain` instead of relying on GitHub's redirect from `GoBeromsu`. The repository history, releases, tags, package name, marketplace name, versions, and author attribution are unchanged. npm trusted-publisher rebinding remains a separately approved registry action; no publish or tag is part of this migration.
|
|
22
|
+
|
|
13
23
|
## [0.20.6] - 2026-10-01
|
|
14
24
|
|
|
15
25
|
## [0.20.5] - 2026-09-30
|
package/README.ko.md
CHANGED
|
@@ -1,69 +1,33 @@
|
|
|
1
1
|
<p align="center">
|
|
2
|
-
<img src="./assets/readme
|
|
2
|
+
<img src="./assets/readme-hero.webp" alt="oh my secondbrain — 거대한 서가와 떠다니는 낱장, 서로 이어지는 지식의 별자리." width="100%" />
|
|
3
3
|
</p>
|
|
4
4
|
|
|
5
5
|
<h1 align="center">Oh My Second Brain</h1>
|
|
6
6
|
|
|
7
7
|
<p align="center">
|
|
8
8
|
<strong>흩어진 지식이, 다시 하나의 별자리로.</strong><br />
|
|
9
|
-
Obsidian
|
|
9
|
+
Obsidian · Markdown · AI 에이전트를 잇는 사용자 소유의 지식·컨벤션 레이어.
|
|
10
10
|
</p>
|
|
11
11
|
|
|
12
12
|
<p align="center">
|
|
13
|
-
<a href="
|
|
14
|
-
<a href="https://nodejs.org/"><img src="https://img.shields.io/badge/Node.js-%E2%89%A520-80b89b?style=flat-square" alt="Node.js 20 이상" /></a>
|
|
15
|
-
<a href="#mcp-도구와-에이전트-연결"><img src="https://img.shields.io/badge/MCP-4_tools-97a8b1?style=flat-square" alt="MCP 도구 4개" /></a>
|
|
16
|
-
<a href="https://github.com/GoBeromsu/oh-my-second-brain/blob/main/package.json"><img src="https://img.shields.io/badge/license-MIT-d7c7a8?style=flat-square" alt="패키지 라이선스 MIT" /></a>
|
|
17
|
-
</p>
|
|
18
|
-
|
|
19
|
-
<p align="center">
|
|
20
|
-
<a href="#빠른-시작"><strong>빠른 시작</strong></a> ·
|
|
13
|
+
<a href="#빠른-시작">빠른 시작</a> ·
|
|
21
14
|
<a href="#동작-방식">동작 방식</a> ·
|
|
22
15
|
<a href="#문서">문서</a> ·
|
|
23
|
-
<a href="https://github.com/
|
|
16
|
+
<a href="https://github.com/Xia-Ataraxia/oh-my-second-brain/releases">릴리스</a> ·
|
|
24
17
|
<a href="./README.md">English</a>
|
|
25
18
|
</p>
|
|
26
19
|
|
|
27
|
-
|
|
20
|
+
<p align="center"><sub>Node.js ≥ 20 · MCP 도구 4개 · 공통 스킬 6개 · 패키지 라이선스 MIT</sub></p>
|
|
28
21
|
|
|
29
|
-
볼트에는 이미 아이디어, 결정, 배운 것들이 쌓여 있다. **OMS는 에이전트가 그 지식을 되찾고, 내가 정한
|
|
30
|
-
|
|
31
|
-
Obsidian은 사령탑으로 남는다. OMS가 꺼져 있어도 노트는 사람이 읽고 고칠 수 있는 Markdown 파일이다. Claude Code, Codex, Hermes를 각 호스트의 통합 기능으로 같은 볼트에 연결할 수 있다.
|
|
22
|
+
볼트에는 이미 아이디어, 결정, 배운 것들이 쌓여 있다. **OMS는 에이전트가 그 지식을 되찾고, 내가 정한 규약에 맞춰 노트를 쓰도록 돕는다.** Obsidian은 사령탑으로 남고, 노트는 OMS가 꺼져 있어도 읽고 고칠 수 있는 Markdown 파일로 남는다.
|
|
32
23
|
|
|
33
24
|
## 왜 OMS인가?
|
|
34
25
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
</td>
|
|
41
|
-
<td width="50%" valign="top">
|
|
42
|
-
<h3>내 볼트의 언어 그대로</h3>
|
|
43
|
-
폴더와 속성의 의미는 내가 정한다. OMS가 제시하는 체계를 따르는 대신, 내 컨벤션을 기록한다.
|
|
44
|
-
</td>
|
|
45
|
-
</tr>
|
|
46
|
-
<tr>
|
|
47
|
-
<td width="50%" valign="top">
|
|
48
|
-
<h3>에이전트가 공유하는 계약</h3>
|
|
49
|
-
setup으로 볼트 규약을 봉인한다. 지원되는 쓰기 경로는 저장 전에 노트 전체가 그 계약에 맞는지 확인한다.
|
|
50
|
-
</td>
|
|
51
|
-
<td width="50%" valign="top">
|
|
52
|
-
<h3>파일의 소유권은 그대로</h3>
|
|
53
|
-
기존 Markdown 노트와 템플릿을 계속 쓴다. setup은 이 파일들을 다시 쓰지 않으며, 봉인된 계약은 볼트 밖에 둔다.
|
|
54
|
-
</td>
|
|
55
|
-
</tr>
|
|
56
|
-
<tr>
|
|
57
|
-
<td width="50%" valign="top">
|
|
58
|
-
<h3>호스트를 넘어 연결하기</h3>
|
|
59
|
-
Claude Code, Codex, Hermes의 네이티브 통합을 사용한다. MCP 도구 4개와 공통 워크플로 스킬 6개를 제공한다.
|
|
60
|
-
</td>
|
|
61
|
-
<td width="50%" valign="top">
|
|
62
|
-
<h3>추측 대신 상태 확인</h3>
|
|
63
|
-
계약 상태, 노트 규약 준수, 색인, wikilink 제안을 확인한다. 검색과 상태 조회는 읽기 전용이다.
|
|
64
|
-
</td>
|
|
65
|
-
</tr>
|
|
66
|
-
</table>
|
|
26
|
+
| 다시 찾기 | 내 규약으로 쓰기 | 계속 소유하기 |
|
|
27
|
+
| :--- | :--- | :--- |
|
|
28
|
+
| Lexical 검색부터 시작하고, 필요할 때 vector·HyDE·질의 확장·reranking을 선택한다. | 폴더와 속성의 의미를 직접 정한다. 지원되는 쓰기 경로에서 계약을 검사하고 결과를 알려준다. | 기존 노트와 템플릿을 유지하며 Claude Code, Codex, Hermes를 같은 볼트에 연결한다. |
|
|
29
|
+
|
|
30
|
+
검색과 `oms doctor status`는 읽기 전용이다. 색인 유지보수는 명시적으로 실행한다.
|
|
67
31
|
|
|
68
32
|
## 빠른 시작
|
|
69
33
|
|
|
@@ -139,7 +103,7 @@ oms search "프로젝트 결정" --vault /path/to/vault
|
|
|
139
103
|
- **판정자는 하나다.** 저장된 쓰기는 계약 위반을 `{field, kind}` 경고로, 거부된 쓰기는 그 이유를 같은 형태로 반환하며, 각각 안내 명령 하나가 붙는다. 규칙 값, 저장소 경로, 계약 본문은 반환하지 않는다.
|
|
140
104
|
- **변조된 봉인은 쓰기를 거부한다.** `.oms/settings.json`의 vault id가 이 기기의 봉인과 어긋나면 `contract-tampered`로 거부하고, `oms doctor contract`가 원인을 알려준다. 봉인 증거가 없거나 깨졌으면 `contract-unreadable` 경고와 함께 저장하며, 소유자가 `oms interview`로 다시 봉인할 때까지 이어진다. `oms doctor contract`가 볼트 이동이나 색인 항목의 누락·손상을 찾으면, 다시 봉인하지 않고 색인만 고치는 `oms doctor contract --fix`를 안내한다. 봉인이 아예 없는 기기에서는 판정하지 않는 것과 구별한다.
|
|
141
105
|
|
|
142
|
-
[아키텍처](./docs/architecture.md), [컨벤션](./docs/conventions.md), [ADR-007](https://github.com/
|
|
106
|
+
[아키텍처](./docs/architecture.md), [컨벤션](./docs/conventions.md), [ADR-007](https://github.com/Xia-Ataraxia/oh-my-second-brain/blob/main/docs/decisions/ADR-007-vault-contract-ontology.md)을 참고한다.
|
|
143
107
|
|
|
144
108
|
</details>
|
|
145
109
|
|
|
@@ -253,13 +217,13 @@ oms hook pre Claude 쓰기를 계약으로
|
|
|
253
217
|
| [설치](./docs/install.md): 설치, setup, 모델, 제거 | [아키텍처](./docs/architecture.md): 권위와 도메인 경계 |
|
|
254
218
|
| [볼트 컨벤션](./docs/conventions.md): 설정과 봉인된 계약 | [CLI 맵](./docs/cli-map.md): 명령과 MCP 작업 매핑 |
|
|
255
219
|
| [호스트 통합](./docs/adapters.md): Claude Code, Codex, Hermes | [검증된 target](./docs/verified-target.md): 안전한 볼트 선택 |
|
|
256
|
-
| [릴리스](https://github.com/
|
|
220
|
+
| [릴리스](https://github.com/Xia-Ataraxia/oh-my-second-brain/releases): 배포 버전 | [변경 이력](./CHANGELOG.md): 무엇이 왜 달라졌는가 |
|
|
257
221
|
|
|
258
222
|
## 기여와 크레딧
|
|
259
223
|
|
|
260
|
-
[기여 가이드](https://github.com/
|
|
224
|
+
[기여 가이드](https://github.com/Xia-Ataraxia/oh-my-second-brain/blob/main/CONTRIBUTING.md)를 읽거나, 재현 가능한 문제와 구체적인 제안을 [이슈](https://github.com/Xia-Ataraxia/oh-my-second-brain/issues)로 남길 수 있다.
|
|
261
225
|
|
|
262
|
-
[ACKNOWLEDGMENTS](./ACKNOWLEDGMENTS.md)는 [Ouroboros](./ACKNOWLEDGMENTS.md#ouroboros), [Gajae Code](./ACKNOWLEDGMENTS.md#gajae-code)의 deep-interview 등 설계에 영향을 준 아이디어를 기록한다. runtime 복제나 연구 결과를 뜻하지 않는다.
|
|
226
|
+
[ACKNOWLEDGMENTS](./ACKNOWLEDGMENTS.md)는 [Ouroboros](./ACKNOWLEDGMENTS.md#ouroboros), [Gajae Code](./ACKNOWLEDGMENTS.md#gajae-code)의 deep-interview 등 설계에 영향을 준 아이디어를 기록한다. runtime 복제나 연구 결과를 뜻하지 않는다. 상단 이미지는 서가와 떠다니는 낱장, 지식의 별자리를 표현한 자체 제작 Blender 장면이다. 네이티브 렌더링, CC0 목재 텍스처, 타이포그래피 출처는 [아트워크 크레딧](./assets/readme/ARTWORK.md)에 기록했다. 개념 이미지이며 제품 화면, host smoke 증거, 제품 gate 통과 결과가 아니다.
|
|
263
227
|
|
|
264
228
|
---
|
|
265
229
|
|
package/README.md
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<p align="center">
|
|
2
|
-
<img src="./assets/readme
|
|
2
|
+
<img src="./assets/readme-hero.webp" alt="oh my secondbrain — a towering library with floating pages and connected stars." width="100%" />
|
|
3
3
|
</p>
|
|
4
4
|
|
|
5
5
|
<h1 align="center">Oh My Second Brain</h1>
|
|
@@ -10,60 +10,24 @@
|
|
|
10
10
|
</p>
|
|
11
11
|
|
|
12
12
|
<p align="center">
|
|
13
|
-
<a href="
|
|
14
|
-
<a href="https://nodejs.org/"><img src="https://img.shields.io/badge/Node.js-%E2%89%A520-80b89b?style=flat-square" alt="Node.js 20 or later" /></a>
|
|
15
|
-
<a href="#mcp-tools--integrations"><img src="https://img.shields.io/badge/MCP-4_tools-97a8b1?style=flat-square" alt="4 MCP tools" /></a>
|
|
16
|
-
<a href="https://github.com/GoBeromsu/oh-my-second-brain/blob/main/package.json"><img src="https://img.shields.io/badge/license-MIT-d7c7a8?style=flat-square" alt="Package license: MIT" /></a>
|
|
17
|
-
</p>
|
|
18
|
-
|
|
19
|
-
<p align="center">
|
|
20
|
-
<a href="#quick-start"><strong>Quick start</strong></a> ·
|
|
13
|
+
<a href="#quick-start">Quick start</a> ·
|
|
21
14
|
<a href="#how-it-works">How it works</a> ·
|
|
22
15
|
<a href="#documentation">Documentation</a> ·
|
|
23
|
-
<a href="https://github.com/
|
|
24
|
-
<a href="https://github.com/
|
|
16
|
+
<a href="https://github.com/Xia-Ataraxia/oh-my-second-brain/releases">Releases</a> ·
|
|
17
|
+
<a href="https://github.com/Xia-Ataraxia/oh-my-second-brain/blob/main/README.ko.md">한국어</a>
|
|
25
18
|
</p>
|
|
26
19
|
|
|
27
|
-
|
|
20
|
+
<p align="center"><sub>Node.js ≥ 20 · 4 MCP tools · 6 shared skills · Package licensed MIT</sub></p>
|
|
28
21
|
|
|
29
|
-
Your vault already holds ideas, decisions, and things you learned. **OMS helps your agents find that knowledge and write within the conventions you defined.**
|
|
30
|
-
|
|
31
|
-
Obsidian stays the command center. Your notes stay plain Markdown, readable and editable even when OMS is not running. Connect Claude Code, Codex, or Hermes to the same vault through their host integrations.
|
|
22
|
+
Your vault already holds ideas, decisions, and things you learned. **OMS helps your agents find that knowledge and write within the conventions you defined.** Obsidian stays the command center. Your notes stay plain Markdown, readable and editable even when OMS is not running.
|
|
32
23
|
|
|
33
24
|
## Why OMS?
|
|
34
25
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
Search
|
|
40
|
-
</td>
|
|
41
|
-
<td width="50%" valign="top">
|
|
42
|
-
<h3>Your vault, your vocabulary</h3>
|
|
43
|
-
Define the meaning of folders and properties. OMS records your conventions instead of shipping a system you have to adopt.
|
|
44
|
-
</td>
|
|
45
|
-
</tr>
|
|
46
|
-
<tr>
|
|
47
|
-
<td width="50%" valign="top">
|
|
48
|
-
<h3>Give agents a shared contract</h3>
|
|
49
|
-
Seal your vault conventions through setup. Supported write paths check the whole note against that contract before saving it.
|
|
50
|
-
</td>
|
|
51
|
-
<td width="50%" valign="top">
|
|
52
|
-
<h3>Keep the files you own</h3>
|
|
53
|
-
Keep using your Markdown notes and templates. Setup does not rewrite them, and the sealed contract lives outside the vault.
|
|
54
|
-
</td>
|
|
55
|
-
</tr>
|
|
56
|
-
<tr>
|
|
57
|
-
<td width="50%" valign="top">
|
|
58
|
-
<h3>Connect across hosts</h3>
|
|
59
|
-
Use native integrations for Claude Code, Codex, and Hermes, with four MCP tools and six shared workflow skills.
|
|
60
|
-
</td>
|
|
61
|
-
<td width="50%" valign="top">
|
|
62
|
-
<h3>Inspect, don't guess</h3>
|
|
63
|
-
Check contract state, audit notes, inspect indexes, and review wikilink suggestions. Search and `doctor status` stay read-only.
|
|
64
|
-
</td>
|
|
65
|
-
</tr>
|
|
66
|
-
</table>
|
|
26
|
+
| Recall | Write with context | Keep ownership |
|
|
27
|
+
| :--- | :--- | :--- |
|
|
28
|
+
| Start with lexical retrieval. Choose vector, HyDE, query expansion, or reranking when you need them. | Define what your folders and properties mean. Supported write paths check the contract and report their findings. | Keep your existing notes and templates. Connect Claude Code, Codex, and Hermes to the same vault. |
|
|
29
|
+
|
|
30
|
+
Search and `oms doctor status` stay read-only. Index maintenance is explicit.
|
|
67
31
|
|
|
68
32
|
## Quick start
|
|
69
33
|
|
|
@@ -139,7 +103,7 @@ These are example requests, not captured run results. Available workflows and wr
|
|
|
139
103
|
- **One judge, bounded feedback.** A saved write returns its contract findings as `{field, kind}` warnings, and a refused write returns its reason the same way. Each of these comes with one guidance command, never rule values, store paths, or the contract body.
|
|
140
104
|
- **A tampered seal blocks writes.** When the vault id in `.oms/settings.json` no longer matches this machine's seal, writes are refused as `contract-tampered`; `oms doctor contract` explains it. Missing or broken seal evidence is `contract-unreadable`: the write is saved with that warning until the owner reseals with `oms interview`. When `oms doctor contract` finds a moved vault or a missing or unreadable index entry, it names `oms doctor contract --fix`, which reindexes without resealing. A machine with no seal is a different case: its vault is not contract-judged.
|
|
141
105
|
|
|
142
|
-
See [architecture](./docs/architecture.md), [conventions](./docs/conventions.md), and [ADR-007](https://github.com/
|
|
106
|
+
See [architecture](./docs/architecture.md), [conventions](./docs/conventions.md), and [ADR-007](https://github.com/Xia-Ataraxia/oh-my-second-brain/blob/main/docs/decisions/ADR-007-vault-contract-ontology.md).
|
|
143
107
|
|
|
144
108
|
</details>
|
|
145
109
|
|
|
@@ -253,13 +217,13 @@ Note `create`, `append`, `update`, and `backfill` are retired operations. There
|
|
|
253
217
|
| [Installation](./docs/install.md): install, setup, models, removal | [Architecture](./docs/architecture.md): authority and domain boundaries |
|
|
254
218
|
| [Vault conventions](./docs/conventions.md): settings and sealed contracts | [CLI map](./docs/cli-map.md): command and MCP operation mapping |
|
|
255
219
|
| [Host integrations](./docs/adapters.md): Claude Code, Codex, Hermes | [Verified targets](./docs/verified-target.md): safe vault resolution |
|
|
256
|
-
| [Releases](https://github.com/
|
|
220
|
+
| [Releases](https://github.com/Xia-Ataraxia/oh-my-second-brain/releases): published versions | [Changelog](./CHANGELOG.md): what changed and why |
|
|
257
221
|
|
|
258
222
|
## Contributing & credits
|
|
259
223
|
|
|
260
|
-
Contributions are welcome. Start with the [contributing guide](https://github.com/
|
|
224
|
+
Contributions are welcome. Start with the [contributing guide](https://github.com/Xia-Ataraxia/oh-my-second-brain/blob/main/CONTRIBUTING.md), or [open an issue](https://github.com/Xia-Ataraxia/oh-my-second-brain/issues) with a reproducible problem or a focused proposal.
|
|
261
225
|
|
|
262
|
-
[ACKNOWLEDGMENTS](./ACKNOWLEDGMENTS.md) records design influences, including [Ouroboros](./ACKNOWLEDGMENTS.md#ouroboros) and [Gajae Code](./ACKNOWLEDGMENTS.md#gajae-code)'s deep-interview. Those credits describe ideas, not a copied runtime or a research result. The original
|
|
226
|
+
[ACKNOWLEDGMENTS](./ACKNOWLEDGMENTS.md) records design influences, including [Ouroboros](./ACKNOWLEDGMENTS.md#ouroboros) and [Gajae Code](./ACKNOWLEDGMENTS.md#gajae-code)'s deep-interview. Those credits describe ideas, not a copied runtime or a research result. The hero is an original Blender library scene with floating paper and knowledge-stars. [Artwork and material credits](./assets/readme/ARTWORK.md) describe its native rendering, CC0 wood texture, and typography. It is conceptual artwork, not a product screenshot, host-smoke evidence, or a product-gate result.
|
|
263
227
|
|
|
264
228
|
---
|
|
265
229
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "oms",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.21.0",
|
|
4
4
|
"description": "Oh My Second Brain convention layer for Obsidian vaults — Hermes skill bundle and MCP adapter.",
|
|
5
5
|
"_note": "oms setup host install writes ~/.hermes/config.yaml mcp_servers.oms and installs the six shared skills, prefixed `oms-`, with provenance under ~/.hermes/skills/knowledge-management/oms/."
|
|
6
6
|
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# README artwork
|
|
2
|
+
|
|
3
|
+
The English and Korean READMEs share the dark library poster titled **oh my secondbrain**.
|
|
4
|
+
|
|
5
|
+
## Native artwork
|
|
6
|
+
|
|
7
|
+
The scene was modeled and rendered in Blender 4.3.2 with Cycles. Three architectural shelving wings, individually varied books, an open volume, drifting paper leaves, and connected light points express personal knowledge as a library of stars. The final native background is 2700 × 1350, rendered with up to 1024 samples. Editable SVG typography supplies the poster layout; the repository uses an optimized 1800 × 1120 WebP export.
|
|
8
|
+
|
|
9
|
+
Geometry, paper shading, typeset page textures and layout are original to this artwork. The paper is an authored material, not a photographic paper scan. No image-generation model or photographic paintover was used.
|
|
10
|
+
|
|
11
|
+
## Third-party material and fonts
|
|
12
|
+
|
|
13
|
+
- Wood: [White Oak Veneer](https://polyhaven.com/a/white_oak_veneer) by Jenelle van Heerden, from Poly Haven under [CC0](https://polyhaven.com/license). The native scene uses the diffuse, roughness and OpenGL normal maps with a smoked warm finish.
|
|
14
|
+
- Typography: Nimbus Sans and Nimbus Mono PS from [URW Base35](https://github.com/ArtifexSoftware/urw-base35-fonts), distributed under AGPL-3.0 with the font exception. Fonts are rendered into this image; font binaries are not included in the repository hero asset.
|
|
15
|
+
|
|
16
|
+
The illustration is conceptual. It is not a product screenshot, a host-smoke result, or evidence that a product gate passed. Existing project acknowledgments and package licensing remain separate from these artwork credits.
|
|
Binary file
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: search
|
|
3
|
-
description: Retrieve vault knowledge through lexical, vector, HyDE, and
|
|
3
|
+
description: Retrieve vault knowledge through lexical, vector, HyDE, declared axes, and observed frontmatter.
|
|
4
4
|
aliases: [retrieve]
|
|
5
5
|
mcp_tool: search
|
|
6
6
|
mcp_args:
|
|
@@ -18,11 +18,12 @@ Retrieve vault knowledge without changing the vault. Search does not depend on c
|
|
|
18
18
|
/search <query|context|templates|index-status|get-document|link>
|
|
19
19
|
```
|
|
20
20
|
|
|
21
|
-
- `query` accepts
|
|
21
|
+
- `query` accepts a `query` string with optional `mode: "query" | "search" | "vsearch"`; typed retrieval with `searches`, `vec`, or `hyde` and no `mode` or `query`; or explicit `observed` frontmatter filtering/discovery, which can omit query text. `mode` never combines with `searches`. Lexical retrieval does not require a valid contract or an embedding provider.
|
|
22
22
|
- `context` retrieves the declared search context.
|
|
23
23
|
- `templates` lists the templates in the vault's template folder and their declared axes, or shows one template.
|
|
24
24
|
- `index-status` requires `view: "status" | "collections" | "contexts"`.
|
|
25
25
|
- `get-document` requires exactly one of `target`, `targets`, or `notePath` with its window.
|
|
26
|
+
- Before editing, call `search {path: "<vault-relative note>"}` without `op`. It returns the whole note and its byte revision in `documents[0].content` and `documents[0].revision`; use that revision as `write.ifMatch`. The separate `get-document` operation supports slices and batches and does not return this edit revision. Do not derive an overwrite revision from a preview or slice.
|
|
26
27
|
- `link` suggests `[[wikilinks]]` for one note (`notePath`, optional `folder`). Suggestions are anchored to a term note's basename or alias, cover the first occurrence of each target only, and report an ambiguous span instead of resolving it. `oms search --link <path>` is the CLI counterpart.
|
|
27
28
|
|
|
28
29
|
A link suggestion is not consent, and search has no apply operation. Show the candidates and insert only the links the user accepts, with the host's file tools at the reported span; if the note changed since, suggest again. Save the note through MCP `write` so the contract judges it, then check it with `doctor { op: "link-check", notePath }`.
|
|
@@ -36,8 +37,19 @@ Typed queries intersect these axes:
|
|
|
36
37
|
- `axes.folder` scopes physical placement.
|
|
37
38
|
- `axes.link` follows observed wikilinks.
|
|
38
39
|
|
|
40
|
+
## Observed frontmatter
|
|
41
|
+
|
|
42
|
+
Use the separate `observed` namespace when the requested filter or exploration means values actually present in current notes, including unsealed or undeclared fields. Observation does not declare a field. `templates` is optional and is useful when declared-axis semantics are needed; it is not a prerequisite for observed discovery.
|
|
43
|
+
|
|
44
|
+
1. Page keys with `search {op: "query", observed: {discover: {limit: 20}}, limit: 0}`.
|
|
45
|
+
2. Page values for one returned key with `observed: {discover: {key: "subject", limit: 20}}`. Continue with `observed.discover.cursor`; this is separate from the note-hit cursor. Restart discovery if source changes invalidate the cursor.
|
|
46
|
+
3. Apply the chosen value facet's `selection` under `observed.field[<key>]` while retaining the discovery request's lexical query, collection and existing predicates. Merge it with a same-key range/membership predicate rather than replacing that predicate. For example, keep `score: {gte: 10, ...facet.selection}` when the facet was discovered under `score: {gte: 10}`. A string facet can return `selection: {exact: {valueType: "string", value: "science"}}`; exact date selections carry canonical ISO strings. Selection identifies a typed canonical value, not the entire query scope. Its count and note set are reproducible with unchanged sources and scope, before result caps or score/rerank filters. Replacing an existing predicate (including a previous exact selection) deliberately changes scope and may change the count; constructing equality from display text can also conflate date-looking strings and numeric timestamps.
|
|
47
|
+
4. Changing or adding lexical query text changes the scope. Keep `limit: 0` for discovery without note hits. Discovery-only responses use `facets: []` for the legacy facet field. Discovery pages are bounded by both item count and serialized bytes; follow the cursor and respect the explicit oversized-entry `omittedCount` rather than treating a short page as the whole vocabulary.
|
|
48
|
+
|
|
49
|
+
Observed filtering/discovery supports lexical and metadata-only requests. Do not combine it with vector, HyDE, or expansion. Scope discovery to a single `collectionPath`, not multi-collection aggregation. Use `axes.field` only for declared typed semantics; use `observed.field` deliberately rather than guessing a declaration or triggering repair.
|
|
50
|
+
|
|
39
51
|
A typed axis fails loudly on an undeclared field. Remove the typed axis rather than guessing a field. That failure does not stop lexical retrieval. Vector or HyDE retrieval fails loudly without a configured embedding provider and model. ADR-005 applies: do not hide a provider or backend failure as an empty success, a fake embedder, or another backend. Missing results are unobserved, not proof of absence.
|
|
40
52
|
|
|
41
|
-
Search never creates `.oms`
|
|
53
|
+
Search never creates `.oms` or mutates templates, notes, the contract, or persistent indexes. Live lexical reads may refresh private detached session caches and disposable temporary storage. A successful validated detached result, including `indexDrift: false`, does not certify that the untouched persistent/vector index was synchronized. Warm-session speed does not imply the same latency for a new standalone CLI invocation. A search call does not grant edit rights.
|
|
42
54
|
|
|
43
55
|
The surface is four MCP tools (write, search, interview, doctor) and six skills.
|
|
@@ -31,7 +31,7 @@ OMS fills only what is mechanical before it judges: template variables such as `
|
|
|
31
31
|
|
|
32
32
|
The judge answers allow or deny, and only a safety refusal denies. Allow writes the note atomically and returns the receipt `{ ok: true, path, revision, contractRevision, index: { keyword, vector }, conformed, missingDefaults, warnings, fixes, next? }`; the note is searchable by keyword in the next call when the vault has an index. A note that breaks the contract is still allowed: each finding is a `warnings` entry, and `next` names the one command to run next; with `contract-open` it is `oms interview`, which the user runs once to seal the vault's folders and properties, so tell the user to run it. To clear a warning, fix the note and write it again with the receipt's revision as `ifMatch`. Deny is for a safety refusal only (a path outside the vault, a control or unsafe path, unsupported input, a tampered contract): it writes nothing and returns `{ ok: false, status: "denied", refusals, violations: [{ field, kind }], reason }`, and `reason` ends with the guidance command. In a sealed vault, when the frontmatter does not parse, the note may be kept as a draft outside the vault instead of saved, and the answer is `{ ok: false, status: "drafted", draftRef, warnings }` (when no draft can be kept, the note is saved with its warnings instead); fix the frontmatter and write again. A finding names a field and a kind only; it never quotes a rule. Do not guess missing values and do not weaken the contract so the note passes; when you cannot fix a finding from what the user gave you, ask.
|
|
33
33
|
|
|
34
|
-
To replace an existing note,
|
|
34
|
+
To replace an existing note, first read it with `search { path }` (no `op`) and pass `documents[0].revision` as `ifMatch` while editing `documents[0].content`. A previous receipt or `write { path, content, check: true }` also reports the revision. Without `ifMatch` the overwrite is refused with `WRITE_IF_MATCH_REQUIRED` and nothing is written; `WRITE_TARGET_CHANGED` means the note moved on, so read it again before retrying; `WRITE_TARGET_ABSENT` means there is no note to replace, so retry without `ifMatch` to create it. `check` also returns the frame for the target (folder meaning, the property and template fields to satisfy, and which may stay absent) and touches nothing on disk.
|
|
35
35
|
|
|
36
36
|
Placement is explicit: an explicit path, otherwise the folder meaning the user approved, otherwise ask. There is no Inbox fallback.
|
|
37
37
|
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import type { McpEngineAdapter } from "../kernel/engine/mcp/facade.js";
|
|
2
|
+
import type { LiveLexicalSession } from "../kernel/engine/embed/live-lexical.js";
|
|
2
3
|
export interface EngineSessionOptions {
|
|
3
4
|
readonly write: boolean;
|
|
5
|
+
/** A pure lexical search; pass a server-owned session to retain its detached core. */
|
|
6
|
+
readonly liveLexical?: true | LiveLexicalSession;
|
|
4
7
|
readonly embed?: boolean;
|
|
5
8
|
readonly modelCacheDir?: string;
|
|
6
9
|
readonly modelEnv?: Readonly<Record<string, string | undefined>>;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { assembleCoreSemanticEngineReadOnly, assembleEngineReadOnly, assembleEphemeralCoreSemanticEngine, } from "../kernel/engine/assemble.js";
|
|
1
|
+
import { assembleCoreSemanticEngineReadOnly, assembleLiveLexicalEngine, assembleEngineReadOnly, assembleEphemeralCoreSemanticEngine, } from "../kernel/engine/assemble.js";
|
|
2
2
|
import { assembleFullSemanticEngine, assembleSemanticEngine, embeddingConfigPresent, } from "../kernel/semantic/semantic-engine.js";
|
|
3
3
|
import { readVaultEmbeddingModelSync } from "../kernel/engine/embed/config.js";
|
|
4
4
|
import { readInstalledModelsReceiptSync } from "../kernel/engine/embed/model.js";
|
|
@@ -25,6 +25,10 @@ export function createEngineSession(vault, options) {
|
|
|
25
25
|
...(options.modelCacheDir === undefined ? {} : { embeddingCacheDir: options.modelCacheDir }),
|
|
26
26
|
...(options.modelEnv === undefined ? {} : { modelEnv: options.modelEnv }),
|
|
27
27
|
};
|
|
28
|
+
if (options.liveLexical !== undefined) {
|
|
29
|
+
const engine = assembleLiveLexicalEngine(modelInputs, options.liveLexical === true ? undefined : options.liveLexical);
|
|
30
|
+
return { adapter: engine.adapter, dispose: () => engine.dispose() };
|
|
31
|
+
}
|
|
28
32
|
const readOnly = embeddingConfigPresent(vault, options.modelCacheDir, options.modelEnv)
|
|
29
33
|
? assembleEngineReadOnly({
|
|
30
34
|
...modelInputs,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine-session.js","sourceRoot":"","sources":["../../src/cli/engine-session.ts"],"names":[],"mappings":"AACA,OAAO,EACL,kCAAkC,EAClC,sBAAsB,EACtB,mCAAmC,GAEpC,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,0BAA0B,EAC1B,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,EAAE,8BAA8B,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"engine-session.js","sourceRoot":"","sources":["../../src/cli/engine-session.ts"],"names":[],"mappings":"AACA,OAAO,EACL,kCAAkC,EAClC,yBAAyB,EACzB,sBAAsB,EACtB,mCAAmC,GAEpC,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,0BAA0B,EAC1B,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,EAAE,8BAA8B,EAAE,MAAM,iCAAiC,CAAC;AAkBjF,oFAAoF;AACpF,MAAM,UAAU,yBAAyB,CACvC,KAAa,EACb,aAAsB,EACtB,QAAuD;IAEvD,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,aAAa,EAAE,QAAQ,CAAC,EAAE,CAAC;QAC5D,MAAM,IAAI,KAAK,CACb,2CAA2C,KAAK,uLAAuL,CACxO,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAa,EAAE,OAA6B;IAC9E,IAAI,OAAO,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;QAC3B,yBAAyB,CAAC,KAAK,EAAE,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC1E,MAAM,MAAM,GAAG,0BAA0B,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QACrG,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;IACtE,CAAC;IAED,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,MAAM,GAAG,sBAAsB,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QACjG,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;IACtE,CAAC;IAED,MAAM,WAAW,GAAG;QAClB,KAAK;QACL,mBAAmB,EAAE,2BAA2B,CAAC,KAAK,CAAC;QACvD,sBAAsB,EAAE,8BAA8B,CACpD,OAAO,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,aAAa,EAAE,CAC/E;QACD,GAAG,CAAC,OAAO,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC;QAC5F,GAAG,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC;KAC1E,CAAC;IACF,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,yBAAyB,CAAC,WAAW,EAAE,OAAO,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACtH,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;IACtE,CAAC;IACD,MAAM,QAAQ,GAA2B,sBAAsB,CAAC,KAAK,EAAE,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,QAAQ,CAAC;QAC7G,CAAC,CAAC,sBAAsB,CAAC;YACvB,GAAG,WAAW;SACf,CAAC;QACF,CAAC,CAAC,kCAAkC,CAAC,WAAW,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,QAAQ,IAAI,mCAAmC,CAAC,WAAW,CAAC,CAAC;IAC5E,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;AACtE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,KAAa,EACb,OAA6B,EAC7B,EAA6C;IAE7C,MAAM,OAAO,GAAG,mBAAmB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACpD,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;YAAS,CAAC;QACT,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IAC1B,CAAC;AACH,CAAC"}
|