appydave-tools 0.20.1 → 0.21.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/bin/bank_reconciliation.rb +0 -1
- data/bin/configuration.rb +0 -1
- data/bin/dam +257 -15
- data/docs/dam/dam-testing-plan.md +39 -70
- data/docs/dam/prd-client-sharing.md +693 -0
- data/docs/dam/windows/README.md +40 -0
- data/lib/appydave/tools/dam/manifest_generator.rb +89 -36
- data/lib/appydave/tools/dam/repo_push.rb +1 -1
- data/lib/appydave/tools/dam/repo_status.rb +30 -8
- data/lib/appydave/tools/dam/s3_operations.rb +64 -8
- data/lib/appydave/tools/dam/share_operations.rb +234 -0
- data/lib/appydave/tools/dam/status.rb +8 -4
- data/lib/appydave/tools/version.rb +1 -1
- data/lib/appydave/tools.rb +1 -0
- data/package.json +1 -1
- metadata +7 -7
- data/docs/SESSION-SUMMARY-WINDOWS-PREP.md +0 -340
- data/docs/WINDOWS-COMPATIBILITY-REPORT.md +0 -429
- data/docs/WINDOWS-START-HERE.md +0 -202
- /data/docs/dam/{windows-testing-guide.md → windows/dam-testing-plan-windows-powershell.md} +0 -0
- /data/docs/{WINDOWS-SETUP.md → dam/windows/installation.md} +0 -0
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: c9c1294eb12c004bfbf7d5c3af2ad72e70202729867d5b2e1978d6710f573eca
|
|
4
|
+
data.tar.gz: 4c00d396ba791995706c8caea17eb36b65c0c6142533281ceb83d75e74a90d00
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 9c9e76453f9594c21c6e5a3571369f715eda1c5262fc5e80429776ed1a4e6afc29a6f258c238df3ef68ed3fc6a769dc5186168674aa90c9d0ee8705e2d056da9
|
|
7
|
+
data.tar.gz: 1dac5dcaa14e3731fff08d6bfb0f3b6128549920503dd6e5869caf89696d40b6e4f745afeade7261d7ccc0a51baa93722b4204b8808b140537c041f393c77703
|
data/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
## [0.20.1](https://github.com/appydave/appydave-tools/compare/v0.20.0...v0.20.1) (2025-11-10)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* remove noisy backup log message from self-healing config saves ([f9dacfd](https://github.com/appydave/appydave-tools/commit/f9dacfd74cce5f991c7f4bafb12d1494aa6ee4ab))
|
|
7
|
+
|
|
1
8
|
# [0.20.0](https://github.com/appydave/appydave-tools/compare/v0.19.0...v0.20.0) (2025-11-10)
|
|
2
9
|
|
|
3
10
|
|
data/bin/bank_reconciliation.rb
CHANGED
data/bin/configuration.rb
CHANGED
data/bin/dam
CHANGED
|
@@ -25,6 +25,8 @@ class VatCLI
|
|
|
25
25
|
'repo-status' => method(:repo_status_command),
|
|
26
26
|
'repo-sync' => method(:repo_sync_command),
|
|
27
27
|
'repo-push' => method(:repo_push_command),
|
|
28
|
+
's3-share' => method(:s3_share_command),
|
|
29
|
+
's3-discover' => method(:s3_discover_command),
|
|
28
30
|
# Deprecated aliases (for backward compatibility)
|
|
29
31
|
's3-cleanup' => method(:s3_cleanup_remote_command),
|
|
30
32
|
'cleanup-local' => method(:s3_cleanup_local_command)
|
|
@@ -66,6 +68,10 @@ class VatCLI
|
|
|
66
68
|
show_config_help
|
|
67
69
|
when 'list'
|
|
68
70
|
show_list_help
|
|
71
|
+
when 's3-share'
|
|
72
|
+
show_s3_share_help
|
|
73
|
+
when 's3-discover'
|
|
74
|
+
show_s3_discover_help
|
|
69
75
|
when 's3-up', 's3-down', 's3-status', 's3-cleanup-remote', 's3-cleanup-local', 'archive', 'manifest', 'sync-ssd'
|
|
70
76
|
show_s3_help(topic)
|
|
71
77
|
when 's3-cleanup', 'cleanup-local'
|
|
@@ -151,6 +157,30 @@ class VatCLI
|
|
|
151
157
|
exit 1
|
|
152
158
|
end
|
|
153
159
|
|
|
160
|
+
# Share file via pre-signed URL
|
|
161
|
+
def s3_share_command(args)
|
|
162
|
+
options = parse_share_args(args)
|
|
163
|
+
|
|
164
|
+
share_ops = Appydave::Tools::Dam::ShareOperations.new(options[:brand], options[:project])
|
|
165
|
+
share_ops.generate_links(files: options[:file], expires: options[:expires], download: options[:download])
|
|
166
|
+
rescue StandardError => e
|
|
167
|
+
puts "❌ Error: #{e.message}"
|
|
168
|
+
exit 1
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
# Discover files in S3 for a project
|
|
172
|
+
def s3_discover_command(args)
|
|
173
|
+
options = parse_discover_args(args)
|
|
174
|
+
files = fetch_s3_files(options[:brand_key], options[:project_id])
|
|
175
|
+
|
|
176
|
+
return if handle_empty_files?(files, options[:brand_key], options[:project_id])
|
|
177
|
+
|
|
178
|
+
display_s3_files(files, options[:brand_key], options[:project_id], options[:shareable])
|
|
179
|
+
rescue StandardError => e
|
|
180
|
+
puts "❌ Error: #{e.message}"
|
|
181
|
+
exit 1
|
|
182
|
+
end
|
|
183
|
+
|
|
154
184
|
# Archive project to SSD
|
|
155
185
|
def archive_command(args)
|
|
156
186
|
options = parse_s3_args(args, 'archive')
|
|
@@ -273,19 +303,14 @@ class VatCLI
|
|
|
273
303
|
project_arg = args[1]
|
|
274
304
|
|
|
275
305
|
if brand_arg.nil?
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
puts '❌ Could not auto-detect brand from current directory'
|
|
280
|
-
puts 'Usage: dam status <brand> [project]'
|
|
281
|
-
exit 1
|
|
282
|
-
end
|
|
283
|
-
brand_key = brand
|
|
284
|
-
else
|
|
285
|
-
brand_key = brand_arg
|
|
286
|
-
project_id = project_arg ? Appydave::Tools::Dam::ProjectResolver.resolve(brand_arg, project_arg) : nil
|
|
306
|
+
puts '❌ Brand argument required'
|
|
307
|
+
puts 'Usage: dam status <brand> [project]'
|
|
308
|
+
exit 1
|
|
287
309
|
end
|
|
288
310
|
|
|
311
|
+
brand_key = brand_arg
|
|
312
|
+
project_id = project_arg ? Appydave::Tools::Dam::ProjectResolver.resolve(brand_arg, project_arg) : nil
|
|
313
|
+
|
|
289
314
|
status = Appydave::Tools::Dam::Status.new(brand_key, project_id)
|
|
290
315
|
status.show
|
|
291
316
|
rescue StandardError => e
|
|
@@ -402,6 +427,113 @@ class VatCLI
|
|
|
402
427
|
{ brand: brand_key, project: project_id, dry_run: dry_run, force: force }
|
|
403
428
|
end
|
|
404
429
|
|
|
430
|
+
def parse_share_args(args)
|
|
431
|
+
# Extract --expires flag
|
|
432
|
+
expires = '7d' # default
|
|
433
|
+
if (expires_index = args.index('--expires'))
|
|
434
|
+
expires = args[expires_index + 1]
|
|
435
|
+
args.delete_at(expires_index + 1)
|
|
436
|
+
args.delete_at(expires_index)
|
|
437
|
+
end
|
|
438
|
+
|
|
439
|
+
# Extract --download flag
|
|
440
|
+
download = args.include?('--download')
|
|
441
|
+
|
|
442
|
+
# Remove other flags
|
|
443
|
+
args = args.reject { |arg| arg.start_with?('--') }
|
|
444
|
+
|
|
445
|
+
brand_arg = args[0]
|
|
446
|
+
project_arg = args[1]
|
|
447
|
+
file_arg = args[2]
|
|
448
|
+
|
|
449
|
+
show_share_usage_and_exit if brand_arg.nil? || project_arg.nil? || file_arg.nil?
|
|
450
|
+
|
|
451
|
+
brand_key = brand_arg
|
|
452
|
+
brand = Appydave::Tools::Dam::Config.expand_brand(brand_arg)
|
|
453
|
+
project_id = Appydave::Tools::Dam::ProjectResolver.resolve(brand_arg, project_arg)
|
|
454
|
+
|
|
455
|
+
# Set ENV for compatibility with ConfigLoader
|
|
456
|
+
ENV['BRAND_PATH'] = Appydave::Tools::Dam::Config.brand_path(brand)
|
|
457
|
+
|
|
458
|
+
{ brand: brand_key, project: project_id, file: file_arg, expires: expires, download: download }
|
|
459
|
+
end
|
|
460
|
+
|
|
461
|
+
def show_share_usage_and_exit
|
|
462
|
+
puts 'Usage: dam s3-share <brand> <project> <file> [--expires 7d] [--download]'
|
|
463
|
+
puts ''
|
|
464
|
+
puts 'Options:'
|
|
465
|
+
puts ' --expires TIME Expiry time (default: 7d)'
|
|
466
|
+
puts ' --download Force download instead of viewing in browser'
|
|
467
|
+
puts ''
|
|
468
|
+
puts 'Examples:'
|
|
469
|
+
puts ' dam s3-share appydave b70 video.mp4'
|
|
470
|
+
puts ' dam s3-share appydave b70 video.mp4 --expires 24h'
|
|
471
|
+
puts ' dam s3-share appydave b70 video.mp4 --download'
|
|
472
|
+
puts ' dam s3-share voz boy-baker final-edit.mov --expires 3d --download'
|
|
473
|
+
exit 1
|
|
474
|
+
end
|
|
475
|
+
|
|
476
|
+
def parse_discover_args(args)
|
|
477
|
+
shareable = args.include?('--shareable')
|
|
478
|
+
args = args.reject { |arg| arg.start_with?('--') }
|
|
479
|
+
|
|
480
|
+
brand_arg = args[0]
|
|
481
|
+
project_arg = args[1]
|
|
482
|
+
|
|
483
|
+
if brand_arg.nil? || project_arg.nil?
|
|
484
|
+
puts 'Usage: dam s3-discover <brand> <project> [--shareable]'
|
|
485
|
+
puts ''
|
|
486
|
+
puts 'Examples:'
|
|
487
|
+
puts ' dam s3-discover appydave b70 # List files'
|
|
488
|
+
puts ' dam s3-discover appydave b70 --shareable # Generate share commands'
|
|
489
|
+
exit 1
|
|
490
|
+
end
|
|
491
|
+
|
|
492
|
+
brand_key = brand_arg
|
|
493
|
+
brand = Appydave::Tools::Dam::Config.expand_brand(brand_arg)
|
|
494
|
+
project_id = Appydave::Tools::Dam::ProjectResolver.resolve(brand_arg, project_arg)
|
|
495
|
+
|
|
496
|
+
# Set ENV for compatibility with ConfigLoader
|
|
497
|
+
ENV['BRAND_PATH'] = Appydave::Tools::Dam::Config.brand_path(brand)
|
|
498
|
+
|
|
499
|
+
{ brand_key: brand_key, project_id: project_id, shareable: shareable }
|
|
500
|
+
end
|
|
501
|
+
|
|
502
|
+
def fetch_s3_files(brand_key, project_id)
|
|
503
|
+
s3_ops = Appydave::Tools::Dam::S3Operations.new(brand_key, project_id)
|
|
504
|
+
s3_ops.list_s3_files
|
|
505
|
+
end
|
|
506
|
+
|
|
507
|
+
def handle_empty_files?(files, brand_key, project_id)
|
|
508
|
+
return false unless files.empty?
|
|
509
|
+
|
|
510
|
+
puts "📭 No files found in S3 for #{brand_key}/#{project_id}"
|
|
511
|
+
puts ''
|
|
512
|
+
puts 'Upload files first:'
|
|
513
|
+
puts " dam s3-up #{brand_key} #{project_id}"
|
|
514
|
+
true
|
|
515
|
+
end
|
|
516
|
+
|
|
517
|
+
def display_s3_files(files, brand_key, project_id, shareable)
|
|
518
|
+
puts ''
|
|
519
|
+
puts "📁 Files in S3: #{brand_key}/#{project_id}"
|
|
520
|
+
puts ''
|
|
521
|
+
|
|
522
|
+
files.each do |file_info|
|
|
523
|
+
# list_s3_files returns array of hashes with 'Key', 'Size', 'ETag'
|
|
524
|
+
s3_key = file_info['Key']
|
|
525
|
+
filename = File.basename(s3_key)
|
|
526
|
+
|
|
527
|
+
if shareable
|
|
528
|
+
puts "dam s3-share #{brand_key} #{project_id} #{filename}"
|
|
529
|
+
else
|
|
530
|
+
puts filename
|
|
531
|
+
end
|
|
532
|
+
end
|
|
533
|
+
|
|
534
|
+
puts ''
|
|
535
|
+
end
|
|
536
|
+
|
|
405
537
|
# Help text methods
|
|
406
538
|
# rubocop:disable Metrics/MethodLength
|
|
407
539
|
def show_main_help
|
|
@@ -415,7 +547,7 @@ class VatCLI
|
|
|
415
547
|
list [brand] [pattern] List brands/projects
|
|
416
548
|
|
|
417
549
|
Status & Monitoring:
|
|
418
|
-
status
|
|
550
|
+
status <brand> [project] Show unified status (local/S3/SSD/git)
|
|
419
551
|
|
|
420
552
|
Git Repository Commands:
|
|
421
553
|
repo-status <brand> [--all] Check git status for brand repos
|
|
@@ -429,6 +561,10 @@ class VatCLI
|
|
|
429
561
|
s3-cleanup-remote <brand> <project> Delete S3 files
|
|
430
562
|
s3-cleanup-local <brand> <project> Delete local s3-staging files
|
|
431
563
|
|
|
564
|
+
S3 Sharing Commands:
|
|
565
|
+
s3-discover <brand> <project> List files available in S3
|
|
566
|
+
s3-share <brand> <project> <file> Generate shareable pre-signed URL
|
|
567
|
+
|
|
432
568
|
Archive Commands:
|
|
433
569
|
archive <brand> <project> Copy project to SSD backup
|
|
434
570
|
manifest <brand> [--all] Generate project manifest
|
|
@@ -453,7 +589,11 @@ class VatCLI
|
|
|
453
589
|
dam s3-up appydave b65
|
|
454
590
|
dam s3-down voz boy-baker --dry-run
|
|
455
591
|
dam s3-status appydave b65
|
|
456
|
-
dam s3-
|
|
592
|
+
dam s3-discover appydave b70
|
|
593
|
+
dam s3-discover appydave b70 --shareable
|
|
594
|
+
dam s3-share appydave b70 video.mp4
|
|
595
|
+
dam s3-share appydave b70 video.mp4 --expires 24h
|
|
596
|
+
dam s3-cleanup-remote appydave b65 --force
|
|
457
597
|
|
|
458
598
|
For more information: https://github.com/appydave/appydave-tools
|
|
459
599
|
HELP
|
|
@@ -474,9 +614,9 @@ class VatCLI
|
|
|
474
614
|
ss → v-supportsignal (SupportSignal client)
|
|
475
615
|
|
|
476
616
|
Usage:
|
|
477
|
-
dam list # Show all brands
|
|
478
|
-
dam list --summary # Show brands with project counts
|
|
617
|
+
dam list # Show all brands with counts
|
|
479
618
|
dam list appydave # List all AppyDave projects
|
|
619
|
+
dam list appydave 'b6*' # List AppyDave projects matching pattern
|
|
480
620
|
dam s3-up voz boy-baker # Upload VOZ project
|
|
481
621
|
HELP
|
|
482
622
|
end
|
|
@@ -585,6 +725,108 @@ class VatCLI
|
|
|
585
725
|
HELP
|
|
586
726
|
end
|
|
587
727
|
|
|
728
|
+
def show_s3_share_help
|
|
729
|
+
puts <<~HELP
|
|
730
|
+
S3 Share Command - Generate Shareable Pre-Signed URLs
|
|
731
|
+
|
|
732
|
+
Generate time-limited secure URLs for sharing video files with clients.
|
|
733
|
+
Recipients don't need AWS access - just click the link in their browser!
|
|
734
|
+
|
|
735
|
+
Usage: dam s3-share <brand> <project> <file> [OPTIONS]
|
|
736
|
+
|
|
737
|
+
Options:
|
|
738
|
+
--expires TIME Expiry time (default: 7d)
|
|
739
|
+
Examples: 24h, 48h, 3d, 7d
|
|
740
|
+
--download Force download instead of viewing in browser (default: inline viewing)
|
|
741
|
+
|
|
742
|
+
How It Works:
|
|
743
|
+
1. Generates pre-signed S3 URL (time-limited, secure)
|
|
744
|
+
2. Copies URL to clipboard automatically
|
|
745
|
+
3. Shows expiry date/time
|
|
746
|
+
4. By default: Opens in browser (inline) - perfect for video playback
|
|
747
|
+
5. With --download: Forces file download
|
|
748
|
+
|
|
749
|
+
Examples:
|
|
750
|
+
dam s3-share appydave b70 video.mp4
|
|
751
|
+
# → View in browser (default), 7-day expiry
|
|
752
|
+
|
|
753
|
+
dam s3-share appydave b70 video.mp4 --download
|
|
754
|
+
# → Force download, 7-day expiry
|
|
755
|
+
|
|
756
|
+
dam s3-share appydave b70 final-edit.mp4 --expires 24h
|
|
757
|
+
# → View in browser, 24-hour expiry for quick review
|
|
758
|
+
|
|
759
|
+
dam s3-share voz boy-baker scene-01.mov --expires 3d --download
|
|
760
|
+
# → Force download, 3-day expiry for client approval
|
|
761
|
+
|
|
762
|
+
Viewing Modes:
|
|
763
|
+
🎬 Default (inline): Opens in browser - great for video playback
|
|
764
|
+
📥 --download flag: Forces download - better for archiving
|
|
765
|
+
|
|
766
|
+
Security:
|
|
767
|
+
✅ Time-limited (expires automatically)
|
|
768
|
+
✅ Cryptographically signed (can't be tampered with)
|
|
769
|
+
✅ No AWS state stored (signature encodes everything)
|
|
770
|
+
✅ Revocable (delete S3 file if needed)
|
|
771
|
+
⚠️ Anyone with URL can access (don't share publicly)
|
|
772
|
+
|
|
773
|
+
Prerequisites:
|
|
774
|
+
- File must be uploaded to S3 first
|
|
775
|
+
- Run: dam s3-up <brand> <project>
|
|
776
|
+
|
|
777
|
+
Use Cases:
|
|
778
|
+
- Share videos with clients for review (inline)
|
|
779
|
+
- Send final files for download (--download)
|
|
780
|
+
- Provide temporary access to collaborators
|
|
781
|
+
- Quick video sharing without email attachments
|
|
782
|
+
|
|
783
|
+
For more information: https://github.com/appydave/appydave-tools
|
|
784
|
+
HELP
|
|
785
|
+
end
|
|
786
|
+
|
|
787
|
+
def show_s3_discover_help
|
|
788
|
+
puts <<~HELP
|
|
789
|
+
S3 Discover Command - List Files in S3
|
|
790
|
+
|
|
791
|
+
Discover what video files exist in S3 for a project.
|
|
792
|
+
Useful before sharing to see available files.
|
|
793
|
+
|
|
794
|
+
Usage: dam s3-discover <brand> <project> [--shareable]
|
|
795
|
+
|
|
796
|
+
Modes:
|
|
797
|
+
Default List filenames only
|
|
798
|
+
--shareable Generate ready-to-run share commands
|
|
799
|
+
|
|
800
|
+
Examples:
|
|
801
|
+
dam s3-discover appydave b70
|
|
802
|
+
# Output:
|
|
803
|
+
# xmen.mp4
|
|
804
|
+
# behind-the-scenes.mov
|
|
805
|
+
|
|
806
|
+
dam s3-discover appydave b70 --shareable
|
|
807
|
+
# Output:
|
|
808
|
+
# dam s3-share appydave b70 xmen.mp4
|
|
809
|
+
# dam s3-share appydave b70 behind-the-scenes.mov
|
|
810
|
+
|
|
811
|
+
Workflow:
|
|
812
|
+
1. Upload files: dam s3-up appydave b70
|
|
813
|
+
2. Discover files: dam s3-discover appydave b70
|
|
814
|
+
3. Share specific file: dam s3-share appydave b70 xmen.mp4
|
|
815
|
+
|
|
816
|
+
Use Cases:
|
|
817
|
+
- Find files available for sharing
|
|
818
|
+
- Generate multiple share commands at once
|
|
819
|
+
- Quick project file listing without downloading
|
|
820
|
+
- Copy-paste shareable commands for clients
|
|
821
|
+
|
|
822
|
+
Prerequisites:
|
|
823
|
+
- Files must be uploaded to S3 first
|
|
824
|
+
- Run: dam s3-up <brand> <project>
|
|
825
|
+
|
|
826
|
+
For more information: https://github.com/appydave/appydave-tools
|
|
827
|
+
HELP
|
|
828
|
+
end
|
|
829
|
+
|
|
588
830
|
# rubocop:disable Metrics/CyclomaticComplexity
|
|
589
831
|
def show_s3_help(command)
|
|
590
832
|
case command
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
**Reference**: Original UAT plan at `/Users/davidcruwys/dev/video-projects/video-asset-tools/docs/testing-plan.md`
|
|
9
9
|
|
|
10
|
-
**Windows Testing**: See [
|
|
10
|
+
**Windows Testing**: See [dam-testing-plan-windows-powershell.md](./dam-testing-plan-windows-powershell.md) for Windows-specific testing scenarios
|
|
11
11
|
|
|
12
12
|
---
|
|
13
13
|
|
|
@@ -245,14 +245,14 @@ bundle exec rspec spec/appydave/tools/dam/config_loader_spec.rb
|
|
|
245
245
|
#### Test 2.1: Help System
|
|
246
246
|
```bash
|
|
247
247
|
# Test: Main help
|
|
248
|
-
|
|
248
|
+
dam help
|
|
249
249
|
|
|
250
250
|
# Test: Command-specific help
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
251
|
+
dam help list
|
|
252
|
+
dam help s3-up
|
|
253
|
+
dam help s3-down
|
|
254
|
+
dam help brands
|
|
255
|
+
dam help workflows
|
|
256
256
|
```
|
|
257
257
|
**Expected**:
|
|
258
258
|
- Full help overview
|
|
@@ -265,40 +265,22 @@ bin/dam help workflows
|
|
|
265
265
|
|
|
266
266
|
---
|
|
267
267
|
|
|
268
|
-
#### Test 2.3: List Brands
|
|
269
|
-
```bash
|
|
270
|
-
# Test: List brands only
|
|
271
|
-
bin/dam list
|
|
272
|
-
```
|
|
273
|
-
**Expected**: `Brands: aitldr, appydave, joy, kiros, ss, voz` (shortcuts)
|
|
274
|
-
|
|
275
|
-
**Status**: [ ] Pass [ ] Fail
|
|
276
|
-
**Notes**: ___________________________________________
|
|
277
|
-
|
|
278
|
-
---
|
|
279
|
-
|
|
280
|
-
#### Test 2.4: List Brands with Summary (Mode 2)
|
|
268
|
+
#### Test 2.3: List Brands
|
|
281
269
|
```bash
|
|
282
|
-
# Test:
|
|
283
|
-
|
|
284
|
-
```
|
|
285
|
-
**Expected**:
|
|
286
|
-
```
|
|
287
|
-
aitldr: X projects
|
|
288
|
-
appydave: Y projects
|
|
289
|
-
joy: Z projects
|
|
290
|
-
...
|
|
270
|
+
# Test: List all brands with project counts
|
|
271
|
+
dam list
|
|
291
272
|
```
|
|
273
|
+
**Expected**: Tabular output showing all brands with project counts, sizes, and paths
|
|
292
274
|
|
|
293
275
|
**Status**: [ ] Pass [ ] Fail
|
|
294
276
|
**Notes**: ___________________________________________
|
|
295
277
|
|
|
296
278
|
---
|
|
297
279
|
|
|
298
|
-
#### Test 2.
|
|
280
|
+
#### Test 2.4: List Brand Projects
|
|
299
281
|
```bash
|
|
300
282
|
# Test: All projects for brand
|
|
301
|
-
|
|
283
|
+
dam list appydave
|
|
302
284
|
```
|
|
303
285
|
**Expected**: List of all appydave projects (excludes `archived/`, `.git`, etc.)
|
|
304
286
|
|
|
@@ -307,10 +289,10 @@ bin/dam list appydave
|
|
|
307
289
|
|
|
308
290
|
---
|
|
309
291
|
|
|
310
|
-
#### Test 2.
|
|
292
|
+
#### Test 2.5: Pattern Matching
|
|
311
293
|
```bash
|
|
312
294
|
# Test: Pattern matching
|
|
313
|
-
|
|
295
|
+
dam list appydave 'b6*'
|
|
314
296
|
```
|
|
315
297
|
**Expected**: Only projects starting with `b6` (b60-b69)
|
|
316
298
|
|
|
@@ -319,7 +301,7 @@ bin/dam list appydave 'b6*'
|
|
|
319
301
|
|
|
320
302
|
---
|
|
321
303
|
|
|
322
|
-
#### Test 2.
|
|
304
|
+
#### Test 2.6: S3 Upload with CLI Args
|
|
323
305
|
```bash
|
|
324
306
|
# Test: Upload with explicit args (dry-run)
|
|
325
307
|
bin/s3_sync_up.rb appydave b65 --dry-run
|
|
@@ -331,7 +313,7 @@ bin/s3_sync_up.rb appydave b65 --dry-run
|
|
|
331
313
|
|
|
332
314
|
---
|
|
333
315
|
|
|
334
|
-
#### Test 2.
|
|
316
|
+
#### Test 2.7: S3 Upload Auto-Detect
|
|
335
317
|
```bash
|
|
336
318
|
# Test: Upload from project directory
|
|
337
319
|
cd ~/dev/video-projects/v-appydave/b65-*
|
|
@@ -344,7 +326,7 @@ bin/s3_sync_up.rb --dry-run
|
|
|
344
326
|
|
|
345
327
|
---
|
|
346
328
|
|
|
347
|
-
#### Test 2.
|
|
329
|
+
#### Test 2.8: S3 Download with CLI Args ⭐ NEW
|
|
348
330
|
```bash
|
|
349
331
|
# Test: Download with explicit args (dry-run)
|
|
350
332
|
bin/s3_sync_down.rb appydave b65 --dry-run
|
|
@@ -356,7 +338,7 @@ bin/s3_sync_down.rb appydave b65 --dry-run
|
|
|
356
338
|
|
|
357
339
|
---
|
|
358
340
|
|
|
359
|
-
#### Test 2.
|
|
341
|
+
#### Test 2.9: S3 Download Auto-Detect ⭐ NEW
|
|
360
342
|
```bash
|
|
361
343
|
# Test: Download from project directory
|
|
362
344
|
cd ~/dev/video-projects/v-appydave/b65-*
|
|
@@ -369,7 +351,7 @@ bin/s3_sync_down.rb --dry-run
|
|
|
369
351
|
|
|
370
352
|
---
|
|
371
353
|
|
|
372
|
-
#### Test 2.
|
|
354
|
+
#### Test 2.10: S3 Status with CLI Args ⭐ NEW
|
|
373
355
|
```bash
|
|
374
356
|
# Test: Check status with explicit args
|
|
375
357
|
bin/s3_sync_status.rb appydave b65
|
|
@@ -381,7 +363,7 @@ bin/s3_sync_status.rb appydave b65
|
|
|
381
363
|
|
|
382
364
|
---
|
|
383
365
|
|
|
384
|
-
#### Test 2.
|
|
366
|
+
#### Test 2.11: S3 Status Auto-Detect ⭐ NEW
|
|
385
367
|
```bash
|
|
386
368
|
# Test: Check status from project directory
|
|
387
369
|
cd ~/dev/video-projects/v-appydave/b65-*
|
|
@@ -394,7 +376,7 @@ bin/s3_sync_status.rb
|
|
|
394
376
|
|
|
395
377
|
---
|
|
396
378
|
|
|
397
|
-
#### Test 2.
|
|
379
|
+
#### Test 2.12: S3 Cleanup with CLI Args ⭐ NEW
|
|
398
380
|
```bash
|
|
399
381
|
# Test: Cleanup with explicit args (dry-run)
|
|
400
382
|
bin/s3_sync_cleanup.rb appydave b65 --dry-run
|
|
@@ -406,7 +388,7 @@ bin/s3_sync_cleanup.rb appydave b65 --dry-run
|
|
|
406
388
|
|
|
407
389
|
---
|
|
408
390
|
|
|
409
|
-
#### Test 2.
|
|
391
|
+
#### Test 2.13: S3 Cleanup Auto-Detect ⭐ NEW
|
|
410
392
|
```bash
|
|
411
393
|
# Test: Cleanup from project directory
|
|
412
394
|
cd ~/dev/video-projects/v-appydave/b65-*
|
|
@@ -419,10 +401,10 @@ bin/s3_sync_cleanup.rb --dry-run
|
|
|
419
401
|
|
|
420
402
|
---
|
|
421
403
|
|
|
422
|
-
#### Test 2.
|
|
404
|
+
#### Test 2.14: Status - Brand Overview ⭐ PHASE 4
|
|
423
405
|
```bash
|
|
424
406
|
# Test: Show unified status for entire brand
|
|
425
|
-
|
|
407
|
+
dam status appydave
|
|
426
408
|
```
|
|
427
409
|
**Expected**: Shows brand git status, manifest summary (total projects, local, S3, SSD counts)
|
|
428
410
|
|
|
@@ -431,10 +413,10 @@ bin/dam status appydave
|
|
|
431
413
|
|
|
432
414
|
---
|
|
433
415
|
|
|
434
|
-
#### Test 2.
|
|
416
|
+
#### Test 2.15: Status - Specific Project ⭐ PHASE 4
|
|
435
417
|
```bash
|
|
436
418
|
# Test: Show detailed status for specific project
|
|
437
|
-
|
|
419
|
+
dam status appydave b65
|
|
438
420
|
```
|
|
439
421
|
**Expected**: Shows storage locations (local, S3 staging, SSD backup) and git status for project
|
|
440
422
|
|
|
@@ -443,23 +425,10 @@ bin/dam status appydave b65
|
|
|
443
425
|
|
|
444
426
|
---
|
|
445
427
|
|
|
446
|
-
#### Test 2.
|
|
447
|
-
```bash
|
|
448
|
-
# Test: Auto-detect brand and project from PWD
|
|
449
|
-
cd ~/dev/video-projects/v-appydave/b65-*
|
|
450
|
-
bin/dam status
|
|
451
|
-
```
|
|
452
|
-
**Expected**: Auto-detects and shows project status
|
|
453
|
-
|
|
454
|
-
**Status**: [ ] Pass [ ] Fail
|
|
455
|
-
**Notes**: ___________________________________________
|
|
456
|
-
|
|
457
|
-
---
|
|
458
|
-
|
|
459
|
-
#### Test 2.18: Repo Status - Single Brand ⭐ PHASE 4
|
|
428
|
+
#### Test 2.16: Repo Status - Single Brand ⭐ PHASE 4
|
|
460
429
|
```bash
|
|
461
430
|
# Test: Show git status for single brand
|
|
462
|
-
|
|
431
|
+
dam repo-status appydave
|
|
463
432
|
```
|
|
464
433
|
**Expected**: Shows branch, remote, working directory status, sync status
|
|
465
434
|
|
|
@@ -468,10 +437,10 @@ bin/dam repo-status appydave
|
|
|
468
437
|
|
|
469
438
|
---
|
|
470
439
|
|
|
471
|
-
#### Test 2.
|
|
440
|
+
#### Test 2.17: Repo Status - All Brands ⭐ PHASE 4
|
|
472
441
|
```bash
|
|
473
442
|
# Test: Show git status for all brands
|
|
474
|
-
|
|
443
|
+
dam repo-status --all
|
|
475
444
|
```
|
|
476
445
|
**Expected**: Shows git status for all configured brands (appydave, voz, aitldr, etc.)
|
|
477
446
|
|
|
@@ -480,10 +449,10 @@ bin/dam repo-status --all
|
|
|
480
449
|
|
|
481
450
|
---
|
|
482
451
|
|
|
483
|
-
#### Test 2.
|
|
452
|
+
#### Test 2.18: Repo Sync - Single Brand ⭐ PHASE 4
|
|
484
453
|
```bash
|
|
485
454
|
# Test: Pull updates for single brand
|
|
486
|
-
|
|
455
|
+
dam repo-sync appydave
|
|
487
456
|
```
|
|
488
457
|
**Expected**: Pulls updates if available, skips if uncommitted changes, shows status
|
|
489
458
|
|
|
@@ -492,10 +461,10 @@ bin/dam repo-sync appydave
|
|
|
492
461
|
|
|
493
462
|
---
|
|
494
463
|
|
|
495
|
-
#### Test 2.
|
|
464
|
+
#### Test 2.19: Repo Sync - All Brands ⭐ PHASE 4
|
|
496
465
|
```bash
|
|
497
466
|
# Test: Pull updates for all brands
|
|
498
|
-
|
|
467
|
+
dam repo-sync --all
|
|
499
468
|
```
|
|
500
469
|
**Expected**: Syncs all brands, shows summary, skips brands with uncommitted changes
|
|
501
470
|
|
|
@@ -504,10 +473,10 @@ bin/dam repo-sync --all
|
|
|
504
473
|
|
|
505
474
|
---
|
|
506
475
|
|
|
507
|
-
#### Test 2.
|
|
476
|
+
#### Test 2.20: Repo Push - Basic ⭐ PHASE 4
|
|
508
477
|
```bash
|
|
509
478
|
# Test: Push changes for brand (no project validation)
|
|
510
|
-
|
|
479
|
+
dam repo-push appydave
|
|
511
480
|
```
|
|
512
481
|
**Expected**: Pushes commits, shows push summary
|
|
513
482
|
|
|
@@ -516,10 +485,10 @@ bin/dam repo-push appydave
|
|
|
516
485
|
|
|
517
486
|
---
|
|
518
487
|
|
|
519
|
-
#### Test 2.
|
|
488
|
+
#### Test 2.21: Repo Push - With Project Validation ⭐ PHASE 4
|
|
520
489
|
```bash
|
|
521
490
|
# Test: Push with project validation
|
|
522
|
-
|
|
491
|
+
dam repo-push appydave b65
|
|
523
492
|
```
|
|
524
493
|
**Expected**: Validates project exists in manifest before pushing, shows validation message
|
|
525
494
|
|