Agent skill

Verify Changes

by saberzero1 in saberzero1/quartz-syncer

Post-change verification workflow — build, reload plugin in Obsidian, run health checks, and verify no regressions via the operability facade.

MITAuto-check passed

Install Verify Changes

skills CLI
$ npx skills add saberzero1/quartz-syncer --skill verify-changes -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install saberzero1/quartz-syncer verify-changes --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/saberzero1/quartz-syncer.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/verify-changes .claude/skills/verify-changes && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
verify-changes
GitHub stars
139
Token cost
~2.1k tokens
SKILL.md length
687 words
Files
1
Skills in repo
4
Repo updated
First seen
Licence
MIT

At a glance

Post-change verification workflow — build, reload plugin in Obsidian, run health checks, and verify no regressions via the operability facade.

  • Works in 6 steps: Build and deploy to test vault → Reload plugin → Health check → …
  • SKILL.md covers Purpose, When to Activate, Prerequisites and Important: CLI Patterns, plus 4 more sections
  • Calls npm

What it does

Verify Changes is an agent skill from saberzero1/quartz-syncer. Post-change verification workflow — build, reload plugin in Obsidian, run health checks, and verify no regressions via the operability facade.

Its SKILL.md is about 2.1k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It works with Obsidian. The repository describes itself as: Manage and publish your notes to Quartz, the fast, batteries-included static-site generator. The licence is MIT.

Example prompts

  • “/verify-changes”

Workflow steps

6 steps, taken from the step headings in SKILL.md.

  1. Build and deploy to test vault
  2. Reload plugin
  3. Health check
  4. Snapshot
  5. Check for errors
  6. Area-specific verification

What it can do on your machine

Read from SKILL.md and the folder at commit 8f04c08. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • npm

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use npm, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Verify Changes loads about 2.1k tokens when it runs. Until then it costs about 39 tokens; SKILL.md has 687 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~39
When it runs · the whole SKILL.md, loaded when a task matches
~2.1k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from saberzero1/quartz-syncer at commit 8f04c08, republished under its MIT licence (© saberzero1). 687 words, ~2,071 tokens.

Download SKILL.mdSave it as .claude/skills/verify-changes/SKILL.md (or your agent's skills folder).
name
verify-changes
description
Post-change verification workflow — build, reload plugin in Obsidian, run health checks, and verify no regressions via the operability facade.
triggers
verify, check changes, test in obsidian, reload plugin, does it work
argument-hint
[file-or-area-changed]

Verify Changes Skill

Purpose

After modifying quartz-syncer source code, build the plugin, reload it in a running Obsidian instance, and verify it works correctly using the operability facade (window.__QS__). This replaces manual "open Obsidian and click around" verification.

When to Activate

Activate after any code change that affects runtime behavior — source files in src/, settings, CLI handlers, views, services. NOT needed for test-only changes or documentation.

Prerequisites

  • Obsidian must be running with the test vault open.
  • Plugin must be built with npm run build:dev (copies to test vault, enables facade via __DEV__ flag).
  • The Obsidian CLI must be registered and working (obsidian eval code="1+1" 2>/dev/null should return => 2).
  • Console capture requires the debugger: run obsidian dev:debug on 2>/dev/null once per Obsidian session before using dev:console.

Important: CLI Patterns

Suppress GTK warnings. Always append 2>/dev/null to every obsidian CLI command. Linux produces GTK/Electron warnings that clutter output.

Async eval needs the IIFE + console.log pattern. Top-level await produces no output:

bash
# WRONG — returns nothing:
obsidian eval code="await window.__QS__.act({name:'pub.open'})" 2>/dev/null

# CORRECT — prints the result:
obsidian eval code="(async()=>{const r=await window.__QS__.act({name:'pub.open'});console.log(JSON.stringify(r))})()" 2>/dev/null

Synchronous calls return values directly:

bash
obsidian eval code="typeof window.__QS__" 2>/dev/null
# => object

obsidian eval only captures output emitted within ~5–15 ms. The limit is duration, not asynchrony: microtasks and sub-frame timers resolve in time, real waits do not. Output logged after eval returns is silently lost — an empty result, not an error.

Actions that do real work may or may not print depending on cache warmth, so never read missing output as failure. Confirm with a follow-up synchronous query instead:

bash
obsidian eval code="(async()=>{const r=await window.__QS__.act({name:'pub.open'});console.log(JSON.stringify(r))})()" 2>/dev/null
sleep 2
obsidian dev:dom selector='[data-qs="pub-center"]' total 2>/dev/null   # this is the real check

For anything that deliberately waits, stash the result and read it back synchronously:

bash
obsidian eval code="window.__probe='pending';(async()=>{/* ...slow work... */ window.__probe=JSON.stringify(result)})()" 2>/dev/null
sleep 5
obsidian eval code="window.__probe" 2>/dev/null

JSON.stringify throws on status.refresh. Its data is a live PublishStatus holding PublishFile objects with circular references. Log a projection, not the whole result. snapshot() is always safe to stringify.

Workflow

Step 1: Build and deploy to test vault
bash
npm run build:dev

This builds with __DEV__=true (facade mounts automatically), includes sourcemaps, and copies main.js to test-vault/.obsidian/plugins/quartz-syncer/. If the build fails, fix the build error first.

Do NOT use npm run build (production) for verification — it does not copy to the test vault and strips the __DEV__ flag.

Step 2: Reload plugin

Build alone does NOT update the running instance. You must reload:

bash
obsidian eval code="(async()=>{await app.plugins.disablePlugin('quartz-syncer');await new Promise(r=>setTimeout(r,1000));await app.plugins.enablePlugin('quartz-syncer')})()" 2>/dev/null

Wait 3 seconds after this command, then verify the plugin loaded:

bash
sleep 3 && obsidian eval code="typeof window.__QS__" 2>/dev/null

Expected: => object. If => undefined, the facade didn't mount — check that the dev build was used.

Step 3: Health check
bash
obsidian eval code="JSON.stringify(window.__QS__.assert('health.core'))" 2>/dev/null

Expected: {"pass":true,"details":{...}}. If pass is false, the plugin failed to initialize — check details for the reason.

Step 4: Snapshot
bash
obsidian eval code="JSON.stringify(window.__QS__.snapshot())" 2>/dev/null

Inspect the snapshot for anomalies:

  • plugin.loaded should be true
  • engine.running should be true
  • statusBar.state should be "ready" or "compiling" (not "error")
  • errors.count should be 0
Show full SKILL.md (271 more words)Show less
Step 5: Check for errors
bash
obsidian dev:errors 2>/dev/null
obsidian dev:console level=error 2>/dev/null

If errors are present, investigate. Use the event buffer for context:

bash
obsidian eval code="JSON.stringify(window.__QS__.events.tail(10))" 2>/dev/null
Step 6: Area-specific verification

Based on what was changed:

Compiler/frontmatter changes: Refresh status and check file counts.

bash
obsidian eval code="(async()=>{const r=await window.__QS__.act({name:'status.refresh'});console.log(JSON.stringify({success:r.success,counts:{unpublished:r.data.unpublished.length,changed:r.data.changed.length,published:r.data.published.length,deleted:r.data.deleted.length}}))})()" 2>/dev/null
obsidian eval code="JSON.stringify(window.__QS__.snapshot().publishStatus)" 2>/dev/null

UI/view changes: Open the affected modal, verify DOM, take screenshot.

bash
obsidian eval code="(async()=>{const r=await window.__QS__.act({name:'pub.open'});console.log(JSON.stringify(r))})()" 2>/dev/null
sleep 2
obsidian dev:dom selector='[data-qs="pub-center"]' total 2>/dev/null
obsidian dev:screenshot path=/tmp/verify.png 2>/dev/null

Settings changes: Verify settings are readable.

bash
obsidian eval code="(async()=>{const r=await window.__QS__.act({name:'settings.get',params:{key:'gitRemoteUrl'}});console.log(JSON.stringify(r))})()" 2>/dev/null

Git/connection changes: Test the connection.

bash
obsidian eval code="(async()=>{const r=await window.__QS__.act({name:'connection.test'});console.log(JSON.stringify(r))})()" 2>/dev/null

Quartz Hub changes: Open the Hub and verify.

bash
obsidian command id=quartz-syncer:open-hub 2>/dev/null
sleep 2
obsidian dev:dom selector='[data-qs="hub"]' total 2>/dev/null
obsidian dev:dom selector='[data-qs="hub-action"]' total 2>/dev/null
obsidian dev:screenshot path=/tmp/hub-verify.png 2>/dev/null

MUST DO

  • Always append 2>/dev/null to all obsidian CLI commands.
  • Always build AND reload — build alone doesn't update the running instance.
  • Always health-check after reload — a successful build doesn't guarantee successful initialization.
  • Always use the IIFE pattern for async facade calls.
  • Always wait after operations (3s after reload, 2s after modal open).
  • Always verify actions took effect — follow up a click with a DOM query or screenshot.
  • Parse all JSON responses — don't assume success. Check pass or success fields.
  • If health check fails, collect a failure bundle before attempting fixes.

MUST NOT DO

  • Do NOT omit 2>/dev/null — GTK warnings will pollute output parsing.
  • Do NOT skip the reload step — Obsidian caches the old plugin code until disabled/enabled.
  • Do NOT assume the plugin loaded correctly just because the build succeeded.
  • Do NOT use await at the top level of obsidian eval — it produces no output. Use the IIFE pattern.
  • Do NOT treat missing eval output as failure — it usually means the work outlasted the ~5–15 ms capture window. Verify with a synchronous follow-up query.
  • Do NOT set input .value without dispatchEvent(new Event('input', { bubbles: true })) — event listeners won't fire.
  • Do NOT modify code and re-verify without rebuilding AND reloading.

Failure Bundle

When something goes wrong, collect all diagnostic data before investigating:

bash
obsidian eval code="JSON.stringify(window.__QS__.snapshot())" 2>/dev/null
obsidian eval code="JSON.stringify(window.__QS__.events.tail(20))" 2>/dev/null
obsidian dev:errors 2>/dev/null
obsidian dev:console level=error 2>/dev/null
obsidian dev:screenshot path=/tmp/failure.png 2>/dev/null

© saberzero1, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .agents/skills/verify-changes of saberzero1/quartz-syncer.

Open the folder on GitHubat commit 8f04c08

Compare with similar skills

Verify Changes next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Verify Changes compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Verify Changes this skillsaberzero1/quartz-syncer139—~2.1kAutomated safety check: PassMIT
Obsidian BasesAtmosphere/atmosphere3.8k22 repos~3.2kAutomated safety check: PassApache-2.0
Knap Markdown Templateskepano/obsidian-skills49k2 repos~986Automated safety check: PassMIT
JSON Canvasheyitsnoah/claudesidian2.6k18 repos~3.5kAutomated safety check: PassMIT
Obsidian MarkdownAtmosphere/atmosphere3.8k20 repos~1.3kAutomated safety check: PassApache-2.0
Obsidian CLIAtmosphere/atmosphere3.8k13 repos~795Automated safety check: PassApache-2.0

Similar skills

  • Obsidian Bases

    Atmosphere/atmosphere

    Create and edit Obsidian Bases (.base files) with views, filters, formulas, and summaries.

    3.8k GitHub starsUsed in 22 repos~3.2k tokens
    Backend & APIsAuto-check passed
  • Knap Markdown Templates

    kepano/obsidian-skills

    Renders Markdown notes from Knap templates and JSON data on the command line, including notes built from Defuddle web page output.

    49k GitHub starsUsed in 2 repos~986 tokens
    Documents & OfficeAuto-check passed
  • JSON Canvas

    heyitsnoah/claudesidian

    Create and edit JSON Canvas files (.canvas) with nodes, edges, groups, and connections.

    2.6k GitHub starsUsed in 18 repos~3.5k tokens
    DevelopmentAuto-check passed
  • Obsidian Markdown

    Atmosphere/atmosphere

    Create and edit Obsidian Flavored Markdown with wikilinks, embeds, callouts, properties, and other Obsidian-specific syntax.

    3.8k GitHub starsUsed in 20 repos~1.3k tokens
    Documents & OfficeAuto-check passed
  • Obsidian CLI

    Atmosphere/atmosphere

    Interact with Obsidian vaults using the Obsidian CLI to read, create, search, and manage notes, tasks, properties, and more.

    3.8k GitHub starsUsed in 13 repos~795 tokens
    Knowledge ManagementAuto-check passed
  • Llmwiki

    atomicstrata/llm-wiki-compiler

    Build and use a persistent, citation-traceable knowledge wiki from documents, research papers, notes, or project documentation.

    2.2k GitHub starsUsed in 1 repo~814 tokens
    Knowledge ManagementAuto-check passed

More from saberzero1/quartz-syncer

  • Debug Obsidian

    saberzero1/quartz-syncer

    Debug and investigate plugin issues in a running Obsidian instance — collect diagnostic data, inspect state, trace events, and identify root causes via the operability facade.

    139 GitHub stars~1.9k tokensUpdated 7 days ago
    Auto-check passed
  • Verify Publish

    saberzero1/quartz-syncer

    End-to-end publish verification — refresh status, publish files, verify the result, and confirm status changes via the operability facade.

    139 GitHub stars~1.6k tokensUpdated 7 days ago
    Auto-check passed
  • Verify UI

    saberzero1/quartz-syncer

    UI verification workflow — open modals, query DOM contract selectors, interact with inputs, take screenshots, and validate UI rendering via the operability facade.

    139 GitHub stars~2.3k tokensUpdated 7 days ago
    Auto-check passed

Works with

Questions about Verify Changes

What does Verify Changes do?

Post-change verification workflow — build, reload plugin in Obsidian, run health checks, and verify no regressions via the operability facade. Verify Changes is an agent skill from saberzero1/quartz-syncer. Post-change verification workflow — build, reload plugin in Obsidian, run health checks, and verify no regressions via the operability facade.

How do I install Verify Changes in Claude Code?

Run `npx skills add saberzero1/quartz-syncer --skill verify-changes -a claude-code`. Or copy the skill folder (.agents/skills/verify-changes in saberzero1/quartz-syncer) into .claude/skills/verify-changes in your project. Claude Code loads it when a task matches its description.

How do I install Verify Changes in Codex?

Run `npx skills add saberzero1/quartz-syncer --skill verify-changes -a codex`. Or copy the skill folder (.agents/skills/verify-changes in saberzero1/quartz-syncer) into .agents/skills/verify-changes in your project. Codex loads it when a task matches its description.

Can I use Verify Changes in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add saberzero1/quartz-syncer --skill verify-changes -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/verify-changes, .gemini/skills/verify-changes, .github/skills/verify-changes and .opencode/skills/verify-changes in your project.

What does Verify Changes need to run?

Going by SKILL.md and its folder, Verify Changes needs the command-line tools its instructions call (npm).

Does Verify Changes access the network?

SKILL.md contains no URLs. Its commands use npm, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is Verify Changes safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Verify Changes use?

Verify Changes is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Verify Changes use?

About 2.1k tokens (SKILL.md is roughly 8.3k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Verify Changes?

Skills that share tags, products or a category with Verify Changes: Obsidian Bases (Atmosphere/atmosphere, 3.8k stars), Knap Markdown Templates (kepano/obsidian-skills, 49k stars), JSON Canvas (heyitsnoah/claudesidian, 2.6k stars) and Obsidian Markdown (Atmosphere/atmosphere, 3.8k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Verify Changes?

saberzero1 (a GitHub user) maintains it in saberzero1/quartz-syncer, which has 139 GitHub stars. The repository holds 4 skills in this directory. The repository was last updated on September 30, 2026.

Source: saberzero1/quartz-syncer on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.