You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
@@ -39,6 +39,7 @@ Tailor suggestions to what's actually missing or stale — don't recite the full
39
39
-**Secrets in env vars only.**`OBSIDIAN_API_KEY` is required; never hardcoded.
40
40
-**Command-palette tools are opt-in.**`obsidian_list_commands` and `obsidian_execute_command` are callable only when `OBSIDIAN_ENABLE_COMMANDS=true` — Obsidian commands are opaque and can be destructive. When the flag is unset, the entry point wraps both with `disabledTool()` so they're absent from `tools/list` (LLM can't invoke) but visible in the operator-facing manifest with a hint to enable them.
41
41
-**Path-policy gating goes through `PathPolicy`.** Every path-taking method on `ObsidianService` calls `policy.assertReadable` / `assertWritable` before the upstream HTTP call; `obsidian_search_notes` post-filters hits via `svc.policy.filterReadable`. Don't bypass this — `OBSIDIAN_READ_PATHS` / `OBSIDIAN_WRITE_PATHS` / `OBSIDIAN_READ_ONLY` are the single chokepoint, and `path_forbidden` is declared on every path-taking tool's `errors[]` contract.
42
+
-**Close the loop on issues.** When implementing work tracked by a GitHub issue, comment on the issue with what landed and close it. Do both — a comment without a close leaves stale issues open; a close without a comment leaves no record of what shipped. The comment is for future readers — state the concrete changes, not the conversation that produced them.
42
43
43
44
---
44
45
@@ -293,19 +294,21 @@ Available skills:
293
294
|`add-test`| Scaffold test file for a tool, resource, or service |
294
295
|`field-test`| Exercise tools/resources/prompts with real inputs, verify behavior, report issues |
295
296
|`security-pass`| Audit server for MCP-flavored security gaps: output injection, scope blast radius, input sinks, tenant isolation |
296
-
|`tool-defs-analysis`| Audit MCP definition language across tools/resources/prompts — voice, leaks, defaults, recovery hints, sparsity, structure |
297
+
|`tool-defs-analysis`| Read-only audit of MCP definition language across the surface — voice, leaks, defaults, recovery hints, output descriptions |
298
+
|`code-simplifier`| Post-session cleanup against `git diff` — modernize syntax, consolidate duplication, align with the codebase |
299
+
|`devcheck`| Lint, format, typecheck, audit |
297
300
|`polish-docs-meta`| Finalize docs, README, metadata, and agent protocol for shipping |
301
+
|`git-wrapup`| Land working-tree changes as a versioned commit + annotated tag — version bump, changelog, verify, tag. Local only. |
298
302
|`release-and-publish`| Ship a release end-to-end across npm, MCP Registry, GitHub Releases (`.mcpb`), and GHCR |
|`api-testing`| createMockContext, test patterns |
@@ -326,10 +329,11 @@ When you complete a skill's checklist, check the boxes and add a completion time
326
329
|`bun run rebuild`| Clean + build |
327
330
|`bun run clean`| Remove build artifacts |
328
331
|`bun run devcheck`| Lint + format + typecheck + security + changelog sync |
329
-
|`bun run audit:refresh`| Delete `bun.lock`, reinstall, re-audit. Use when `devcheck` flags a transitive advisory — stale lockfile can mask already-patched deps. If advisory survives, it's real. |
332
+
|`bun run audit:refresh`| Delete `bun.lock`, reinstall, and re-run `bun audit`. Use when `devcheck` flags a transitive advisory — Bun's `update` is sticky on transitive resolutions, so the advisory may be a stale-lockfile false positive. If it survives the refresh, it's real. |
330
333
|`bun run tree`| Generate `docs/tree.md`|
331
334
|`bun run list-skills`| Print project skill index (name, version, description) |
332
-
|`bun run format`| Auto-fix formatting (Biome) |
335
+
|`bun run format`| Auto-fix formatting (safe fixes only) |
336
+
|`bun run format:unsafe`| Also apply Biome's unsafe autofixes — review the diff; they can change behavior |
333
337
|`bun run lint:mcp`| Validate MCP definitions against the linter rules |
334
338
|`bun run lint:packaging`| Validate env var alignment between `manifest.json` and `server.json`|
335
339
|`bun run bundle`| Build and pack as `.mcpb` for one-click Claude Desktop install |
@@ -63,7 +63,7 @@ Up to three search modes selected by `mode`:
63
63
-`jsonlogic` — JSONLogic tree evaluated against `path`, `content`, `frontmatter.<key>`, `tags`, and `stat.{ctime,mtime,size}`; custom `glob` and `regexp` operators
64
64
-`omnisearch` — BM25-ranked search via the community [Omnisearch](https://github.com/scambier/obsidian-omnisearch) plugin. Supports quoted phrases, `-exclusion`, `path:` / `ext:` filters, typo tolerance, and PDF + OCR coverage (via [Text Extractor](https://github.com/scambier/obsidian-text-extractor)). Only present in the mode enum when the plugin's HTTP server is reachable at startup; the upstream hard-caps results at 50 — narrow the query to surface more (the response carries `truncated: true` when the cap was likely hit).
65
65
66
-
Results paginate via opaque cursors per the [MCP 2025-06-18 spec](https://modelcontextprotocol.io/specification/2025-06-18/utils/pagination): omit `cursor` for the first page, then pass `nextCursor` from the prior response. Every result carries `totalCount` (post-path-policy, pre-pagination); `nextCursor` is omitted on the last page. Text-mode hits are additionally clipped per file at `maxMatchesPerHit` (default 10) so a single match-heavy note can't blow the response budget — clipped hits carry `truncated: true` and `totalMatches`.
66
+
Results paginate via opaque cursors per the [MCP 2025-11-25 spec](https://modelcontextprotocol.io/specification/2025-11-25/utils/pagination): omit `cursor` for the first page, then pass `nextCursor` from the prior response. Every result carries `totalCount` (post-path-policy, pre-pagination); `nextCursor` is omitted on the last page. Text-mode hits are additionally clipped per file at `maxMatchesPerHit` (default 10) so a single match-heavy note can't blow the response budget — clipped hits carry `truncated: true` and `totalMatches`.
67
67
68
68
---
69
69
@@ -195,7 +195,7 @@ Obsidian-specific:
195
195
- Wraps the [Obsidian Local REST API](https://github.com/coddingtonbear/obsidian-local-rest-api) plugin — typed client, deterministic error mapping
196
196
- Section-aware editing across headings, block references, and frontmatter fields via `PATCH`-with-target operations
197
197
- Tag reconciliation across both representations: frontmatter `tags:` array and inline `#tag` syntax (skipping fenced code blocks)
198
-
- Search across up to three modes: text, JSONLogic, and (when the plugin is reachable) BM25-ranked Omnisearch — cursor-paginated per the MCP 2025-06-18 spec, with per-file match clipping in text mode
198
+
- Search across up to three modes: text, JSONLogic, and (when the plugin is reachable) BM25-ranked Omnisearch — cursor-paginated per the MCP 2025-11-25 spec, with per-file match clipping in text mode
199
199
- Optional human-in-the-loop confirmation for destructive deletes via `ctx.elicit`
200
200
- Folder-scoped read/write permissions via `OBSIDIAN_READ_PATHS` / `OBSIDIAN_WRITE_PATHS` and a global `OBSIDIAN_READ_ONLY` kill switch — denies are typed `path_forbidden` with the active scope echoed back in the error data
201
201
- Opt-in command-palette pair (`obsidian_list_commands` + `obsidian_execute_command`) — registered only when `OBSIDIAN_ENABLE_COMMANDS=true`
0 commit comments