From apple-notes-pack
Sets up hot-reload workflow for JXA scripts automating Apple Notes on macOS, with chokidar file watching, osascript runner, and test helpers for note CRUD.
npx claudepluginhub jeremylongshore/claude-code-plugins-plus-skills --plugin apple-notes-packThis skill is limited to using the following tools:
Iterative development workflow for Apple Notes JXA scripts with file watching and test helpers.
Sets up macOS permissions for Apple Notes automation with AppleScript, JXA, osascript, and Shortcuts. Includes access tests, CLI wrapper script, and Shortcuts verification.
Authors JXA (JavaScript for Automation) scripts for macOS app automation using Application() calls. Covers ES5 syntax constraints, run() function structure, for-loops, properties(), and .whose() filtering.
Manages Apple Notes on macOS via memo CLI: create, view, edit, delete, search, move notes between folders, and export to HTML/Markdown. Useful for terminal-based note operations.
Share bugs, ideas, or general feedback.
Iterative development workflow for Apple Notes JXA scripts with file watching and test helpers.
mkdir apple-notes-automation && cd apple-notes-automation
npm init -y
npm install -D chokidar tsx typescript
// src/dev/watch-runner.ts
import { watch } from "chokidar";
import { execSync } from "child_process";
watch("scripts/*.js", { ignoreInitial: true }).on("change", (path) => {
console.log(`Changed: ${path} — running...`);
try {
const output = execSync(`osascript -l JavaScript "${path}"`, { encoding: "utf8" });
console.log(output);
} catch (err: any) {
console.error(err.stderr);
}
});
console.log("Watching scripts/*.js for changes...");
// src/dev/test-notes.ts
import { execSync } from "child_process";
function runJxa(script: string): string {
return execSync(`osascript -l JavaScript -e '${script}'`, { encoding: "utf8" }).trim();
}
function getNoteCount(): number {
return parseInt(runJxa("Application(\"Notes\").defaultAccount.notes.length"));
}
function createTestNote(title: string): string {
return runJxa(`
const Notes = Application("Notes");
const note = Notes.Note({name: "${title}", body: "<p>Test</p>"});
Notes.defaultAccount.folders[0].notes.push(note);
note.id();
`);
}
export { runJxa, getNoteCount, createTestNote };
{
"scripts": {
"dev": "tsx src/dev/watch-runner.ts",
"test:notes": "tsx src/dev/test-notes.ts"
}
}