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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ad2e56b8d8b3c9a1cb3e97bf6a020dff3c912ae6d22be2188104276cf952a0cf
4
- data.tar.gz: ba06bb06e615d282df69ccb5b52a1f5b5264f02dfd7af574e86a71721cec1633
3
+ metadata.gz: c9c1294eb12c004bfbf7d5c3af2ad72e70202729867d5b2e1978d6710f573eca
4
+ data.tar.gz: 4c00d396ba791995706c8caea17eb36b65c0c6142533281ceb83d75e74a90d00
5
5
  SHA512:
6
- metadata.gz: 53ba4ece9f3f7d7c8fe29107b9059018285a382acb02a1f26275d0b41a95745402dbe74d9609a6a089c73c0ec92ce320df58fa50b8bbd4b17578f0d84234bc1a
7
- data.tar.gz: 927899c39261f330ceb73387a8598023a5c642cec24e5753ddde063af545a7aa373ac07969c6f0ee5c69ed2ee76b4f75d871c96cce2d015ef81d7fae6b532fab
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
 
@@ -3,7 +3,6 @@
3
3
 
4
4
  $LOAD_PATH.unshift(File.expand_path('../lib', __dir__))
5
5
 
6
- require 'pry'
7
6
  require 'appydave/tools'
8
7
 
9
8
  # !/usr/bin/env ruby
data/bin/configuration.rb CHANGED
@@ -10,7 +10,6 @@
10
10
 
11
11
  $LOAD_PATH.unshift(File.expand_path('../lib', __dir__))
12
12
 
13
- require 'pry'
14
13
  require 'appydave/tools'
15
14
 
16
15
  options = { keys: [] }
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
- # Auto-detect from PWD
277
- brand, project_id = Appydave::Tools::Dam::ProjectResolver.detect_from_pwd
278
- if brand.nil?
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 [brand] [project] Show unified status (local/S3/SSD/git)
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-cleanup appydave b65 --force
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 [windows-testing-guide.md](./windows-testing-guide.md) for Windows-specific testing scenarios
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
- bin/dam help
248
+ dam help
249
249
 
250
250
  # Test: Command-specific help
251
- bin/dam help list
252
- bin/dam help s3-up
253
- bin/dam help s3-down
254
- bin/dam help brands
255
- bin/dam help workflows
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 (Mode 1)
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: Brands with project counts
283
- bin/dam list --summary
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.5: List Brand Projects (Mode 3)
280
+ #### Test 2.4: List Brand Projects
299
281
  ```bash
300
282
  # Test: All projects for brand
301
- bin/dam list appydave
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.6: Pattern Matching (Mode 3b)
292
+ #### Test 2.5: Pattern Matching
311
293
  ```bash
312
294
  # Test: Pattern matching
313
- bin/dam list appydave 'b6*'
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.7: S3 Upload with CLI Args
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.8: S3 Upload Auto-Detect
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.9: S3 Download with CLI Args ⭐ NEW
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.10: S3 Download Auto-Detect ⭐ NEW
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.11: S3 Status with CLI Args ⭐ NEW
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.12: S3 Status Auto-Detect ⭐ NEW
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.13: S3 Cleanup with CLI Args ⭐ NEW
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.14: S3 Cleanup Auto-Detect ⭐ NEW
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.15: Status - Brand Overview ⭐ PHASE 4
404
+ #### Test 2.14: Status - Brand Overview ⭐ PHASE 4
423
405
  ```bash
424
406
  # Test: Show unified status for entire brand
425
- bin/dam status appydave
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.16: Status - Specific Project ⭐ PHASE 4
416
+ #### Test 2.15: Status - Specific Project ⭐ PHASE 4
435
417
  ```bash
436
418
  # Test: Show detailed status for specific project
437
- bin/dam status appydave b65
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.17: Status - Auto-Detect ⭐ PHASE 4
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
- bin/dam repo-status appydave
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.19: Repo Status - All Brands ⭐ PHASE 4
440
+ #### Test 2.17: Repo Status - All Brands ⭐ PHASE 4
472
441
  ```bash
473
442
  # Test: Show git status for all brands
474
- bin/dam repo-status --all
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.20: Repo Sync - Single Brand ⭐ PHASE 4
452
+ #### Test 2.18: Repo Sync - Single Brand ⭐ PHASE 4
484
453
  ```bash
485
454
  # Test: Pull updates for single brand
486
- bin/dam repo-sync appydave
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.21: Repo Sync - All Brands ⭐ PHASE 4
464
+ #### Test 2.19: Repo Sync - All Brands ⭐ PHASE 4
496
465
  ```bash
497
466
  # Test: Pull updates for all brands
498
- bin/dam repo-sync --all
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.22: Repo Push - Basic ⭐ PHASE 4
476
+ #### Test 2.20: Repo Push - Basic ⭐ PHASE 4
508
477
  ```bash
509
478
  # Test: Push changes for brand (no project validation)
510
- bin/dam repo-push appydave
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.23: Repo Push - With Project Validation ⭐ PHASE 4
488
+ #### Test 2.21: Repo Push - With Project Validation ⭐ PHASE 4
520
489
  ```bash
521
490
  # Test: Push with project validation
522
- bin/dam repo-push appydave b65
491
+ dam repo-push appydave b65
523
492
  ```
524
493
  **Expected**: Validates project exists in manifest before pushing, shows validation message
525
494