ffmpeg-skill 2.3.0 → 2.3.1
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/docs/contract.md +4 -3
- package/package.json +1 -1
- package/references/scripts.md +2 -1
- package/scripts/render.py +6 -3
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.3.
|
|
24
|
+
| `skill.version` | the npm / package.json version (`2.3.1`) | 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.3.
|
|
122
|
+
"skill": {"id": "ffmpeg-skill", "version": "2.3.1", "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"},
|
|
@@ -225,7 +225,8 @@ subtitle/LUT/font files a filter reads. Tools that print their document without
|
|
|
225
225
|
(`probe`, the analysis tools) still write the plan at exit; `verify.py` and `render.py`
|
|
226
226
|
refuse `--plan` (their steps run for real; a project file is already a plan). `render.py FILE` executes a plan:
|
|
227
227
|
it refuses (`kind: input`) when an input's size or head/tail hash differs from the plan,
|
|
228
|
-
runs the tool with the planned `argv`, then the verify steps
|
|
228
|
+
runs the tool with the planned `argv`, then the verify steps (a `check` step may also carry
|
|
229
|
+
`"content": true`, added by hand, for `check.py --content`), and reports `plan`, `tool`,
|
|
229
230
|
`tool_result` and `check`. `plan_version` is bumped when the document's shape changes.
|
|
230
231
|
|
|
231
232
|
### Repeatability
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ffmpeg-skill",
|
|
3
|
-
"version": "2.3.
|
|
3
|
+
"version": "2.3.1",
|
|
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",
|
package/references/scripts.md
CHANGED
|
@@ -631,7 +631,8 @@ A plan is a single tool's dry run as an artifact: `cut.py in.mp4 --start 2 --end
|
|
|
631
631
|
head+tail), commands, output, verify}` and runs nothing. `render.py cut.json`
|
|
632
632
|
re-fingerprints the inputs (refusing, `kind: input`, if any changed since the
|
|
633
633
|
plan), runs the tool with the planned argv, then the verify steps (probe; `check`
|
|
634
|
-
for a `--platform` or a platform export preset
|
|
634
|
+
for a `--platform` or a platform export preset; add `"content": true` to a check
|
|
635
|
+
step for the black/frozen/silence rows), and reports `plan`, `tool`,
|
|
635
636
|
`tool_result` and `check`. Show the plan to the user, get the yes, execute:
|
|
636
637
|
one round trip instead of re-deriving the command.
|
|
637
638
|
`"export": {"preset": "reels", "normalize": true}` forwards `export.py --normalize`
|
package/scripts/render.py
CHANGED
|
@@ -729,8 +729,11 @@ def execute_plan(plan: Dict[str, Any], path: str) -> int:
|
|
|
729
729
|
check_result = None
|
|
730
730
|
exit_code = 0
|
|
731
731
|
for step in plan.get("verify") or []:
|
|
732
|
-
|
|
733
|
-
|
|
732
|
+
# a check step names a platform, asks for check.py --content's black/frozen/silence rows
|
|
733
|
+
# ("content": true), or both -- the same keys a project's "check" stage takes
|
|
734
|
+
if step.get("tool") == "check" and (step.get("platform") or step.get("content") is True) and output:
|
|
735
|
+
cp = run_tool([str(HERE / "check.py"), output] + (["--platform", str(step["platform"])] if step.get("platform") else [])
|
|
736
|
+
+ (["--content"] if step.get("content") is True else []) + ["--json"] + child_args())
|
|
734
737
|
try:
|
|
735
738
|
check_result = json.loads(cp.stdout)
|
|
736
739
|
except ValueError:
|
|
@@ -742,7 +745,7 @@ def execute_plan(plan: Dict[str, Any], path: str) -> int:
|
|
|
742
745
|
# same command run by hand)
|
|
743
746
|
if exit_code:
|
|
744
747
|
failed_rows = [r["check"] for r in (check_result or {}).get("checks", []) if r.get("status") == "FAIL"]
|
|
745
|
-
info(f"plan done: {output}, but the {check_result.get('platform')} check failed" + (f": {', '.join(failed_rows)}" if failed_rows else ""))
|
|
748
|
+
info(f"plan done: {output}, but the {check_result.get('platform') or 'content'} check failed" + (f": {', '.join(failed_rows)}" if failed_rows else ""))
|
|
746
749
|
else:
|
|
747
750
|
info(f"plan done: {output}")
|
|
748
751
|
emit(output, plan=path, tool=tool, stages=[tool] + (["check"] if check_result else []), check=check_result, tool_result=doc,
|