feat: initial commit - Jhonny Editor

- Adicionado estrutura completa do projeto
- Configurado MCP server para Premiere Pro
- Adicionado documentação e skills
- Configurado Gitignore para o projeto
This commit is contained in:
João Henrique
2026-09-08 09:59:31 -04:00
commit b541f502ba
1507 changed files with 387650 additions and 0 deletions
@@ -0,0 +1,102 @@
import { readFile, writeFile } from "node:fs/promises";
import { resolve } from "node:path";
const repository = "docsforadobe/premiere-scripting-guide";
const commit = "4253cea094e84d43590b77012b33bd1c140f72ea";
const referencePath = resolve(process.env.EXTENDSCRIPT_REFERENCE_PATH ?? "src/resources/cep-reference-inventory.json");
const outputPath = resolve(process.env.EXTENDSCRIPT_INVENTORY_OUTPUT_PATH ?? "src/resources/extendscript-api-inventory.json");
const fixtureDirectory = process.env.EXTENDSCRIPT_INVENTORY_FIXTURE_DIRECTORY;
const check = process.argv.includes("--check");
async function markdown(path) {
if (fixtureDirectory) return readFile(resolve(fixtureDirectory, path), "utf8");
const response = await fetch(`https://raw.githubusercontent.com/${repository}/${commit}/${path}`, {
signal: AbortSignal.timeout(30_000),
});
if (!response.ok) throw new Error(`Guide request failed for ${path}: HTTP ${response.status}`);
return response.text();
}
function parsePage(path, source) {
const lines = source.replaceAll("\r\n", "\n").split("\n");
const title = lines.find((line) => line.startsWith("# "))?.slice(2).trim();
if (!title || !/ object$/i.test(title)) return [];
const objectName = title.replace(/ object$/i, "");
let section = null;
let sectionHasHeadings = false;
const symbols = [];
for (let index = 0; index < lines.length; index += 1) {
const line = lines[index];
if (line === "## Attributes") { section = "attribute"; sectionHasHeadings = false; }
else if (line === "## Methods") { section = "method"; sectionHasHeadings = false; }
else if (line.startsWith("## ")) section = null;
if (section && !sectionHasHeadings) {
const tableMember = line.match(/^\|\s*`([^`]+)`\s*\|/);
if (tableMember) {
const member = tableMember[1];
symbols.push({
object: objectName,
name: `${objectName}.${member}`,
kind: section,
signature: member,
sourcePath: path,
});
continue;
}
}
if (!section || !line.startsWith("### ")) continue;
sectionHasHeadings = true;
const name = line.slice(4).trim();
const signatureLine = lines.slice(index + 1).find((candidate) => candidate.trim() !== "");
const match = signatureLine?.match(/^`([^`]+)`$/);
if (!match) throw new Error(`Missing inline signature for ${path}:${name}`);
symbols.push({ object: objectName, name, kind: section, signature: match[1], sourcePath: path });
}
return symbols;
}
const reference = JSON.parse(await readFile(referencePath, "utf8"));
const guideEntries = reference.entries.filter((entry) => entry.repository === repository);
if (guideEntries.some((entry) => entry.commit !== commit || entry.scope !== "premiere-extendscript-guide")) {
throw new Error("Scripting guide reference entries do not match the pinned commit and scope");
}
const paths = reference.entries
.filter((entry) => entry.repository === repository
&& entry.commit === commit
&& entry.scope === "premiere-extendscript-guide"
&& entry.path.startsWith("docs/")
&& entry.path.endsWith(".md"))
.map((entry) => entry.path)
.sort();
if (paths.length === 0) throw new Error("Pinned CEP reference inventory contains no scripting guide Markdown files");
const symbols = [];
for (const path of paths) symbols.push(...parsePage(path, await markdown(path)));
symbols.sort((left, right) => `${left.object}:${left.kind}:${left.name}`.localeCompare(`${right.object}:${right.kind}:${right.name}`));
if (symbols.length === 0) throw new Error("No ExtendScript symbols were parsed from the guide");
const keys = symbols.map((symbol) => `${symbol.object}:${symbol.kind}:${symbol.name}`);
if (new Set(keys).size !== keys.length) throw new Error("ExtendScript inventory contains duplicate object members");
const objects = [...new Set(symbols.map((symbol) => symbol.object))].sort();
const inventory = {
schemaVersion: 1,
source: { repository, commit, authority: "community", authorityNote: "Community-maintained guide; not Adobe API authority." },
stats: {
total: symbols.length,
objects: objects.length,
attributes: symbols.filter((symbol) => symbol.kind === "attribute").length,
methods: symbols.filter((symbol) => symbol.kind === "method").length,
},
objects,
symbols,
};
const rendered = `${JSON.stringify(inventory, null, 2)}\n`;
if (check) {
let current = "";
try { current = await readFile(outputPath, "utf8"); } catch {}
if (current.replaceAll("\r\n", "\n") !== rendered) {
console.error("ExtendScript API inventory is stale. Run npm run extendscript:api-inventory.");
process.exitCode = 1;
} else console.log(`ExtendScript API inventory is current: ${symbols.length} symbols.`);
} else {
await writeFile(outputPath, rendered);
console.log(`Wrote ${symbols.length} ExtendScript symbols across ${objects.length} objects.`);
}