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.
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
- # VAT (Video Asset Tools) - CLI for video project management
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 'VAT - Video Asset Tools'
34
- puts 'Usage: vat [command] [options]'
35
- puts "Run 'vat help' for more information."
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 'vat help' for available commands."
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::Vat::ProjectListing.list_brands_with_counts
87
+ Appydave::Tools::Dam::ProjectListing.list_brands_with_counts
87
88
  elsif pattern_arg
88
89
  # Pattern matching
89
- Appydave::Tools::Vat::ProjectListing.list_with_pattern(brand_arg, pattern_arg)
90
+ Appydave::Tools::Dam::ProjectListing.list_with_pattern(brand_arg, pattern_arg)
90
91
  else
91
92
  # Specific brand
92
- Appydave::Tools::Vat::ProjectListing.list_brand_projects(brand_arg)
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::Vat::S3Operations.new(options[:brand], options[:project])
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::Vat::S3Operations.new(options[:brand], options[:project])
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::Vat::S3Operations.new(options[:brand], options[:project])
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::Vat::S3Operations.new(options[:brand], options[:project])
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::Vat::S3Operations.new(options[:brand], options[:project])
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::Vat::S3Operations.new(options[:brand], options[:project])
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::Vat::ManifestGenerator.new(brand_key)
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
- brand = Appydave::Tools::Vat::Config.expand_brand(brand_arg)
186
- ENV['BRAND_PATH'] = Appydave::Tools::Vat::Config.brand_path(brand)
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::Vat::ManifestGenerator.new(brand_arg)
189
+ generator = Appydave::Tools::Dam::ManifestGenerator.new(brand_arg)
189
190
  generator.generate
190
191
  else
191
- puts 'Usage: vat manifest <brand> [--all]'
192
+ puts 'Usage: dam manifest <brand> [--all]'
192
193
  puts ''
193
194
  puts 'Examples:'
194
- puts ' vat manifest appydave # Generate manifest for AppyDave brand'
195
- puts ' vat manifest --all # Generate manifests for all brands'
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::Vat::ProjectResolver.detect_from_pwd
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: vat #{command} <brand> <project> [--dry-run]"
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::Vat::Config.expand_brand(brand_arg) # Expand for path resolution
225
- project_id = Appydave::Tools::Vat::ProjectResolver.resolve(brand_arg, project_arg)
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::Vat::Config.brand_path(brand)
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
- VAT (Video Asset Tools) - Unified CLI for video project management
268
+ DAM (Video Asset Tools) - Unified CLI for video project management
239
269
 
240
- Usage: vat [command] [options]
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
- vat list All brands with counts/sizes
259
- vat list appydave All projects for brand
260
- vat list appydave 'b6*' Pattern matching
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
- vat help brands List available brands
264
- vat help workflows Explain FliVideo vs Storyline workflows
265
- vat help config Configuration file details
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
- vat list
269
- vat s3-up appydave b65
270
- vat s3-down voz boy-baker --dry-run
271
- vat s3-status appydave b65
272
- vat s3-cleanup appydave b65 --force
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
- VAT supports multi-tenant video project management with brand shortcuts:
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
- vat list # Show all brands
294
- vat list --summary # Show brands with project counts
295
- vat list appydave # List all AppyDave projects
296
- vat s3-up voz boy-baker # Upload VOZ project
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
- VAT supports two primary video content workflows:
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
- VAT uses two configuration levels:
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: vat list [brand] [pattern]
415
+ Usage: dam list [brand] [pattern]
385
416
 
386
417
  Modes:
387
418
  1. List all brands with summary:
388
- vat list
419
+ dam list
389
420
 
390
421
  2. List projects for specific brand:
391
- vat list appydave
422
+ dam list appydave
392
423
 
393
424
  3. Pattern matching:
394
- vat list appydave 'b6*' # All projects b60-b69
395
- vat list appydave 'b4*' # All projects b40-b49
425
+ dam list appydave 'b6*' # All projects b60-b69
426
+ dam list appydave 'b4*' # All projects b40-b49
396
427
 
397
428
  Examples:
398
- vat list # Tabular: brand, project count, size, modified
399
- vat list voz # Tabular: all VOZ projects with size/date
400
- vat list appydave 'b6*' # Tabular: b60-b69 projects with size/date
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: vat s3-up <brand> <project> [--dry-run]
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
- vat s3-up appydave b65 # Upload b65 project
422
- vat s3-up voz boy-baker --dry-run # Preview upload
423
- vat s3-up # Auto-detect from PWD
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: vat s3-down <brand> <project> [--dry-run]
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
- vat s3-down appydave b65 # Download b65 project
445
- vat s3-down voz boy-baker --dry-run # Preview download
446
- vat s3-down # Auto-detect from PWD
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: vat s3-status <brand> [project]
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
- vat s3-status appydave b65 # Check b65 status
468
- vat s3-status # Auto-detect from PWD
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: vat s3-cleanup-remote <brand> <project> --force [--dry-run]
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
- vat s3-cleanup-remote appydave b65 --dry-run # Preview deletion
491
- vat s3-cleanup-remote appydave b65 --force # Actually delete
492
- vat s3-cleanup-remote --force # Auto-detect from PWD
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: vat s3-cleanup-local <brand> <project> --force [--dry-run]
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
- vat s3-cleanup-local appydave b65 --dry-run # Preview deletion
515
- vat s3-cleanup-local appydave b65 --force # Actually delete
516
- vat s3-cleanup-local --force # Auto-detect from PWD
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: vat archive <brand> <project> [--force] [--dry-run]
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
- vat archive appydave b63 --dry-run # Preview archive
545
- vat archive appydave b63 # Copy to SSD only
546
- vat archive appydave b63 --force # Copy and delete local
547
- vat archive # Auto-detect from PWD
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: vat manifest <brand> [--all]
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
- vat manifest appydave # Generate manifest for AppyDave
582
- vat manifest voz # Generate manifest for VOZ
583
- vat manifest --all # Generate manifests for all brands
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 **VAT (Video Asset Tools)**. VAT IS a Digital Asset Management (DAM) system specifically designed for multi-brand video project workflows.
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
- ## VAT as a DAM System
9
+ ## DAM as a DAM System
10
10
 
11
- **VAT (Video Asset Tools)** implements this DAM vision with:
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 "VAT" instead of "DAM"?
18
+ ## Why "DAM" instead of "DAM"?
19
19
 
20
- The name "Video Asset Tools" was chosen for:
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, VAT is fundamentally a DAM system. All user stories below have been implemented in VAT.
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 VAT. All have been implemented:
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**: VAT supports 6 brands with individual configurations in `brands.json`.
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**: `vat list` command with pattern matching and project discovery.
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 VAT commands (`list`, `s3-up`, `s3-down`, `s3-status`, `archive`, `manifest`).
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**: `vat archive` (copy to SSD) and upcoming `vat sync-ssd` (restore from SSD).
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 VAT. The system provides:
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
- **VAT IS a complete DAM solution for video content creators.**
123
+ **DAM IS a complete DAM solution for video content creators.**