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