Files
excalidraw-mcp-sentinel/skills/excalidraw-mcp/scripts/export-elements.cjs
T
d73fa53cde Feat/excalidraw skill (#38)
* feat(skill): add excalidraw-mcp skill with export/import helpers

* fix(skill): correct url trailing-slash normalization in scripts

* feat(skill): add create/update/delete helpers and document CRUD test

* docs: restructure README and document skill usage

* docs: make README skill guidance tool-agnostic and SEO-friendly

* docs: add Claude Code skill installation instructions

* feat: Introduce skill creation tools and an agent-browser skill with templates and reference documentation.

* fix(frontend): keep server element ids for WS updates

Ensure WS delete/update events match scene element IDs by disabling ID regeneration when converting server payloads.

* feat: Add Zod library and OpenCode AI SDK dependencies, and introduce new Excalidraw skill scripts for element deletion and health checks.

* chore: Install project dependencies including Zod and OpenCode AI SDK, and add an Excalidraw reference cheatsheet.

---------

Co-authored-by: YC Lin <yclin@YCdeMacBook-Air.local>
2026-01-26 00:17:18 +08:00

54 lines
1.4 KiB
JavaScript

#!/usr/bin/env node
/* eslint-disable no-console */
const fs = require("node:fs");
const path = require("node:path");
const DEFAULT_URL = process.env.EXPRESS_SERVER_URL || "http://localhost:3000";
function parseArgs(argv) {
const out = { url: DEFAULT_URL, outFile: null };
for (let i = 0; i < argv.length; i++) {
const a = argv[i];
if (a === "--url") out.url = argv[++i];
else if (a === "--out") out.outFile = argv[++i];
else if (a === "-o") out.outFile = argv[++i];
}
return out;
}
async function main() {
if (typeof fetch !== "function") {
throw new Error("This script requires Node 18+ (global fetch).");
}
const { url, outFile } = parseArgs(process.argv.slice(2));
const res = await fetch(`${url.replace(/\/$/, "")}/api/elements`);
const json = await res.json();
if (!res.ok || !json || json.success !== true) {
throw new Error(`Failed to export elements: ${res.status} ${res.statusText}`);
}
const payload = {
exportedAt: new Date().toISOString(),
expressServerUrl: url,
elements: json.elements || [],
};
const text = JSON.stringify(payload, null, 2);
if (!outFile) {
process.stdout.write(text + "\n");
return;
}
fs.mkdirSync(path.dirname(outFile), { recursive: true });
fs.writeFileSync(outFile, text + "\n");
console.log(`Wrote ${payload.elements.length} elements to ${outFile}`);
}
main().catch((err) => {
console.error(err?.stack || String(err));
process.exit(1);
});