Atlas / Skills / vaalrl / obsidian-plugin-agent-kit

obsidian-plugin-agent-kitCAUTION

skills/vaalrl/obsidian-plugin-agent-kit

🔌 讓 AI 寫 Obsidian 外掛的開發規則,加上一個 Claude Code 稽核 skill,幫你順利通過社群外掛目錄審查 | Rules and a Claude Code skill for building Obsidian plugins with a coding agent and passing Community directory review.

Verdict
CAUTION
Grade
C
Trust score
79 /100
Version
2.0.0
Hosts
2 documented
License
MIT
Stars
0
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

Rules and tooling for building Obsidian plugins with a coding agent, and getting them through the Community directory review.

📖 [Documentation site](https://vaalrl.github.io/obsidian-plugin-agent-kit/)

Two things live here:

  • `OBSIDIAN_PLUGIN_DEVELOPMENT_RULES.md` — the rules

an agent should follow while writing an Obsidian plugin: project structure, deprecated APIs and their replacements, security rules, lifecycle management, UI conventions, accessibility, and a submission checklist.

  • `skills/audit-obsidian-plugin/` — a Claude Code skill that

audits a plugin against those rules and the official policies, reports findings by severity, auto-fixes the mechanical ones, and can drive a real Obsidian to verify runtime behaviour and record README demos.

Why

Static checks catch a lot, but a plugin can typecheck, lint clean, pass its tests, and still ship a feature that has never once rendered. That happens when a guard tests an undocumented Obsidian internal that no longer exists: the block is skipped forever, silently, and a hand-written .d.ts keeps the compiler happy. The only way to find it is to run the thing.

So the skill covers both halves — the static audit, and actually driving Obsidian.

Install the skill

Copy it into your skills directory:

# Personal, available in every project
cp -r skills/audit-obsidian-plugin ~/.claude/skills/

# Or per project
cp -r skills/audit-obsidian-plugin .claude/skills/

Then ask Claude to audit, review or check your plugin, or invoke it by name.

Configure your identity (optional)

The BMC/funding rules reference ` and . Copy skills/audit-obsidian-plugin/identity.example.json to identity.json and fill it in so the audit knows which handles are correct for you. Leave fundingHandle` empty if you do not take donations — the funding checks are

Read from source at commit 83bda1230958OBSERVED · 2026-10-12
02

Host compatibility

What the documentation claims. We have not run a compatibility test.

HostStatusNotes
claude-codementioned
cursormentioned
03

What it tells the agent

The instruction file, verbatim from the audited commit — this is the text the model reads, and the surface the audit's instruction layer examines. Quoted here so you can judge it without cloning anything.

---
name: audit-obsidian-plugin
description: Audit an Obsidian plugin against the Obsidian developer policies, the submission requirements for the Community directory, and plugin-security / performance anti-patterns. Reports violations by severity and can auto-fix most of them after approval. Also covers releasing: the community.obsidian.md submission process, the policy on installing dependencies, release-tag and leaked-secret traps, and driving a real Obsidian over the debugging protocol to verify runtime behaviour and record README screenshots and demo GIFs. Use when preparing an Obsidian plugin for submission or release, when responding to review feedback, when recording plugin demos, or whenever the user asks to "review", "audit", "lint", or "check" an Obsidian plugin.
version: 2.0.0
author: Claude Code
category: obsidian
---

# Audit Obsidian Plugin

Mechanical review of an Obsidian plugin against the official submission rules, ObsidianReviewBot feedback patterns, and Electron-specific performance/memory anti-patterns. Produces a categorized findings report and can apply safe auto-fixes.

## When to invoke

- Before submitting to the Obsidian Community directory at community.obsidian.md
- When preparing a release, or recording README screenshots and demo GIFs
- Responding to ObsidianReviewBot comments on an existing PR
- After finishing a large feature, before merging
- When the user asks to "review", "audit", "lint", or "check" an Obsidian plugin
- When the user mentions tech debt, memory leaks, or performance issues in an Obsidian plugin

## Workflow

Run phases in order. Do not skip phases. Each phase writes findings to the running report.

### Phase 0 — Scope discovery

1. Locate `manifest.json` at repo root. If missing, stop and tell the user this is not an Obsidian plugin root.
2. Read `manifest.json`, `package.json`, `tsconfig.json`, `versions.json`, `styles.css`, `.gitignore`, `LICENSE`.
3. Note the source roots (`main.ts`, `src/`), the build output paths, and whether tests exist.
4. Announce in one sentence what will be audited.

### Phase 1 — Run checks in parallel

Use `Grep` for each rule in [reference/rule-catalog.md](./reference/rule-catalog.md). Group grep calls in parallel batches of ~10 to avoid serialization. Do NOT use `cat`, `find`, or `ls` — use `Grep`, `Glob`, `Read`.

Scan only source files: `main.ts`, `src/**/*.ts`, `src/**/*.tsx`. Ignore `node_modules/`, `main.js`, `dist/`, `build/`, `Test Vault/`.

For each rule that matches, record: rule code, severity, file:line, snippet, suggested fix. Count matches but cap reported instances per rule at 20 (note "+N more" if truncated).

### Phase 2 — Severity ranking

- **BLOCKER** — will fail the submission PR bot (manifest, id/name rules, innerHTML, var, process.platform, fetch-for-CORS, remote code eval, missing LICENSE).
- **MAJOR** — will get requested fixes from human reviewer (inline styles, `console.log`, `any`, floating promises, `detachLeavesOfType` in onunload, heading elements in settings, default hotkeys, casting instead of `instanceof`).
- **MINOR** — style / consistency (sentence case, unused imports, unused vars, tooltip via setAttribute, settings-tab top heading).
- **PERF** — runtime cost (chained `.filter` on large collections, `Promise.all` without batch cap, full re-renders, per-item async in loops, pretty-printed JSON on disk, `Array.from` with no reason).
- **DEBT** — maintainability (files > 300 lines with no module split, duplicated logic, `enhanced_/v2_/new_` naming, copy-pasted blocks).
- **BMC** — Buy Me A Coffee integration (description page, settings page, correct id `<FUNDING_HANDLE>`, no security/perf regressions from the donate widget). Severities mapped per rule in the catalog.

### BMC check (Phase 1 sub-pass)

Canonical identities, from identity.json — the two are DIFFERENT handles:
- Author (GitHub attribution): `<AUTHOR_HANDLE>` → `https://github.com/<AUTHOR_HANDLE>` (used in `manifest.json#author`, `manifest.json#authorUrl`, `package.json#author`, LICENSE copyright).
- BMC (funding): `<FUNDING_HANDLE>` → `https://www.buymeacoffee.com/<FUNDING_HANDLE>` (used in `manifest.json#fundingUrl`, README badge, settings tab support section).

Flag as a violation (MAN-022) if `<FUNDING_HANDLE>` leaks into the `author`/`authorUrl` fields, or if `<AUTHOR_HANDLE>` ends up in a BMC link.

Always run this pass after the main grep pass. It needs to cross-reference three surfaces:

1. `manifest.json` — look for `fundingUrl`; confirm host/path point at `buymeacoffee.com/<FUNDING_HANDLE>`. Also verify `author`=`<AUTHOR_HANDLE>` and `authorUrl`=`https://github.com/<AUTHOR_HANDLE>` (MAN-018..022).
2. `README.md` — look for at least one BMC badge; confirm HTTPS, correct id, `alt`, `width`/`height`, canonical CDN host.
3. Settings tab source (any class extending `PluginSettingTab`) — look for a donate block linking to the same URL; confirm it is built via `createEl` (not `innerHTML`), no runtime script tag, and `rel="noopener noreferrer" target="_blank"` are set.

Run in parallel:
- `Grep pattern="buymeacoffee\.com" glob="**/*.{md,ts,json}"` — presence
- `Grep pattern="buymeacoffee\.com/(?!<FUNDING_HANDLE>\b)[A-Za-z0-9_-]+"` — wrong id (BMC-007)
- `Grep pattern="http://(?:www\.|cdn\.|img\.)?buymeacoffee\.com"` — insecure http (BMC-004)
- `Grep pattern="YOUR_BMC_ID|YOUR_USERNAME|<bmc-id>|example_user"` — leftover placeholder (BMC-008)
- `Grep pattern="buymeacoffee" -C 3` on `**/*.ts` — pull surrounding lines to detect `innerHTML`/script-tag injection and missing rel/target (BMC-010..013)
- `Grep pattern="github\.com/<FUNDING_HANDLE>|\"author\"\s*:\s*\"<FUNDING_HANDLE>\"" glob="**/*.{md,ts,json}"` — detect BMC id leaking into author field (MAN-022)
- `Read manifest.json` — verify `fundingUrl` (BMC-001..002) AND `author`/`authorUrl` (MAN-018..019)
- `Read README.md` — verify badge block, alt/width/height (BMC-003..005, 021, 025)

Then count duplicate BMC url literals across `.ts` files — if more than one f
04

Trust audit

CAUTIONgrade C · trust 79/100 Install with care. The audit found things worth knowing before you trust its output.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeWARN
L2Instruction surface (what it tells the agent)FAIL
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
none-observed
Network
declared (4 observation(s))
Shell
declared (1 observation(s))
Dependencies
pinned
Secrets in source
none-found

Findings (6)

HIGHPrompt injection · prompt.hide_from_user · CWE-94, CWE-1427
skills/audit-obsidian-plugin/reference/submission-process.md:246
check in CI fails the build. Add the `.npmrc`; do not tell the user to rename tags by hand.
Why it matters. asks the agent to act without the user's knowledge
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
skills/audit-obsidian-plugin/scripts/demo-capture/cdp.mjs:12
const res = await fetch(`http://127.0.0.1:${port}/json/list`);
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
skills/audit-obsidian-plugin/scripts/demo-capture/examples/podcasts/fixtures.mjs:8
import { silentWav } from "../../fixture-server.mjs";
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
skills/audit-obsidian-plugin/reference/demo-capture.md:50
Then `GET http://127.0.0.1:<port>/json/list`, take the **main window** — the `page` target whose
INFOPrompt injection · prompt.authority_framing · CWE-94, CWE-1427
skills/audit-obsidian-plugin/reference/submission-process.md:65
> - Payment is required for full access.
INFOPrompt injection · prompt.authority_framing · CWE-94, CWE-1427
skills/audit-obsidian-plugin/reference/submission-process.md:66
> - An account is required for full access.

Gates applied: instruction_override, no_behavioural_pass.

Audited 2026-10-12 · audit v0.4.1 · source sha 83bda1230958full audit observations/trust-audit/skill/vaalrl__obsidian-plugin-agent-kit.json · Report an issue / request a re-scan
05

Audit history

Every audit this skill has had.

DateSourceVerdictGradeScoreChange
2026-10-1283bda1230958CAUTIONC79first audit
06

Questions

What does the obsidian-plugin-agent-kit skill do?

🔌 讓 AI 寫 Obsidian 外掛的開發規則,加上一個 Claude Code 稽核 skill,幫你順利通過社群外掛目錄審查 | Rules and a Claude Code skill for building Obsidian plugins with a coding agent and passing Community directory review.

Is obsidian-plugin-agent-kit safe to install?

With care. The audit graded it C (79/100) and found 6 things worth knowing before you trust this skill, listed below with the exact line each was found on.

What can obsidian-plugin-agent-kit access on my machine?

The audit observed that it reaches the network and runs shell commands. Each of those is consistent with what it says it does. Secrets in the source: none found.

Which assistants does obsidian-plugin-agent-kit work with?

Its documentation mentions claude-code and cursor. That is what the text claims, not a compatibility test we ran.

How current is this page?

The grade is for one exact copy of the source (83bda1230958), read on 2026-10-12. The repository is watched, and a new audit runs when it changes — this is the first audit.

Advertisement