oh-my-second-brain 0.12.2 → 0.14.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 +2 -2
- package/.claude-plugin/plugin.json +2 -2
- package/.codex-plugin/plugin.json +2 -2
- package/.mcp.codex.json +1 -0
- package/.mcp.json +1 -1
- package/CHANGELOG-assets.md +10 -0
- package/CHANGELOG-cli.md +15 -0
- package/CHANGELOG-kernel.md +24 -0
- package/CHANGELOG-mcp.md +24 -0
- package/CHANGELOG-vendors.md +15 -0
- package/CHANGELOG.md +9 -0
- package/README.ko.md +48 -23
- package/README.md +40 -22
- package/assets/claude/hooks/oms-guard.mjs +3 -3
- package/assets/claude/hooks/oms-post-guard.mjs +5 -5
- package/assets/codex/AGENTS.md +1 -1
- package/assets/codex/rules/oms.md +2 -2
- package/assets/hermes/README.md +3 -3
- package/assets/hermes-manifest.json +2 -2
- package/assets/skills/distill/SKILL.md +8 -2
- package/assets/skills/doctor/SKILL.md +5 -3
- package/assets/skills/link/SKILL.md +13 -4
- package/assets/skills/search/SKILL.md +12 -6
- package/assets/skills/status/SKILL.md +6 -2
- package/assets/skills/template/SKILL.md +20 -7
- package/assets/skills/write/SKILL.md +32 -7
- package/dist/cli/args.d.ts +2 -12
- package/dist/cli/args.js +55 -126
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/audit.d.ts +1 -0
- package/dist/cli/audit.js +21 -2
- package/dist/cli/audit.js.map +1 -1
- package/dist/cli/doc-command.d.ts +16 -0
- package/dist/cli/doc-command.js +54 -24
- package/dist/cli/doc-command.js.map +1 -1
- package/dist/cli/graph-command.d.ts +1 -0
- package/dist/cli/graph-command.js +92 -0
- package/dist/cli/graph-command.js.map +1 -0
- package/dist/cli/host-commands.d.ts +12 -14
- package/dist/cli/host-commands.js +143 -60
- package/dist/cli/host-commands.js.map +1 -1
- package/dist/cli/host-probe.d.ts +5 -0
- package/dist/cli/host-probe.js +129 -0
- package/dist/cli/host-probe.js.map +1 -0
- package/dist/cli/index-command.d.ts +8 -0
- package/dist/cli/index-command.js +149 -27
- package/dist/cli/index-command.js.map +1 -1
- package/dist/cli/link-check.d.ts +5 -0
- package/dist/cli/link-check.js +19 -0
- package/dist/cli/link-check.js.map +1 -0
- package/dist/cli/link-command.d.ts +2 -0
- package/dist/cli/link-command.js +257 -1
- package/dist/cli/link-command.js.map +1 -1
- package/dist/cli/linkify.d.ts +2 -2
- package/dist/cli/linkify.js +2 -2
- package/dist/cli/model-command.d.ts +2 -0
- package/dist/cli/model-command.js +178 -0
- package/dist/cli/model-command.js.map +1 -0
- package/dist/cli/note-command.d.ts +2 -0
- package/dist/cli/note-command.js +277 -0
- package/dist/cli/note-command.js.map +1 -0
- package/dist/cli/oms.d.ts +0 -4
- package/dist/cli/oms.js +177 -124
- package/dist/cli/oms.js.map +1 -1
- package/dist/cli/package-command.d.ts +1 -0
- package/dist/cli/package-command.js +82 -0
- package/dist/cli/package-command.js.map +1 -0
- package/dist/cli/search-usage.js +6 -11
- package/dist/cli/search-usage.js.map +1 -1
- package/dist/cli/search.d.ts +2 -9
- package/dist/cli/search.js +164 -53
- package/dist/cli/search.js.map +1 -1
- package/dist/cli/serve-http.d.ts +3 -0
- package/dist/cli/serve-http.js +150 -30
- package/dist/cli/serve-http.js.map +1 -1
- package/dist/cli/setup-command.d.ts +1 -1
- package/dist/cli/setup-command.js +70 -4
- package/dist/cli/setup-command.js.map +1 -1
- package/dist/cli/status-command.d.ts +1 -0
- package/dist/cli/status-command.js +124 -0
- package/dist/cli/status-command.js.map +1 -0
- package/dist/cli/template-command.d.ts +2 -0
- package/dist/cli/template-command.js +301 -0
- package/dist/cli/template-command.js.map +1 -0
- package/dist/cli/usage.js +45 -69
- package/dist/cli/usage.js.map +1 -1
- package/dist/kernel/capture/safe.d.ts +4 -0
- package/dist/kernel/capture/safe.js +163 -15
- package/dist/kernel/capture/safe.js.map +1 -1
- package/dist/kernel/conventions/note-exclude.js +11 -58
- package/dist/kernel/conventions/note-exclude.js.map +1 -1
- package/dist/kernel/conventions/report.js +1 -1
- package/dist/kernel/conventions/report.js.map +1 -1
- package/dist/kernel/conventions/write-contract.d.ts +3 -3
- package/dist/kernel/conventions/write-contract.js +8 -1
- package/dist/kernel/conventions/write-contract.js.map +1 -1
- package/dist/kernel/conventions/write-protocol.js.map +1 -1
- package/dist/kernel/doctor/service.d.ts +23 -1
- package/dist/kernel/doctor/service.js +105 -0
- package/dist/kernel/doctor/service.js.map +1 -1
- package/dist/kernel/engine/embed/model.d.ts +27 -0
- package/dist/kernel/engine/embed/model.js +119 -7
- package/dist/kernel/engine/embed/model.js.map +1 -1
- package/dist/kernel/engine/embed/read-snapshot.d.ts +16 -0
- package/dist/kernel/engine/embed/read-snapshot.js +116 -0
- package/dist/kernel/engine/embed/read-snapshot.js.map +1 -0
- package/dist/kernel/engine/embed/repair.js +19 -7
- package/dist/kernel/engine/embed/repair.js.map +1 -1
- package/dist/kernel/engine/embed/store.js +118 -103
- package/dist/kernel/engine/embed/store.js.map +1 -1
- package/dist/kernel/engine/graph/builder.js +1 -1
- package/dist/kernel/engine/graph/builder.js.map +1 -1
- package/dist/kernel/engine/graph/explore.d.ts +1 -1
- package/dist/kernel/engine/graph/explore.js +7 -4
- package/dist/kernel/engine/graph/explore.js.map +1 -1
- package/dist/kernel/engine/graph/node.js +13 -5
- package/dist/kernel/engine/graph/node.js.map +1 -1
- package/dist/kernel/engine/mcp/facade.js +36 -30
- package/dist/kernel/engine/mcp/facade.js.map +1 -1
- package/dist/kernel/engine/mcp/query-mapper.d.ts +1 -1
- package/dist/kernel/engine/mcp/query-mapper.js +2 -2
- package/dist/kernel/engine/mcp/query-mapper.js.map +1 -1
- package/dist/kernel/engine/mcp/types.d.ts +1 -1
- package/dist/kernel/engine/retrieval/taxonomy-context.js +1 -1
- package/dist/kernel/engine/retrieval/taxonomy-context.js.map +1 -1
- package/dist/kernel/harness/surface-registry.js +24 -18
- package/dist/kernel/harness/surface-registry.js.map +1 -1
- package/dist/kernel/harness/validation.js +4 -1
- package/dist/kernel/harness/validation.js.map +1 -1
- package/dist/kernel/install/asset-health.d.ts +47 -0
- package/dist/kernel/install/asset-health.js +90 -0
- package/dist/kernel/install/asset-health.js.map +1 -0
- package/dist/kernel/install/common.js +1 -1
- package/dist/kernel/install/common.js.map +1 -1
- package/dist/kernel/link/convention-note.js +4 -4
- package/dist/kernel/link/convention-note.js.map +1 -1
- package/dist/kernel/runtime/event-journal.d.ts +12 -0
- package/dist/kernel/runtime/event-journal.js +311 -0
- package/dist/kernel/runtime/event-journal.js.map +1 -0
- package/dist/kernel/runtime/event-read.d.ts +3 -0
- package/dist/kernel/runtime/event-read.js +80 -0
- package/dist/kernel/runtime/event-read.js.map +1 -0
- package/dist/kernel/runtime/event-summary.d.ts +20 -0
- package/dist/kernel/runtime/event-summary.js +49 -0
- package/dist/kernel/runtime/event-summary.js.map +1 -0
- package/dist/kernel/runtime/event-types.d.ts +91 -0
- package/dist/kernel/runtime/event-types.js +10 -0
- package/dist/kernel/runtime/event-types.js.map +1 -0
- package/dist/kernel/search/morning-test-fixtures.js +3 -3
- package/dist/kernel/search/morning-test-fixtures.js.map +1 -1
- package/dist/kernel/searchbackend/engine-search-backend.js +4 -4
- package/dist/kernel/searchbackend/engine-search-backend.js.map +1 -1
- package/dist/kernel/setup/documents.d.ts +17 -8
- package/dist/kernel/setup/documents.js +13 -4
- package/dist/kernel/setup/documents.js.map +1 -1
- package/dist/kernel/setup/service.d.ts +11 -2
- package/dist/kernel/setup/service.js +27 -6
- package/dist/kernel/setup/service.js.map +1 -1
- package/dist/kernel/templates/canonical.d.ts +9 -5
- package/dist/kernel/templates/canonical.js +53 -3
- package/dist/kernel/templates/canonical.js.map +1 -1
- package/dist/kernel/templates/compose-add.d.ts +27 -0
- package/dist/kernel/templates/compose-add.js +29 -0
- package/dist/kernel/templates/compose-add.js.map +1 -0
- package/dist/kernel/templates/contract-from-notes.d.ts +32 -0
- package/dist/kernel/templates/contract-from-notes.js +285 -0
- package/dist/kernel/templates/contract-from-notes.js.map +1 -0
- package/dist/kernel/templates/doctor.d.ts +7 -2
- package/dist/kernel/templates/doctor.js +148 -28
- package/dist/kernel/templates/doctor.js.map +1 -1
- package/dist/kernel/templates/extract.d.ts +7 -8
- package/dist/kernel/templates/extract.js +27 -20
- package/dist/kernel/templates/extract.js.map +1 -1
- package/dist/kernel/templates/hints.d.ts +36 -0
- package/dist/kernel/templates/hints.js +279 -0
- package/dist/kernel/templates/hints.js.map +1 -0
- package/dist/kernel/templates/index.d.ts +3 -1
- package/dist/kernel/templates/index.js +1 -0
- package/dist/kernel/templates/index.js.map +1 -1
- package/dist/kernel/templates/migration.d.ts +34 -28
- package/dist/kernel/templates/migration.js +461 -710
- package/dist/kernel/templates/migration.js.map +1 -1
- package/dist/kernel/templates/obsidian-core-time.d.ts +19 -0
- package/dist/kernel/templates/obsidian-core-time.js +82 -0
- package/dist/kernel/templates/obsidian-core-time.js.map +1 -0
- package/dist/kernel/templates/operations.d.ts +8 -0
- package/dist/kernel/templates/operations.js +106 -0
- package/dist/kernel/templates/operations.js.map +1 -0
- package/dist/kernel/templates/paths.d.ts +5 -2
- package/dist/kernel/templates/paths.js +17 -2
- package/dist/kernel/templates/paths.js.map +1 -1
- package/dist/kernel/templates/policy.d.ts +59 -4
- package/dist/kernel/templates/policy.js +147 -38
- package/dist/kernel/templates/policy.js.map +1 -1
- package/dist/kernel/templates/register.d.ts +12 -0
- package/dist/kernel/templates/register.js +138 -0
- package/dist/kernel/templates/register.js.map +1 -0
- package/dist/kernel/templates/renderer.d.ts +11 -0
- package/dist/kernel/templates/renderer.js +67 -0
- package/dist/kernel/templates/renderer.js.map +1 -0
- package/dist/kernel/templates/resolver.d.ts +24 -1
- package/dist/kernel/templates/resolver.js +200 -53
- package/dist/kernel/templates/resolver.js.map +1 -1
- package/dist/kernel/templates/transaction.d.ts +17 -3
- package/dist/kernel/templates/transaction.js +199 -21
- package/dist/kernel/templates/transaction.js.map +1 -1
- package/dist/kernel/templates/types.d.ts +42 -17
- package/dist/kernel/update/update.d.ts +1 -7
- package/dist/kernel/update/update.js +36 -102
- package/dist/kernel/update/update.js.map +1 -1
- package/dist/mcp/server.d.ts +2 -1
- package/dist/mcp/server.js +731 -597
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/update-notice.js +1 -1
- package/dist/mcp/update-notice.js.map +1 -1
- package/dist/vendors/claude/claude.d.ts +2 -0
- package/dist/vendors/claude/claude.js +2 -1
- package/dist/vendors/claude/claude.js.map +1 -1
- package/dist/vendors/claude/hook/post-tool-use.js +1 -1
- package/dist/vendors/claude/hook/post-tool-use.js.map +1 -1
- package/dist/vendors/codex/codex.d.ts +2 -0
- package/dist/vendors/codex/codex.js +28 -33
- package/dist/vendors/codex/codex.js.map +1 -1
- package/dist/vendors/hermes/hermes.d.ts +2 -0
- package/dist/vendors/hermes/hermes.js +34 -13
- package/dist/vendors/hermes/hermes.js.map +1 -1
- package/docs/adapters.md +36 -1
- package/docs/architecture.md +27 -3
- package/docs/cli-map.md +88 -0
- package/docs/conventions.md +71 -8
- package/docs/install.md +75 -32
- package/docs/verified-target.md +3 -3
- package/package.json +7 -3
- package/skills/distill/SKILL.md +26 -0
- package/skills/doctor/SKILL.md +26 -0
- package/skills/link/SKILL.md +33 -0
- package/skills/search/SKILL.md +37 -0
- package/skills/status/SKILL.md +20 -0
- package/skills/template/SKILL.md +42 -0
- package/skills/write/SKILL.md +61 -0
- package/dist/cli/doctor-lint.d.ts +0 -17
- package/dist/cli/doctor-lint.js +0 -87
- package/dist/cli/doctor-lint.js.map +0 -1
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: search
|
|
3
3
|
description: Retrieve vault knowledge through resolved template axes.
|
|
4
4
|
aliases: [retrieve]
|
|
5
|
-
mcp_tool:
|
|
5
|
+
mcp_tool: search
|
|
6
6
|
mcp_args:
|
|
7
7
|
op: "query"
|
|
8
8
|
query: "$1"
|
|
@@ -15,17 +15,23 @@ Retrieve vault knowledge without changing the vault.
|
|
|
15
15
|
## Usage
|
|
16
16
|
|
|
17
17
|
```text
|
|
18
|
-
/search <query>
|
|
18
|
+
/search <query|context|template-scan|templates|index-status|get-document>
|
|
19
19
|
```
|
|
20
20
|
|
|
21
|
-
Plain `query` is projection-independent lexical retrieval and remains available when no embedding provider is configured.
|
|
22
|
-
|
|
21
|
+
- `query` requires `mode: "query" | "search" | "vsearch"` and exactly one of `query` or `searches`. Plain `mode: "query"` is projection-independent lexical retrieval and remains available when no embedding provider is configured.
|
|
22
|
+
- `context` retrieves the declared search context.
|
|
23
|
+
- `template-scan` reports template candidates without registering or writing them.
|
|
24
|
+
- `templates` lists templates when `templateId` is absent and shows one template when `templateId` is present.
|
|
25
|
+
- `index-status` requires `view: "status" | "collections" | "contexts"`.
|
|
26
|
+
- `get-document` requires exactly one of `target`, `targets`, or `notePath` with its window.
|
|
23
27
|
|
|
24
|
-
|
|
28
|
+
Do not use retired `lazy-load`, `multi-get-documents`, `collections`, `contexts`, or `status` search operations. Template-managed source files are never returned as notes. Expansion is explicit only for `search { op: "query" }` through its closed strategy object and never changes a plain lexical query.
|
|
29
|
+
|
|
30
|
+
Use `search { op: "templates" }` to list stable template IDs and declared axes, or add `templateId` to show exactly one. Typed queries use the same derived projection as writes:
|
|
25
31
|
|
|
26
32
|
- `axes.template` selects one stable template identity.
|
|
27
33
|
- `axes.field.<key>` filters a field declared by that template; values may be scalars, scalar lists, or supported predicate objects.
|
|
28
34
|
- `axes.folder` scopes physical placement.
|
|
29
35
|
- `axes.link` follows observed wikilinks.
|
|
30
36
|
|
|
31
|
-
Axes intersect. They require
|
|
37
|
+
Axes intersect. They require current authority and fail loudly on an undeclared field or stale signature; remove the typed axis or run template diagnosis rather than guessing. Vector or HyDE retrieval also fails loudly without a configured embedding provider and model. Missing results and history are unobserved, not proof of absence or non-use.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: status
|
|
3
3
|
description: Report read-only template, graph, and semantic-index health.
|
|
4
|
-
mcp_tool:
|
|
4
|
+
mcp_tool: status
|
|
5
5
|
mcp_args: {}
|
|
6
6
|
---
|
|
7
7
|
|
|
@@ -13,4 +13,8 @@ Report vault health without changing files.
|
|
|
13
13
|
/status
|
|
14
14
|
```
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
With `status` op absent, show the combined read-only view: resolved template count, current projection/input signature, managed template-source exclusions, template diagnosis state, and graph/semantic-index availability. Use `status { op: "graph" }` only for graph status. Do not send `graph` when requesting the combined view.
|
|
17
|
+
|
|
18
|
+
A malformed or missing projection is reported as invalid with an actionable doctor operation. Status never regenerates controls, rebuilds indexes, repairs notes, edits controls, or writes the vault. Use `oms graph build` / `doctor { op: "build-graph" }` for graph construction and `oms index sync|embed|repair` for embedding work.
|
|
19
|
+
|
|
20
|
+
Report runtime history separately: events live outside the vault and are scoped to the current host and vault. A missing event means unobserved, never unused. Distinguish actual mutation time from observation time; external drift gives a changed-between interval, not an invented modification timestamp. Every use/check verifies current authority instead of applying an age-based expiry rule. Surface `LEDGER_APPEND_FAILED` explicitly without claiming a successful vault write failed.
|
|
@@ -15,15 +15,28 @@ Turn the user's natural-language note design into an actual Obsidian Markdown te
|
|
|
15
15
|
- `.oms/taxonomy.json` owns folder/link `intent`, note placement, and global axes.
|
|
16
16
|
- `.oms/types.json` is derived state. Never edit it directly.
|
|
17
17
|
|
|
18
|
-
Use an existing stable `templateId` when updating or moving a template. A path or digest change never creates a new identity. New OMS-managed templates default to `<
|
|
18
|
+
Use an existing stable `templateId` when updating or moving a template. A path or digest change never creates a new identity. New OMS-managed templates default to `<sourceFolder>/<templateId>.md` inside a registered template folder (the folder marked `default: true` unless you name another registered folder); registered existing templates keep their explicitly verified `sourcePath`.
|
|
19
|
+
|
|
20
|
+
## Renderers
|
|
21
|
+
|
|
22
|
+
Every binding carries `renderer`. Obsidian renders; OMS validates.
|
|
23
|
+
|
|
24
|
+
- `obsidian-core`: only `{{title}}`, `{{date}}`, `{{time}}`, `{{date:FMT}}`, `{{time:FMT}}` appear. OMS can create notes from it.
|
|
25
|
+
- `templater`: `<% %>` appears and the YAML frontmatter parses. OMS extracts the key/type contract; every field whose value is a Templater tag is `filledBy: "obsidian"`. OMS never copies a raw tag into a note and never runs Templater: a note write without caller values for those fields returns `FIELD_FILLED_BY_OBSIDIAN` (ask the user), and a Templater body returns `TEMPLATE_RENDERER_EXTERNAL`.
|
|
26
|
+
- `none`: script-first or no frontmatter. The contract comes from notes Obsidian already produced (`contract-from-notes`), with the sample count and field coverage shown in the proposal; zero samples is `TEMPLATE_CONTRACT_UNOBSERVED`, not unused.
|
|
27
|
+
|
|
28
|
+
You may **propose** an `obsidian-core` copy of a Templater template when the mapping is exact: `tp.date.now("FMT")` -> `{{date:FMT}}` / `{{time:FMT}}`, `tp.file.title` -> `{{title}}`. Anything else has no faithful mapping; do not invent one. Submit the converted bytes as a new template through the guarded flow; the kernel validates syntax, contract, path, signatures, and CAS, and the user approves the digest.
|
|
19
29
|
|
|
20
30
|
## Workflow
|
|
21
31
|
|
|
22
|
-
1. Read `
|
|
32
|
+
1. Read `search { op: "templates" }` to list bindings, or `search { op: "templates", templateId }` to show one, then read the user's requested shape. Use `search { op: "template-scan" }` for candidates. Do not guess existing IDs or fields, and never auto-register a scan result.
|
|
23
33
|
2. Draft the exact Markdown and policy/taxonomy intent. Preserve unknown frontmatter, policy extensions, body bytes, and Obsidian property types.
|
|
24
|
-
3. Call `
|
|
25
|
-
4.
|
|
26
|
-
5.
|
|
27
|
-
6.
|
|
34
|
+
3. Call `write { op: "template", ..., dryRun: true }` for create, update, reclassify, relocate-folder, register-folder, remove, or default. Regeneration is not a write-template mode: use `doctor { op: "regenerate-types", dryRun: true }`. Current signatures are derived and verified by the server, not hand-assembled by the host.
|
|
35
|
+
4. To adopt a template that already exists in the vault, call `write { op: "template", mode: "register-existing", templateId, sourceFolder, sourcePath, renderer, filledBy, contract, naming, dryRun: true }` instead. `filledBy` lists Obsidian-filled field names (an empty array for a Core template). The server verifies the proposed metadata against the source and derives every signature itself; you supply no `expected*` digests and no template bytes.
|
|
36
|
+
5. Show the proposal, paths, diagnostics, and `approvalDigest` to the user.
|
|
37
|
+
6. Apply only after the caller explicitly approves that exact digest. Submit the same request with `dryRun: false` and `approvedDigest`.
|
|
38
|
+
7. Report the server-verified receipt and postconditions.
|
|
39
|
+
|
|
40
|
+
CLI uses the noun leaves `oms template scan|list|show|add|update|move|remove|default|check|regenerate-types`. Mutations require `--dry-run`, then the same request with `--yes --approved-digest`; resume uses `oms template update --resume` with the exact `transactionId` and `approvedDigest`. `add <folder>` registers a source folder; `add <file> --id` registers existing bytes; `add --id --from` proposes a new source inside an explicitly registered creation folder. `default <id>` chooses the default note binding, not the source creation folder. Removal keeps registered-existing files; `--delete-source` applies only to managed sources. Never remove the current default without selecting another binding first.
|
|
28
41
|
|
|
29
|
-
Reject unsupported expressions, unsafe paths, unresolved legacy mappings, stale signatures, and identity changes. Never self-approve, silently fall back to a legacy Concept reader, or directly mutate managed template/control files.
|
|
42
|
+
Reject unsupported expressions, unsafe paths, unresolved legacy mappings, stale signatures, and identity changes. Preserve non-observed proposal gaps explicitly. Never self-approve, silently fall back to a legacy Concept reader, or directly mutate managed template/control files.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: write
|
|
3
3
|
description: Write vault notes and manage Obsidian templates through the guarded template contract.
|
|
4
|
-
mcp_tool:
|
|
4
|
+
mcp_tool: write
|
|
5
5
|
mcp_args:
|
|
6
6
|
op: "note"
|
|
7
7
|
mode: "create"
|
|
@@ -11,26 +11,51 @@ mcp_args:
|
|
|
11
11
|
|
|
12
12
|
# write
|
|
13
13
|
|
|
14
|
-
Use MCP `
|
|
14
|
+
Use MCP `write` for every vault-note or managed-template mutation. Do not use host Write/Edit for vault Markdown.
|
|
15
15
|
|
|
16
16
|
## Notes
|
|
17
17
|
|
|
18
|
-
Translate the user's natural-language note kind into a stable ID returned by
|
|
18
|
+
Translate the user's natural-language note kind into a stable ID returned by
|
|
19
|
+
`search { op: "templates" }`; never guess an ID. A create may omit
|
|
20
|
+
`templateId` only to use the policy's declared `defaultTemplate`. If no default
|
|
21
|
+
is declared, report `TEMPLATE_DEFAULT_UNDECLARED`; never select the first
|
|
22
|
+
available template.
|
|
19
23
|
|
|
20
24
|
```text
|
|
21
|
-
/write
|
|
25
|
+
/write [template-id] [body]
|
|
22
26
|
```
|
|
23
27
|
|
|
24
|
-
For create, call `op: "note"` with `mode
|
|
28
|
+
For create, call `op: "note"` with `mode: "create"`, optional `templateId`, and
|
|
29
|
+
body/frontmatter; placement and naming derive the path. For append/update, pass
|
|
30
|
+
`notePath` without a caller-selected `templateId`; OMS resolves the persisted
|
|
31
|
+
note identity. The actual Obsidian template supplies frontmatter shape and body
|
|
32
|
+
scaffolding; OMS applies the vault-wide base defaults and policy.
|
|
33
|
+
|
|
34
|
+
Document reads do not use `write`. Use `search { op: "get-document" }` with
|
|
35
|
+
exactly one of a single `target`, multiple `targets`, or `notePath` plus a
|
|
36
|
+
window. Do not call removed document-read operations or aliases.
|
|
25
37
|
|
|
26
38
|
## Templates
|
|
27
39
|
|
|
28
|
-
Template
|
|
40
|
+
Template changes use `op: "template"` with `mode: "create" | "update" |
|
|
41
|
+
"reclassify" | "relocate-folder" | "register-folder" | "register-existing" |
|
|
42
|
+
"remove" | "default"`.
|
|
29
43
|
|
|
30
|
-
1. Submit `dryRun: true
|
|
44
|
+
1. Submit `dryRun: true`; the server derives and verifies current state, input,
|
|
45
|
+
and source signatures. Do not supply or invent expected-state digests.
|
|
31
46
|
2. Show the resulting proposal and `approvalDigest`.
|
|
32
47
|
3. Apply only with `dryRun: false` and that exact caller-approved digest.
|
|
33
48
|
|
|
34
49
|
Never self-approve, hand-edit the derived `.oms/types.json`, or directly edit a managed template.
|
|
35
50
|
|
|
36
51
|
Responses are `ask`, `written`, or `rejected`. Resolve named violations and retry; never invent missing required values.
|
|
52
|
+
|
|
53
|
+
Renderer rules for `op: "note"`: OMS renders supported Core expressions, never
|
|
54
|
+
executes Templater scripts. A `templater` template needs a caller value for
|
|
55
|
+
every `filledBy: "obsidian"` field (`FIELD_FILLED_BY_OBSIDIAN` asks for them)
|
|
56
|
+
and is rejected when its body contains external delimiters
|
|
57
|
+
(`TEMPLATE_RENDERER_EXTERNAL`); a `none` template is always rejected for note
|
|
58
|
+
creation. Point the user at an `obsidian-core` template or propose a converted
|
|
59
|
+
copy through `/template` instead of pasting raw Templater tags. Caller-supplied
|
|
60
|
+
values and body must not contain raw external tags either. Never expose private
|
|
61
|
+
note content while presenting a dry-run proposal.
|
package/dist/cli/args.d.ts
CHANGED
|
@@ -9,26 +9,16 @@ export interface ParsedCliArgs {
|
|
|
9
9
|
readonly vaultExplicit: boolean;
|
|
10
10
|
readonly yes: boolean;
|
|
11
11
|
readonly approvedDigest?: string;
|
|
12
|
-
readonly
|
|
13
|
-
readonly maxPerTemplate?: number;
|
|
14
|
-
/** linkify: opt into rewriting notes in place (still requires `--yes`). */
|
|
15
|
-
readonly apply: boolean;
|
|
12
|
+
readonly templateFolders: readonly string[];
|
|
16
13
|
readonly installClaude: boolean;
|
|
17
14
|
readonly runtime: RuntimeSelection | undefined;
|
|
15
|
+
readonly agentVault: string | undefined;
|
|
18
16
|
readonly dryRun: boolean;
|
|
19
17
|
readonly executeExternal: boolean;
|
|
20
|
-
readonly checkUpdate: boolean;
|
|
21
|
-
readonly timeoutMs: number | undefined;
|
|
22
|
-
readonly agentVault: string | undefined;
|
|
23
|
-
readonly verbose: boolean;
|
|
24
|
-
readonly json: boolean;
|
|
25
|
-
readonly folders: readonly string[];
|
|
26
|
-
readonly conventionNote: boolean;
|
|
27
18
|
readonly modelsDescriptorPath: string | undefined;
|
|
28
19
|
readonly modelsNoDefault: boolean;
|
|
29
20
|
readonly modelsDefault: boolean;
|
|
30
21
|
readonly unknownFlags: readonly string[];
|
|
31
22
|
readonly error: CliArgumentError | undefined;
|
|
32
23
|
}
|
|
33
|
-
export declare function isRuntimeSelection(value: string): value is RuntimeSelection;
|
|
34
24
|
export declare function parseCliArgs(argv: readonly string[], cwd?: string): ParsedCliArgs;
|
package/dist/cli/args.js
CHANGED
|
@@ -1,107 +1,83 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
|
-
import { harnessSurfaceRegistry } from "../kernel/harness/surface-registry.js";
|
|
3
2
|
export class CliArgumentError extends Error {
|
|
4
3
|
constructor(message) {
|
|
5
4
|
super(message);
|
|
6
5
|
this.name = "CliArgumentError";
|
|
7
6
|
}
|
|
8
7
|
}
|
|
9
|
-
export function isRuntimeSelection(value) {
|
|
10
|
-
if (value === "auto" || value === "all")
|
|
11
|
-
return true;
|
|
12
|
-
return harnessSurfaceRegistry.hosts.some((host) => host.runtime === value);
|
|
13
|
-
}
|
|
14
8
|
export function parseCliArgs(argv, cwd = process.cwd()) {
|
|
15
9
|
const firstArg = argv[0];
|
|
16
10
|
const command = firstArg === "--help" || firstArg === "-h" ? undefined : firstArg;
|
|
17
|
-
let help = firstArg === "--help"
|
|
11
|
+
let help = firstArg === "--help"
|
|
12
|
+
|| firstArg === "-h"
|
|
13
|
+
|| argv.slice(1).some((arg) => arg === "--help" || arg === "-h");
|
|
18
14
|
let vault = cwd;
|
|
19
15
|
let vaultExplicit = false;
|
|
20
16
|
let yes = false;
|
|
21
17
|
let approvedDigest;
|
|
22
|
-
|
|
23
|
-
let maxPerTemplate;
|
|
24
|
-
let apply = false;
|
|
18
|
+
const templateFolders = [];
|
|
25
19
|
let installClaude = false;
|
|
26
20
|
let runtime;
|
|
21
|
+
let agentVault;
|
|
27
22
|
let dryRun = false;
|
|
28
23
|
let executeExternal = false;
|
|
29
|
-
let checkUpdate = false;
|
|
30
|
-
let timeoutMs;
|
|
31
|
-
let agentVault;
|
|
32
|
-
let verbose = false;
|
|
33
|
-
let json = false;
|
|
34
|
-
const folders = [];
|
|
35
|
-
let conventionNote = true;
|
|
36
24
|
let modelsDescriptorPath;
|
|
37
25
|
let modelsNoDefault = false;
|
|
38
26
|
let modelsDefault = false;
|
|
39
27
|
const unknownFlags = [];
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
28
|
+
// Every public family except setup owns its argv contract. The top-level
|
|
29
|
+
// parser only recognizes the common help route and otherwise
|
|
30
|
+
// leaves those arguments untouched for the family handler.
|
|
31
|
+
if (command !== "setup")
|
|
32
|
+
return result();
|
|
33
|
+
for (let index = 1; index < argv.length; index += 1) {
|
|
34
|
+
const arg = argv[index];
|
|
35
|
+
const next = argv[index + 1];
|
|
43
36
|
if (arg === "--help" || arg === "-h") {
|
|
44
37
|
help = true;
|
|
45
38
|
}
|
|
46
|
-
else if (arg === "--vault"
|
|
39
|
+
else if (arg === "--vault") {
|
|
40
|
+
if (next === undefined || next.startsWith("--"))
|
|
41
|
+
return failure("[oms] Missing value for --vault.");
|
|
47
42
|
vault = path.resolve(cwd, next);
|
|
48
43
|
vaultExplicit = true;
|
|
49
|
-
|
|
44
|
+
index += 1;
|
|
50
45
|
}
|
|
51
46
|
else if (arg === "--yes") {
|
|
52
47
|
yes = true;
|
|
53
48
|
}
|
|
54
49
|
else if (arg === "--approved-digest") {
|
|
55
50
|
if (next === undefined || next.startsWith("--")) {
|
|
56
|
-
return
|
|
51
|
+
return failure("[oms] Missing value for --approved-digest.");
|
|
57
52
|
}
|
|
58
53
|
approvedDigest = next;
|
|
59
|
-
|
|
54
|
+
index += 1;
|
|
60
55
|
}
|
|
61
56
|
else if (arg === "--template-folder") {
|
|
62
57
|
if (next === undefined || next.startsWith("--")) {
|
|
63
|
-
return
|
|
64
|
-
}
|
|
65
|
-
templateFolder = next;
|
|
66
|
-
i++;
|
|
67
|
-
}
|
|
68
|
-
else if (arg === "--max-per-template") {
|
|
69
|
-
const parsed = Number.parseInt(next ?? "", 10);
|
|
70
|
-
if (next === undefined || !Number.isFinite(parsed) || parsed <= 0 || `${parsed}` !== next) {
|
|
71
|
-
return parsedArgsWithError(`[oms] --max-per-template must be a positive integer.`);
|
|
58
|
+
return failure("[oms] Missing value for --template-folder.");
|
|
72
59
|
}
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
else if (arg === "--apply") {
|
|
77
|
-
apply = true;
|
|
60
|
+
if (!templateFolders.includes(next))
|
|
61
|
+
templateFolders.push(next);
|
|
62
|
+
index += 1;
|
|
78
63
|
}
|
|
79
64
|
else if (arg === "--install-claude") {
|
|
80
65
|
installClaude = true;
|
|
81
66
|
}
|
|
82
|
-
else if (arg === "--
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
if (!Number.isFinite(parsed) || parsed <= 0) {
|
|
88
|
-
return parsedArgsWithError(`[oms] Unsupported timeout: ${next}`);
|
|
89
|
-
}
|
|
90
|
-
timeoutMs = parsed;
|
|
91
|
-
i++;
|
|
92
|
-
}
|
|
93
|
-
else if (arg === "--runtime" && next) {
|
|
94
|
-
if (isRuntimeSelection(next)) {
|
|
95
|
-
runtime = next;
|
|
96
|
-
}
|
|
97
|
-
else {
|
|
98
|
-
return parsedArgsWithError(`[oms] Unsupported runtime: ${next}`);
|
|
67
|
+
else if (arg === "--runtime") {
|
|
68
|
+
if (next === undefined || next.startsWith("--"))
|
|
69
|
+
return failure("[oms] Missing value for --runtime.");
|
|
70
|
+
if (!["auto", "all", "claude", "codex", "hermes"].includes(next)) {
|
|
71
|
+
return failure(`[oms] Unsupported runtime: ${next}`);
|
|
99
72
|
}
|
|
100
|
-
|
|
73
|
+
runtime = next;
|
|
74
|
+
index += 1;
|
|
101
75
|
}
|
|
102
|
-
else if (arg === "--agent-vault"
|
|
76
|
+
else if (arg === "--agent-vault") {
|
|
77
|
+
if (next === undefined || next.startsWith("--"))
|
|
78
|
+
return failure("[oms] Missing value for --agent-vault.");
|
|
103
79
|
agentVault = path.resolve(cwd, next);
|
|
104
|
-
|
|
80
|
+
index += 1;
|
|
105
81
|
}
|
|
106
82
|
else if (arg === "--dry-run") {
|
|
107
83
|
dryRun = true;
|
|
@@ -109,25 +85,12 @@ export function parseCliArgs(argv, cwd = process.cwd()) {
|
|
|
109
85
|
else if (arg === "--execute") {
|
|
110
86
|
executeExternal = true;
|
|
111
87
|
}
|
|
112
|
-
else if (arg === "--verbose" || arg === "-v") {
|
|
113
|
-
verbose = true;
|
|
114
|
-
}
|
|
115
|
-
else if (arg === "--json") {
|
|
116
|
-
json = true;
|
|
117
|
-
}
|
|
118
|
-
else if (arg === "--folder" && next) {
|
|
119
|
-
folders.push(next);
|
|
120
|
-
i++;
|
|
121
|
-
}
|
|
122
|
-
else if (arg === "--no-convention-note") {
|
|
123
|
-
conventionNote = false;
|
|
124
|
-
}
|
|
125
88
|
else if (arg === "--models-descriptor") {
|
|
126
89
|
if (next === undefined || next === "" || next.startsWith("-")) {
|
|
127
|
-
return
|
|
90
|
+
return failure("[oms] Missing value for --models-descriptor. Choose one of --models-default, --models-descriptor <path>, or --models-no-default.");
|
|
128
91
|
}
|
|
129
92
|
modelsDescriptorPath = path.resolve(cwd, next);
|
|
130
|
-
|
|
93
|
+
index += 1;
|
|
131
94
|
}
|
|
132
95
|
else if (arg === "--models-no-default") {
|
|
133
96
|
modelsNoDefault = true;
|
|
@@ -138,53 +101,22 @@ export function parseCliArgs(argv, cwd = process.cwd()) {
|
|
|
138
101
|
else if (arg === "--embedding-descriptor") {
|
|
139
102
|
unknownFlags.push(arg);
|
|
140
103
|
if (next !== undefined && !next.startsWith("--"))
|
|
141
|
-
|
|
142
|
-
}
|
|
143
|
-
else if (arg === "--embedding-default" || arg === "--embedding-no-default") {
|
|
144
|
-
unknownFlags.push(arg);
|
|
104
|
+
index += 1;
|
|
145
105
|
}
|
|
146
106
|
else if (arg !== undefined) {
|
|
147
107
|
unknownFlags.push(arg);
|
|
148
108
|
}
|
|
149
109
|
}
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
return parsedArgsWithError(`[oms] Mutually exclusive setup model options: ${modelChoices.join(" and ")}. Choose one of --models-default, --models-descriptor <path>, or --models-no-default.`);
|
|
158
|
-
}
|
|
110
|
+
const modelChoices = [
|
|
111
|
+
modelsDescriptorPath !== undefined ? "--models-descriptor" : undefined,
|
|
112
|
+
modelsDefault ? "--models-default" : undefined,
|
|
113
|
+
modelsNoDefault ? "--models-no-default" : undefined,
|
|
114
|
+
].filter((flag) => flag !== undefined);
|
|
115
|
+
if (modelChoices.length > 1) {
|
|
116
|
+
return failure(`[oms] Mutually exclusive setup model options: ${modelChoices.join(" and ")}. Choose one of --models-default, --models-descriptor <path>, or --models-no-default.`);
|
|
159
117
|
}
|
|
160
|
-
return
|
|
161
|
-
|
|
162
|
-
help,
|
|
163
|
-
vault,
|
|
164
|
-
vaultExplicit,
|
|
165
|
-
yes,
|
|
166
|
-
approvedDigest,
|
|
167
|
-
templateFolder,
|
|
168
|
-
maxPerTemplate,
|
|
169
|
-
apply,
|
|
170
|
-
installClaude,
|
|
171
|
-
runtime,
|
|
172
|
-
dryRun,
|
|
173
|
-
executeExternal,
|
|
174
|
-
checkUpdate,
|
|
175
|
-
timeoutMs,
|
|
176
|
-
agentVault,
|
|
177
|
-
verbose,
|
|
178
|
-
json,
|
|
179
|
-
folders,
|
|
180
|
-
conventionNote,
|
|
181
|
-
modelsDescriptorPath,
|
|
182
|
-
modelsNoDefault,
|
|
183
|
-
modelsDefault,
|
|
184
|
-
unknownFlags,
|
|
185
|
-
error: undefined,
|
|
186
|
-
};
|
|
187
|
-
function parsedArgsWithError(message) {
|
|
118
|
+
return result();
|
|
119
|
+
function result(error) {
|
|
188
120
|
return {
|
|
189
121
|
command,
|
|
190
122
|
help,
|
|
@@ -192,26 +124,23 @@ export function parseCliArgs(argv, cwd = process.cwd()) {
|
|
|
192
124
|
vaultExplicit,
|
|
193
125
|
yes,
|
|
194
126
|
approvedDigest,
|
|
195
|
-
|
|
196
|
-
maxPerTemplate,
|
|
197
|
-
apply,
|
|
127
|
+
templateFolders,
|
|
198
128
|
installClaude,
|
|
199
129
|
runtime,
|
|
130
|
+
agentVault,
|
|
200
131
|
dryRun,
|
|
201
132
|
executeExternal,
|
|
202
|
-
checkUpdate,
|
|
203
|
-
timeoutMs,
|
|
204
|
-
agentVault,
|
|
205
|
-
verbose,
|
|
206
|
-
json,
|
|
207
|
-
folders,
|
|
208
|
-
conventionNote,
|
|
209
133
|
modelsDescriptorPath,
|
|
210
134
|
modelsNoDefault,
|
|
211
135
|
modelsDefault,
|
|
212
|
-
unknownFlags
|
|
213
|
-
|
|
136
|
+
unknownFlags: command === "setup"
|
|
137
|
+
? unknownFlags
|
|
138
|
+
: argv.slice(1).filter((arg) => arg !== "--help" && arg !== "-h"),
|
|
139
|
+
error,
|
|
214
140
|
};
|
|
215
141
|
}
|
|
142
|
+
function failure(message) {
|
|
143
|
+
return result(new CliArgumentError(message));
|
|
144
|
+
}
|
|
216
145
|
}
|
|
217
146
|
//# sourceMappingURL=args.js.map
|
package/dist/cli/args.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACzC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AAsBD,MAAM,UAAU,YAAY,CAAC,IAAuB,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;IACvE,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACzB,MAAM,OAAO,GAAG,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;IAClF,IAAI,IAAI,GACN,QAAQ,KAAK,QAAQ;WAClB,QAAQ,KAAK,IAAI;WACjB,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC;IACnE,IAAI,KAAK,GAAG,GAAG,CAAC;IAChB,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,IAAI,GAAG,GAAG,KAAK,CAAC;IAChB,IAAI,cAAkC,CAAC;IACvC,MAAM,eAAe,GAAa,EAAE,CAAC;IACrC,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,IAAI,OAAqC,CAAC;IAC1C,IAAI,UAA8B,CAAC;IACnC,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,eAAe,GAAG,KAAK,CAAC;IAC5B,IAAI,oBAAwC,CAAC;IAC7C,IAAI,eAAe,GAAG,KAAK,CAAC;IAC5B,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,MAAM,YAAY,GAAa,EAAE,CAAC;IAElC,yEAAyE;IACzE,6DAA6D;IAC7D,2DAA2D;IAC3D,IAAI,OAAO,KAAK,OAAO;QAAE,OAAO,MAAM,EAAE,CAAC;IAEzC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACpD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAC7B,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACrC,IAAI,GAAG,IAAI,CAAC;QACd,CAAC;aAAM,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YAC7B,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;gBAAE,OAAO,OAAO,CAAC,kCAAkC,CAAC,CAAC;YACpG,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAChC,aAAa,GAAG,IAAI,CAAC;YACrB,KAAK,IAAI,CAAC,CAAC;QACb,CAAC;aAAM,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;YAC3B,GAAG,GAAG,IAAI,CAAC;QACb,CAAC;aAAM,IAAI,GAAG,KAAK,mBAAmB,EAAE,CAAC;YACvC,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChD,OAAO,OAAO,CAAC,4CAA4C,CAAC,CAAC;YAC/D,CAAC;YACD,cAAc,GAAG,IAAI,CAAC;YACtB,KAAK,IAAI,CAAC,CAAC;QACb,CAAC;aAAM,IAAI,GAAG,KAAK,mBAAmB,EAAE,CAAC;YACvC,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChD,OAAO,OAAO,CAAC,4CAA4C,CAAC,CAAC;YAC/D,CAAC;YACD,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAAE,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAChE,KAAK,IAAI,CAAC,CAAC;QACb,CAAC;aAAM,IAAI,GAAG,KAAK,kBAAkB,EAAE,CAAC;YACtC,aAAa,GAAG,IAAI,CAAC;QACvB,CAAC;aAAM,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YAC/B,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;gBAAE,OAAO,OAAO,CAAC,oCAAoC,CAAC,CAAC;YACtG,IAAI,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBACjE,OAAO,OAAO,CAAC,8BAA8B,IAAI,EAAE,CAAC,CAAC;YACvD,CAAC;YACD,OAAO,GAAG,IAAwB,CAAC;YACnC,KAAK,IAAI,CAAC,CAAC;QACb,CAAC;aAAM,IAAI,GAAG,KAAK,eAAe,EAAE,CAAC;YACnC,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;gBAAE,OAAO,OAAO,CAAC,wCAAwC,CAAC,CAAC;YAC1G,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACrC,KAAK,IAAI,CAAC,CAAC;QACb,CAAC;aAAM,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YAC/B,MAAM,GAAG,IAAI,CAAC;QAChB,CAAC;aAAM,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YAC/B,eAAe,GAAG,IAAI,CAAC;QACzB,CAAC;aAAM,IAAI,GAAG,KAAK,qBAAqB,EAAE,CAAC;YACzC,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,EAAE,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC9D,OAAO,OAAO,CACZ,kIAAkI,CACnI,CAAC;YACJ,CAAC;YACD,oBAAoB,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAC/C,KAAK,IAAI,CAAC,CAAC;QACb,CAAC;aAAM,IAAI,GAAG,KAAK,qBAAqB,EAAE,CAAC;YACzC,eAAe,GAAG,IAAI,CAAC;QACzB,CAAC;aAAM,IAAI,GAAG,KAAK,kBAAkB,EAAE,CAAC;YACtC,aAAa,GAAG,IAAI,CAAC;QACvB,CAAC;aAAM,IAAI,GAAG,KAAK,wBAAwB,EAAE,CAAC;YAC5C,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACvB,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;gBAAE,KAAK,IAAI,CAAC,CAAC;QAC/D,CAAC;aAAM,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YAC7B,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAED,MAAM,YAAY,GAAG;QACnB,oBAAoB,KAAK,SAAS,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,SAAS;QACtE,aAAa,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,SAAS;QAC9C,eAAe,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,SAAS;KACpD,CAAC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IACvD,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,OAAO,OAAO,CACZ,iDAAiD,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,uFAAuF,CACnK,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,EAAE,CAAC;IAEhB,SAAS,MAAM,CAAC,KAAwB;QACtC,OAAO;YACL,OAAO;YACP,IAAI;YACJ,KAAK;YACL,aAAa;YACb,GAAG;YACH,cAAc;YACd,eAAe;YACf,aAAa;YACb,OAAO;YACP,UAAU;YACV,MAAM;YACN,eAAe;YACf,oBAAoB;YACpB,eAAe;YACf,aAAa;YACb,YAAY,EAAE,OAAO,KAAK,OAAO;gBAC/B,CAAC,CAAC,YAAY;gBACd,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,CAAC;YACnE,KAAK;SACN,CAAC;IACJ,CAAC;IAED,SAAS,OAAO,CAAC,OAAe;QAC9B,OAAO,MAAM,CAAC,IAAI,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC"}
|
package/dist/cli/audit.d.ts
CHANGED
package/dist/cli/audit.js
CHANGED
|
@@ -9,8 +9,22 @@ function validatedFolder(folder) {
|
|
|
9
9
|
}
|
|
10
10
|
return folder;
|
|
11
11
|
}
|
|
12
|
+
function boundedDiagnostics(diagnostics, maxPerTemplate) {
|
|
13
|
+
if (maxPerTemplate === undefined)
|
|
14
|
+
return diagnostics;
|
|
15
|
+
const counts = new Map();
|
|
16
|
+
return diagnostics.filter(item => {
|
|
17
|
+
const key = item.templateId ?? "<vault>";
|
|
18
|
+
const count = counts.get(key) ?? 0;
|
|
19
|
+
counts.set(key, count + 1);
|
|
20
|
+
return count < maxPerTemplate;
|
|
21
|
+
});
|
|
22
|
+
}
|
|
12
23
|
export async function runAudit(opts) {
|
|
13
24
|
try {
|
|
25
|
+
if (opts.maxPerTemplate !== undefined && (!Number.isSafeInteger(opts.maxPerTemplate) || opts.maxPerTemplate < 1)) {
|
|
26
|
+
throw new Error("Audit maxPerTemplate must be a safe positive integer.");
|
|
27
|
+
}
|
|
14
28
|
const folder = validatedFolder(opts.folder);
|
|
15
29
|
if (folder !== undefined)
|
|
16
30
|
await access(path.join(opts.vault, folder));
|
|
@@ -19,10 +33,15 @@ export async function runAudit(opts) {
|
|
|
19
33
|
const diagnosis = await diagnoseTemplates({ vault: opts.vault, source: "explicit" });
|
|
20
34
|
const notes = folder === undefined ? index.notes : index.notes.filter(note => note.path === folder || note.path.startsWith(`${folder}/`));
|
|
21
35
|
const unresolvedNotes = folder === undefined ? index.unresolvedNotes : index.unresolvedNotes.filter(note => note.path === folder || note.path.startsWith(`${folder}/`));
|
|
22
|
-
const identityDiagnostics = unresolvedNotes.map(note => ({
|
|
36
|
+
const identityDiagnostics = unresolvedNotes.map(note => ({
|
|
37
|
+
code: "TEMPLATE_NOTE_IDENTITY_UNRESOLVED",
|
|
38
|
+
path: note.path,
|
|
39
|
+
remediation: `persist a valid template identity (${note.reason})`,
|
|
40
|
+
}));
|
|
23
41
|
const scopedDiagnosis = folder === undefined
|
|
24
42
|
? diagnosis.diagnostics
|
|
25
43
|
: diagnosis.diagnostics.filter(item => item.code !== "MIGRATION_NOTE_IDENTITY_UNRESOLVED" || item.path === undefined || item.path === folder || item.path.startsWith(`${folder}/`));
|
|
44
|
+
const diagnostics = boundedDiagnostics([...scopedDiagnosis, ...identityDiagnostics], opts.maxPerTemplate);
|
|
26
45
|
const templateCounts = {};
|
|
27
46
|
for (const note of notes)
|
|
28
47
|
templateCounts[note.templateId] = (templateCounts[note.templateId] ?? 0) + 1;
|
|
@@ -35,7 +54,7 @@ export async function runAudit(opts) {
|
|
|
35
54
|
excludedTemplateSources: convention.managedSourcePaths,
|
|
36
55
|
templateCounts,
|
|
37
56
|
status: scopedDiagnosis.length === 0 && unresolvedNotes.length === 0 ? "healthy" : "needs-repair",
|
|
38
|
-
diagnostics
|
|
57
|
+
diagnostics,
|
|
39
58
|
unresolvedNotes,
|
|
40
59
|
unresolvedLegacyNotes: folder === undefined ? diagnosis.unresolvedLegacyNotes : diagnosis.unresolvedLegacyNotes.filter(notePath => notePath === folder || notePath.startsWith(`${folder}/`)),
|
|
41
60
|
clean: scopedDiagnosis.length === 0 && unresolvedNotes.length === 0,
|
package/dist/cli/audit.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/cli/audit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/cli/audit.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,4 +5,20 @@ export interface DocCommandOptions {
|
|
|
5
5
|
readonly write: (message: string) => void;
|
|
6
6
|
readonly writeError: (message: string) => void;
|
|
7
7
|
}
|
|
8
|
+
export interface NoteDocumentGetOptions {
|
|
9
|
+
readonly vault: string;
|
|
10
|
+
readonly target?: string;
|
|
11
|
+
readonly targets?: readonly string[];
|
|
12
|
+
readonly notePath?: string;
|
|
13
|
+
readonly collection?: string;
|
|
14
|
+
readonly fromLine?: number;
|
|
15
|
+
readonly lineCount?: number;
|
|
16
|
+
readonly lineLimit?: number;
|
|
17
|
+
readonly maxBytes?: number;
|
|
18
|
+
readonly lineNumbers?: boolean;
|
|
19
|
+
readonly fullPath?: boolean;
|
|
20
|
+
readonly write: (message: string) => void;
|
|
21
|
+
}
|
|
22
|
+
/** Read-only document access shared by the note family and the retiring doc dispatcher. */
|
|
23
|
+
export declare function getNoteDocuments(options: NoteDocumentGetOptions): Promise<number>;
|
|
8
24
|
export declare function runDocCommand(options: DocCommandOptions): Promise<number>;
|