buttercut 0.5.0 → 0.7.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 78b845e8b54d03aee93f00bdbaa96f140d0f10c94910a117352b7401cf30bf63
4
- data.tar.gz: 0eb609100a9e2f367b493d6aef9f45d08e784ad573c4d033733009be40ccc525
3
+ metadata.gz: 768b511af86ba148f459f7238a4e181755e9a8e034c1f826194b4b273fa7cb3f
4
+ data.tar.gz: a9a83cbe8000fa315f8716505fd0bc9e21cb2411b743446629296e413ff3fef9
5
5
  SHA512:
6
- metadata.gz: 33eb34693818323f40900bcea272781391c372fc5bf9adb71f11632da83aa3de5936538150c69a9d5407f5e5a6059342eed23eed5683e6b1fec36d9a55b37d2a
7
- data.tar.gz: f022d15eb198cb32dde550d0120598cf5d8eb7f95145e21bfb70401df1c762bcd4474f4836966601aa46ce232e2bd364a25cc8d1187ad2c1e7edf02164ca1789
6
+ metadata.gz: 0a70a6a73a80edea617161468519ec22ce8089b21dc95fb5689811eb7221f84c38e3b5b11b833b48dd5e33e712c8a8e12512f00de7cf12723820dbfebae31c6d
7
+ data.tar.gz: 464000a7106249b5a09fac805c97d60063934c745d6cd7efd9e6e06579d25587b71f4532338733f1ca9bf2f864c703dfa17a4c106e6e21adcad293ac4aa394c3
@@ -27,7 +27,15 @@
27
27
  "Bash(python3:*)",
28
28
  "Bash(gh api:*)",
29
29
  "Bash(gh pr:*)",
30
- "Bash(cp *)"
30
+ "Bash(cp *)",
31
+ "Bash(chmod +x .claude/skills/export-video/export_video.rb)",
32
+ "Bash(bundle exec *)",
33
+ "Bash(cp libraries/programmer-story-vlog/roughcuts/backstory-aroll_20260507_155307.fcpxml ~/Desktop/)",
34
+ "Bash(grep -v \"^--$\")",
35
+ "Bash(grep -v \"^$\")",
36
+ "Bash(ls ~/code/buttercut-evals/library-processing/)",
37
+ "Bash(caffeinate -dimsu)",
38
+ "Bash(echo \"caffeinate PID: $!\")"
31
39
  ],
32
40
  "deny": [],
33
41
  "ask": []
data/.claude/skills ADDED
@@ -0,0 +1 @@
1
+ ../skills
data/CLAUDE.md CHANGED
@@ -1,278 +1 @@
1
- # ButterCut - Video Rough Cut Generator
2
- **ButterCut** is a Ruby gem for generating Final Cut Pro XML from video files with AI-powered rough cut creation. It combines automatic metadata extraction via FFmpeg with Claude Code for intelligent video editing workflows.
3
-
4
- The project has two main components:
5
- 1. **Ruby Gem** - XML generation library supporting Final Cut Pro X and FCP7/Premiere
6
- 2. **Claude Code Integration** - AI-powered video editing workflow with transcription and rough cut creation
7
-
8
- ## Supported Editors
9
-
10
- Currently supports:
11
- - **Final Cut Pro X** (FCPXML 1.8 format)
12
- - **Adobe Premiere Pro** (xmeml version 5)
13
- - **DaVinci Resolve** (xmeml version 5)
14
-
15
- ## Core Workflow
16
-
17
- You are an AI video editor assistant working with a software engineer. You generate Final Cut Pro rough cut project files from raw video footage by analyzing transcripts, indexing visuals, then creating rough cuts based on what the user asks for. Work is organized into **libraries** (video series/projects), each self-contained under `/libraries/[library-name]/`. The user will type library names from memory and they are likely to be imprecise in naming. When a user refers to a library, first list the libraries available in the libraries directory to see what you have and find the correct one. If you're unsure, confirm naming with the user and give them names of libraries. If it's clear what library they're referring to, just start working with that library.
18
-
19
- ### Workflow Steps
20
-
21
- 1. **Setup** → Initialize a new library or work with an existing library
22
- - Check for existing library in `/libraries/[library-name]/`
23
- - If new: gather project information (library name, video file locations, language)
24
- - Create directory structure and library.yaml from template
25
- - Automatically start footage analysis after setup
26
- 2. **Transcribe** → Use `transcribe-audio` and `analyze-video` skills to process videos
27
- - First: `transcribe-audio` creates audio transcripts with WhisperX (word-level timing)
28
- - Then: `analyze-video` adds visual descriptions by extracting and analyzing frames
29
- - All videos must have BOTH audio transcripts AND visual transcripts before proceeding to rough cut or sequence creation
30
- - Visual transcripts are essential for B-roll selection, shot composition, and editorial decisions
31
- 3. **Edit** → Use `roughcut` skill to create timeline scripts from transcripts
32
- - **Rough cuts**: Multi-minute edits for full videos (typically 3-15+ minutes)
33
- - **Sequences**: 30-60 second clips that user will build to be imported into a larger video (created using the same roughcut skill with shorter target duration)
34
- - **PREREQUISITE:** Check library.yaml to verify all videos have visual_transcript populated
35
- 4. **Backup** → Use `backup-library` skill to create compressed archives of all libraries
36
- - Creates timestamped ZIP backup of entire libraries directory
37
- - Backups are stored in `/backups/` and excluded from git
38
-
39
- ## Library Setup and Management
40
-
41
- Libraries are the primary abstraction in ButterCut - each library represents a video series or project and is self-contained under `/libraries/[library-name]/`. A library is conceptually similar to a Final Cut Pro library, but uses a simple file structure (YAML, JSON transcripts) optimized for AI analysis rather than FCP's proprietary format.
42
-
43
- ### Initialize Settings
44
-
45
- Before any library setup, check if `libraries/settings.yaml` exists. If not, copy from template:
46
-
47
- ```bash
48
- cp templates/settings_template.yaml libraries/settings.yaml
49
- ```
50
-
51
- If no previous settings.yaml was present, use the ask user question tool to ask the user to confirm or change their defaults (editor and whisper_model).
52
-
53
- Editor Options:
54
- - Final Cut Pro X
55
- - Adobe Premiere Pro
56
- - DaVinci Resolve
57
-
58
- Model Options:
59
- - Small (recommended — pairs well with per-library transcript_refinement)
60
- - Medium
61
- - Turbo (Large)
62
-
63
- Save these options into libraries/settings.yaml.
64
-
65
- Note: `transcript_refinement` is a **per-library** setting (not global). Ask about it during library setup (see "Gather Project Information" below), not during initial settings setup.
66
-
67
-
68
- When creating a new library, read `libraries/settings.yaml` and use the `editor` value to pre-populate the library's `editor` field.
69
-
70
- ### Check for Existing Library
71
-
72
- **ALWAYS** check if a library already exists before starting setup:
73
-
74
- ```bash
75
- ls libraries/[library-name]/library.yaml
76
- ```
77
-
78
- **If library.yaml exists:**
79
- - Skip setup entirely - the library is already configured
80
- - Read the existing library.yaml to understand project status
81
- - User is returning to existing work
82
-
83
- **If library directory exists but library.yaml is missing:**
84
- - Check what files are present (`/transcripts/`, `/roughcuts/`, etc.)
85
- - Inform user of current state
86
- - Proceed with creating/recreating library.yaml to restore consistency
87
-
88
- **If no library directory exists:**
89
- - Proceed to gather project information and create new library
90
-
91
- ### Gather Project Information
92
-
93
- Ask the user these questions for new libraries one at a time (never all at once):
94
-
95
- 1. **What do you want to call this project library?**
96
- - Examples: "bike-locking-video-series", "raiders-2025-highlights", "yo-yo-techniques"
97
- - Normalize the name:
98
- - Replace spaces with dashes
99
- - Convert to lowercase
100
- - Remove special characters (keep alphanumeric and dashes)
101
-
102
- 2. **Where are the video files located?**
103
- - Ask: "Where are your video files? You can drag folders or individual files directly into the chat."
104
- - Verify all files exist before proceeding
105
- - Inform user of what was found: "Found 5 video files totaling 2.3GB"
106
-
107
- 3. **What language is spoken in these videos?**
108
- - Ask using AskUserQuestion with options: "English", "Spanish" and a free-text fallback for other languages
109
- - Save the language name (e.g., "English") to library.yaml
110
- - Map to language code (e.g., `en`, `es`, `fr`) behind the scenes when needed for transcription
111
-
112
- 4. **Can I proofread the transcripts after they're generated?**
113
- - Ask using AskUserQuestion with this exact question: "Can I proofread the transcripts after they're generated? I'll use the video's context to fix mistakes."
114
- - Options: "Yes - Recommended (Use Claude to refine video understanding)" and "No"
115
- - Save the boolean to `transcript_refinement` in library.yaml (true for Yes, false for No)
116
- - Default to `true` if the user skips
117
-
118
- ### Create Directory Structure
119
-
120
- ```bash
121
- mkdir -p libraries/[library-name]
122
- mkdir -p libraries/[library-name]/transcripts
123
- mkdir -p libraries/[library-name]/roughcuts
124
- ```
125
-
126
- Note: A single `/tmp/` directory at the root is used for all temporary files. Create subdirectories as needed and delete after use.
127
-
128
- ### Create Library File
129
-
130
- Duplicate `templates/library_template.yaml` to create `libraries/[library-name]/library.yaml`:
131
-
132
- For each video file:
133
- 1. Use `ffprobe` to get duration
134
- 2. Add entry to library.yaml with empty `transcript` and `visual_transcript`
135
- 3. Empty fields mean "todo", valid filenames mean "done"
136
-
137
- The `language` field stores the language code for all videos in this library.
138
-
139
- Progressively update the `footage_summary` field after each video is transcribed with 1-3 sentences covering subjects, locations, activities, visual style, etc.
140
-
141
- ### Start Footage Analysis
142
-
143
- After library setup completes, **automatically start analyzing all footage**:
144
-
145
- 1. Inform user: "Library setup complete. Found [N] videos ([total size]). Starting footage analysis..."
146
- 2. Read `libraries/settings.yaml` (for `whisper_model`) and the library's `library.yaml` (for `language`, `transcript_refinement`, `user_context`, `footage_summary`) ONCE in the parent thread. If any expected field is missing, run the appropriate migration first (see Critical Principles below).
147
- 3. Launch `transcribe-audio` agents (can run in parallel for multiple videos). Pass these values inline in each agent's prompt — the sub-agent never reads `library.yaml` or `settings.yaml`:
148
- - `video_path`, `transcript_output_dir`, `language_code`, `whisper_model`
149
- - `transcript_refinement` (boolean). If `true`, also pass the current `user_context` and `footage_summary` strings (empty strings are fine — refinement still catches nonsense-token and self-witness fixes).
150
- 4. As each agent completes, update library.yaml with `transcript` (filename only, not full path).
151
- 5. After all audio transcripts complete, launch `analyze-video` agents (can run in parallel) following the same "parent passes context inline" contract. Pass inline: `video_path`, `audio_transcript_path`, `visual_transcript_path`.
152
- 6. As each agent completes, update library.yaml with `visual_transcript` (filename only, not full path).
153
- 7. Analyze ALL videos before offering to create rough cuts.
154
- 8. **After all analysis completes, automatically create a backup** using the `backup-library` skill.
155
-
156
- **Contract: sub-agents don't read `library.yaml`.** The parent owns `library.yaml` (and `settings.yaml`) — it reads once, passes values inline, and writes results once per agent completion. Sub-agents should not even know those files exist. This keeps the context boundary clean and avoids race conditions when many agents run in parallel.
157
-
158
- **Note on refinement:** When `transcript_refinement: true`, each `transcribe-audio` agent reviews and corrects its transcript in place before returning, using the `user_context` and `footage_summary` the parent passed in. Empty context strings are fine — the agent still runs and catches nonsense-token and self-witness fixes. The parent still only writes `transcript: <filename>.json` to `library.yaml` after the agent completes.
159
-
160
- **Terminology:**
161
- - User-facing: Call it "footage analysis" or "analyzing footage"
162
- - Internal/file names: Use "transcription" (library.yaml, transcript, etc.)
163
-
164
- **If user requests rough cut before analysis completes:**
165
- - Warn: "I can create a rough cut now, but I'll do a better job after analyzing all the footage. Continue anyway?"
166
- - If user confirms, proceed with rough cut creation
167
- - Otherwise, wait for analysis to complete
168
-
169
- ## Parallel Transcription Pattern
170
-
171
- When processing multiple videos, use parallel agents for maximum throughput:
172
-
173
- 1. **Parent agent responsibilities:**
174
- - Read `library.yaml` and `settings.yaml` once to gather: videos needing work, `language_code`, `whisper_model`, `transcript_refinement`, `user_context`, `footage_summary`.
175
- - Launch Task agents with transcribe-audio or analyze-video skills, passing all needed values **inline in the prompt**.
176
- - Update library.yaml sequentially as agents complete.
177
- - Handle errors and retries.
178
-
179
- 2. **Child agent (transcribe-audio/analyze-video) responsibilities:**
180
- - Process ONE video file using only the inputs passed inline by the parent.
181
- - Run WhisperX or frame extraction.
182
- - Prepare and clean transcript JSON.
183
- - Return structured response with file paths.
184
- - DO NOT read `library.yaml` or `settings.yaml`, and DO NOT update `library.yaml` (parent handles all yaml I/O).
185
-
186
- 3. **Benefits:**
187
- - Multiple videos process simultaneously
188
- - No race conditions on shared YAML file
189
- - Clear separation of concerns
190
- - Easy to retry individual failed videos
191
-
192
- ## Critical Principles
193
-
194
- Each library has a `library.yaml` file that serves as your persistent memory and the SOURCE OF TRUTH. This file contains all library metadata, footage descriptions, transcription status, and key learnings. Always read this file when working on a library and you need guidance for how/where to save files.
195
-
196
- **Migrate legacy library.yaml files before doing anything else.** Every time you read a library.yaml, check it against the canonical field list in `templates/library_template.yaml`. If any expected field is missing, or any field appears under an old name, the library predates a feature and MUST be migrated before you do any further work on it — no rough cuts, sequences, transcription, exports, or anything else until the schema is current. The migrations are fast, idempotent, and safe; don't ask the user for permission and don't describe them as optional "tidying." Just run them.
197
-
198
- Known migration triggers (match each to a `scripts/NNN_migrate_*.rb` script via CHANGELOG.md):
199
-
200
- - `editor` missing (added in 0.4.0)
201
- - `transcript_refinement` missing (added in [Unreleased]; missing means "predates the feature, default to `false`" — NOT the template default of `true`)
202
- - `footage_summary` missing OR old name `footage_description` present (renamed in [Unreleased])
203
- - video entries with `transcript_path` / `visual_transcript_path` (renamed to `transcript` / `visual_transcript` in 0.3.0)
204
- - video entries with `file_size_mb` (removed in 0.3.0)
205
-
206
- A missing field is not the same as a field set to the template default — the template default only applies to freshly created libraries. If you see a schema issue not on this list, still check CHANGELOG.md; the list may be behind. After running migrations, re-read the library.yaml and continue with whatever the user asked for.
207
-
208
- **Keep main-thread context minimal.** The main thread orchestrates; sub-agents do the heavy work and return concise summaries. Don't read full transcript JSON, visual transcript JSON, or extracted frames into the main thread as part of routine workflow — across a large library this bloats context fast. Trust sub-agent return messages when updating library.yaml. Direct user requests ("show me transcript X") are fine; the rule is about automatic workflow behavior.
209
-
210
- **Use actual filenames.** Never use generic labels like "Video 1" or "Clip A" - always reference actual filenames like "DJI_20250423171212_0210_D.mov" for clear traceability.
211
-
212
- **Visual transcripts are mandatory.** Before creating any rough cut or sequence, verify ALL videos have both audio and visual transcripts. Check `library.yaml` - every video entry must have a `visual_transcript` with a filename (not empty or null or ""). Transcripts are stored in `libraries/[library-name]/transcripts/`. Visual descriptions are essential for shot selection, pacing decisions, and B-roll placement.
213
-
214
- **Be curious and ask questions.** Occasionally ask users questions about their libraries and footage to better understand context, creative intent, and preferences. When you receive answers, add this information to the `user_context` key in the library.yaml file. This builds institutional knowledge that improves future rough cut and sequence decisions and helps maintain continuity across editing sessions.
215
-
216
- ## Key Reminders
217
-
218
- - Never modify source video files - always preserve originals
219
- - Flag areas needing human judgment rather than making assumptions
220
- - When you have lots of videos to process (dozens or hundreds isn't out of the ordinary), create a reasonable task list with 5 tasks and then a final task that says to check the yaml processing file to see if you need to then generate more tasks. This way users can see progress and the agent doesn't get overwhelmed.
221
- - Generally avoid writing one-off scripts, but if you do need to write one, write it in Ruby unless you have a very strong reason to write in another language.
222
- - Only run 4 parallel tasks at a time.
223
- - Whenever you export XML files, include a datetime timestamp in the filename so it's clear when they were generated.
224
-
225
- ## Programming Style
226
-
227
- When you add a Ruby script under `.claude/scripts/` or similar, follow these conventions:
228
-
229
- - **One class per script; file name matches the class name.** `ScriptExtractor` lives in `script_extractor.rb`.
230
- - **Single high-level entry point.** Expose a class method (`Klass.extract`, `Klass.run`, etc.) that calls `new(...).extract` internally — callers shouldn't need to know about instantiation.
231
- - **Break the work into small private methods with clear names** (`load_transcript`, `format_script`, `write_output`, `report`). The public entry point should read like a short outline of the workflow.
232
- - **Required arguments are required.** Don't silently default `nil`/missing args — raise `ArgumentError` in `initialize` if a required value is missing or empty. No hidden fallback paths.
233
- - **Keep CLI arg parsing out of the class.** Use a bottom-of-file `if __FILE__ == $PROGRAM_NAME` block to parse `ARGV`, validate file paths, print a usage line, and delegate to the class.
234
-
235
- ## Project Structure
236
-
237
- - `lib/buttercut.rb` - Factory class that creates editor-specific generators
238
- - `lib/buttercut/editor_base.rb` - Shared validation, metadata extraction, and timeline math
239
- - `lib/buttercut/fcpx.rb` - Final Cut Pro X implementation (FCPXML 1.8)
240
- - `lib/buttercut/fcp7.rb` - Final Cut Pro 7 / Premiere / DaVinci Resolve implementation (xmeml v5)
241
- - `.claude/skills/` - Claude Code skills for AI-powered workflow
242
- - `spec/` - RSpec test suite
243
- - `templates/` - Library and project templates
244
- - `libraries/` - Working directory for user's video projects (gitignored)
245
- - `libraries/settings.yaml` - User settings (editor, whisper_model) — created from template on first library setup
246
- - `backups/` - Compressed library backups (transcriptions, roughcuts, etc) (gitignored)
247
-
248
- ## Design Philosophy
249
-
250
- ButterCut is designed to be simple, automatic and geared toward working with non technical people using ButterCut via a client, Claude Cowork or Claude Code.
251
-
252
- - **Input**: Array of full file paths to video files
253
- - **Output**: Working XML file ready to import into the non-technical user's video editor (Final Cut, Premiere, Resolve)
254
- - **Automatic Metadata Extraction**: Uses FFmpeg internally to extract video properties (duration, resolution, frame rate, audio rate, etc.)
255
-
256
- The user should not need to understand video codecs, frame rates, or FCPXML structure - just provide file paths and get working XML. We should talk to the user from a video editing perspective, not a technical software engineer perspective.
257
-
258
- ## Development Commands
259
-
260
- ### Testing
261
- RSpec tests for the XML generation library. This doesn't include agent or end to end testing.
262
- ```bash
263
- # Install dependencies
264
- bundle install
265
-
266
- # Run all tests
267
- bundle exec rspec
268
-
269
- # Run specific test file
270
- bundle exec rspec spec/buttercut_spec.rb
271
-
272
- # Run specific test
273
- bundle exec rspec spec/buttercut_spec.rb:10
274
- ```
275
-
276
- ## Claude Skills
277
-
278
- When creating new Claude skills, aim to keep them to 50 lines. Only very complicated skills (ie transcription and roughcuts) should be larger than that. If the skill is complicated and seems like it can't be explained in 50 lines, consider if they should be broken up across multiple skills or if the complexity can be contained inside a ruby script saved adjacent to the skill.
1
+ @AGENTS.md
data/LICENSE CHANGED
@@ -1,21 +1,106 @@
1
- MIT License
2
-
3
- Copyright (c) 2025 Andrew Ford
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ Required Notice: Copyright 2025 TubeSalt LLC
2
+
3
+ ## Additional Permission: Commercial Output
4
+
5
+ The licensor grants the following permission in addition to the rights
6
+ granted by the PolyForm Noncommercial License 1.0.0 below.
7
+
8
+ You may use the software to produce video files, project files, edits,
9
+ exports, and other creative works ("Outputs") for any purpose, including
10
+ commercial purposes. You retain all rights to your Outputs, and the
11
+ licensor claims no ownership of them. Producing or distributing your
12
+ Outputs, including for monetary compensation, is not by itself a
13
+ commercial use of the software.
14
+
15
+ This Additional Permission covers using the software as a tool to make
16
+ videos. It does **not** permit any of the following, which remain
17
+ restricted to noncommercial purposes under the license below:
18
+
19
+ - Distributing, sublicensing, or selling the software (in original or
20
+ modified form), whether on its own or as part of another product;
21
+ - Offering the software (in original or modified form) as a hosted,
22
+ managed, or Software-as-a-Service product;
23
+ - Incorporating the software into a commercial software product,
24
+ plugin, extension, or service.
25
+
26
+ Plainly: you may use ButterCut to make commercial videos. You may not
27
+ use ButterCut to make commercial software.
28
+
29
+ If any term of this Additional Permission conflicts with the PolyForm
30
+ Noncommercial License 1.0.0 below, this Additional Permission controls.
31
+
32
+ ---
33
+
34
+ # PolyForm Noncommercial License 1.0.0
35
+
36
+ <https://polyformproject.org/licenses/noncommercial/1.0.0>
37
+
38
+ ## Acceptance
39
+
40
+ In order to get any license under these terms, you must agree to them as both strict obligations and conditions to all your licenses.
41
+
42
+ ## Copyright License
43
+
44
+ The licensor grants you a copyright license for the software to do everything you might do with the software that would otherwise infringe the licensor's copyright in it for any permitted purpose. However, you may only distribute the software according to [Distribution License](#distribution-license) and make changes or new works based on the software according to [Changes and New Works License](#changes-and-new-works-license).
45
+
46
+ ## Distribution License
47
+
48
+ The licensor grants you an additional copyright license to distribute copies of the software. Your license to distribute covers distributing the software with changes and new works permitted by [Changes and New Works License](#changes-and-new-works-license).
49
+
50
+ ## Notices
51
+
52
+ You must ensure that anyone who gets a copy of any part of the software from you also gets a copy of these terms or the URL for them above, as well as copies of any plain-text lines beginning with `Required Notice:` that the licensor provided with the software. For example:
53
+
54
+ > Required Notice: Copyright Yoyodyne, Inc. (http://example.com)
55
+
56
+ ## Changes and New Works License
57
+
58
+ The licensor grants you an additional copyright license to make changes and new works based on the software for any permitted purpose.
59
+
60
+ ## Patent License
61
+
62
+ The licensor grants you a patent license for the software that covers patent claims the licensor can license, or becomes able to license, that you would infringe by using the software.
63
+
64
+ ## Noncommercial Purposes
65
+
66
+ Any noncommercial purpose is a permitted purpose.
67
+
68
+ ## Personal Uses
69
+
70
+ Personal use for research, experiment, and testing for the benefit of public knowledge, personal study, private entertainment, hobby projects, amateur pursuits, or religious observance, without any anticipated commercial application, is use for a permitted purpose.
71
+
72
+ ## Noncommercial Organizations
73
+
74
+ Use by any charitable organization, educational institution, public research organization, public safety or health organization, environmental protection organization, or government institution is use for a permitted purpose regardless of the source of funding or obligations resulting from the funding.
75
+
76
+ ## Fair Use
77
+
78
+ You may have "fair use" rights for the software under the law. These terms do not limit them.
79
+
80
+ ## No Other Rights
81
+
82
+ These terms do not allow you to sublicense or transfer any of your licenses to anyone else, or prevent the licensor from granting licenses to anyone else. These terms do not imply any other licenses.
83
+
84
+ ## Patent Defense
85
+
86
+ If you make any written claim that the software infringes or contributes to infringement of any patent, your patent license for the software granted under these terms ends immediately. If your company makes such a claim, your patent license ends immediately for work on behalf of your company.
87
+
88
+ ## Violations
89
+
90
+ The first time you are notified in writing that you have violated any of these terms, or done anything with the software not covered by your licenses, your licenses can nonetheless continue if you come into full compliance with these terms, and take practical steps to correct past violations, within 32 days of receiving notice. Otherwise, all your licenses end immediately.
91
+
92
+ ## No Liability
93
+
94
+ ***As far as the law allows, the software comes as is, without any warranty or condition, and the licensor will not be liable to you for any damages arising out of these terms or the use or nature of the software, under any kind of legal claim.***
95
+
96
+ ## Definitions
97
+
98
+ The **licensor** is the individual or entity offering these terms, and the **software** is the software the licensor makes available under these terms.
99
+
100
+ **You** refers to the individual or entity agreeing to these terms.
101
+
102
+ **Your company** is any legal entity, sole proprietorship, or other kind of organization that you work for, plus all organizations that have control over, are under the control of, or are under common control with that organization. **Control** means ownership of substantially all the assets of an entity, or the power to direct its management and policies by vote, contract, or otherwise. Control can be direct or indirect.
103
+
104
+ **Your licenses** are all the licenses granted to you for the software under these terms.
105
+
106
+ **Use** means anything you do with the software requiring one of your licenses.
data/README.md CHANGED
@@ -44,7 +44,7 @@ For manual installation, see [docs/installation.md](docs/installation.md).
44
44
 
45
45
  ## Usage
46
46
 
47
- First tell Claude to create a **Library**. A library organizes your video footage along with audio and visual transcripts. Then tell Claude you want to create a **rough cut** or **sequence**.
47
+ First tell Claude to create a **Library**. A library organizes your video footage along with the transcripts, contact sheets, and summaries Claude needs to edit it. Then tell Claude you want to create a **rough cut** or **sequence**.
48
48
 
49
49
  ### Creating a Video Library
50
50
 
@@ -60,14 +60,14 @@ You:
60
60
 
61
61
  Claude: [Automatically processes all videos]
62
62
  ✓ Creates library structure
63
- ✓ Transcribes audio with WhisperX
64
- Analyzes video frames
65
- Generates visual transcripts
63
+ ✓ Transcribes audio
64
+ Builds a contact sheet for every clip
65
+ Writes a short summary of each clip
66
66
 
67
67
  Result: Full footage analysis ready for rough cut creation
68
68
  ```
69
69
 
70
- Claude handles the parallel processing, metadata extraction, and transcript generation. See the [full walkthrough](docs/example-library-setup.md) for a detailed example of me setting up a library from my wedding footage.
70
+ Claude handles the parallel processing, metadata extraction, and analysis. See the [full walkthrough](docs/example-library-setup.md) for a detailed example of me setting up a library from my wedding footage.
71
71
 
72
72
  ### Creating a Roughcut or Sequence
73
73
 
@@ -76,7 +76,7 @@ Once your library is analyzed, Claude can create rough cuts through an interacti
76
76
  ```plaintext
77
77
  You: "Let's create a new roughcut"
78
78
 
79
- Claude: [Loads roughcut skill and analyzes footage]
79
+ Claude: [Loads cut skill and analyzes footage]
80
80
  What should this roughcut focus on?
81
81
  - Full story
82
82
  - Just the meetup coverage
@@ -100,7 +100,7 @@ Claude: [Asks which video editor you want to use]
100
100
  You: "Final Cut Pro X"
101
101
 
102
102
  Claude: [Creates roughcut with editorial decisions]
103
- Combined visual transcripts
103
+ Reviewed contact sheets and transcripts
104
104
  ✓ Selected 29 clips (4:32 total)
105
105
  ✓ Exported to FCPXML
106
106
 
@@ -120,7 +120,12 @@ ButterCut was inspired by ambitious open source work from [Chris Hocking](https:
120
120
 
121
121
  ## License
122
122
 
123
- MIT
123
+ ButterCut is open source under the [PolyForm Noncommercial License 1.0.0 with a Commercial Output exception](LICENSE).
124
+
125
+ - **You can use ButterCut to make videos commercially.** Cut a YouTube video for ad revenue, edit a paid client project, deliver a sponsored brand piece — all fine. The videos are yours, and the licensor claims no rights to them.
126
+ - **You can't repackage ButterCut as commercial software.** Selling, hosting, or bundling the tool itself (or a fork of it) into a commercial product, plugin, or SaaS requires a separate commercial license from TubeSalt LLC.
127
+
128
+ Personal, hobby, research, and educational use of the software is also free under the underlying license. If you'd like a commercial software license, reach out.
124
129
 
125
130
  ## Contributing
126
131
 
@@ -1,3 +1,3 @@
1
1
  class ButterCut
2
- VERSION = "0.5.0"
2
+ VERSION = "0.7.0"
3
3
  end
@@ -14,9 +14,21 @@ footage_summary: "No footage analyzed yet."
14
14
  # "This footage appears to be wedding footage. It includes the bride and groom getting dressed, preparing for the wedding ceremomy, the ceremony, and the post ceremony dinner and party."
15
15
  # "This footage appears to be a vlog. The footage starts in The Richmond District in San Francisco, includes a bus ride on the 38R, and concludes at a Ruby Meetup in downtown San Francisco."
16
16
 
17
- # Video files and transcription status
17
+ # Video files and analysis status
18
+ #
19
+ # Per clip, analysis fills three fields:
20
+ # transcript — audio transcript JSON (word-level timing, in transcripts/);
21
+ # also the source for on-demand dialogue extraction via
22
+ # skills/analyze-video/script_extractor.rb
23
+ # contact_sheet — _full.jpg visual overview (in contact_sheets/); per-segment
24
+ # sheets for clips >10 min live alongside on disk
25
+ # summary — markdown overview (in summaries/)
26
+ #
27
+ # Note: visual_transcript is deprecated. Older libraries may still carry the
28
+ # field; new libraries use the contact_sheet field instead.
18
29
  videos:
19
30
  - path: /full/path/to/video_file.mp4
20
31
  duration: "00:05:32"
21
32
  transcript: # filename only (stored in libraries/[library-name]/transcripts/)
22
- visual_transcript: # filename only (visual_*.json with frame descriptions)
33
+ contact_sheet: # filename only (_full.jpg in libraries/[library-name]/contact_sheets/)
34
+ summary: # filename only (summary_*.md in libraries/[library-name]/summaries/)
@@ -0,0 +1,53 @@
1
+ <!--
2
+ Cut Plan Template — written and consumed by the `cut` skill's Roughcut path (see `skills/cut/roughcut_planning.md`).
3
+
4
+ Fill in every section. Delete this comment block before saving.
5
+ The plan is editorial direction; the build agent picks the exact clips
6
+ and timestamps inside each beat.
7
+ -->
8
+
9
+ # [Working title]
10
+
11
+ ## Concept
12
+ <!-- 1–2 sentences on the angle, tone, or arc. What story is this cut telling? -->
13
+
14
+ ## Format
15
+ <!-- Vlog, YouTube Short, long-form, documentary, talking-head, montage, etc.
16
+ Include any pacing or tonal cues that flow from the format. -->
17
+
18
+ ## Target Duration
19
+ <!-- Approximate runtime, e.g. "4–6 min" or "45–60s sequence". -->
20
+
21
+ ## Beats
22
+ <!--
23
+ Ordered list. Each beat is one editorial unit with intent and footage suggestions. Beats are direction, not paper-cut timestamps.
24
+
25
+ For an 8 minute vlog, you might aim for something like 60 seconds per beat, with both good footage for a-roll and b-roll.
26
+
27
+ For other types of videos use your best editorial judgement, thinking about what is common in the genre you're working with. You can also talk to the user directly to determine what they want.
28
+ -->
29
+
30
+ ### 1. [Beat name]
31
+ - **Intent:** what this beat does for the story (open, escalate, turn, payoff, etc.)
32
+ - **Approx. share:** rough fraction of runtime (e.g. "~30s", "~2 min", "~15% of total")
33
+ - **Footage suggestions:** filenames likely to feed this beat (e.g. `DJI_56738.mov`, `panasonic_1234.mov`). The build agent may swap in stronger moments from elsewhere.
34
+
35
+ ### 2. [Beat name]
36
+ - **Intent:**
37
+ - **Approx. share:**
38
+ - **Footage suggestions:**
39
+
40
+ <!-- Add more beats as needed. A 6 minute video might have 4-6 beats. You'll need to use your judgement about the footage availability, target duration and cut you're making. -->
41
+
42
+ ## Required Dialogue
43
+ <!--
44
+ Lines the user specifically wants in. Two flavors are both fine:
45
+
46
+ - **Exact quote:** "Here's how I learned to juggle." (`source_file_if_known.mov`)
47
+ - **Lossy reference:** "Include the bit about Kailey's uncle the magician teaching her to juggle before he died." (`file_1.mov, file_2.mov, file_5.mov`)
48
+
49
+ Leave this section empty if no specific lines are required.
50
+ -->
51
+
52
+ ## Notes for the Build
53
+ <!-- Any constraints, things to avoid, or judgment calls the build agent should know — single-track timeline assumptions, must-not-include footage, tone preferences, etc. Include decisions or direction from the user. -->
@@ -1,25 +1,8 @@
1
1
  # Rough Cut Template
2
2
  # This template defines the structure for video rough cuts
3
3
 
4
- # User-facing description of what this rough cut contains
5
- description: "Brief description of the rough cut - what story it tells, target duration, and editorial approach"
6
-
7
- # Working notes for the agent during rough cut creation
8
- notes: |
9
- Working notes area for editorial decisions, narrative structure planning,
10
- pacing considerations, and any issues or concerns identified during editing.
11
-
12
- Consider:
13
- - Story arc and key narrative beats
14
- - Pacing and rhythm
15
- - Transitions between segments
16
- - B-roll placement opportunities
17
- - Audio/dialogue clarity
18
-
19
- # Coverage summary of available footage
20
- footage_coverage: |
21
- Overview of what footage is available and how it could be used.
22
- Include notes about strongest segments, potential issues, and creative opportunities.
4
+ # One-line summary of what this cut is — useful when scanning a folder of cuts
5
+ description: "Brief one-line summary of this cut what it is and roughly how long"
23
6
 
24
7
  # The actual rough cut - ordered list of clips to use
25
8
  clips:
@@ -39,4 +22,4 @@ clips:
39
22
  # Rough cut metadata
40
23
  metadata:
41
24
  created_date: "" # Will be populated when rough cut is created
42
- total_duration: "" # Calculated from all clip durations
25
+ total_duration: "" # Calculated from all clip durations
@@ -8,3 +8,12 @@ editor: fcpx
8
8
  # turbo is nearly as accurate as large-v3 but significantly faster
9
9
  # Recommended: `small` paired with transcript_refinement (set per-library in library.yaml)
10
10
  whisper_model: small
11
+
12
+ # After exporting a roughcut, also drop a copy of the XML on the Desktop for easy import
13
+ save_to_desktop_after_export: true
14
+
15
+ # Where to write library backup archives.
16
+ # Defaults to ~/Documents/buttercut-video-editor-backups so backups live outside
17
+ # the project directory and survive a fresh clone or `update-buttercut` run.
18
+ # Set to a different absolute path (or one starting with ~) to redirect.
19
+ # backups_dir: ~/Documents/buttercut-video-editor-backups