Copia del código fuente de OpenCut
(OpenCut-app/OpenCut) tomada en el
commit e668010, con los fallos que traía corregidos. Licencia MIT, la misma que
el original. No es un fork oficial ni está afiliada al proyecto.
| Commit | Contenido |
|---|---|
Import OpenCut at e668010 |
El árbol de upstream, sin tocar |
OpenCut, fixed |
Los 102 archivos de arreglos. Ver el diff completo |
docs: |
Este documento |
Dos causas apiladas, una detrás de la otra.
1. moon comparaba contra una rama master que no existe.
.moon/workspace.yml no definía vcs.defaultBranch, y moon asume master
cuando no se le dice otra cosa. La rama del proyecto es main, así que
moon ci moría al segundo, antes de ejecutar una sola tarea:
Loading changed files
Base revision: N/A
Affected by changes: all
Error: process::failed
Process git failed: exit code 128
fatal: ambiguous argument 'master': unknown revision or path not in the working tree.
El arreglo es una línea:
vcs:
defaultBranch: 'main'2. Las tareas deploy se ejecutaban en CI. Con lo anterior resuelto, el
pipeline por fin llegaba a las tareas y fallaba en las dos últimas:
web:deploy | ERROR In a non-interactive environment, it's necessary to set a
CLOUDFLARE_API_TOKEN environment variable for wrangler to work.
api:deploy | (lo mismo)
Tasks: 9 completed, 2 failed
Desplegar a Cloudflare no es una comprobación de CI. runInCI: false en ambas,
igual que ya hacían las tareas dev.
Y tres cosas más que impedían que el CI fuese útil:
desktop:checken el runner de Ubuntu necesita paquetes que no vienen instalados:build-essential,cmake,pkg-config,libvulkan-dev,libwayland-dev,libx11-xcb-dev,libxkbcommon-x11-dev,libfontconfig-dev.apps/desktop/README.mdlos lista como requisito del desarrollador; el workflow nunca los instalaba.desktop:checkcompila GPUI desde fuente: 30-60 minutos por sistema con caché frío. ConSwatinem/rust-cachebaja a ~1 min 15 s.paths-ignore: "*.md"solo cubría la raíz del repositorio; ahora es"**/*.md". Y se añadióworkflow_dispatch, porque conpaths-ignoreun push que solo cambia markdown no dispara nada y no había forma de pedir un run a mano.
Las acciones estaban referenciadas por tags mutables; ahora van pinneadas por
SHA. media-deps.yml declaraba contents: write para todo el workflow, cuando
solo el job que publica el release lo necesita.
Resultado: verde en las tres plataformas en unos cuatro minutos.
No había lockfile en ninguna parte, así que cada máquina y cada ejecución de CI
resolvían un árbol de dependencias distinto. Y varias dependencias estaban
pinneadas a la cadena literal "latest", que es un rango irresoluble por
definición. Ahora hay un bun.lock commiteado y una raíz de workspace, lo que
además hace que bunfig.toml se lea de verdad: Bun solo lee el bunfig.toml que
está junto al package.json para el que instala, y el guard de versiones llevaba
sin aplicarse desde siempre.
Ni lockfile, ni tsconfig en la API, ni forma de invocarlo. Tres errores reales
llevaban ahí sin que nadie los viera:
calendar.tsxpasaba unclassNamecon la clavetable, que react-day-picker eliminó en la v9. Ahora esmonth_grid. El estilo de la tabla llevaba desde entonces sin aplicarse en absoluto.spinner.tsxchocaba con su propio spread de props sobrestrokeWidth.scroll-area.tsximportaba React sin usarlo.
vitest y jsdom eran dependencias, con script de test, sin configuración y
sin un solo archivo de test. vite.config.ts importaba defineConfig de vite,
así que jsdom ni se activaba. Hay vitest.config.ts, un archivo de setup con el
matchMedia que jsdom no trae, y tres tests reales.
El bloque .dark de styles.css, los variants dark: de los componentes y la
dependencia next-themes existían, pero nunca se montó ningún
ThemeProvider, así que la clase no se aplicaba jamás. Añadido el provider,
un interruptor para llegar a él, y un test que comprueba que la clase aterriza en
el documento.
- Los dos tooltips de
chart.tsxusaban el índice del array comokey, tres líneas por debajo de lakeyestable que ya habían calculado. styles.csstenía un@applysin punto y coma. Error de sintaxis real.public/manifest.jsonseguía siendo el de la plantilla de TanStack: nombraba la app"Create TanStack App Sample"y apuntaba a dos iconos que no existen. Además no estaba enlazado desde el<head>.sidebar.tsxdeclaraba de más en dos arrays de dependencias de hooks.pagination.tsxponíarole="navigation"en un<nav>, que ya lo es.setup.ts(media) tenía cuatro!de non-null porque un booleano no estrecha el tipo. Modelado como fuente-o-prebuilt, el compilador lo arrastra solo. Y la búsqueda del directorio de fuentes ahora falla con un mensaje en lugar de unir una ruta llamadaundefined.
Los cuatro pines de ffmpeg.json apuntaban a un tag de BtbN que ya no existe y
a nombres de archivo que nunca existieron: los reales llevan un sufijo de
commit (ffmpeg-n8.1.3-18-g46d899d7a0-win64-lgpl-shared-8.1.zip). O sea que
moon run media:setup fallaba en todas las plataformas, no solo donde no hay
pin. Re-pinneados a un tag vigente, con los SHA-256 tomados del
checksums.sha256 publicado y verificados descargando un archivo y
hasheándolo.
ffmpeg.json no tiene entradas para macOS, y no es un olvido: BtbN no publica
builds de macOS (lo comprobé listando sus releases), así que la única fuente es
el workflow propio del repositorio. setup.ts lo explica ahora.
En Windows el prebuilt es la única vía posible: un build desde fuente requiere cross-compilar desde Linux con llvm-mingw, y el script se niega.
En un proyecto que distribuye fuentes con licencia OFL y binarios de FFmpeg con
LGPL. THIRD-PARTY-NOTICES.md se genera desde los lockfiles con
scripts/third-party-notices.ts, así que regenerarlo es un comando. Resultado
actual: 1321 dependencias, cero sin licencia declarada, y los candidatos a
copyleft son todos dev-only, de build-time o dual-licensed con opción permisiva.
Cuatro dependencias directas y 47 paquetes existían por un solo componente:
form.tsx era el único consumidor de radix-ui y react-hook-form, nada
importaba form.tsx, y @hookform/resolvers y zod no los importaba nadie.
También sobraba lucide-react, con cero usos (el sistema de iconos es
Hugeicons).
El repositorio documentaba Biome sin traer configuración, mientras .vscode
apuntaba a Prettier y a Biome a la vez. Ahora hay biome.jsonc, .editorconfig,
rustfmt.toml y .gitattributes — este último porque en Windows, con
core.autocrlf activo, git status reportaba todo el árbol como modificado.
Se añadieron las tareas que faltaban: typecheck en raíz, web y api,
desktop:fmt, y notices. Y las exenciones de accesibilidad quedaron acotadas a
apps/web/src/components/ui en lugar de globales, de modo que el resto del código
sigue teniendo esas reglas como errores.
Esto no es un editor de vídeo, y no lo era antes de estos arreglos: es la reescritura en curso. Arrancarlo da esto y nada más:
| Dónde | Qué hay |
|---|---|
La web, en / |
«OpenCut» y «The rewrite is under construction» |
La web, en /editor |
«Editor» y «Coming soon» |
| La app de escritorio | Una ventana con cuatro recuadros: Browser, Preview, Inspector, Timeline |
| La API | Tres direcciones: /, /health y /echo |
No se puede importar un vídeo, cortarlo ni exportarlo. La versión funcional del editor es la anterior, https://opencut.app, y es la que el proyecto recomienda mientras esta reescritura avanza.
proto use # instala moon, bun y Rust en las versiones de .prototools
bun install # 620 paquetes, ~600 MB
moon run web:dev # localhost:5173| Comando | Qué hace |
|---|---|
moon run web:dev |
La web, en localhost:5173 |
moon run api:dev |
La API, en localhost:8787 |
moon run desktop:dev |
La app de escritorio (necesita Rust y las MSVC Build Tools) |
moon run lint / format |
Biome, comprobar / aplicar |
moon run typecheck |
tsc de los scripts y del crate de media |
moon run web:test |
Vitest |
moon run media:setup |
Descarga FFmpeg y verifica su SHA-256 |
moon run notices |
Regenera THIRD-PARTY-NOTICES.md |
En Windows, el detalle completo —incluido lo que hace falta para compilar el
escritorio, que son las MSVC Build Tools— está en SETUP-WINDOWS.md.
| Síntoma | Causa |
|---|---|
linker 'link.exe' not found |
Faltan las MSVC Build Tools |
git status marca todos los archivos |
core.autocrlf está activado |
No default project has been configured |
Usa el target con scope: moon run web:test |
moon run lint se queja del formato |
moon run format |
download failed: 404 en media:setup |
Un pin de FFmpeg caducó; el error lo dice |
error: ambiguous argument 'master' |
Falta vcs.defaultBranch (ya está) |
| Archivo | Qué es |
|---|---|
SETUP-WINDOWS.md |
Instalación en Windows, en detalle |
THIRD-PARTY-NOTICES.md |
Todas las dependencias y sus licencias, generado |
README.upstream.md |
El README original de OpenCut, sin tocar |
LICENSE |
Licencia MIT |
changelog/ |
Notas de versión de OpenCut |
- El pin de macOS en FFmpeg. No tiene arreglo de terceros: nadie publica
builds compartidos LGPL para Mac. Se cierra ejecutando
media-deps.ymluna vez y luegobun run crates/media/setup/pin.ts <tag>, que rellena las seis plataformas. - Los 13 warnings de lint restantes son inherentes a los primitivos vendored
de shadcn (roles no semánticos,
keypor índice en listas de longitud fija). Están acotados y documentados enbiome.jsonc. - La app de escritorio no tiene funciones. Es un esqueleto, y ningún arreglo de los de arriba cambia eso.