Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
43a3357
ci: pin every action and reusable workflow to a full commit SHA
chhoumann Oct 24, 2026
e5ed31e
build(deps-dev): move to pnpm 12 with a release-age and trust policy
chhoumann Oct 24, 2026
9d546e4
ci: give Dependabot the same 7-day cooldown as pnpm
chhoumann Oct 24, 2026
fa4d010
build(deps-dev): drop svelte-preprocess in favor of Svelte 5's native…
chhoumann Oct 24, 2026
4a8ab1e
build(deps-dev): replace esbuild-svelte with a 30-line compile plugin
chhoumann Oct 24, 2026
4bddda4
build(deps-dev): drop unused svelte-eslint-parser and tslib
chhoumann Oct 24, 2026
8968f5f
build(deps-dev): migrate to ESLint 10 and express Obsidian rules with…
chhoumann Oct 24, 2026
60685cf
build(deps-dev): move to Vitest 5 and drop the unused coverage provider
chhoumann Oct 24, 2026
91f1e61
build(deps-dev): bump obsidian-e2e to 0.14.0
chhoumann Oct 24, 2026
d2850a0
build(deps-dev): bump obsidian types to 1.14.4 and the Svelte toolchain
chhoumann Oct 24, 2026
367b7db
refactor: type svelteMount against Svelte 5 components only
chhoumann Oct 24, 2026
c6971ef
build(deps-dev): drop the transitive security overrides
chhoumann Oct 24, 2026
8e20590
build(deps-dev): pin the mobile harness Python dependencies
chhoumann Oct 24, 2026
435604e
docs: describe the esbuild build in AGENTS.md
chhoumann Oct 24, 2026
ae2b89f
build(deps-dev): give the docs site its own pnpm 12 supply-chain policy
chhoumann Oct 24, 2026
b7e7e3f
build(deps-dev): upgrade the docs site to Astro 7.4 and Starlight 0.42
chhoumann Oct 24, 2026
6c079bc
build(deps-dev): upgrade the docs site's Sharp to 0.35.5
chhoumann Oct 24, 2026
dd711b1
build(deps-dev): upgrade the docs site's IBM Plex fonts to Fontsource…
chhoumann Oct 24, 2026
23ee3fc
build(deps-dev): upgrade the docs site's Wrangler to 4.151.1
chhoumann Oct 24, 2026
cb5d4b2
build(deps-dev): re-resolve the docs site's lockfile under the releas…
chhoumann Oct 24, 2026
7257a40
build(deps-dev): override the docs site's vulnerable transitive depen…
chhoumann Oct 24, 2026
c20bba9
ci: let Dependabot update the docs site's dependencies
chhoumann Oct 24, 2026
f760fee
docs: keep the landing page's feature cards in an aligned grid
chhoumann Oct 24, 2026
eca0f64
test(e2e): count leaked body children instead of a body-size delta
chhoumann Oct 24, 2026
3c3b768
build(deps-dev): fail on Svelte rune modules and deny esbuild's insta…
chhoumann Oct 24, 2026
4b079c6
build(deps-dev): read the plugin name from manifest.json in the lint …
chhoumann Oct 24, 2026
a72a113
ci: give toolkit pin bumps their own Dependabot PR and tighten engines
chhoumann Oct 24, 2026
7b572d5
build(deps-dev): reject rune modules before any other loader runs
chhoumann Oct 24, 2026
e7f4b96
ci: keep the three release stubs in one Dependabot toolkit group
chhoumann Oct 24, 2026
27654b1
build(deps-dev): exclude Node 25 from engines and regex-escape the pl…
chhoumann Oct 24, 2026
97bde8d
ci: replace an em-dash in the Dependabot comment
chhoumann Oct 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 35 additions & 1 deletion .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -1,16 +1,23 @@
version: 2
updates:
# GitHub Actions across all workflows. Keeps the SHA pins from rotting — the
# GitHub Actions across all workflows. Keeps the SHA pins from rotting - the
# Node 20 deprecation slipped into many repos precisely because nothing watched
# these.
- package-ecosystem: github-actions
directory: /
schedule:
interval: weekly
day: monday
cooldown:
default-days: 7
groups:
actions:
patterns: ["*"]
exclude-patterns: ["chhoumann/obsidian-plugin-workflows*"]
# Toolkit bumps change release behavior, so they get their own PR. One
# group keeps the three release stubs on the same toolkit commit.
release-toolkit:
patterns: ["chhoumann/obsidian-plugin-workflows*"]
commit-message:
prefix: ci
labels:
Expand All @@ -24,6 +31,10 @@ updates:
interval: weekly
day: monday
open-pull-requests-limit: 10
# Mirrors minimumReleaseAge in pnpm-workspace.yaml.
cooldown:
default-days: 7
exclude: ["obsidian-e2e"]
groups:
dev-dependencies:
dependency-type: development
Expand All @@ -38,3 +49,26 @@ updates:
include: scope
labels:
- dependencies

# Docs site (website/package.json + website/pnpm-lock.yaml).
- package-ecosystem: npm
directory: /website
schedule:
interval: weekly
day: monday
open-pull-requests-limit: 10
# Mirrors minimumReleaseAge in website/pnpm-workspace.yaml.
cooldown:
default-days: 7
groups:
# One group, because Astro, Starlight and starlight-links-validator
# require each other's new versions and must move in one PR.
website:
patterns: ["*"]
update-types: ["minor", "patch"]
commit-message:
# Emits build(website): - nothing here ships in the plugin, so these
# bumps must not match the release policy's build(deps).
prefix: build(website)
labels:
- dependencies
8 changes: 4 additions & 4 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Harden Runner
uses: step-security/harden-runner@e14015d583714f6e62063499dc959a02595150a1 # v2.21.1
uses: step-security/harden-runner@ccd8616d44fd3846e67624a50d5aad6d37bf2d25 # v2.22.1
with:
egress-policy: audit
- name: Checkout
Expand All @@ -33,7 +33,7 @@ jobs:
- name: Setup pnpm
uses: pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413 # v6.1.0
- name: Use Node.js 24
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0
with:
node-version: 24
check-latest: true
Expand All @@ -48,7 +48,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Harden Runner
uses: step-security/harden-runner@e14015d583714f6e62063499dc959a02595150a1 # v2.21.1
uses: step-security/harden-runner@ccd8616d44fd3846e67624a50d5aad6d37bf2d25 # v2.22.1
with:
egress-policy: audit
- name: Checkout
Expand All @@ -58,7 +58,7 @@ jobs:
- name: Setup pnpm
uses: pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413 # v6.1.0
- name: Use Node.js 24
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0
with:
node-version: 24
check-latest: true
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/codeql.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,19 +29,19 @@ jobs:
language: [javascript-typescript, actions]
steps:
- name: Harden Runner
uses: step-security/harden-runner@e14015d583714f6e62063499dc959a02595150a1 # v2.21.1
uses: step-security/harden-runner@ccd8616d44fd3846e67624a50d5aad6d37bf2d25 # v2.22.1
with:
egress-policy: audit
- name: Checkout
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Initialize CodeQL
uses: github/codeql-action/init@2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2 # v4
uses: github/codeql-action/init@6f2ac81f5cd81fe351a197ba0b00d91d03cd2aee # v4.39.0
with:
languages: ${{ matrix.language }}
queries: security-extended
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2 # v4
uses: github/codeql-action/analyze@6f2ac81f5cd81fe351a197ba0b00d91d03cd2aee # v4.39.0
with:
category: "/language:${{ matrix.language }}"
2 changes: 1 addition & 1 deletion .github/workflows/dependency-review.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ jobs:
pull-requests: write
steps:
- name: Harden Runner
uses: step-security/harden-runner@e14015d583714f6e62063499dc959a02595150a1 # v2.21.1
uses: step-security/harden-runner@ccd8616d44fd3846e67624a50d5aad6d37bf2d25 # v2.22.1
with:
egress-policy: audit
- name: Checkout
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/pr-title.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Harden Runner
uses: step-security/harden-runner@e14015d583714f6e62063499dc959a02595150a1 # v2.21.1
uses: step-security/harden-runner@ccd8616d44fd3846e67624a50d5aad6d37bf2d25 # v2.22.1
with:
egress-policy: audit
- name: Lint PR title
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release-prepare.yml
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ jobs:
permissions:
contents: write
pull-requests: write
uses: chhoumann/obsidian-plugin-workflows/.github/workflows/release-prepare.yml@v4
uses: chhoumann/obsidian-plugin-workflows/.github/workflows/release-prepare.yml@ebcf84b80dc48ba15e0eec1f3575d41519a78ed5 # v4
with:
plugin-name: metaedit
package-manager: pnpm
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release-trigger.yml
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ jobs:
actions: write
contents: write
pull-requests: read
uses: chhoumann/obsidian-plugin-workflows/.github/workflows/release-validate.yml@v4
uses: chhoumann/obsidian-plugin-workflows/.github/workflows/release-validate.yml@ebcf84b80dc48ba15e0eec1f3575d41519a78ed5 # v4
with:
pr-number: ${{ github.event.pull_request.number || inputs.pr-number }}
plugin-name: metaedit
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ jobs:
contents: write
id-token: write
pull-requests: read
uses: chhoumann/obsidian-plugin-workflows/.github/workflows/release.yml@v4
uses: chhoumann/obsidian-plugin-workflows/.github/workflows/release.yml@ebcf84b80dc48ba15e0eec1f3575d41519a78ed5 # v4
with:
release-pr: ${{ inputs.releasePr }}
plugin-name: metaedit
Expand Down
1 change: 0 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ main.js

# obsidian
data.json
/coverage/

# Obsidian E2E harness (isolated per-worktree vaults, instances, failure artifacts)
.obsidian-e2e-vaults
Expand Down
1 change: 0 additions & 1 deletion .npmrc

This file was deleted.

5 changes: 2 additions & 3 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,11 +37,10 @@ hand-written, committed release asset.
merge waiting for self-approval.

## Build, Test, and Development Commands
- `pnpm run dev`: watch-mode Rollup build, regenerating `main.js` as you edit.
- `pnpm run build`: production Rollup bundle (`main.js`).
- `pnpm run dev`: watch-mode esbuild build, regenerating `main.js` as you edit.
- `pnpm run build`: typecheck, then the production esbuild bundle (`main.js`).
- `pnpm run lint`: ESLint over the TypeScript sources.
- `pnpm run test`: Vitest unit suite (jsdom-free, `node` environment).
- `pnpm run test:coverage`: unit suite with V8 coverage.
- `pnpm run test:e2e`: build, then run the live Obsidian E2E suite (`tests/e2e/`).
- `pnpm run obsidian:e2e -- <command>`: run an `obsidian` CLI command against an
isolated, auto-provisioned worktree instance (see below).
Expand Down
20 changes: 10 additions & 10 deletions MOBILE_FINDINGS.md
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ vault open in Obsidian, and supports restore.
Command:

```bash
uv run --no-project --with pymobiledevice3 python scripts/mobile/metaedit_ios.py deploy --vault notes --confirm-real-vault
uv run scripts/mobile/metaedit_ios.py deploy --vault notes --confirm-real-vault
```

Snapshot:
Expand Down Expand Up @@ -99,7 +99,7 @@ Deploy result:
Command:

```bash
uv run --no-project --with pymobiledevice3 python scripts/mobile/metaedit_ios.py eval --file scripts/mobile/probes/issue99_frontmatter.js
uv run scripts/mobile/metaedit_ios.py eval --file scripts/mobile/probes/issue99_frontmatter.js
```

Result: `ok: true`.
Expand Down Expand Up @@ -128,7 +128,7 @@ parsed properties or the note text.
Command:

```bash
uv run --no-project --with pymobiledevice3 python scripts/mobile/metaedit_ios.py eval --timeout 180 --file scripts/mobile/probes/core_smoke.js
uv run scripts/mobile/metaedit_ios.py eval --timeout 180 --file scripts/mobile/probes/core_smoke.js
```

Result: `ok: true`.
Expand Down Expand Up @@ -158,8 +158,8 @@ during the test window.
Commands:

```bash
uv run --no-project --with pymobiledevice3 python scripts/mobile/metaedit_ios.py eval '(()=>{console.clear(); return "cleared";})()'
uv run --no-project --with pymobiledevice3 python scripts/mobile/metaedit_ios.py logs --seconds 10
uv run scripts/mobile/metaedit_ios.py eval '(()=>{console.clear(); return "cleared";})()'
uv run scripts/mobile/metaedit_ios.py logs --seconds 10
```

Fresh post-probe result: no console errors or uncaught errors streamed.
Expand All @@ -169,7 +169,7 @@ Fresh post-probe result: no console errors or uncaught errors streamed.
Command:

```bash
uv run --no-project --with pymobiledevice3 python scripts/mobile/metaedit_ios.py restore --backup ~/.metaedit-mobile-backups/metaedit/<device>/notes/20260628T160849Z
uv run scripts/mobile/metaedit_ios.py restore --backup ~/.metaedit-mobile-backups/metaedit/<device>/notes/20260628T160849Z
```

Restore result:
Expand All @@ -190,10 +190,10 @@ and an open disposable scratch Obsidian vault are available. Android deploy has
no backup/restore path, so it requires an explicit scratch-vault confirmation:

```bash
uv run --no-project --with websockets python scripts/mobile/metaedit_android.py diagnose
uv run --no-project --with websockets python scripts/mobile/metaedit_android.py deploy --confirm-scratch-vault
uv run --no-project --with websockets python scripts/mobile/metaedit_android.py eval --file scripts/mobile/probes/issue99_frontmatter.js
uv run --no-project --with websockets python scripts/mobile/metaedit_android.py eval --file scripts/mobile/probes/core_smoke.js
uv run scripts/mobile/metaedit_android.py diagnose
uv run scripts/mobile/metaedit_android.py deploy --confirm-scratch-vault
uv run scripts/mobile/metaedit_android.py eval --file scripts/mobile/probes/issue99_frontmatter.js
uv run scripts/mobile/metaedit_android.py eval --file scripts/mobile/probes/core_smoke.js
```

## Conclusion
Expand Down
56 changes: 49 additions & 7 deletions esbuild.config.mjs
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
import {builtinModules} from "node:module";
import {readFile} from "node:fs/promises";
import {dirname, join, sep} from "node:path";
import {dirname, join, relative, sep} from "node:path";
import {fileURLToPath} from "node:url";
import esbuild from "esbuild";
import esbuildSvelte from "esbuild-svelte";
import sveltePreprocess from "svelte-preprocess";
import {compile} from "svelte/compiler";

const isProduction = process.argv.includes("production");
const projectSrcDir = `${join(dirname(fileURLToPath(import.meta.url)), "src")}${sep}`;
Expand Down Expand Up @@ -55,6 +54,51 @@ function stripDevCommandBlocks() {
};
}

function toEsbuildMessage({message, start, end}, file, source) {
if (!start || !end) return {text: message};
const lineText = source.split(/\r\n|\r|\n/)[start.line - 1];
const lineEnd = start.line === end.line ? end.column : lineText.length;
return {
text: message,
location: {file, line: start.line, column: start.column, length: lineEnd - start.column, lineText},
};
}

// Registered first so no other loader can hand esbuild a rune module's source.
function rejectSvelteRuneModules() {
return {
name: "reject-svelte-rune-modules",
setup(build) {
build.onLoad({filter: /\.svelte\.[cm]?[jt]s$/}, (args) => ({
errors: [{text: `Svelte rune modules (.svelte.js/.svelte.ts) are not supported by this build: ${args.path}`}],
}));
},
};
}

function compileSvelte() {
return {
name: "compile-svelte",
setup(build) {
build.onLoad({filter: /\.svelte$/}, async (args) => {
const source = await readFile(args.path, "utf8");
try {
const {js, warnings} = compile(source, {
filename: relative(process.cwd(), args.path),
css: "injected",
});
return {
contents: `${js.code}\n//# sourceMappingURL=${js.map.toUrl()}`,
warnings: warnings.map((warning) => toEsbuildMessage(warning, args.path, source)),
};
} catch (error) {
return {errors: [toEsbuildMessage(error, args.path, source)]};
}
});
},
};
}

const options = {
entryPoints: ["src/main.ts"],
bundle: true,
Expand All @@ -72,11 +116,9 @@ const options = {
},
logLevel: "info",
plugins: [
rejectSvelteRuneModules(),
...(isProduction ? [stripDevCommandBlocks()] : []),
esbuildSvelte({
compilerOptions: {css: "injected"},
preprocess: sveltePreprocess(),
}),
compileSvelte(),
],
};

Expand Down
Loading
Loading