ffmpeg-skill 2.8.1 → 2.8.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -480,10 +480,15 @@ FFmpeg itself:
480
480
 
481
481
  | OS | Command |
482
482
  |----|---------|
483
- | macOS | `brew install ffmpeg-full` (the plain `ffmpeg` formula lacks the subtitles, drawtext and zscale filters) |
483
+ | macOS | `brew install ffmpeg-full`, then put it on `PATH` (below). The plain `ffmpeg` formula lacks the subtitles, drawtext and zscale filters |
484
484
  | Ubuntu / Debian | `sudo apt install ffmpeg` |
485
485
  | Windows | `winget install Gyan.FFmpeg` |
486
486
 
487
+ **On macOS, `ffmpeg-full` is keg-only:** Homebrew installs it without linking it, so after `brew install ffmpeg-full` the `ffmpeg` on `PATH` is still the lean `ffmpeg` formula (often present as a dependency of another formula), or no `ffmpeg` at all, so `doctor` keeps reporting `ffmpeg`, or the `subtitles` and `drawtext` filters, as missing. Make it the one the tools find, in one of two ways:
488
+
489
+ - **Put it first on `PATH`.** Add `export PATH="$(brew --prefix ffmpeg-full)/bin:$PATH"` to your shell profile. `brew --prefix ffmpeg-full` is the stable `opt/` path, so this survives upgrades, but it only reaches processes started from a shell that read the profile.
490
+ - **Link it over the lean formula:** `brew unlink ffmpeg 2>/dev/null; brew link --overwrite --force ffmpeg-full`. Every process finds this one, but `brew doctor` warns about a linked keg-only formula, and an upgrade of the lean `ffmpeg` has been seen to link the lean build back on top without a message. After upgrading, check that `command -v ffmpeg` still resolves into `ffmpeg-full`, and re-run the link if it doesn't.
491
+
487
492
  ## Requirements
488
493
 
489
494
  - FFmpeg 5.0+. Always required: `libx264`, `aac`, and the `drawtext`, `subtitles` (libass), `loudnorm`, `xfade`, `acrossfade`, `scdet`, `silencedetect` and `tile` filters. Needed only by the flags that use them: `libx265`, `prores_ks`, `libzimg` / `zscale`, `libmp3lame`, `libopus`, `libvorbis`, the `ass` filter. `doctor` tells you which are present. The apt and gyan.dev builds carry all of them; some Homebrew bottles lack `libass` / `libfreetype` / `libzimg`, which `doctor` reports as missing.
package/bin/install.js CHANGED
@@ -94,7 +94,9 @@ function checkFfmpeg() {
94
94
  const r = spawnSync('ffmpeg', ['-version'], { encoding: 'utf8' });
95
95
  if (r.error || r.status !== 0) {
96
96
  console.warn('\n warning: ffmpeg was not found on PATH. The skill needs FFmpeg to run:');
97
- console.warn(' macOS: brew install ffmpeg-full (the plain ffmpeg formula lacks subtitles/drawtext/zscale)');
97
+ console.warn(' macOS: brew install ffmpeg-full; export PATH="$(brew --prefix ffmpeg-full)/bin:$PATH"');
98
+ console.warn(' # keg-only, so installing it does not put it on PATH: keep the export in your shell profile;');
99
+ console.warn(' # the plain ffmpeg formula lacks subtitles/drawtext/zscale');
98
100
  console.warn(' Ubuntu: sudo apt install ffmpeg');
99
101
  console.warn(' Windows: winget install Gyan.FFmpeg\n');
100
102
  return false;
package/docs/contract.md CHANGED
@@ -21,7 +21,7 @@ The contract is derived from the code that runs, not maintained beside it:
21
21
  | Field | Meaning | Changes when |
22
22
  |---|---|---|
23
23
  | `contract_version` | shape of this document (`1.0`) | a key is renamed, removed or changes meaning |
24
- | `skill.version` | the npm / package.json version (`2.8.1`) | any release |
24
+ | `skill.version` | the npm / package.json version (`2.8.2`) | any release |
25
25
 
26
26
  A release that adds a tool or a flag keeps `contract_version`; a breaking change to the
27
27
  ToolSpec shape bumps it. Consumers pin on `contract_version` and read `skill.version`
@@ -119,7 +119,7 @@ JSON would have been rewritten for that. The flat keys, typed per tool in `outpu
119
119
  "contract_version": "1.0",
120
120
  "deprecated": [],
121
121
  "removed": [{"what": "...", "since": "1.10.0", "replacement": "...", "removed_in": "2.0.0", "where": "cli | json | mcp | behaviour"}],
122
- "skill": {"id": "ffmpeg-skill", "version": "2.8.1", "execution_mode": "local", "kind": "execution",
122
+ "skill": {"id": "ffmpeg-skill", "version": "2.8.2", "execution_mode": "local", "kind": "execution",
123
123
  "entrypoints": {"cli": "...", "mcp": "...", "contract": "...", "doctor": "..."},
124
124
  "not_provided": ["AI reasoning", "decisions", "production plans", "project IR", "approvals", "network access", "transcription engine"]},
125
125
  "requirements": {"python": ">=3.9 (standard library only)", "ffmpeg": ">=5.0", "ffprobe": ">=5.0"},
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ffmpeg-skill",
3
- "version": "2.8.1",
3
+ "version": "2.8.2",
4
4
  "description": "Agent Skill that gives coding agents (Claude Code, Cursor, Codex) a local video editor: 42 FFmpeg tools with a machine-readable contract, contract-derived MCP server, FFmpeg capability detection, probe-first / verify-last workflow. Cut, join, silence removal, fit, captions and karaoke, overlays, motion graphics, HDR to SDR, LUTs, audio clean-up and typed dynamics, sync with drift correction, multicam, loudness, delivery checks, project rendering, batch. No API keys, no cloud, no dependencies.",
5
5
  "keywords": [
6
6
  "ffmpeg",
@@ -18,7 +18,9 @@ from typing import Any, Dict, List, Optional, Sequence, Tuple
18
18
 
19
19
 
20
20
  INSTALL_HINTS = {
21
- "Darwin": " brew install ffmpeg-full (the plain ffmpeg formula lacks subtitles/drawtext/zscale)",
21
+ "Darwin": (" brew install ffmpeg-full; export PATH=\"$(brew --prefix ffmpeg-full)/bin:$PATH\""
22
+ " # keg-only, so installing it does not put it on PATH: keep the export in your shell profile;"
23
+ " the plain ffmpeg formula lacks subtitles/drawtext/zscale"),
22
24
  "Linux": (
23
25
  " Debian/Ubuntu: sudo apt install ffmpeg\n"
24
26
  " Fedora: sudo dnf install ffmpeg\n"
@@ -1011,10 +1011,15 @@ def _capability_fix_hint(cap: str) -> str:
1011
1011
  if cap in ("ffmpeg", "ffprobe"):
1012
1012
  from _common import INSTALL_HINTS
1013
1013
  hint = INSTALL_HINTS.get(platform.system(), "see https://ffmpeg.org/download.html").strip().splitlines()[0].strip()
1014
- return f"install ffmpeg: {hint}"
1014
+ # a hint's "# why" is a shell comment so the printed line pastes; joined into a fix string
1015
+ # with "; " it would swallow what follows, so show it in parentheses here instead
1016
+ cmd, _, why = hint.partition("#")
1017
+ return f"install ffmpeg: {cmd.strip()} ({why.strip()})" if why else f"install ffmpeg: {hint}"
1015
1018
  system = platform.system()
1016
1019
  if system == "Darwin":
1017
- full_hint = "on macOS, brew install ffmpeg-full (the plain formula lacks subtitles/drawtext/zscale)"
1020
+ full_hint = ("on macOS, brew install ffmpeg-full; export PATH=\"$(brew --prefix ffmpeg-full)/bin:$PATH\" "
1021
+ "(ffmpeg-full is keg-only, so installing it does not replace the ffmpeg already found: keep the "
1022
+ "export in your shell profile; the plain formula lacks subtitles/drawtext/zscale)")
1018
1023
  elif system == "Windows":
1019
1024
  full_hint = "on Windows, winget install Gyan.FFmpeg (the gyan.dev full build carries subtitles/drawtext/zscale; a plain choco ffmpeg package can lack them)"
1020
1025
  else: