Add HyperFrames skills (from heygen-com/hyperframes, Apache-2.0)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FXVsD1DgdzZLiPuwtKzMSY
This commit is contained in:
Claude committed 2026-10-21 23:18:32 +00:00
1 parent 3e3f41ee5f
commit daac216bb9
300 files changed
+49175

No files matched your search

@@ -0,0 +1,46 @@
import { strict as assert } from "node:assert";
import { test } from "node:test";
import { mkdtempSync, readFileSync, readdirSync, rmSync, symlinkSync } from "node:fs";
import { spawnSync } from "node:child_process";
import { dirname, join, relative, resolve } from "node:path";
import { tmpdir } from "node:os";
import { fileURLToPath } from "node:url";
const SKILLS = resolve(dirname(fileURLToPath(import.meta.url)), "../../..");
const CLI_MEDIA_USE = resolve(SKILLS, "../packages/cli/src/media-use");
// Agents install skills by symlinking the skills dir, so each script must still run its CLI.
test("skill CLIs run when invoked through a symlinked skills dir", () => {
const dir = mkdtempSync(join(tmpdir(), "skills-link-"));
try {
symlinkSync(SKILLS, join(dir, "skills"), "dir");
for (const script of ["media-use/audio/scripts/heygen-voice.mjs"]) {
const run = spawnSync(process.execPath, [join(dir, "skills", script), "not-a-command"], {
encoding: "utf8",
});
assert.notEqual(run.status, 0, `${script} exited ${run.status} without running its CLI`);
assert.match(run.stderr, /usage/, script);
}
} finally {
rmSync(dir, { recursive: true, force: true });
}
});
function skillScripts(dir) {
return readdirSync(dir, { withFileTypes: true }).flatMap((entry) => {
const path = join(dir, entry.name);
if (entry.isDirectory()) return entry.name === "node_modules" ? [] : skillScripts(path);
return /\.(mjs|js)$/.test(entry.name) && !/\.test\.mjs$/.test(entry.name) ? [path] : [];
});
}
test("skill scripts detect their CLI entry through lib/main-module.mjs only", () => {
const handRolled = [...skillScripts(SKILLS), ...skillScripts(CLI_MEDIA_USE)].filter(
(path) =>
!path.endsWith("main-module.mjs") && readFileSync(path, "utf8").includes("process.argv[1]"),
);
assert.deepEqual(
handRolled.map((path) => relative(SKILLS, path)),
[],
);
});