OB

obsidian-ci-integration

Provides GitHub Actions workflows for building, testing, and releasing Obsidian plugins.

Install

mkdir -p .claude/skills/obsidian-ci-integration && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/8166" && unzip -o skill.zip -d .claude/skills/obsidian-ci-integration && rm skill.zip

Installs to .claude/skills/obsidian-ci-integration

Activation

This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.

Set up GitHub Actions CI/CD for Obsidian plugin development.
60 charsno explicit “when” trigger
Intermediate

Key capabilities

  • Validate Obsidian plugin builds on every push or pull request
  • Automate plugin releases to GitHub when a Git tag is pushed
  • Synchronize plugin version numbers across manifest.json, versions.json, and package.json
  • Validate the consistency of manifest.json and versions.json files
  • Support beta channel distribution for Obsidian plugins via BRAT

How it works

GitHub Actions workflows are configured to trigger on Git events like pushes or tag creation. These workflows execute scripts to build, validate, and release the Obsidian plugin.

Inputs & outputs

You give it
Git push to main branch or a tag push
You get back
GitHub Actions workflow runs, GitHub release created, or manifest/version files updated

When to use obsidian-ci-integration

  • Automate Obsidian plugin builds on push
  • Validate manifest and version files
  • Automate plugin releases via Git tags
  • Setup automated testing for plugins

About this skill

Obsidian CI Integration

Overview

GitHub Actions workflows for Obsidian plugin development: build validation on every push, automated releases when you tag, version-bump scripting, manifest.json validation, and BRAT beta channel support.

Prerequisites

  • GitHub repository with an Obsidian plugin
  • Working local build (npm run build produces main.js)
  • manifest.json and versions.json in repo root
  • GitHub Actions enabled on the repository

Instructions

Step 1: Create Build Workflow

# .github/workflows/build.yml
name: Build Plugin
on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - uses: actions/setup-node@v4
        with:
          node-version: 18

      - name: Install dependencies
        run: npm ci

      - name: Build plugin
        run: npm run build

      - name: Verify build output
        run: |
          if [ ! -f main.js ]; then
            echo "ERROR: main.js not found after build"
            exit 1
          fi
          echo "main.js size: $(wc -c < main.js) bytes"

      - name: Validate manifest.json
        run: |
          node -e "
            const m = require('./manifest.json');
            const required = ['id', 'name', 'version', 'minAppVersion', 'description', 'author'];
            const missing = required.filter(f => !m[f]);
            if (missing.length) {
              console.error('Missing manifest fields:', missing.join(', '));
              process.exit(1);
            }
            console.log('manifest.json valid:', m.id, 'v' + m.version);
          "

Step 2: Create Release Workflow

# .github/workflows/release.yml
name: Release Plugin
on:
  push:
    tags:
      - '*'

jobs:
  release:
    runs-on: ubuntu-latest
    permissions:
      contents: write
    steps:
      - uses: actions/checkout@v4

      - uses: actions/setup-node@v4
        with:
          node-version: 18

      - run: npm ci
      - run: npm run build

      - name: Create GitHub Release
        uses: softprops/action-gh-release@v2
        with:
          files: |
            main.js
            manifest.json
            styles.css
          draft: false
          generate_release_notes: true

Step 3: Create Version Bump Script

// version-bump.mjs
import { readFileSync, writeFileSync } from 'fs';

const targetVersion = process.env.npm_package_version;

// Update manifest.json
const manifest = JSON.parse(readFileSync('manifest.json', 'utf8'));
const { minAppVersion } = manifest;
manifest.version = targetVersion;
writeFileSync('manifest.json', JSON.stringify(manifest, null, '\t'));

// Update versions.json — maps plugin version to minimum Obsidian version
const versions = JSON.parse(readFileSync('versions.json', 'utf8'));
versions[targetVersion] = minAppVersion;
writeFileSync('versions.json', JSON.stringify(versions, null, '\t'));

console.log(`Bumped to ${targetVersion} (minAppVersion: ${minAppVersion})`);

Step 4: Wire Version Bump into package.json

{
  "scripts": {
    "build": "node esbuild.config.mjs",
    "dev": "node esbuild.config.mjs --watch",
    "version": "node version-bump.mjs && git add manifest.json versions.json"
  }
}

Now npm version patch (or minor/major) runs the bump script automatically.

Step 5: Add Manifest Validation Workflow

# .github/workflows/validate.yml
name: Validate Plugin
on: [push, pull_request]

jobs:
  validate:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Check manifest/versions consistency
        run: |
          node -e "
            const manifest = require('./manifest.json');
            const versions = require('./versions.json');
            const pkg = require('./package.json');
            let fail = false;

            if (manifest.version !== pkg.version) {
              console.error('Version mismatch: manifest=' + manifest.version + ' package=' + pkg.version);
              fail = true;
            }

            if (!versions[manifest.version]) {
              console.error('versions.json missing entry for ' + manifest.version);
              fail = true;
            }

            if (fail) process.exit(1);
            console.log('All versions consistent: ' + manifest.version);
          "

Step 6: BRAT Beta Support

Add a beta-manifest.json for BRAT beta testers:

{
  "id": "your-plugin-id",
  "name": "Your Plugin (Beta)",
  "version": "1.2.0-beta.1",
  "minAppVersion": "1.5.0",
  "description": "Beta channel — install via BRAT",
  "author": "Your Name"
}

Beta users install via BRAT by entering your GitHub repo URL. BRAT fetches the latest release (including pre-releases) automatically — no submission to the community repo needed.

Output

  • .github/workflows/build.yml — validates build on every push/PR
  • .github/workflows/release.yml — creates GitHub release with main.js, manifest.json, styles.css on tag push
  • .github/workflows/validate.yml — checks version consistency across manifest, package.json, and versions.json
  • version-bump.mjs — keeps manifest.json and versions.json in sync with package.json version
  • Optional beta-manifest.json for BRAT beta channel

Error Handling

ErrorCauseSolution
main.js not foundBuild script doesn't output to rootCheck esbuild outfile points to ./main.js
Release has no assetsTag pushed before buildLet the release workflow handle the build, don't attach manually
Version mismatchForgot npm versionRun npm version patch instead of editing manifest by hand
BRAT not picking up betaNo pre-release on GitHubCreate release and check "pre-release" checkbox
npm ci failsNo lockfileCommit package-lock.json to the repo
Permission denied on releaseMissing contents: writeAdd permissions block to release job

Examples

Tag and Release a New Version

set -euo pipefail
# Bump, commit, tag, push — release workflow fires automatically
npm version patch
git push origin main --tags

Manual Build Verification

set -euo pipefail
npm ci
npm run build
test -f main.js && echo "Build OK: $(wc -c < main.js) bytes" || echo "FAIL: main.js missing"
node -e "const m=require('./manifest.json'); console.log(m.id, 'v'+m.version)"

Release with Changelog

# In release.yml, replace generate_release_notes with a body:
- name: Create GitHub Release
  uses: softprops/action-gh-release@v2
  with:
    files: |
      main.js
      manifest.json
      styles.css
    body: |
      ## Changes
      - Feature: Added X
      - Fix: Resolved Y

Resources

Next Steps

For publishing to the community plugin directory, see obsidian-deploy-integration. For pre-release quality checks, see obsidian-prod-checklist.

Prerequisites

GitHub repository with an Obsidian pluginWorking local build (npm run build produces main.js)manifest.json and versions.json in repo rootGitHub Actions enabled on the repository

Limitations

  • Build script must output main.js to the root directory
  • Release workflow requires contents: write permissions
  • BRAT beta support requires a pre-release on GitHub

How it compares

This skill automates the entire CI/CD pipeline for Obsidian plugins using GitHub Actions, unlike manual build, validation, and release processes.

Compared to similar skills

obsidian-ci-integration side by side with the closest alternatives in the catalog.

SkillInstallsUpdatedSafetyDifficulty
obsidian-ci-integration (this skill)025dReviewIntermediate
perf-lighthouse135moReviewIntermediate
smoke-test64moReviewBeginner
1k-dev-commands226dReviewBeginner

Try saying

Example prompts that trigger this skill in your AI assistant.

More by jeremylongshore

View all by jeremylongshore

analyzing-logs

jeremylongshore

Analyze application logs to detect performance issues, identify error patterns, and improve stability by extracting key insights.

14123

ollama-setup

jeremylongshore

Configure auto-configure Ollama when user needs local LLM deployment, free AI alternatives, or wants to eliminate hosted API costs. Trigger phrases: "install ollama", "local AI", "free LLM", "self-hosted AI", "replace OpenAI", "no API costs". Use when appropriate context detected. Trigger with relevant phrases based on skill purpose.

1167

backtesting-trading-strategies

jeremylongshore

Backtest crypto and traditional trading strategies against historical data. Calculates performance metrics (Sharpe, Sortino, max drawdown), generates equity curves, and optimizes strategy parameters. Use when user wants to test a trading strategy, validate signals, or compare approaches. Trigger with phrases like "backtest strategy", "test trading strategy", "historical performance", "simulate trades", "optimize parameters", or "validate signals".

1071

generating-database-seed-data

jeremylongshore

Process this skill enables AI assistant to generate realistic test data and database seed scripts for development and testing environments. it uses faker libraries to create realistic data, maintains relational integrity, and allows configurable data volumes. u... Use when working with databases or data models. Trigger with phrases like 'database', 'query', or 'schema'.

1033

cursor-codebase-indexing

jeremylongshore

Execute set up and optimize Cursor codebase indexing. Triggers on "cursor index setup", "codebase indexing", "index codebase", "cursor semantic search". Use when working with cursor codebase indexing functionality. Trigger with phrases like "cursor codebase indexing", "cursor indexing", "cursor".

885

testing-mobile-apps

jeremylongshore

Execute mobile app testing on iOS and Android devices/simulators. Use when performing specialized testing. Trigger with phrases like "test mobile app", "run iOS tests", or "validate Android functionality".

810

You might also like

perf-lighthouse

tech-leads-club

Run Lighthouse audits locally via CLI or Node API, parse and interpret reports, set performance budgets. Use when measuring site performance, understanding Lighthouse scores, setting up budgets, or integrating audits into CI. Triggers on: lighthouse, run lighthouse, lighthouse score, performance audit, performance budget.

1361

smoke-test

mastra-ai

Create a Mastra project using create-mastra and smoke test the studio in Chrome

616

1k-dev-commands

OneKeyHQ

Development commands — yarn scripts for dev servers, building, linting, testing, and troubleshooting.

24

instantly-ci-integration

jeremylongshore

Configure Instantly CI/CD integration with GitHub Actions and testing. Use when setting up automated testing, configuring CI pipelines, or integrating Instantly tests into your build process. Trigger with phrases like "instantly CI", "instantly GitHub Actions", "instantly automated tests", "CI instantly".

14

groq-ci-integration

jeremylongshore

Configure Groq CI/CD integration with GitHub Actions and testing. Use when setting up automated testing, configuring CI pipelines, or integrating Groq tests into your build process. Trigger with phrases like "groq CI", "groq GitHub Actions", "groq automated tests", "CI groq".

13

apollo-ci-integration

jeremylongshore

Configure Apollo.io CI/CD integration. Use when setting up automated testing, continuous integration, or deployment pipelines for Apollo integrations. Trigger with phrases like "apollo ci", "apollo github actions", "apollo pipeline", "apollo ci/cd", "apollo automated tests".

11

Search skills

Search the agent skills registry