appydave-tools 0.17.1 → 0.18.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 +4 -4
- data/CHANGELOG.md +7 -0
- data/CLAUDE.md +44 -7
- data/README.md +8 -5
- data/bin/{vat → dam} +163 -83
- data/docs/{vat → dam}/dam-vision.md +13 -13
- data/docs/{vat → dam}/session-summary-2025-11-09.md +79 -79
- data/docs/{vat → dam}/usage.md +118 -93
- data/docs/{vat → dam}/vat-testing-plan.md +94 -94
- data/docs/development/CODEX-recommendations.md +11 -0
- data/lib/appydave/tools/configuration/models/brands_config.rb +18 -3
- data/lib/appydave/tools/{vat → dam}/config.rb +32 -13
- data/lib/appydave/tools/{vat → dam}/config_loader.rb +1 -1
- data/lib/appydave/tools/{vat → dam}/manifest_generator.rb +3 -3
- data/lib/appydave/tools/{vat → dam}/project_listing.rb +1 -1
- data/lib/appydave/tools/{vat → dam}/project_resolver.rb +1 -1
- data/lib/appydave/tools/{vat → dam}/s3_operations.rb +3 -3
- data/lib/appydave/tools/dam/sync_from_ssd.rb +241 -0
- data/lib/appydave/tools/version.rb +1 -1
- data/lib/appydave/tools.rb +7 -6
- data/package.json +1 -1
- metadata +13 -12
data/bin/{vat → dam}
RENAMED
|
@@ -7,7 +7,7 @@ $LOAD_PATH.unshift(File.expand_path('../lib', __dir__))
|
|
|
7
7
|
|
|
8
8
|
require 'appydave/tools'
|
|
9
9
|
|
|
10
|
-
#
|
|
10
|
+
# DAM (Video Asset Tools) - CLI for video project management
|
|
11
11
|
class VatCLI
|
|
12
12
|
def initialize
|
|
13
13
|
@commands = {
|
|
@@ -20,6 +20,7 @@ class VatCLI
|
|
|
20
20
|
's3-cleanup-local' => method(:s3_cleanup_local_command),
|
|
21
21
|
'archive' => method(:archive_command),
|
|
22
22
|
'manifest' => method(:manifest_command),
|
|
23
|
+
'sync-ssd' => method(:sync_ssd_command),
|
|
23
24
|
# Deprecated aliases (for backward compatibility)
|
|
24
25
|
's3-cleanup' => method(:s3_cleanup_remote_command),
|
|
25
26
|
'cleanup-local' => method(:s3_cleanup_local_command)
|
|
@@ -30,9 +31,9 @@ class VatCLI
|
|
|
30
31
|
command, *args = ARGV
|
|
31
32
|
|
|
32
33
|
if command.nil?
|
|
33
|
-
puts '
|
|
34
|
-
puts 'Usage:
|
|
35
|
-
puts "Run '
|
|
34
|
+
puts 'DAM - Video Asset Tools'
|
|
35
|
+
puts 'Usage: dam [command] [options]'
|
|
36
|
+
puts "Run 'dam help' for more information."
|
|
36
37
|
exit
|
|
37
38
|
end
|
|
38
39
|
|
|
@@ -40,7 +41,7 @@ class VatCLI
|
|
|
40
41
|
@commands[command].call(args)
|
|
41
42
|
else
|
|
42
43
|
puts "Unknown command: #{command}"
|
|
43
|
-
puts "Run '
|
|
44
|
+
puts "Run 'dam help' for available commands."
|
|
44
45
|
exit 1
|
|
45
46
|
end
|
|
46
47
|
end
|
|
@@ -61,7 +62,7 @@ class VatCLI
|
|
|
61
62
|
show_config_help
|
|
62
63
|
when 'list'
|
|
63
64
|
show_list_help
|
|
64
|
-
when 's3-up', 's3-down', 's3-status', 's3-cleanup-remote', 's3-cleanup-local', 'archive', 'manifest'
|
|
65
|
+
when 's3-up', 's3-down', 's3-status', 's3-cleanup-remote', 's3-cleanup-local', 'archive', 'manifest', 'sync-ssd'
|
|
65
66
|
show_s3_help(topic)
|
|
66
67
|
when 's3-cleanup', 'cleanup-local'
|
|
67
68
|
# Deprecated command names - show deprecation notice and new help
|
|
@@ -83,13 +84,13 @@ class VatCLI
|
|
|
83
84
|
|
|
84
85
|
if brand_arg.nil?
|
|
85
86
|
# List all brands with summary
|
|
86
|
-
Appydave::Tools::
|
|
87
|
+
Appydave::Tools::Dam::ProjectListing.list_brands_with_counts
|
|
87
88
|
elsif pattern_arg
|
|
88
89
|
# Pattern matching
|
|
89
|
-
Appydave::Tools::
|
|
90
|
+
Appydave::Tools::Dam::ProjectListing.list_with_pattern(brand_arg, pattern_arg)
|
|
90
91
|
else
|
|
91
92
|
# Specific brand
|
|
92
|
-
Appydave::Tools::
|
|
93
|
+
Appydave::Tools::Dam::ProjectListing.list_brand_projects(brand_arg)
|
|
93
94
|
end
|
|
94
95
|
rescue StandardError => e
|
|
95
96
|
puts "❌ Error: #{e.message}"
|
|
@@ -99,7 +100,7 @@ class VatCLI
|
|
|
99
100
|
# S3 Upload
|
|
100
101
|
def s3_up_command(args)
|
|
101
102
|
options = parse_s3_args(args, 's3-up')
|
|
102
|
-
s3_ops = Appydave::Tools::
|
|
103
|
+
s3_ops = Appydave::Tools::Dam::S3Operations.new(options[:brand], options[:project])
|
|
103
104
|
s3_ops.upload(dry_run: options[:dry_run])
|
|
104
105
|
rescue StandardError => e
|
|
105
106
|
puts "❌ Error: #{e.message}"
|
|
@@ -109,7 +110,7 @@ class VatCLI
|
|
|
109
110
|
# S3 Download
|
|
110
111
|
def s3_down_command(args)
|
|
111
112
|
options = parse_s3_args(args, 's3-down')
|
|
112
|
-
s3_ops = Appydave::Tools::
|
|
113
|
+
s3_ops = Appydave::Tools::Dam::S3Operations.new(options[:brand], options[:project])
|
|
113
114
|
s3_ops.download(dry_run: options[:dry_run])
|
|
114
115
|
rescue StandardError => e
|
|
115
116
|
puts "❌ Error: #{e.message}"
|
|
@@ -119,7 +120,7 @@ class VatCLI
|
|
|
119
120
|
# S3 Status
|
|
120
121
|
def s3_status_command(args)
|
|
121
122
|
options = parse_s3_args(args, 's3-status')
|
|
122
|
-
s3_ops = Appydave::Tools::
|
|
123
|
+
s3_ops = Appydave::Tools::Dam::S3Operations.new(options[:brand], options[:project])
|
|
123
124
|
s3_ops.status
|
|
124
125
|
rescue StandardError => e
|
|
125
126
|
puts "❌ Error: #{e.message}"
|
|
@@ -129,7 +130,7 @@ class VatCLI
|
|
|
129
130
|
# S3 Cleanup Remote
|
|
130
131
|
def s3_cleanup_remote_command(args)
|
|
131
132
|
options = parse_s3_args(args, 's3-cleanup-remote')
|
|
132
|
-
s3_ops = Appydave::Tools::
|
|
133
|
+
s3_ops = Appydave::Tools::Dam::S3Operations.new(options[:brand], options[:project])
|
|
133
134
|
s3_ops.cleanup(force: options[:force], dry_run: options[:dry_run])
|
|
134
135
|
rescue StandardError => e
|
|
135
136
|
puts "❌ Error: #{e.message}"
|
|
@@ -139,7 +140,7 @@ class VatCLI
|
|
|
139
140
|
# S3 Cleanup Local
|
|
140
141
|
def s3_cleanup_local_command(args)
|
|
141
142
|
options = parse_s3_args(args, 's3-cleanup-local')
|
|
142
|
-
s3_ops = Appydave::Tools::
|
|
143
|
+
s3_ops = Appydave::Tools::Dam::S3Operations.new(options[:brand], options[:project])
|
|
143
144
|
s3_ops.cleanup_local(force: options[:force], dry_run: options[:dry_run])
|
|
144
145
|
rescue StandardError => e
|
|
145
146
|
puts "❌ Error: #{e.message}"
|
|
@@ -149,7 +150,7 @@ class VatCLI
|
|
|
149
150
|
# Archive project to SSD
|
|
150
151
|
def archive_command(args)
|
|
151
152
|
options = parse_s3_args(args, 'archive')
|
|
152
|
-
s3_ops = Appydave::Tools::
|
|
153
|
+
s3_ops = Appydave::Tools::Dam::S3Operations.new(options[:brand], options[:project])
|
|
153
154
|
s3_ops.archive(force: options[:force], dry_run: options[:dry_run])
|
|
154
155
|
rescue StandardError => e
|
|
155
156
|
puts "❌ Error: #{e.message}"
|
|
@@ -173,7 +174,7 @@ class VatCLI
|
|
|
173
174
|
puts ''
|
|
174
175
|
puts '=' * 60
|
|
175
176
|
|
|
176
|
-
generator = Appydave::Tools::
|
|
177
|
+
generator = Appydave::Tools::Dam::ManifestGenerator.new(brand_key)
|
|
177
178
|
generator.generate
|
|
178
179
|
end
|
|
179
180
|
|
|
@@ -182,17 +183,17 @@ class VatCLI
|
|
|
182
183
|
puts '✅ All brand manifests generated!'
|
|
183
184
|
elsif brand_arg
|
|
184
185
|
# Generate manifest for specific brand
|
|
185
|
-
|
|
186
|
-
ENV['BRAND_PATH'] = Appydave::Tools::
|
|
186
|
+
Appydave::Tools::Dam::Config.expand_brand(brand_arg)
|
|
187
|
+
ENV['BRAND_PATH'] = Appydave::Tools::Dam::Config.brand_path(brand_arg)
|
|
187
188
|
|
|
188
|
-
generator = Appydave::Tools::
|
|
189
|
+
generator = Appydave::Tools::Dam::ManifestGenerator.new(brand_arg)
|
|
189
190
|
generator.generate
|
|
190
191
|
else
|
|
191
|
-
puts 'Usage:
|
|
192
|
+
puts 'Usage: dam manifest <brand> [--all]'
|
|
192
193
|
puts ''
|
|
193
194
|
puts 'Examples:'
|
|
194
|
-
puts '
|
|
195
|
-
puts '
|
|
195
|
+
puts ' dam manifest appydave # Generate manifest for AppyDave brand'
|
|
196
|
+
puts ' dam manifest --all # Generate manifests for all brands'
|
|
196
197
|
exit 1
|
|
197
198
|
end
|
|
198
199
|
rescue StandardError => e
|
|
@@ -201,6 +202,35 @@ class VatCLI
|
|
|
201
202
|
end
|
|
202
203
|
# rubocop:enable Metrics/MethodLength
|
|
203
204
|
|
|
205
|
+
# Sync light files from SSD to local
|
|
206
|
+
def sync_ssd_command(args)
|
|
207
|
+
dry_run = args.include?('--dry-run')
|
|
208
|
+
args = args.reject { |arg| arg.start_with?('--') }
|
|
209
|
+
brand_arg = args[0]
|
|
210
|
+
|
|
211
|
+
if brand_arg
|
|
212
|
+
# Sync specific brand
|
|
213
|
+
Appydave::Tools::Dam::Config.expand_brand(brand_arg)
|
|
214
|
+
ENV['BRAND_PATH'] = Appydave::Tools::Dam::Config.brand_path(brand_arg)
|
|
215
|
+
|
|
216
|
+
syncer = Appydave::Tools::Dam::SyncFromSsd.new(brand_arg)
|
|
217
|
+
syncer.sync(dry_run: dry_run)
|
|
218
|
+
else
|
|
219
|
+
puts 'Usage: dam sync-ssd <brand> [--dry-run]'
|
|
220
|
+
puts ''
|
|
221
|
+
puts 'Sync light files (subtitles, images, docs) from SSD to local for archived projects.'
|
|
222
|
+
puts 'Does NOT sync heavy video files (MP4, MOV, etc.).'
|
|
223
|
+
puts ''
|
|
224
|
+
puts 'Examples:'
|
|
225
|
+
puts ' dam sync-ssd appydave # Sync all AppyDave projects from SSD'
|
|
226
|
+
puts ' dam sync-ssd appydave --dry-run # Preview what would be synced'
|
|
227
|
+
exit 1
|
|
228
|
+
end
|
|
229
|
+
rescue StandardError => e
|
|
230
|
+
puts "❌ Error: #{e.message}"
|
|
231
|
+
exit 1
|
|
232
|
+
end
|
|
233
|
+
|
|
204
234
|
# Parse S3 command arguments
|
|
205
235
|
def parse_s3_args(args, command)
|
|
206
236
|
dry_run = args.include?('--dry-run')
|
|
@@ -212,21 +242,21 @@ class VatCLI
|
|
|
212
242
|
|
|
213
243
|
if brand_arg.nil?
|
|
214
244
|
# Auto-detect from PWD
|
|
215
|
-
brand, project_id = Appydave::Tools::
|
|
245
|
+
brand, project_id = Appydave::Tools::Dam::ProjectResolver.detect_from_pwd
|
|
216
246
|
if brand.nil? || project_id.nil?
|
|
217
247
|
puts '❌ Could not auto-detect brand/project from current directory'
|
|
218
|
-
puts "Usage:
|
|
248
|
+
puts "Usage: dam #{command} <brand> <project> [--dry-run]"
|
|
219
249
|
exit 1
|
|
220
250
|
end
|
|
221
251
|
brand_key = brand # Already detected, use as-is
|
|
222
252
|
else
|
|
223
253
|
brand_key = brand_arg # Use the shortcut/key (e.g., 'appydave')
|
|
224
|
-
brand = Appydave::Tools::
|
|
225
|
-
project_id = Appydave::Tools::
|
|
254
|
+
brand = Appydave::Tools::Dam::Config.expand_brand(brand_arg) # Expand for path resolution
|
|
255
|
+
project_id = Appydave::Tools::Dam::ProjectResolver.resolve(brand_arg, project_arg)
|
|
226
256
|
end
|
|
227
257
|
|
|
228
258
|
# Set ENV for compatibility with ConfigLoader
|
|
229
|
-
ENV['BRAND_PATH'] = Appydave::Tools::
|
|
259
|
+
ENV['BRAND_PATH'] = Appydave::Tools::Dam::Config.brand_path(brand)
|
|
230
260
|
|
|
231
261
|
{ brand: brand_key, project: project_id, dry_run: dry_run, force: force }
|
|
232
262
|
end
|
|
@@ -235,9 +265,9 @@ class VatCLI
|
|
|
235
265
|
# rubocop:disable Metrics/MethodLength
|
|
236
266
|
def show_main_help
|
|
237
267
|
puts <<~HELP
|
|
238
|
-
|
|
268
|
+
DAM (Video Asset Tools) - Unified CLI for video project management
|
|
239
269
|
|
|
240
|
-
Usage:
|
|
270
|
+
Usage: dam [command] [options]
|
|
241
271
|
|
|
242
272
|
Available Commands:
|
|
243
273
|
help [command] Show help information
|
|
@@ -253,23 +283,24 @@ class VatCLI
|
|
|
253
283
|
Archive Commands:
|
|
254
284
|
archive <brand> <project> Copy project to SSD backup
|
|
255
285
|
manifest <brand> [--all] Generate project manifest
|
|
286
|
+
sync-ssd <brand> Restore light files from SSD
|
|
256
287
|
|
|
257
288
|
List Modes:
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
289
|
+
dam list All brands with counts/sizes
|
|
290
|
+
dam list appydave All projects for brand
|
|
291
|
+
dam list appydave 'b6*' Pattern matching
|
|
261
292
|
|
|
262
293
|
Help Topics:
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
294
|
+
dam help brands List available brands
|
|
295
|
+
dam help workflows Explain FliVideo vs Storyline workflows
|
|
296
|
+
dam help config Configuration file details
|
|
266
297
|
|
|
267
298
|
Examples:
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
299
|
+
dam list
|
|
300
|
+
dam s3-up appydave b65
|
|
301
|
+
dam s3-down voz boy-baker --dry-run
|
|
302
|
+
dam s3-status appydave b65
|
|
303
|
+
dam s3-cleanup appydave b65 --force
|
|
273
304
|
|
|
274
305
|
For more information: https://github.com/appydave/appydave-tools
|
|
275
306
|
HELP
|
|
@@ -279,7 +310,7 @@ class VatCLI
|
|
|
279
310
|
puts <<~HELP
|
|
280
311
|
Available Brands
|
|
281
312
|
|
|
282
|
-
|
|
313
|
+
DAM supports multi-tenant video project management with brand shortcuts:
|
|
283
314
|
|
|
284
315
|
Brand Shortcuts:
|
|
285
316
|
appydave → v-appydave (AppyDave brand videos)
|
|
@@ -290,10 +321,10 @@ class VatCLI
|
|
|
290
321
|
ss → v-supportsignal (SupportSignal client)
|
|
291
322
|
|
|
292
323
|
Usage:
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
324
|
+
dam list # Show all brands
|
|
325
|
+
dam list --summary # Show brands with project counts
|
|
326
|
+
dam list appydave # List all AppyDave projects
|
|
327
|
+
dam s3-up voz boy-baker # Upload VOZ project
|
|
297
328
|
HELP
|
|
298
329
|
end
|
|
299
330
|
|
|
@@ -301,7 +332,7 @@ class VatCLI
|
|
|
301
332
|
puts <<~HELP
|
|
302
333
|
Video Workflows
|
|
303
334
|
|
|
304
|
-
|
|
335
|
+
DAM supports two primary video content workflows:
|
|
305
336
|
|
|
306
337
|
1. FliVideo Workflow (AppyDave)
|
|
307
338
|
- Sequential chapter-based recording
|
|
@@ -335,7 +366,7 @@ class VatCLI
|
|
|
335
366
|
puts <<~HELP
|
|
336
367
|
Configuration
|
|
337
368
|
|
|
338
|
-
|
|
369
|
+
DAM uses two configuration levels:
|
|
339
370
|
|
|
340
371
|
1. System Configuration (settings.json)
|
|
341
372
|
Location: ~/.config/appydave/settings.json
|
|
@@ -381,23 +412,23 @@ class VatCLI
|
|
|
381
412
|
puts <<~HELP
|
|
382
413
|
List Command
|
|
383
414
|
|
|
384
|
-
Usage:
|
|
415
|
+
Usage: dam list [brand] [pattern]
|
|
385
416
|
|
|
386
417
|
Modes:
|
|
387
418
|
1. List all brands with summary:
|
|
388
|
-
|
|
419
|
+
dam list
|
|
389
420
|
|
|
390
421
|
2. List projects for specific brand:
|
|
391
|
-
|
|
422
|
+
dam list appydave
|
|
392
423
|
|
|
393
424
|
3. Pattern matching:
|
|
394
|
-
|
|
395
|
-
|
|
425
|
+
dam list appydave 'b6*' # All projects b60-b69
|
|
426
|
+
dam list appydave 'b4*' # All projects b40-b49
|
|
396
427
|
|
|
397
428
|
Examples:
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
429
|
+
dam list # Tabular: brand, project count, size, modified
|
|
430
|
+
dam list voz # Tabular: all VOZ projects with size/date
|
|
431
|
+
dam list appydave 'b6*' # Tabular: b60-b69 projects with size/date
|
|
401
432
|
HELP
|
|
402
433
|
end
|
|
403
434
|
|
|
@@ -410,7 +441,7 @@ class VatCLI
|
|
|
410
441
|
|
|
411
442
|
Upload files from local s3-staging/ directory to S3 for collaboration.
|
|
412
443
|
|
|
413
|
-
Usage:
|
|
444
|
+
Usage: dam s3-up <brand> <project> [--dry-run]
|
|
414
445
|
|
|
415
446
|
Features:
|
|
416
447
|
- Smart sync: Skips unchanged files (MD5 comparison)
|
|
@@ -418,9 +449,9 @@ class VatCLI
|
|
|
418
449
|
- Dry-run support: Preview changes without uploading
|
|
419
450
|
|
|
420
451
|
Examples:
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
452
|
+
dam s3-up appydave b65 # Upload b65 project
|
|
453
|
+
dam s3-up voz boy-baker --dry-run # Preview upload
|
|
454
|
+
dam s3-up # Auto-detect from PWD
|
|
424
455
|
|
|
425
456
|
Notes:
|
|
426
457
|
- Files must be in project's s3-staging/ directory
|
|
@@ -433,7 +464,7 @@ class VatCLI
|
|
|
433
464
|
|
|
434
465
|
Download files from S3 to local s3-staging/ directory.
|
|
435
466
|
|
|
436
|
-
Usage:
|
|
467
|
+
Usage: dam s3-down <brand> <project> [--dry-run]
|
|
437
468
|
|
|
438
469
|
Features:
|
|
439
470
|
- Smart sync: Skips unchanged files (MD5 comparison)
|
|
@@ -441,9 +472,9 @@ class VatCLI
|
|
|
441
472
|
- Dry-run support: Preview changes without downloading
|
|
442
473
|
|
|
443
474
|
Examples:
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
475
|
+
dam s3-down appydave b65 # Download b65 project
|
|
476
|
+
dam s3-down voz boy-baker --dry-run # Preview download
|
|
477
|
+
dam s3-down # Auto-detect from PWD
|
|
447
478
|
|
|
448
479
|
Notes:
|
|
449
480
|
- Creates s3-staging/ directory if needed
|
|
@@ -455,7 +486,7 @@ class VatCLI
|
|
|
455
486
|
|
|
456
487
|
Check sync status between local and S3 files.
|
|
457
488
|
|
|
458
|
-
Usage:
|
|
489
|
+
Usage: dam s3-status <brand> [project]
|
|
459
490
|
|
|
460
491
|
Features:
|
|
461
492
|
- Shows all files (S3 and local)
|
|
@@ -464,8 +495,8 @@ class VatCLI
|
|
|
464
495
|
- Shows file counts for both S3 and local
|
|
465
496
|
|
|
466
497
|
Examples:
|
|
467
|
-
|
|
468
|
-
|
|
498
|
+
dam s3-status appydave b65 # Check b65 status
|
|
499
|
+
dam s3-status # Auto-detect from PWD
|
|
469
500
|
|
|
470
501
|
Status Indicators:
|
|
471
502
|
✓ [synced] - Local and S3 match (MD5)
|
|
@@ -479,7 +510,7 @@ class VatCLI
|
|
|
479
510
|
|
|
480
511
|
Delete all S3 files for a project (use with caution).
|
|
481
512
|
|
|
482
|
-
Usage:
|
|
513
|
+
Usage: dam s3-cleanup-remote <brand> <project> --force [--dry-run]
|
|
483
514
|
|
|
484
515
|
Features:
|
|
485
516
|
- Requires --force flag for safety
|
|
@@ -487,9 +518,9 @@ class VatCLI
|
|
|
487
518
|
- Shows deleted/failed counts
|
|
488
519
|
|
|
489
520
|
Examples:
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
521
|
+
dam s3-cleanup-remote appydave b65 --dry-run # Preview deletion
|
|
522
|
+
dam s3-cleanup-remote appydave b65 --force # Actually delete
|
|
523
|
+
dam s3-cleanup-remote --force # Auto-detect from PWD
|
|
493
524
|
|
|
494
525
|
⚠️ WARNING: This permanently deletes files from S3.
|
|
495
526
|
Ensure you have local backups before running.
|
|
@@ -502,7 +533,7 @@ class VatCLI
|
|
|
502
533
|
|
|
503
534
|
Delete all local files in the s3-staging/ directory for a project.
|
|
504
535
|
|
|
505
|
-
Usage:
|
|
536
|
+
Usage: dam s3-cleanup-local <brand> <project> --force [--dry-run]
|
|
506
537
|
|
|
507
538
|
Features:
|
|
508
539
|
- Requires --force flag for safety
|
|
@@ -511,9 +542,9 @@ class VatCLI
|
|
|
511
542
|
- Shows deleted/failed counts
|
|
512
543
|
|
|
513
544
|
Examples:
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
545
|
+
dam s3-cleanup-local appydave b65 --dry-run # Preview deletion
|
|
546
|
+
dam s3-cleanup-local appydave b65 --force # Actually delete
|
|
547
|
+
dam s3-cleanup-local --force # Auto-detect from PWD
|
|
517
548
|
|
|
518
549
|
Use Cases:
|
|
519
550
|
- Free up disk space after uploading to S3
|
|
@@ -531,7 +562,7 @@ class VatCLI
|
|
|
531
562
|
|
|
532
563
|
Copy completed video project to SSD for long-term backup.
|
|
533
564
|
|
|
534
|
-
Usage:
|
|
565
|
+
Usage: dam archive <brand> <project> [--force] [--dry-run]
|
|
535
566
|
|
|
536
567
|
Features:
|
|
537
568
|
- Copies entire project directory to SSD backup location
|
|
@@ -541,10 +572,10 @@ class VatCLI
|
|
|
541
572
|
- Dry-run support: Preview archive operation
|
|
542
573
|
|
|
543
574
|
Examples:
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
575
|
+
dam archive appydave b63 --dry-run # Preview archive
|
|
576
|
+
dam archive appydave b63 # Copy to SSD only
|
|
577
|
+
dam archive appydave b63 --force # Copy and delete local
|
|
578
|
+
dam archive # Auto-detect from PWD
|
|
548
579
|
|
|
549
580
|
Storage Strategy:
|
|
550
581
|
Local → S3 (90-day collaboration) → SSD (long-term archive)
|
|
@@ -567,7 +598,7 @@ class VatCLI
|
|
|
567
598
|
|
|
568
599
|
Generate a JSON manifest of all video projects for a brand.
|
|
569
600
|
|
|
570
|
-
Usage:
|
|
601
|
+
Usage: dam manifest <brand> [--all]
|
|
571
602
|
|
|
572
603
|
Features:
|
|
573
604
|
- Scans local and SSD storage locations
|
|
@@ -578,9 +609,9 @@ class VatCLI
|
|
|
578
609
|
- Outputs projects.json in brand directory
|
|
579
610
|
|
|
580
611
|
Examples:
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
612
|
+
dam manifest appydave # Generate manifest for AppyDave
|
|
613
|
+
dam manifest voz # Generate manifest for VOZ
|
|
614
|
+
dam manifest --all # Generate manifests for all brands
|
|
584
615
|
|
|
585
616
|
Output Location:
|
|
586
617
|
- Single brand: <brand-path>/projects.json
|
|
@@ -613,6 +644,55 @@ class VatCLI
|
|
|
613
644
|
- Validate project naming conventions
|
|
614
645
|
- Prepare for sync-ssd operations
|
|
615
646
|
HELP
|
|
647
|
+
when 'sync-ssd'
|
|
648
|
+
puts <<~HELP
|
|
649
|
+
Sync from SSD Command
|
|
650
|
+
|
|
651
|
+
Restore light files (subtitles, images, docs) from SSD to local for archived projects.
|
|
652
|
+
Does NOT sync heavy video files (MP4, MOV, etc.).
|
|
653
|
+
|
|
654
|
+
Usage: dam sync-ssd <brand> [--dry-run]
|
|
655
|
+
|
|
656
|
+
Features:
|
|
657
|
+
- Syncs ALL projects for a brand from manifest (projects.json)
|
|
658
|
+
- Only copies light files: .srt, .vtt, .jpg, .png, .md, .txt, .json
|
|
659
|
+
- Excludes heavy files: .mp4, .mov, .avi, .mkv, .webm
|
|
660
|
+
- Smart skip: Skips files already synced (size comparison)
|
|
661
|
+
- Creates archived/{range}/{project}/ directory structure
|
|
662
|
+
- Dry-run support: Preview what will be synced
|
|
663
|
+
|
|
664
|
+
Examples:
|
|
665
|
+
dam sync-ssd appydave # Sync all AppyDave projects
|
|
666
|
+
dam sync-ssd appydave --dry-run # Preview sync
|
|
667
|
+
dam sync-ssd voz # Sync all VOZ projects
|
|
668
|
+
|
|
669
|
+
Requirements:
|
|
670
|
+
- Must have projects.json manifest (run: dam manifest <brand>)
|
|
671
|
+
- SSD must be mounted
|
|
672
|
+
- Projects must exist on SSD
|
|
673
|
+
|
|
674
|
+
Behavior:
|
|
675
|
+
- Only syncs projects that exist on SSD but NOT in local flat structure
|
|
676
|
+
- Creates archived/{range}/{project}/ structure for restored files
|
|
677
|
+
- Skips projects already in local flat structure
|
|
678
|
+
- Skips files with same size (already synced)
|
|
679
|
+
|
|
680
|
+
Use Cases:
|
|
681
|
+
- Restore supporting files for archived projects
|
|
682
|
+
- Get subtitles and images without huge video files
|
|
683
|
+
- Prepare project for re-editing (download videos separately)
|
|
684
|
+
- Access project documentation and metadata
|
|
685
|
+
|
|
686
|
+
Storage Strategy:
|
|
687
|
+
SSD (archive) → Local archived/{range}/{project}/ (light files only)
|
|
688
|
+
|
|
689
|
+
⚠️ NOTE: This only syncs LIGHT files. Heavy video files remain on SSD.
|
|
690
|
+
If you need video files, copy them manually from SSD.
|
|
691
|
+
|
|
692
|
+
Configuration:
|
|
693
|
+
- SSD backup path configured per brand in brands.json
|
|
694
|
+
- Manifest file: <brand-path>/projects.json
|
|
695
|
+
HELP
|
|
616
696
|
end
|
|
617
697
|
end
|
|
618
698
|
# rubocop:enable Metrics/CyclomaticComplexity
|
|
@@ -1,39 +1,39 @@
|
|
|
1
1
|
# DAM Vision - Digital Asset Management for Video Projects
|
|
2
2
|
|
|
3
|
-
> **Note**: This is the original vision document for what became **
|
|
3
|
+
> **Note**: This is the original vision document for what became **DAM (Digital Asset Management)**. DAM IS a Digital Asset Management (DAM) system specifically designed for multi-brand video project workflows.
|
|
4
4
|
|
|
5
5
|
## What is DAM?
|
|
6
6
|
|
|
7
7
|
Digital Asset Management (DAM) is a system that stores, organizes, and retrieves digital assets such as images, videos, and other multimedia files. DAM systems are used by organizations to manage their digital assets efficiently and effectively.
|
|
8
8
|
|
|
9
|
-
##
|
|
9
|
+
## DAM as a DAM System
|
|
10
10
|
|
|
11
|
-
**
|
|
11
|
+
**DAM (Digital Asset Management)** implements this DAM vision with:
|
|
12
12
|
- Multi-tenant brand management (6 brands: AppyDave, VOZ, AITLDR, Kiros, Beauty & Joy, SupportSignal)
|
|
13
13
|
- Hybrid storage strategy (Local → S3 → SSD)
|
|
14
14
|
- Project lifecycle management (create, archive, restore)
|
|
15
15
|
- Asset organization and discovery
|
|
16
16
|
- Configurable workflows per brand
|
|
17
17
|
|
|
18
|
-
## Why "
|
|
18
|
+
## Why "DAM" instead of "DAM"?
|
|
19
19
|
|
|
20
|
-
The name "
|
|
20
|
+
The name "Digital Asset Management" was chosen for:
|
|
21
21
|
- Specificity to video content creation workflows
|
|
22
22
|
- Simplicity for command-line usage
|
|
23
23
|
- Backward compatibility with existing tooling
|
|
24
24
|
|
|
25
|
-
However,
|
|
25
|
+
However, DAM is fundamentally a DAM system. All user stories below have been implemented in DAM.
|
|
26
26
|
|
|
27
27
|
---
|
|
28
28
|
|
|
29
29
|
## Original User Stories
|
|
30
30
|
|
|
31
|
-
These user stories defined the vision for what became
|
|
31
|
+
These user stories defined the vision for what became DAM. All have been implemented:
|
|
32
32
|
|
|
33
33
|
### Multi-Brand Management ✅
|
|
34
34
|
**Story**: As a content creator, I want to keep track of the different brands I'm running where a business unit represents brand.
|
|
35
35
|
|
|
36
|
-
**Implementation**:
|
|
36
|
+
**Implementation**: DAM supports 6 brands with individual configurations in `brands.json`.
|
|
37
37
|
|
|
38
38
|
### Brand Configuration ✅
|
|
39
39
|
**Story**: As a content creator, I want to manage the types of projects and extra configuration associated with each brand.
|
|
@@ -43,7 +43,7 @@ These user stories defined the vision for what became VAT. All have been impleme
|
|
|
43
43
|
### Asset Discovery ✅
|
|
44
44
|
**Story**: As a content creator, I want to be able to find assets associated with a project and brand.
|
|
45
45
|
|
|
46
|
-
**Implementation**: `
|
|
46
|
+
**Implementation**: `dam list` command with pattern matching and project discovery.
|
|
47
47
|
|
|
48
48
|
### Multi-Location Storage ✅
|
|
49
49
|
**Story**: As a content creator, I may need to split specific projects across multiple drive locations for short and long-term storage and for team sharing.
|
|
@@ -68,12 +68,12 @@ These user stories defined the vision for what became VAT. All have been impleme
|
|
|
68
68
|
### Project Management ✅
|
|
69
69
|
**Story**: As a content creator, I need to be able to create, remove, rename, update, list project files.
|
|
70
70
|
|
|
71
|
-
**Implementation**: Full CRUD operations via
|
|
71
|
+
**Implementation**: Full CRUD operations via DAM commands (`list`, `s3-up`, `s3-down`, `s3-status`, `archive`, `manifest`).
|
|
72
72
|
|
|
73
73
|
### Archive/Restore ✅
|
|
74
74
|
**Story**: As a content creator, I need to be able to archive or reverse archive project files.
|
|
75
75
|
|
|
76
|
-
**Implementation**: `
|
|
76
|
+
**Implementation**: `dam archive` (copy to SSD) and upcoming `dam sync-ssd` (restore from SSD).
|
|
77
77
|
|
|
78
78
|
### Transcription Management ✅
|
|
79
79
|
**Story**: As a content creator, I need to be able to work with video transcriptions for use by various AI tools.
|
|
@@ -109,7 +109,7 @@ These user stories defined the vision for what became VAT. All have been impleme
|
|
|
109
109
|
|
|
110
110
|
## Implementation Summary
|
|
111
111
|
|
|
112
|
-
All original DAM user stories have been fully implemented in
|
|
112
|
+
All original DAM user stories have been fully implemented in DAM. The system provides:
|
|
113
113
|
|
|
114
114
|
✅ Multi-brand video project management
|
|
115
115
|
✅ Hybrid storage (Local/S3/SSD)
|
|
@@ -120,4 +120,4 @@ All original DAM user stories have been fully implemented in VAT. The system pro
|
|
|
120
120
|
✅ Comprehensive CLI with help system
|
|
121
121
|
✅ 297 automated tests, 90.69% coverage
|
|
122
122
|
|
|
123
|
-
**
|
|
123
|
+
**DAM IS a complete DAM solution for video content creators.**
|