5.1 KiB
5.1 KiB
Tasks: enterprise-audio-timeline
Change ID: enterprise-audio-timeline
Package: @suaveplan/audio-timeline
Target path: packages/audio/audio-timeline
Prerequisite packages on Verdaccio: @suaveplan/audio-core, @suaveplan/undo, @suaveplan/fsm, @suaveplan/events, @suaveplan/error, @suaveplan/types
1. Scaffold
- Create directory
packages/audio/audio-timeline/withsrc/,tests/,src/__benchmarks__/, and all feature subdirectories per the layout inproposal.md. - Write
package.jsonat version0.1.0with"type": "module","sideEffects": false, fullexportsmap, deps:@suaveplan/audio-core workspace:^,@suaveplan/undo workspace:^,@suaveplan/fsm workspace:^,@suaveplan/events workspace:^,@suaveplan/error workspace:^,@suaveplan/types workspace:^,zod catalog:forms. - Write
tsconfig.jsonextending@suaveplan/typescript-config/library.json. - Write
vitest.config.tsusingcreateTestConfig()from@suaveplan/testing/config. - Add
lint,typecheck,test,test:coverage,build,docs:checkscripts.
2. Types + errors
- Write
src/engine/engine.types.ts—TimelineEngineOptions,TimelineState,FadeCurve,TimelineEventMap. - Write
src/track/track.types.ts—Track. - Write
src/clip/clip.types.ts—Clip. - Write
src/adapter/adapter.types.ts—TimelineAdapter. - Write co-located
.mdfiles for each types module (≥200 words). - Write
src/error-codes.ts—TimelineErrorCode,AUDIO_TIMELINE_ERROR_METADATA,registerTimelineErrorCodes(). - Write Zod schemas:
TrackSchema,ClipSchema,TimelineStateSchema,TimelineEngineOptionsSchema.
3. Track module
- Implement
src/track/track.ts— track CRUD helpers:createTrack,updateTrack,removeTrack,validateTrack. - Write
track.test.tsandtrack.md.
4. Clip module
- Implement
src/clip/clip.ts— clip helpers:createClip,validateClip,canSplitAt,constrainBoundaryTrim. - Write
clip.test.tsandclip.md.
5. Operations
- Implement
src/operations/clip-operations.ts—moveClip,splitClip,trimClip,constrainClipDrag,constrainBoundaryTrimwith overlap andminDurationguards. - Implement
src/operations/timeline-operations.ts—setSelection,setLoopRegion,setZoomLevel,zoomIn,zoomOut. - Write
clip-operations.test.ts,timeline-operations.test.ts, and both.mdfiles.
6. Adapter interface
- Implement
src/adapter/adapter.ts—NullTimelineAdapterfor tests (no-op implementation ofTimelineAdapter). - Write
adapter.test.tsandadapter.md.
7. Mixer
- Implement
src/mixer/mixer.ts—MixerState,setMasterVolume,setTrackVolume,setTrackMute,setTrackSolo,setTrackPan, solo-group logic (non-soloed tracks gain = 0 when any track is soloed). - Write
mixer.test.tsandmixer.md.
8. Zoom
- Implement
src/zoom/zoom.ts— zoom level table,zoomIn,zoomOut,setZoomLevel,canZoomIn,canZoomOut. - Write
zoom.test.tsandzoom.md.
9. TimelineEngine
- Implement
TimelineEngineinsrc/engine/engine.ts:- Constructor with
TimelineEngineOptions, optional adapter. getState()returns immutableTimelineStatesnapshot.- Track methods delegate to track module and push undo commands via
@suaveplan/undoCommandStack. - Clip methods delegate to clip-operations; no-op drags do not push undo.
- Playback methods delegate to adapter; FSM guards state transitions via
@suaveplan/fsm. - Undo/redo:
undo(),redo(),beginTransaction(),commitTransaction(),abortTransaction(). - Incremental adapter updates: on undo/redo, if track count is unchanged call
adapter.updateTrack()per changed track instead ofadapter.setTracks(). - Events: typed
on/offvia@suaveplan/eventsforplay,pause,stop,seek,trackChange,clipChange,tempoChange,loopChange,selectionChange,zoomChange. dispose()closes adapter and clears history.
- Constructor with
- Write
engine.test.ts(≤500 lines): init, play/pause/stop, add/remove track, add/move/split/trim clip, undo/redo round-trip, transaction abort. - Write
engine.md.
10. Benchmarks
- Write
src/__benchmarks__/timeline.bench.ts— create 50 tracks, add 200 clips, perform 100 undo/redo cycles.
11. Integration tests
- Write
tests/integration.test.ts— full timeline lifecycle: create tracks, add clips, playback state transitions, undo/redo round-trip, adapter incremental update verification.
12. Docs + verify + publish
- All co-located
.mdfiles (≥200 words each). - Write
README.mdat package root. bunx turbo lint typecheck test --filter=@suaveplan/audio-timeline— green.bunx turbo test:coverage --filter=@suaveplan/audio-timeline— 100%.bun scripts/publish.ts --package @suaveplan/audio-timeline.- Fold
specs/audio-timeline/spec.mdintoopenspec/specs/audio-timeline/spec.md. - Archive to
openspec/archive/2026-05-14-enterprise-audio-timeline/.