cli-audit
Audit an existing CLI against cli-build: how well an agent can operate it and how well a human can read it. Use when the user…
Release a new version of an Obsidian community plugin without forgetting steps. Use when: (1) user says "release the plugin", "bump <plugin> to X.Y.Z", "ship a new Obsidian release", "tag a new plugin version", "publish to the obsidian directory", (2) the working directory
$ npx -y skills add crafter-station/skills --skill obsidian-plugin-release --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/obsidian-plugin-releaseContext preview
The summary Claude sees to decide when to auto-load this skill.
Release a new version of an Obsidian community plugin without forgetting steps. Use when: (1) user says "release the plugin", "bump <plugin> to X.Y.Z", "ship a new Obsidian release", "tag a new plugin version", "publish to the obsidian directory", (2) the working directory
name: obsidian-plugin-release version: 1.0.0 description: | Release a new version of an Obsidian community plugin without forgetting steps. Use when: (1) user says "release the plugin", "bump <plugin> to X.Y.Z", "ship a new Obsidian release", "tag a new plugin version", "publish to the obsidian directory", (2) the working directory contains manifest.json + main.js + versions.json (Obsidian plugin signature), (3) user wants to scaffold the release workflow into an existing plugin (`scaffold-workflow` arg). Handles version bump across manifest.json + package.json + versions.json, build, lint, conventional commit, signed annotated tag, push, and lets the GitHub Actions workflow publish the release with build-provenance attestation. Idempotent and dry-run-safe.
Releasing an Obsidian plugin has 12 manual steps that are easy to half-do (forget `versions.json`, push tag before main, sign assets without provenance). This skill collapses the flow into a single intent: pick a version → ship.
The current directory is an Obsidian plugin if all of these exist at the root:
Refuse to run if any of those are missing. Suggest `scaffold-workflow` if `manifest.json` exists but `.github/workflows/release.yml` does not.
bun run scripts/release.ts <version> # via package.json script if user added it # OR direct ~/.claude/skills/obsidian-plugin-release/scripts/release.ts <version>
Steps the script does (each one a hard gate — stop on failure):
1. **Verify clean tree** — abort if uncommitted changes (unless `--allow-dirty`). 2. **Verify version is new** — `versions.json` must not already contain it. 3. **Bump version atomically** — write the same `<version>` to `manifest.json`, `package.json`, and append `versions.json` keyed to current `minAppVersion`. Use `JSON.parse → mutate → write` (preserve trailing newline + tab indent that Obsidian expects). 4. **Build** — `bun run build`. Abort on non-zero. 5. **Lint** — `bunx eslint src/` (skip if user has no `src/` — JS-only plugins exist). Abort on errors. 6. **Stage** — `git add manifest.json package.json versions.json main.js styles.css`. Only those 5 files. 7. **Commit** — conventional message, no Co-Authored-By:
chore: release <version>
8. **Push main** — `git push origin <current-branch>`. 9. **Tag** — `git tag -a <version> -m "Release <version>"` (annotated because `tag.gpgSign=true` is common; annotated works either way). 10. **Push tag** — `git push origin <version>`. This triggers the release workflow. 11. **Wait for workflow** — `gh run watch --exit-status` against the latest run on this tag. Abort if it fails. 12. **Verify release** — `gh release view <version> --json assets` must include `main.js`, `manifest.json`, `styles.css`. Attestation is verified via `gh attestation verify` on `main.js`.
Print the release URL + the community page (`https://community.obsidian.md/plugins/<id>`) + the deep link (`obsidian://show-plugin?id=<id>`) at the end.
Print every file that would change, the commit message, the tag message, and the workflow that would fire. No writes, no network calls.
Audit current state. Output:
Use this before running a release if anything feels off.
Drop `.github/workflows/release.yml` into the current plugin. Idempotent — refuses to overwrite unless `--force`.
Template lives at [templates/release.yml](templates/release.yml). It:
Also offer to scaffold [templates/eslint.config.mjs](templates/eslint.config.mjs) if the user is starting from scratch — it ships with the obsidianmd plugin pre-wired and the ignore globs (`web/**`, `assets/**`, `scripts/**`) that match the Obsidian scanner expectations.
Agent skills extracted from real work. Each one shipped something first.
Audit an existing CLI against cli-build: how well an agent can operate it and how well a human can read it. Use when the user…
Design and build a CLI that an AI agent can operate safely and a human can supervise. Use when the user wants to build a CLI,…
Generate OG images and favicon based on project branding. Use when: (1) user needs social media preview images for their project,…
Set up hierarchical Intent Layer (AGENTS.md files) for codebases. Use when initializing a new project, adding context…
Deprecated. Auto-generate Claude skills from documentation URLs using Firecrawl agent. Use when user wants to create a skill from…
Read-only audit of a developer machine for npm/PyPI supply-chain compromise. Checks for known IOCs from the 2025-2026 wave —…