Build Information
Successful build of Kadr, reference v1.1.1 (ff6c4b), with Swift 6.4 for macOS (SPM) on 31 Oct 2026 05:47:46 UTC.
Swift 6 data race errors: 0
Build Command
env DEVELOPER_DIR=/Applications/Xcode-27.0.0.app xcrun swift build --arch arm64Build Log
========================================
RunAll
========================================
Builder version: 5.1.4
Interrupt handler set up.
========================================
Checkout
========================================
Clone URL: https://github.com/SteliyanH/kadr.git
Reference: v1.1.1
Initialized empty Git repository in /Users/admin/builder/spi-builder-workspace/.git/
From https://github.com/SteliyanH/kadr
* tag v1.1.1 -> FETCH_HEAD
HEAD is now at ff6c4bf release: v1.1.1 changelog
Cloned https://github.com/SteliyanH/kadr.git
Revision (git rev-parse @):
ff6c4bf2ee6663aa7ce973ee5a678c67f6d63475
SPI manifest file found: $PWD/.spi.yml
SUCCESS checkout https://github.com/SteliyanH/kadr.git at v1.1.1
========================================
ResolveProductDependencies
========================================
Resolving dependencies ...
{
"identity": ".resolve-product-dependencies",
"name": "resolve-dependencies",
"url": "/Users/admin/builder/spi-builder-workspace/.resolve-product-dependencies",
"version": "unspecified",
"path": "/Users/admin/builder/spi-builder-workspace/.resolve-product-dependencies",
"traits": [
"default"
],
"dependencies": [
{
"identity": "kadr",
"name": "Kadr",
"url": "https://github.com/SteliyanH/kadr.git",
"version": "unspecified",
"path": "/Users/admin/builder/spi-builder-workspace/.resolve-product-dependencies/.build/checkouts/kadr",
"traits": [
"default"
],
"dependencies": [
]
}
]
}
Fetching https://github.com/SteliyanH/kadr.git
[1/2152] Fetching kadr
Fetched https://github.com/SteliyanH/kadr.git (9.98s)
Creating working copy for https://github.com/SteliyanH/kadr.git
Working copy of https://github.com/SteliyanH/kadr.git resolved at v1.1.1 (ff6c4bf)
warning: '.resolve-product-dependencies': dependency 'kadr' is not used by any target
Found 0 product dependencies
========================================
Build
========================================
Selected platform: macosSpm
Swift version: 6.4
Building package at path: $PWD
https://github.com/SteliyanH/kadr.git
Running build ...
env DEVELOPER_DIR=/Applications/Xcode-27.0.0.app xcrun swift build --arch arm64
Building for debugging...
[Pre-planning 1 / 153]
[Planning deferred tasks]
[43 / 69] Kadr_KadrTests
[45 / 69]
[46 / 70] Kadr
[56 / 154]
[59 / 154]
[67 / 154]
[69 / 154]
[70 / 154]
[75 / 154]
[77 / 154]
[79 / 154]
[82 / 154]
[87 / 154]
[90 / 154]
[92 / 154]
[93 / 154]
[104 / 154]
[107 / 154]
[108 / 154]
[113 / 154]
[118 / 154]
[119 / 154]
[130 / 154] Kadr
[131 / 154] Kadr
[139 / 155]
[142 / 169]
[143 / 170]
[145 / 170] KadrExamples
[152 / 170] KadrExamples
[153 / 174] KadrBenchmarks-product
[162 / 174] KadrExamples
[166 / 174]
[168 / 174] KadrExamples
[168 / 174] KadrBenchmarks-product
[170 / 174] KadrBenchmarks-product
[172 / 174] KadrExamples
Build complete! (14.75 sec)
warning: 'spi-builder-workspace': found 7 file(s) which are unhandled; explicitly declare them as resources or exclude from the target
/Users/admin/builder/spi-builder-workspace/Examples/README.md
/Users/admin/builder/spi-builder-workspace/Examples/SimpleEditor/Resources/sample_audio.mp3
/Users/admin/builder/spi-builder-workspace/Examples/SimpleEditor/Resources/sample_forest.png
/Users/admin/builder/spi-builder-workspace/Examples/SimpleEditor/Resources/sample_ocean.png
/Users/admin/builder/spi-builder-workspace/Examples/SimpleEditor/Resources/sample_purple.png
/Users/admin/builder/spi-builder-workspace/Examples/SimpleEditor/Resources/sample_sunset.png
/Users/admin/builder/spi-builder-workspace/Examples/SimpleEditor/Resources/sample_video.mp4
Build complete.
{
"dependencies" : [
],
"manifest_display_name" : "Kadr",
"name" : "Kadr",
"path" : "/Users/admin/builder/spi-builder-workspace",
"platforms" : [
{
"name" : "ios",
"version" : "17.0"
},
{
"name" : "macos",
"version" : "14.0"
},
{
"name" : "tvos",
"version" : "17.0"
},
{
"name" : "visionos",
"version" : "1.0"
}
],
"products" : [
{
"name" : "Kadr",
"targets" : [
"Kadr"
],
"type" : {
"library" : [
"automatic"
]
}
},
{
"name" : "KadrBenchmarks",
"targets" : [
"KadrBenchmarks"
],
"type" : {
"executable" : null
}
}
],
"targets" : [
{
"c99name" : "KadrTests",
"module_type" : "SwiftTarget",
"name" : "KadrTests",
"path" : "Tests/KadrTests",
"resources" : [
{
"path" : "/Users/admin/builder/spi-builder-workspace/Tests/KadrTests/Resources/sample.mov",
"rule" : {
"process" : {
}
}
},
{
"path" : "/Users/admin/builder/spi-builder-workspace/Tests/KadrTests/Resources/sample.mp3",
"rule" : {
"process" : {
}
}
},
{
"path" : "/Users/admin/builder/spi-builder-workspace/Tests/KadrTests/Resources/sample.png",
"rule" : {
"process" : {
}
}
},
{
"path" : "/Users/admin/builder/spi-builder-workspace/Tests/KadrTests/Resources/sample.wav",
"rule" : {
"process" : {
}
}
}
],
"sources" : [
"APIValidationTests.swift",
"AnimationClearingModifiersTests.swift",
"AnimationTests.swift",
"AssetWriterExportTests.swift",
"AudioBuilderTests.swift",
"AudioCrossfadeTests.swift",
"AudioSpeedTests.swift",
"AudioTrackTimingTests.swift",
"AudioVolumeRampTests.swift",
"AudioWaveformTests.swift",
"CMTimeAPITests.swift",
"CancellationTokenTests.swift",
"CaptionTests.swift",
"ChromaKeyComponentsTests.swift",
"ChromaKeyTests.swift",
"ClipAtTimeTests.swift",
"ClipCropTests.swift",
"ClipIDTests.swift",
"ClipMaskTests.swift",
"ClipVolumeTests.swift",
"CompositorTests.swift",
"CropTests.swift",
"DSLTests.swift",
"DuckingTests.swift",
"EdgeCasesTests.swift",
"EmptyCompositionTests.swift",
"ExportQualityTests.swift",
"ExportTests.swift",
"FilterIDRestorationTests.swift",
"FilterIDTests.swift",
"FilterIntensityAnimationTests.swift",
"FilterKindTests.swift",
"FilterPixelTests.swift",
"FilterPresetsTests.swift",
"FilterTests.swift",
"IntrospectionTests.swift",
"KadrErrorLocalizedTests.swift",
"KadrVideoCompositorTests.swift",
"LUTTests.swift",
"LayoutHelpersTests.swift",
"LayoutTests.swift",
"MoveFiltersTests.swift",
"MultiInputCompositorTests.swift",
"MultiTrackEngineTests.swift",
"MultiTrackLayeringTests.swift",
"MultiTrackRecursiveTests.swift",
"NoAudioCompositionExportTests.swift",
"OverlayLayoutAnimationTests.swift",
"OverlayTests.swift",
"OverlayVisibilityTests.swift",
"PassthroughFallbackTests.swift",
"PreviewAPITests.swift",
"SampleMediaTests.swift",
"SimulatorOverlayExportTests.swift",
"SpeedCurveTests.swift",
"SpeedEnumTests.swift",
"SpeedTests.swift",
"SugarTests.swift",
"TestEnvironment.swift",
"TextAnimationTests.swift",
"TextEffectsTests.swift",
"TextOverlayExportTests.swift",
"TrackTests.swift",
"TransformTests.swift",
"TransitionsTests.swift",
"V010PolishTests.swift"
],
"target_dependencies" : [
"Kadr"
],
"type" : "test"
},
{
"c99name" : "KadrExamples",
"module_type" : "SwiftTarget",
"name" : "KadrExamples",
"path" : "Examples",
"sources" : [
"APIValidation.swift",
"SimpleEditor/ContentView.swift",
"V020Showcase.swift",
"V030Showcase.swift",
"V040Showcase.swift",
"V041Showcase.swift",
"V050Showcase.swift",
"V060Showcase.swift",
"V070Showcase.swift",
"V080Showcase.swift",
"V090Showcase.swift",
"V100Showcase.swift",
"V110Showcase.swift",
"V120Showcase.swift",
"V140Showcase.swift",
"V1_0_0Showcase.swift"
],
"target_dependencies" : [
"Kadr"
],
"type" : "library"
},
{
"c99name" : "KadrBenchmarks",
"module_type" : "SwiftTarget",
"name" : "KadrBenchmarks",
"path" : "Benchmarks/KadrBenchmarks",
"product_memberships" : [
"KadrBenchmarks"
],
"sources" : [
"Fixtures.swift",
"Harness.swift",
"main.swift"
],
"target_dependencies" : [
"Kadr"
],
"type" : "executable"
},
{
"c99name" : "Kadr",
"module_type" : "SwiftTarget",
"name" : "Kadr",
"path" : "Sources/Kadr",
"product_memberships" : [
"Kadr",
"KadrBenchmarks"
],
"sources" : [
"Animation/Animatable.swift",
"Animation/Animation.swift",
"Animation/TimingFunction.swift",
"DSL/AudioBuilder.swift",
"DSL/AudioTimePitchAlgorithm.swift",
"DSL/AudioTrack.swift",
"DSL/BackgroundMusic.swift",
"DSL/Caption.swift",
"DSL/Clip.swift",
"DSL/ImageClip+Color.swift",
"DSL/ImageClip.swift",
"DSL/SampleMedia.swift",
"DSL/TitleSequence.swift",
"DSL/Track.swift",
"DSL/Transition.swift",
"DSL/Video.swift",
"DSL/VideoBuilder.swift",
"DSL/VideoClip.swift",
"Engine/AssetWriterExporter.swift",
"Engine/AudioWaveform.swift",
"Engine/AudioWaveformLoader.swift",
"Engine/CancellationToken.swift",
"Engine/CompositionBuilder.swift",
"Engine/Compositor.swift",
"Engine/CropCompositor.swift",
"Engine/ExportEngine.swift",
"Engine/FilterProcessor.swift",
"Engine/ImageEncoder.swift",
"Engine/KadrVideoCompositor.swift",
"Engine/MaskCompositor.swift",
"Engine/MultiInputCompositor.swift",
"Engine/OverlayRenderer.swift",
"Engine/PlaybackComposer.swift",
"Engine/ReverseProcessor.swift",
"Engine/SpeedCurveSampler.swift",
"Engine/ThumbnailGenerator.swift",
"Errors/KadrError+LocalizedError.swift",
"Errors/KadrError.swift",
"Export/ExportProgress.swift",
"Export/ExportSettings.swift",
"Export/Exporter.swift",
"Export/Preset.swift",
"Filters/ChromaKey.swift",
"Filters/Filter.swift",
"Filters/FilterKind.swift",
"Filters/LUT.swift",
"Layout/Anchor.swift",
"Layout/ClipID.swift",
"Layout/CropRegion.swift",
"Layout/FilterID.swift",
"Layout/Frame.swift",
"Layout/LayerID.swift",
"Layout/Layout.swift",
"Layout/Position.swift",
"Layout/Size.swift",
"Layout/Transform.swift",
"Modifiers/Clip+AnimationClearing.swift",
"Modifiers/Clip+FilterID.swift",
"Modifiers/Clip+Speed.swift",
"Overlays/ImageOverlay.swift",
"Overlays/Overlay.swift",
"Overlays/StickerOverlay.swift",
"Overlays/TextAnimation.swift",
"Overlays/TextOverlay.swift",
"Overlays/TextShadow.swift",
"Overlays/TextStroke.swift",
"Overlays/TextStyle.swift",
"Overlays/Watermark.swift",
"Platform/PlatformTypes.swift",
"Time/Timecode.swift"
],
"type" : "library"
}
],
"tools_version" : "6.0"
}
✅ Doc result (pending) reported
========================================
GenerateDocs
========================================
Generating docs at path: $PWD/.docs/steliyanh/kadr/v1.1.1
Repository: SteliyanH/kadr
Swift version used: 6.4
Target: Kadr
Extracting symbol information for 'Kadr'...
Finished extracting symbol information for 'Kadr'. (2.33s)
Building documentation for 'Kadr'...
warning: 'fadeIn(_:)' is ambiguous at '/Kadr/AudioTrack'
--> ../DSL/AudioTrack.swift:29:19-29:29
27 |
28 | /// Fade-in duration applied at the start of the track. `.zero` if no fade-in.
29 + /// Set via ``fadeIn(_:)`` (CMTime or TimeInterval).
| ├─suggestion: Insert '-(CMTime)' for 'func fadeIn(_ duration: CMTime) -> AudioTrack'
| ╰─suggestion: Insert '-(TimeInterval)' for 'func fadeIn(_ duration: TimeInterval) -> AudioTrack'
30 | public let fadeInDuration: CMTime
31 |
warning: 'fadeOut(_:)' is ambiguous at '/Kadr/AudioTrack'
--> ../DSL/AudioTrack.swift:33:19-33:30
31 |
32 | /// Fade-out duration applied at the end of the track. `.zero` if no fade-out.
33 + /// Set via ``fadeOut(_:)`` (CMTime or TimeInterval).
| ├─suggestion: Insert '-(CMTime)' for 'func fadeOut(_ duration: CMTime) -> AudioTrack'
| ╰─suggestion: Insert '-(TimeInterval)' for 'func fadeOut(_ duration: TimeInterval) -> AudioTrack'
34 | public let fadeOutDuration: CMTime
35 |
warning: 'crossfade(_:)' is ambiguous at '/Kadr/AudioTrack'
--> ../DSL/AudioTrack.swift:57:63-57:76
55 | /// fade in on the next — over `min(crossfadeDuration, overlapDuration)`. The
56 | /// crossfade overrides any explicit `fadeIn` / `fadeOut` at that boundary so
57 + /// AVFoundation doesn't see overlapping ramps. Set via ``crossfade(_:)``.
| ├─suggestion: Insert '-(CMTime)' for 'func crossfade(_ duration: CMTime) -> AudioTrack'
| ╰─suggestion: Insert '-(TimeInterval)' for 'func crossfade(_ duration: TimeInterval) -> AudioTrack'
58 | /// Added in v0.8.
59 | public let crossfadeDuration: CMTime?
warning: 'volumeRamp(start:end:during:)' is ambiguous at '/Kadr/AudioTrack'
--> ../DSL/AudioTrack.swift:64:15-64:44
62 | /// (0 = the audio's start in the composition, i.e. ``startTime``). Each ramp
63 | /// linearly interpolates from `startVolume` to `endVolume` across `range`. Set
64 + /// via ``volumeRamp(start:end:during:)``. Added in v0.8.3.
| ├─suggestion: Insert '-(_,_,CMTimeRange)' for 'func volumeRamp(start: Double, end: Double, during range: CMTimeRange) -> AudioTrack'
| ╰─suggestion: Insert '-(_,_,ClosedRange<TimeInterval>)' for 'func volumeRamp(start: Double, end: Double, during range: ClosedRange<TimeInterval>) -> AudioTrack'
65 | ///
66 | /// Engine consumers must avoid overlap between ramps and the implicit fade-in /
warning: '(any)' isn't a disambiguation for 'compositor(_:)' at '/Kadr/Video'
--> ../DSL/Video.swift:46:63-46:69
44 | public internal(set) var crop: CropRegion?
45 |
46 + /// Optional multi-track blender. Set via ``compositor(_:)-(any)`` /
| ├─suggestion: Replace '(any)' with '(([CIImage],CompositorContext)->CIImage)' for 'func compositor(_ body: @Sendable @escaping ([CIImage], CompositorContext) -> CIImage) -> Video'
| ╰─suggestion: Replace '(any)' with '(MultiInputCompositor)' for 'func compositor(_ compositor: any MultiInputCompositor) -> Video'
47 | /// ``compositor(_:)-(closure)``. `nil` (default) means the engine will use its
48 | /// built-in alpha-composite later-over-earlier blender when the composition has
warning: '(closure)' isn't a disambiguation for 'compositor(_:)' at '/Kadr/Video'
--> ../DSL/Video.swift:47:25-47:35
45 |
46 | /// Optional multi-track blender. Set via ``compositor(_:)-(any)`` /
47 + /// ``compositor(_:)-(closure)``. `nil` (default) means the engine will use its
| ├─suggestion: Replace '(closure)' with '(([CIImage],CompositorContext)->CIImage)' for 'func compositor(_ body: @Sendable @escaping ([CIImage], CompositorContext) -> CIImage) -> Video'
| ╰─suggestion: Replace '(closure)' with '(MultiInputCompositor)' for 'func compositor(_ compositor: any MultiInputCompositor) -> Video'
48 | /// built-in alpha-composite later-over-earlier blender when the composition has
49 | /// multiple parallel tracks.
warning: '(CMTimeRange)' isn't a disambiguation for 'compositor(_:during:)' at '/Kadr/Video'
--> ../DSL/Video.swift:56:32-56:46
54 | /// engine consults each frame's composition time — inside the window the user's
55 | /// compositor runs; outside it, the default alpha-composite blender runs. Set via
56 + /// ``compositor(_:during:)-(CMTimeRange)`` / ``compositor(_:during:)-(closedrange)``.
| ├─suggestion: Replace '(CMTimeRange)' with '(_,CMTimeRange)' for 'func compositor(_ compositor: any MultiInputCompositor, during range: CMTimeRange) -> Video'
| ╰─suggestion: Replace '(CMTimeRange)' with '(_,ClosedRange<TimeInterval>)' for 'func compositor(_ compositor: any MultiInputCompositor, during range: ClosedRange<TimeInterval>) -> Video'
57 | /// Added in v0.7.
58 | public internal(set) var compositorWindow: CMTimeRange?
warning: '(closedrange)' isn't a disambiguation for 'compositor(_:during:)' at '/Kadr/Video'
--> ../DSL/Video.swift:56:74-56:88
54 | /// engine consults each frame's composition time — inside the window the user's
55 | /// compositor runs; outside it, the default alpha-composite blender runs. Set via
56 + /// ``compositor(_:during:)-(CMTimeRange)`` / ``compositor(_:during:)-(closedrange)``.
| ├─suggestion: Replace '(closedrange)' with '(_,CMTimeRange)' for 'func compositor(_ compositor: any MultiInputCompositor, during range: CMTimeRange) -> Video'
| ╰─suggestion: Replace '(closedrange)' with '(_,ClosedRange<TimeInterval>)' for 'func compositor(_ compositor: any MultiInputCompositor, during range: ClosedRange<TimeInterval>) -> Video'
57 | /// Added in v0.7.
58 | public internal(set) var compositorWindow: CMTimeRange?
warning: '(CMTimeRange)' isn't a disambiguation for 'compositor(_:during:)' at '/Kadr/Video'
--> ../DSL/Video.swift:287:48-287:62
285 | }
286 |
287 + /// Closure form of ``compositor(_:during:)-(CMTimeRange)``. Added in v0.7.
| ├─suggestion: Replace '(CMTimeRange)' with '(_,CMTimeRange)' for 'func compositor(_ compositor: any MultiInputCompositor, during range: CMTimeRange) -> Video'
| ╰─suggestion: Replace '(CMTimeRange)' with '(_,ClosedRange<TimeInterval>)' for 'func compositor(_ compositor: any MultiInputCompositor, during range: ClosedRange<TimeInterval>) -> Video'
288 | public func compositor(during range: CMTimeRange, _ body: @Sendable @escaping ([CIImage], CompositorContext) -> CIImage) -> Video {
289 | compositor(ClosureMultiInputCompositor(body: body), during: range)
warning: '(closedrange)' isn't a disambiguation for 'compositor(_:during:)' at '/Kadr/Video'
--> ../DSL/Video.swift:292:48-292:62
290 | }
291 |
292 + /// Closure form of ``compositor(_:during:)-(closedrange)``. Added in v0.7.
| ├─suggestion: Replace '(closedrange)' with '(_,CMTimeRange)' for 'func compositor(_ compositor: any MultiInputCompositor, during range: CMTimeRange) -> Video'
| ╰─suggestion: Replace '(closedrange)' with '(_,ClosedRange<TimeInterval>)' for 'func compositor(_ compositor: any MultiInputCompositor, during range: ClosedRange<TimeInterval>) -> Video'
293 | public func compositor(during range: ClosedRange<TimeInterval>, _ body: @Sendable @escaping ([CIImage], CompositorContext) -> CIImage) -> Video {
294 | compositor(ClosureMultiInputCompositor(body: body), during: range)
warning: 'trimmed(to:)' is ambiguous at '/Kadr/VideoClip'
--> ../DSL/VideoClip.swift:41:19-41:31
39 |
40 | /// The active trim range in source-asset time, or `nil` if the full asset is used.
41 + /// Set via ``trimmed(to:)`` (CMTimeRange or ClosedRange<TimeInterval>).
| ├─suggestion: Insert '-(CMTimeRange)' for 'func trimmed(to range: CMTimeRange) -> VideoClip'
| ╰─suggestion: Insert '-(ClosedRange<TimeInterval>)' for 'func trimmed(to range: ClosedRange<TimeInterval>) -> VideoClip'
42 | public internal(set) var trimRange: CMTimeRange?
43 |
warning: 'trimmed(to:)' is ambiguous at '/Kadr/VideoClip'
--> ../DSL/VideoClip.swift:71:11-71:23
69 | /// 0.5 = half-speed, 2.0 = 2×). The engine integrates the curve into a piecewise-linear
70 | /// time map and applies via repeated `scaleTimeRange` segments. Composes with
71 + /// ``trimmed(to:)``: trim is applied first (selects the source range), then the speed
| ├─suggestion: Insert '-(CMTimeRange)' for 'func trimmed(to range: CMTimeRange) -> VideoClip'
| ╰─suggestion: Insert '-(ClosedRange<TimeInterval>)' for 'func trimmed(to range: ClosedRange<TimeInterval>) -> VideoClip'
72 | /// curve maps that range to the timeline. Set via ``speed(curve:)``. Added in v0.9.
73 | public internal(set) var speedCurve: Animation<Double>?
warning: 'speed(curve:)' doesn't exist at '/Kadr/VideoClip/speedCurve'
--> ../DSL/VideoClip.swift:72:58-72:71
70 | /// time map and applies via repeated `scaleTimeRange` segments. Composes with
71 | /// ``trimmed(to:)``: trim is applied first (selects the source range), then the speed
72 + /// curve maps that range to the timeline. Set via ``speed(curve:)``. Added in v0.9.
73 | public internal(set) var speedCurve: Animation<Double>?
74 |
warning: '(any)' isn't a disambiguation for 'compositor(_:)' at '/Kadr/VideoClip'
--> ../DSL/VideoClip.swift:102:46-102:52
100 |
101 | /// User-supplied compositors applied to this clip in declaration order, after
102 + /// ``filters``. Set via ``compositor(_:)-(any)`` or ``compositor(_:)-(closure)``.
| ├─suggestion: Replace '(any)' with '((CIImage,CompositorContext)->CIImage)' for 'func compositor(_ body: @Sendable @escaping (CIImage, CompositorContext) -> CIImage) -> VideoClip'
| ╰─suggestion: Replace '(any)' with '(Compositor)' for 'func compositor(_ compositor: any Compositor) -> VideoClip'
103 | public internal(set) var compositors: [any Compositor]
104 |
warning: '(closure)' isn't a disambiguation for 'compositor(_:)' at '/Kadr/VideoClip'
--> ../DSL/VideoClip.swift:102:74-102:84
100 |
101 | /// User-supplied compositors applied to this clip in declaration order, after
102 + /// ``filters``. Set via ``compositor(_:)-(any)`` or ``compositor(_:)-(closure)``.
| ├─suggestion: Replace '(closure)' with '((CIImage,CompositorContext)->CIImage)' for 'func compositor(_ body: @Sendable @escaping (CIImage, CompositorContext) -> CIImage) -> VideoClip'
| ╰─suggestion: Replace '(closure)' with '(Compositor)' for 'func compositor(_ compositor: any Compositor) -> VideoClip'
103 | public internal(set) var compositors: [any Compositor]
104 |
warning: '(closure)' isn't a disambiguation for 'compositor(_:)' at '/Kadr/VideoClip'
--> ../Engine/Compositor.swift:37:74-37:84
35 | /// ```
36 | ///
37 + /// For ad-hoc use, prefer the closure form on ``VideoClip/compositor(_:)-(closure)``.
| ├─suggestion: Replace '(closure)' with '((CIImage,CompositorContext)->CIImage)' for 'func compositor(_ body: @Sendable @escaping (CIImage, CompositorContext) -> CIImage) -> VideoClip'
| ╰─suggestion: Replace '(closure)' with '(Compositor)' for 'func compositor(_ compositor: any Compositor) -> VideoClip'
38 | ///
39 | /// **Constraints**
warning: 'KadrVideoCompositor' doesn't exist at '/Kadr/ThumbnailGenerator'
--> ../Engine/ThumbnailGenerator.swift:42:19-42:38
40 | /// > the batch ``thumbnails(at:)`` stream (which drives `images(for:)` from a producer
41 | /// > task) free of actor-isolation friction. Matches the engine's other AVFoundation
42 + /// > wrappers (``KadrVideoCompositor``).
43 | public final class ThumbnailGenerator: @unchecked Sendable {
44 |
warning: 'allCases' doesn't exist at '/Kadr/FilterKind'
--> ../Filters/FilterKind.swift:10:35-10:43
8 | /// offering "add a filter" therefore has to hard-code the menu, and every
9 | /// hard-coded menu goes stale the moment a filter is added here. This type is
10 + /// the fix: iterate ``FilterKind/allCases``, and a filter added to kadr appears
11 | /// in the menu without the consumer changing anything.
12 | ///
warning: 'rawValue' doesn't exist at '/Kadr/FilterKind/displayName'
--> ../Filters/FilterKind.swift:71:39-71:47
69 | /// An English name, for menus.
70 | ///
71 + /// kadr ships no localisation. ``rawValue`` is a stable key, so a localised
72 | /// app can look up its own string by it and fall back to this.
73 | public var displayName: String {
warning: 'allCases' doesn't exist at '/Kadr/FilterKind'
--> ../Filters/FilterKind.swift:110:68-110:76
108 | ///
109 | /// Exhaustive by construction: a new `Filter` case fails to compile here
110 + /// until it is given a kind, which is what keeps ``FilterKind/allCases``
111 | /// honest.
112 | ///
warning: Organizing 'Kadr/MultiTrackComposition' under 'Kadr/CustomCompositors' forms a cycle
Links in a "Topics section" are used to organize documentation into a hierarchy. The documentation hierarchy shouldn't contain cycles.
If this link contributed to the documentation hierarchy it would introduce this cycle:
╭─▶︎ CustomCompositors ─▶︎ MultiTrackComposition ─╮
╰───────────────────────────────────────────────╯
--> CustomCompositors.md:100:3-100:30
98 | - ``MultiInputCompositor``
99 | - ``Filter``
100 + - <doc:MultiTrackComposition>
| ╰─suggestion: Remove '- <doc:MultiTrackComposition>'
warning: '(any)' isn't a disambiguation for 'compositor(_:)' at '/Kadr/Video'
--> Kadr.md:55:25-55:31
53 | - ``VideoClip/at(time:)-(TimeInterval)``
54 | - ``MultiInputCompositor``
55 + - ``Video/compositor(_:)-(any)``
| ├─suggestion: Replace '(any)' with '(([CIImage],CompositorContext)->CIImage)' for 'func compositor(_ body: @Sendable @escaping ([CIImage], CompositorContext) -> CIImage) -> Video'
| ╰─suggestion: Replace '(any)' with '(MultiInputCompositor)' for 'func compositor(_ compositor: any MultiInputCompositor) -> Video'
56 | - ``Video/compositor(_:)-(closure)``
57 |
warning: '(closure)' isn't a disambiguation for 'compositor(_:)' at '/Kadr/Video'
--> Kadr.md:56:25-56:35
54 | - ``MultiInputCompositor``
55 | - ``Video/compositor(_:)-(any)``
56 + - ``Video/compositor(_:)-(closure)``
| ├─suggestion: Replace '(closure)' with '(([CIImage],CompositorContext)->CIImage)' for 'func compositor(_ body: @Sendable @escaping ([CIImage], CompositorContext) -> CIImage) -> Video'
| ╰─suggestion: Replace '(closure)' with '(MultiInputCompositor)' for 'func compositor(_ compositor: any MultiInputCompositor) -> Video'
57 |
58 | ### Audio
warning: '(any)' isn't a disambiguation for 'compositor(_:)' at '/Kadr/VideoClip'
--> Kadr.md:103:29-103:35
101 | - ``Compositor``
102 | - ``CompositorContext``
103 + - ``VideoClip/compositor(_:)-(any)``
| ├─suggestion: Replace '(any)' with '((CIImage,CompositorContext)->CIImage)' for 'func compositor(_ body: @Sendable @escaping (CIImage, CompositorContext) -> CIImage) -> VideoClip'
| ╰─suggestion: Replace '(any)' with '(Compositor)' for 'func compositor(_ compositor: any Compositor) -> VideoClip'
104 | - ``VideoClip/compositor(_:)-(closure)``
105 |
warning: '(closure)' isn't a disambiguation for 'compositor(_:)' at '/Kadr/VideoClip'
--> Kadr.md:104:29-104:39
102 | - ``CompositorContext``
103 | - ``VideoClip/compositor(_:)-(any)``
104 + - ``VideoClip/compositor(_:)-(closure)``
| ├─suggestion: Replace '(closure)' with '((CIImage,CompositorContext)->CIImage)' for 'func compositor(_ body: @Sendable @escaping (CIImage, CompositorContext) -> CIImage) -> VideoClip'
| ╰─suggestion: Replace '(closure)' with '(Compositor)' for 'func compositor(_ compositor: any Compositor) -> VideoClip'
105 |
106 | ### Preview & Introspection (v0.4+)
warning: Organizing 'Kadr/Slideshows' under 'Kadr/KeyframeAnimation' forms a cycle
Links in a "Topics section" are used to organize documentation into a hierarchy. The documentation hierarchy shouldn't contain cycles.
If this link contributed to the documentation hierarchy it would introduce this cycle:
╭─▶︎ KeyframeAnimation ─▶︎ Slideshows ─╮
╰────────────────────────────────────╯
--> KeyframeAnimation.md:103:3-103:19
101 | - ``Transform``
102 | - ``FilterID``
103 + - <doc:Slideshows>
| ╰─suggestion: Remove '- <doc:Slideshows>'
warning: 'at(time:)' doesn't exist at '/Kadr/Clip'
--> MultiTrackComposition.md:16:8-16:17
14 | ## One clip, placed by time
15 |
16 + ``Clip/at(time:)`` pins a clip to an absolute composition time. It leaves the
17 | chain — the clips around it behave as though it were not there:
18 |
warning: '7m1ip' isn't a disambiguation for 'clipID' at '/Kadr/Clip'
--> ../Layout/ClipID.swift:25:49-25:55
23 | ///
24 | /// `Transition` deliberately doesn't carry a `ClipID` — it sits between media clips
25 + /// and isn't an addressable unit. ``Clip/clipID-7m1ip`` returns `nil` for transitions.
| ├─suggestion: Remove '-7m1ip' for 'var clipID: ClipID? { get }'
| ╰─suggestion: Replace '7m1ip' with '8c9sq' for 'var clipID: ClipID? { get }'
26 | public struct ClipID: Hashable, Sendable, ExpressibleByStringLiteral, CustomStringConvertible {
27 | /// The wrapped string identifier.
warning: 'speed(curve:)' doesn't exist at '/Kadr/VideoClip'
--> ../Modifiers/Clip+Speed.swift:4:58-4:71
2 |
3 | /// Canonical representation of a clip's playback speed. v0.11 collapse of
4 + /// the two-method ``VideoClip/speed(_:)`` / ``VideoClip/speed(curve:)``
| ├─suggestion: Replace 'speed(curve:)' with 'speedCurve'
| ╰─suggestion: Replace 'speed(curve:)' with 'speed(_:)'
5 | /// pair into a single enum, making the previously-documented
6 | /// mutual-exclusion compile-time-checked.
warning: 'visible(during:)-(CMTimeRange)' doesn't exist at '/Kadr/Overlay/visibilityRange'
--> ../Overlays/Overlay.swift:31:11-31:41
29 | /// Composition time range during which this overlay is visible. `nil` (the default)
30 | /// means the overlay is visible for the entire composition. Set via
31 + /// ``visible(during:)-(CMTimeRange)`` or ``visible(during:)-(ClosedRange<TimeInterval>)``
32 | /// on the concrete overlay types.
33 | ///
warning: 'visible(during:)-(ClosedRange<TimeInterval>)' doesn't exist at '/Kadr/Overlay/visibilityRange'
--> ../Overlays/Overlay.swift:31:49-31:93
29 | /// Composition time range during which this overlay is visible. `nil` (the default)
30 | /// means the overlay is visible for the entire composition. Set via
31 + /// ``visible(during:)-(CMTimeRange)`` or ``visible(during:)-(ClosedRange<TimeInterval>)``
32 | /// on the concrete overlay types.
33 | ///
warning: 'Watermark' doesn't exist at '/Kadr/TextOverlay/positionAnimation'
--> ../Overlays/Overlay.swift:52:31-52:40
50 |
51 | /// Default: nil. ``ImageOverlay`` and ``StickerOverlay`` override with storage;
52 + /// ``TextOverlay`` and ``Watermark`` keep the default in v0.8.1.
53 | var positionAnimation: Animation<Position>? { nil }
54 |
Finished building documentation for 'Kadr' (0.48s)
Generated documentation archive at:
/Users/admin/builder/spi-builder-workspace/.docs/steliyanh/kadr/v1.1.1
Fetching https://github.com/swiftlang/swift-docc-plugin
[1/2345] Fetching swift-docc-plugin
Fetched https://github.com/swiftlang/swift-docc-plugin (1.42s)
Computing version for https://github.com/swiftlang/swift-docc-plugin
Computed https://github.com/swiftlang/swift-docc-plugin at 1.5.0 (3.66s)
Fetching https://github.com/swiftlang/swift-docc-symbolkit
[1/3850] Fetching swift-docc-symbolkit
Fetched https://github.com/swiftlang/swift-docc-symbolkit (1.49s)
Computing version for https://github.com/swiftlang/swift-docc-symbolkit
Computed https://github.com/swiftlang/swift-docc-symbolkit at 1.0.0 (2.36s)
Creating working copy for https://github.com/swiftlang/swift-docc-symbolkit
Working copy of https://github.com/swiftlang/swift-docc-symbolkit resolved at 1.0.0
Creating working copy for https://github.com/swiftlang/swift-docc-plugin
Working copy of https://github.com/swiftlang/swift-docc-plugin resolved at 1.5.0
warning: 'spi-builder-workspace': found 7 file(s) which are unhandled; explicitly declare them as resources or exclude from the target
/Users/admin/builder/spi-builder-workspace/Examples/README.md
/Users/admin/builder/spi-builder-workspace/Examples/SimpleEditor/Resources/sample_audio.mp3
/Users/admin/builder/spi-builder-workspace/Examples/SimpleEditor/Resources/sample_forest.png
/Users/admin/builder/spi-builder-workspace/Examples/SimpleEditor/Resources/sample_ocean.png
/Users/admin/builder/spi-builder-workspace/Examples/SimpleEditor/Resources/sample_purple.png
/Users/admin/builder/spi-builder-workspace/Examples/SimpleEditor/Resources/sample_sunset.png
/Users/admin/builder/spi-builder-workspace/Examples/SimpleEditor/Resources/sample_video.mp4
Building for debugging...
[Planning deferred tasks]
[18 / 41]
[20 / 43] Snippets
[30 / 92]
[35 / 92]
[38 / 92]
[39 / 92]
[43 / 92]
[45 / 92]
[48 / 92]
[51 / 92]
[53 / 92]
[54 / 92]
[65 / 92] SymbolKit
[66 / 92] Snippets
[84 / 93] SymbolKit
[84 / 93] snippet-extract-product
[90 / 97] snippet-extract-product
[93 / 97] SymbolKit
[95 / 97] snippet-extract-product
Build complete! (4.46 sec)
warning: 'spi-builder-workspace': found 7 file(s) which are unhandled; explicitly declare them as resources or exclude from the target
/Users/admin/builder/spi-builder-workspace/Examples/README.md
/Users/admin/builder/spi-builder-workspace/Examples/SimpleEditor/Resources/sample_audio.mp3
/Users/admin/builder/spi-builder-workspace/Examples/SimpleEditor/Resources/sample_forest.png
/Users/admin/builder/spi-builder-workspace/Examples/SimpleEditor/Resources/sample_ocean.png
/Users/admin/builder/spi-builder-workspace/Examples/SimpleEditor/Resources/sample_purple.png
/Users/admin/builder/spi-builder-workspace/Examples/SimpleEditor/Resources/sample_sunset.png
/Users/admin/builder/spi-builder-workspace/Examples/SimpleEditor/Resources/sample_video.mp4
Building for debugging...
[Planning deferred tasks]
[2 / 10]
[3 / 11] Kadr
[14 / 22] Kadr
[16 / 18] Kadr
Build complete! (2.12 sec)
1544
11 /Users/admin/builder/spi-builder-workspace/.docs/steliyanh/kadr/v1.1.1
✅ Doc result (uploading) reported
========================================
SyncDocs
========================================
Doc archive source directory: $PWD/.docs/steliyanh/kadr/v1.1.1
File count: 1544
Doc size: 11.0MB
Preparing doc bundle ...
Using presigned URL upload - AWS credentials not required
Uploading -steliyanh-kadr-v1.1.1-47da38f4.zip to presigned URL
Starting upload of 2378806 bytes...
Upload completed successfully
Done.