appydave-tools 0.16.0 → 0.17.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.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +6 -0
  3. data/AGENTS.md +22 -0
  4. data/CHANGELOG.md +12 -0
  5. data/CLAUDE.md +206 -51
  6. data/README.md +144 -11
  7. data/bin/archive_project.rb +249 -0
  8. data/bin/configuration.rb +21 -1
  9. data/bin/generate_manifest.rb +357 -0
  10. data/bin/sync_from_ssd.rb +236 -0
  11. data/bin/vat +623 -0
  12. data/docs/README.md +169 -0
  13. data/docs/configuration/.env.example +19 -0
  14. data/docs/configuration/README.md +394 -0
  15. data/docs/configuration/channels.example.json +26 -0
  16. data/docs/configuration/settings.example.json +6 -0
  17. data/docs/development/CODEX-recommendations.md +123 -0
  18. data/docs/development/README.md +100 -0
  19. data/docs/development/cli-architecture-patterns.md +1604 -0
  20. data/docs/development/pattern-comparison.md +284 -0
  21. data/docs/prd-unified-brands-configuration.md +792 -0
  22. data/docs/project-brand-systems-analysis.md +934 -0
  23. data/docs/vat/dam-vision.md +123 -0
  24. data/docs/vat/session-summary-2025-11-09.md +297 -0
  25. data/docs/vat/usage.md +508 -0
  26. data/docs/vat/vat-testing-plan.md +801 -0
  27. data/lib/appydave/tools/configuration/models/brands_config.rb +238 -0
  28. data/lib/appydave/tools/configuration/models/config_base.rb +7 -0
  29. data/lib/appydave/tools/configuration/models/settings_config.rb +4 -0
  30. data/lib/appydave/tools/vat/config.rb +153 -0
  31. data/lib/appydave/tools/vat/config_loader.rb +91 -0
  32. data/lib/appydave/tools/vat/manifest_generator.rb +239 -0
  33. data/lib/appydave/tools/vat/project_listing.rb +198 -0
  34. data/lib/appydave/tools/vat/project_resolver.rb +132 -0
  35. data/lib/appydave/tools/vat/s3_operations.rb +560 -0
  36. data/lib/appydave/tools/version.rb +1 -1
  37. data/lib/appydave/tools.rb +9 -1
  38. data/package.json +1 -1
  39. metadata +57 -3
  40. data/docs/dam/overview.md +0 -28
@@ -0,0 +1,934 @@
1
+ # Project and Brand Management Systems Analysis
2
+
3
+ **Repository:** `appydave-tools`
4
+ **Analysis Date:** 2025-11-09
5
+ **Purpose:** Comprehensive mapping of all project/brand management systems in the codebase
6
+
7
+ ---
8
+
9
+ ## Executive Summary
10
+
11
+ The `appydave-tools` codebase contains **THREE DISTINCT SYSTEMS** for managing projects, brands, and channels:
12
+
13
+ 1. **VAT (Video Asset Tools)** - Filesystem-based video project storage orchestration
14
+ 2. **Channels Configuration** - YouTube channel metadata and project location management
15
+ 3. **NameManager/ProjectName** - File naming conventions and project name parsing
16
+
17
+ These systems serve **different but complementary purposes**, with **limited integration** between them. There is **conceptual overlap** in how they model "brands" and "projects", but they operate independently with different data sources and use cases.
18
+
19
+ ### Key Findings
20
+
21
+ - ✅ **No direct conflicts** - Systems don't duplicate functionality
22
+ - ⚠️ **Limited crossover** - Systems don't reference each other programmatically
23
+ - 🔄 **Potential for integration** - NameManager could bridge VAT and Channels
24
+ - 📊 **Different data models** - Each system has its own brand/project representation
25
+ - 🎯 **Clear separation of concerns** - Each system has a well-defined purpose
26
+
27
+ ---
28
+
29
+ ## System 1: VAT (Video Asset Tools)
30
+
31
+ ### Purpose
32
+ Multi-tenant video project storage orchestration across local filesystem, S3 collaboration staging, and SSD archival storage.
33
+
34
+ ### Location
35
+ - **Module:** `lib/appydave/tools/vat/`
36
+ - **CLI:** `bin/vat`
37
+ - **Documentation:** `docs/usage/vat.md`
38
+
39
+ ### Data Model
40
+
41
+ #### Brands (Top-Level Entities)
42
+ Brands are **filesystem directories** following the `v-*` naming pattern:
43
+
44
+ | Brand Shortcut | Full Directory Name | Purpose |
45
+ |----------------|---------------------|---------|
46
+ | `appydave` | `v-appydave` | AppyDave brand videos (21+ projects) |
47
+ | `voz` | `v-voz` | VOZ client videos |
48
+ | `aitldr` | `v-aitldr` | AITLDR brand videos |
49
+ | `kiros` | `v-kiros` | Kiros client videos |
50
+ | `joy` | `v-beauty-and-joy` | Beauty & Joy brand |
51
+ | `ss` | `v-supportsignal` | SupportSignal client |
52
+
53
+ **Brand Detection Logic:**
54
+ ```ruby
55
+ # lib/appydave/tools/vat/config.rb
56
+ def expand_brand(shortcut)
57
+ return shortcut if shortcut.start_with?('v-')
58
+
59
+ case shortcut
60
+ when 'joy' then 'v-beauty-and-joy'
61
+ when 'ss' then 'v-supportsignal'
62
+ else
63
+ "v-#{shortcut}"
64
+ end
65
+ end
66
+ ```
67
+
68
+ #### Projects (Within Each Brand)
69
+ Projects are **subdirectories** within brand folders:
70
+
71
+ **FliVideo Pattern (AppyDave):**
72
+ - Format: `b[number]-[descriptive-name]`
73
+ - Example: `b65-guy-monroe-marketing-plan`
74
+ - Short name support: `b65` → resolves to full project name
75
+ - Pattern matching: `b6*` → matches b60-b69
76
+
77
+ **Storyline Pattern (VOZ, AITLDR):**
78
+ - Format: `[descriptive-name]`
79
+ - Example: `boy-baker`, `the-point`
80
+ - No short name expansion (exact match required)
81
+
82
+ ### Configuration
83
+
84
+ #### System Level: `~/.vat-config`
85
+ ```bash
86
+ VIDEO_PROJECTS_ROOT=/Users/davidcruwys/dev/video-projects
87
+ ```
88
+
89
+ #### Brand Level: `<brand-dir>/.video-tools.env`
90
+ ```bash
91
+ # AWS Configuration
92
+ AWS_ACCESS_KEY_ID=xxx
93
+ AWS_SECRET_ACCESS_KEY=xxx
94
+ AWS_REGION=us-east-1
95
+ S3_BUCKET=your-bucket-name
96
+
97
+ # SSD Backup Path
98
+ SSD_BASE=/Volumes/T7/youtube-PUBLISHED/appydave
99
+ ```
100
+
101
+ ### Scope
102
+ - **Storage orchestration**: Local → S3 (90-day collaboration) → SSD (archive)
103
+ - **Project discovery**: List brands, list projects, pattern matching
104
+ - **S3 sync**: Upload/download/status/cleanup of staging files
105
+ - **Archive management**: SSD backup and sync operations
106
+
107
+ ### Key Features
108
+ - ✅ Multi-tenant (6 brands)
109
+ - ✅ Smart sync (MD5-based file comparison)
110
+ - ✅ Pattern matching (`b6*` → all b60-b69 projects)
111
+ - ✅ Auto-detection (from current directory PWD)
112
+ - ✅ Brand shortcuts (short names for faster CLI usage)
113
+ - ✅ Hybrid storage strategy (local/S3/SSD)
114
+
115
+ ### Example Usage
116
+ ```bash
117
+ # List all brands
118
+ vat list
119
+ # Output: Brands: appydave, aitldr, joy, kiros, ss, voz
120
+
121
+ # List projects for a brand
122
+ vat list appydave
123
+ # Output: Lists all projects (b59-..., b60-..., etc.)
124
+
125
+ # Upload to S3
126
+ vat s3-up appydave b65
127
+
128
+ # Auto-detect from PWD
129
+ cd ~/dev/video-projects/v-appydave/b65-guy-monroe-marketing-plan
130
+ vat s3-up # Auto-detects brand and project
131
+ ```
132
+
133
+ ---
134
+
135
+ ## System 2: Channels Configuration
136
+
137
+ ### Purpose
138
+ YouTube channel metadata and project location management for multi-channel content creators.
139
+
140
+ ### Location
141
+ - **Module:** `lib/appydave/tools/configuration/models/channels_config.rb`
142
+ - **Storage:** `~/.config/appydave/channels.json`
143
+ - **CLI:** `bin/configuration.rb` (manage configs)
144
+
145
+ ### Data Model
146
+
147
+ #### Channels (Top-Level Entities)
148
+ Channels are **logical YouTube channels** with associated metadata and project locations:
149
+
150
+ **Data Structure:**
151
+ ```json
152
+ {
153
+ "channels": {
154
+ "appydave": {
155
+ "code": "ad",
156
+ "name": "AppyDave",
157
+ "youtube_handle": "@appydave",
158
+ "locations": {
159
+ "content_projects": "/path/to/content/appydave",
160
+ "video_projects": "/path/to/video/appydave",
161
+ "published_projects": "/path/to/published/appydave",
162
+ "abandoned_projects": "/path/to/abandoned/appydave"
163
+ }
164
+ },
165
+ "appydave_coding": {
166
+ "code": "ac",
167
+ "name": "AppyDave Coding",
168
+ "youtube_handle": "@appydavecoding",
169
+ "locations": {
170
+ "content_projects": "/path/to/content/appydave_coding",
171
+ "video_projects": "/path/to/video/appydave_coding",
172
+ "published_projects": "/path/to/published/appydave_coding",
173
+ "abandoned_projects": "/path/to/abandoned/appydave_coding"
174
+ }
175
+ }
176
+ }
177
+ }
178
+ ```
179
+
180
+ **Channel Attributes:**
181
+ - `key` - Unique identifier (e.g., "appydave")
182
+ - `code` - Short code for file naming (e.g., "ad", "ac")
183
+ - `name` - Display name (e.g., "AppyDave")
184
+ - `youtube_handle` - YouTube handle (e.g., "@appydave")
185
+
186
+ **Project Locations (4 types per channel):**
187
+ 1. `content_projects` - Source content (scripts, research, raw footage)
188
+ 2. `video_projects` - Active video production (editing, rendering)
189
+ 3. `published_projects` - Completed and published videos
190
+ 4. `abandoned_projects` - Cancelled/failed projects
191
+
192
+ ### Configuration
193
+
194
+ #### Storage Location
195
+ - **File:** `~/.config/appydave/channels.json`
196
+ - **Format:** JSON
197
+ - **Managed by:** `Appydave::Tools::Configuration::Config`
198
+
199
+ #### Access Pattern
200
+ ```ruby
201
+ # Load configuration
202
+ config = Appydave::Tools::Configuration::Config
203
+
204
+ # Get channel info
205
+ channel = config.channels.get_channel('appydave')
206
+ # => ChannelInfo(key: "appydave", code: "ad", name: "AppyDave", ...)
207
+
208
+ # Access locations
209
+ channel.locations.video_projects
210
+ # => "/path/to/video/appydave"
211
+ ```
212
+
213
+ ### Scope
214
+ - **Channel metadata**: YouTube handles, display names, short codes
215
+ - **Project lifecycle**: Tracks projects across 4 stages (content → video → published → abandoned)
216
+ - **Path management**: Defines where different types of projects are stored
217
+ - **Multi-channel support**: Supports creators with multiple YouTube channels
218
+
219
+ ### Key Features
220
+ - ✅ Multi-channel (unlimited channels)
221
+ - ✅ Lifecycle tracking (4 project stages)
222
+ - ✅ Team-shareable (JSON config files, no secrets)
223
+ - ✅ Per-developer paths (each team member customizes their local paths)
224
+ - ✅ Type-safe access (ChannelInfo and ChannelLocation classes)
225
+
226
+ ### Example Usage
227
+ ```ruby
228
+ # List all channels
229
+ config.channels.channels.each do |channel|
230
+ puts "#{channel.name} (@#{channel.youtube_handle})"
231
+ end
232
+
233
+ # Get video projects location for a channel
234
+ channel = config.channels.get_channel('appydave')
235
+ video_path = channel.locations.video_projects
236
+ # => "/Volumes/Expansion/Sync/tube-channels/appydave/active"
237
+
238
+ # Check if a code exists
239
+ config.channels.code?('ad') # => true
240
+ config.channels.code?('xyz') # => false
241
+ ```
242
+
243
+ ---
244
+
245
+ ## System 3: NameManager/ProjectName
246
+
247
+ ### Purpose
248
+ Parse and generate project names following AppyDave naming conventions, with optional channel code integration.
249
+
250
+ ### Location
251
+ - **Module:** `lib/appydave/tools/name_manager/project_name.rb`
252
+ - **Used by:** (Appears to be standalone utility, no active usage found)
253
+ - **Status:** ⚠️ **Potentially underutilized**
254
+
255
+ ### Data Model
256
+
257
+ #### Project Name Pattern
258
+ Projects follow a structured naming convention:
259
+
260
+ **Without channel code:**
261
+ ```
262
+ [sequence]-[project-name]
263
+ Example: 40-my-awesome-video
264
+ ```
265
+
266
+ **With channel code:**
267
+ ```
268
+ [sequence]-[channel-code]-[project-name]
269
+ Example: 40-ad-my-awesome-video
270
+ ```
271
+
272
+ **Parsing Logic:**
273
+ ```ruby
274
+ # Parse: "40-ad-my-awesome-video"
275
+ project_name = ProjectName.new("40-ad-my-awesome-video")
276
+
277
+ project_name.sequence # => "40"
278
+ project_name.channel_code # => "ad"
279
+ project_name.project_name # => "my-awesome-video"
280
+ project_name.generate_name # => "40-ad-my-awesome-video"
281
+ ```
282
+
283
+ **Channel Code Validation:**
284
+ - Validates channel codes against `Channels Configuration` (System 2)
285
+ - Only accepts codes defined in `channels.json` (e.g., "ad", "ac")
286
+ - Falls back to no-channel-code pattern if code is invalid
287
+
288
+ ### Configuration
289
+ - **Depends on:** `Channels Configuration` (System 2)
290
+ - **Validates against:** `config.channels.code?(code)`
291
+ - **No standalone config:** Inherits from Channels system
292
+
293
+ ### Scope
294
+ - **File naming**: Generate consistent project file names
295
+ - **Name parsing**: Extract sequence, channel code, and project name from filenames
296
+ - **Channel integration**: Validates channel codes exist in system
297
+ - **Name generation**: Reconstruct filenames from components
298
+
299
+ ### Key Features
300
+ - ✅ Structured parsing (sequence + code + name)
301
+ - ✅ Channel code validation (checks against Channels config)
302
+ - ✅ Flexible format (with or without channel code)
303
+ - ✅ Lowercase normalization
304
+
305
+ ### Example Usage
306
+ ```ruby
307
+ # Parse existing filename
308
+ name = ProjectName.new("40-ad-my-video.mp4")
309
+ name.sequence # => "40"
310
+ name.channel_code # => "ad" (validated against channels.json)
311
+ name.project_name # => "my-video"
312
+
313
+ # Generate new filename
314
+ name.generate_name # => "40-ad-my-video"
315
+
316
+ # Parse without channel code
317
+ name2 = ProjectName.new("50-another-video.mp4")
318
+ name2.sequence # => "50"
319
+ name2.channel_code # => nil
320
+ name2.project_name # => "another-video"
321
+ ```
322
+
323
+ ---
324
+
325
+ ## System Comparison Matrix
326
+
327
+ | Aspect | VAT (Video Asset Tools) | Channels Configuration | NameManager/ProjectName |
328
+ |--------|-------------------------|------------------------|-------------------------|
329
+ | **Primary Entity** | Brands (v-*) | Channels (@youtube) | Project Names |
330
+ | **Data Source** | Filesystem | JSON config file | File naming convention |
331
+ | **Storage Location** | `VIDEO_PROJECTS_ROOT` | `~/.config/appydave/` | N/A (parsing only) |
332
+ | **Configuration** | `.vat-config` + `.video-tools.env` | `channels.json` | Uses Channels config |
333
+ | **Scope** | Storage orchestration | Metadata + locations | Naming conventions |
334
+ | **Multi-tenancy** | 6 brands (hardcoded shortcuts) | Unlimited channels | N/A (validation only) |
335
+ | **Project Tracking** | Directory listing | 4 lifecycle stages | Name parsing |
336
+ | **Integration** | Standalone | Standalone | Depends on Channels |
337
+ | **CLI Tool** | `vat` | `bin/configuration.rb` | None (library only) |
338
+ | **Team Sharing** | Git-tracked config files | Git-tracked JSON | N/A |
339
+ | **Secrets Management** | `.video-tools.env` (gitignored) | None (metadata only) | None |
340
+
341
+ ---
342
+
343
+ ## Crossover Analysis
344
+
345
+ ### Where Systems Overlap
346
+
347
+ #### 1. **Brand/Channel Concept**
348
+
349
+ **VAT Brands:**
350
+ - `v-appydave` → Filesystem directory for video projects
351
+ - Purpose: Storage organization and S3 sync
352
+ - Scope: All video projects for this brand
353
+
354
+ **Channels Config:**
355
+ - `appydave` → YouTube channel metadata
356
+ - Purpose: YouTube integration and project lifecycle tracking
357
+ - Scope: Content across 4 project stages
358
+
359
+ **Relationship:**
360
+ - Same **conceptual entity** (AppyDave brand)
361
+ - Different **representations** (filesystem vs metadata)
362
+ - **No programmatic link** between the two systems
363
+
364
+ **Example:**
365
+ ```
366
+ VAT: v-appydave/b65-guy-monroe-marketing-plan/
367
+ Channels: appydave → locations.video_projects = /path/to/video/appydave/
368
+
369
+ Could be the same physical location, but no enforcement or validation!
370
+ ```
371
+
372
+ #### 2. **Project Organization**
373
+
374
+ **VAT Projects:**
375
+ - Physical directories under brands
376
+ - Example: `b65-guy-monroe-marketing-plan`
377
+ - Located at: `VIDEO_PROJECTS_ROOT/v-appydave/b65-*/`
378
+
379
+ **Channels Locations:**
380
+ - Four types of project folders per channel:
381
+ - `content_projects` - Could contain planning/scripts
382
+ - `video_projects` - **Could map to VAT brand directories!**
383
+ - `published_projects` - Archive for published videos
384
+ - `abandoned_projects` - Archive for failed projects
385
+
386
+ **Potential Integration:**
387
+ ```ruby
388
+ # Channels config COULD point to VAT directory:
389
+ {
390
+ "appydave": {
391
+ "locations": {
392
+ "video_projects": "/Users/davidcruwys/dev/video-projects/v-appydave"
393
+ # ↑ This is the same path as VAT's brand_path('appydave')!
394
+ }
395
+ }
396
+ }
397
+ ```
398
+
399
+ **Current Reality:**
400
+ - ❌ **No validation** that these paths match
401
+ - ❌ **No cross-system queries** (can't ask VAT to list projects from Channels config)
402
+ - ❌ **No enforcement** of consistency
403
+
404
+ #### 3. **NameManager as Bridge**
405
+
406
+ **NameManager validates channel codes:**
407
+ ```ruby
408
+ # NameManager checks if code exists in Channels config
409
+ config.channels.code?('ad') # => true
410
+ ```
411
+
412
+ **Potential integration opportunity:**
413
+ - NameManager could validate that project names follow VAT patterns
414
+ - NameManager could generate filenames for both VAT projects and Channel locations
415
+ - Currently **underutilized** - no active usage found in codebase
416
+
417
+ ### Where Systems Complement Each Other
418
+
419
+ #### Scenario 1: Multi-Channel YouTube Creator
420
+
421
+ **Current workflow (disconnected):**
422
+ 1. Use **VAT** to manage video project storage (`v-appydave/b65-*`)
423
+ 2. Use **Channels Config** to track YouTube channel metadata
424
+ 3. Manually ensure paths are consistent
425
+
426
+ **Potential integrated workflow:**
427
+ 1. Define channel in **Channels Config** with `video_projects` pointing to VAT brand path
428
+ 2. Use **VAT** to list and sync projects
429
+ 3. Use **NameManager** to generate consistent filenames with channel codes
430
+ 4. Upload to YouTube using **YouTube Manager** with channel metadata
431
+
432
+ #### Scenario 2: Content Lifecycle Tracking
433
+
434
+ **VAT's strength:** Storage orchestration (local → S3 → SSD)
435
+ **Channels' strength:** Project lifecycle (content → video → published → abandoned)
436
+
437
+ **Potential workflow:**
438
+ 1. Start in `content_projects` (Channels) - scripts, planning
439
+ 2. Move to `video_projects` (Channels) - **THIS is managed by VAT!**
440
+ 3. VAT handles S3 collaboration during editing
441
+ 4. Move to `published_projects` (Channels) when done
442
+ 5. VAT archives to SSD for long-term storage
443
+
444
+ ### Where Systems Conflict or Duplicate
445
+
446
+ #### ⚠️ Duplicate Brand/Channel Lists
447
+
448
+ **VAT has hardcoded brand shortcuts:**
449
+ ```ruby
450
+ case shortcut
451
+ when 'joy' then 'v-beauty-and-joy'
452
+ when 'ss' then 'v-supportsignal'
453
+ else "v-#{shortcut}"
454
+ end
455
+ ```
456
+
457
+ **Channels Config has channel keys:**
458
+ ```json
459
+ {
460
+ "channels": {
461
+ "appydave": { ... },
462
+ "appydave_coding": { ... }
463
+ }
464
+ }
465
+ ```
466
+
467
+ **Problem:**
468
+ - If you add a new brand to VAT, no automatic channel creation
469
+ - If you add a new channel to Channels config, no VAT brand
470
+ - **Manual synchronization required** to keep lists aligned
471
+
472
+ #### ⚠️ Project Location Ambiguity
473
+
474
+ **VAT assumes:**
475
+ - All projects for a brand are in `VIDEO_PROJECTS_ROOT/v-[brand]/`
476
+
477
+ **Channels Config allows:**
478
+ - Four separate locations per channel (content, video, published, abandoned)
479
+
480
+ **Conflict:**
481
+ - VAT can't handle projects split across multiple lifecycle folders
482
+ - Channels config can't leverage VAT's S3 sync for non-video-projects locations
483
+
484
+ ---
485
+
486
+ ## Architectural Diagrams
487
+
488
+ ### System Independence (Current State)
489
+
490
+ ```
491
+ ┌─────────────────────────────────────────────────────────────┐
492
+ │ appydave-tools │
493
+ │ │
494
+ │ ┌────────────────────┐ ┌──────────────────────┐ │
495
+ │ │ VAT System │ │ Channels Config │ │
496
+ │ │ │ │ │ │
497
+ │ │ Brands: │ │ Channels: │ │
498
+ │ │ • v-appydave │ │ • appydave │ │
499
+ │ │ • v-voz │ │ • appydave_coding │ │
500
+ │ │ • v-aitldr │ │ │ │
501
+ │ │ • v-kiros │ │ Locations: │ │
502
+ │ │ • v-joy │ │ • content_projects │ │
503
+ │ │ • v-ss │ │ • video_projects │ │
504
+ │ │ │ │ • published_proj. │ │
505
+ │ │ Projects: │ │ • abandoned_proj. │ │
506
+ │ │ • b65-* │ │ │ │
507
+ │ │ • boy-baker │ │ YouTube Metadata: │ │
508
+ │ │ │ │ • @handles │ │
509
+ │ └────────────────────┘ │ • names │ │
510
+ │ │ │ • codes │ │
511
+ │ │ └──────────────────────┘ │
512
+ │ │ ▲ │
513
+ │ │ │ │
514
+ │ │ ┌────────┴────────┐ │
515
+ │ │ │ NameManager │ │
516
+ │ │ │ │ │
517
+ │ │ │ Validates: │ │
518
+ │ │ │ • channel_code │ │
519
+ │ │ │ against │ │
520
+ │ │ │ Channels │ │
521
+ │ │ │ config │ │
522
+ │ │ └─────────────────┘ │
523
+ │ │ │
524
+ │ ▼ │
525
+ │ ┌────────────────────┐ │
526
+ │ │ Filesystem │ │
527
+ │ │ │ │
528
+ │ │ VIDEO_PROJECTS_ │ │
529
+ │ │ ROOT/ │ │
530
+ │ │ └─ v-appydave/ │ │
531
+ │ │ └─ b65-*/ │ │
532
+ │ └────────────────────┘ │
533
+ │ │
534
+ │ ┌────────────────────┐ │
535
+ │ │ Config Files │ │
536
+ │ │ │ │
537
+ │ │ ~/.vat-config │ │
538
+ │ │ ~/.config/ │ │
539
+ │ │ appydave/ │ │
540
+ │ │ channels.json │ │
541
+ │ └────────────────────┘ │
542
+ └─────────────────────────────────────────────────────────────┘
543
+
544
+ Legend:
545
+ → Depends on / References
546
+ ║ No connection
547
+ ```
548
+
549
+ ### Potential Integration (Future State)
550
+
551
+ ```
552
+ ┌─────────────────────────────────────────────────────────────┐
553
+ │ appydave-tools │
554
+ │ │
555
+ │ ┌────────────────────┐ ┌──────────────────────┐ │
556
+ │ │ VAT System │◄──┤ Channels Config │ │
557
+ │ │ │ │ │ │
558
+ │ │ Brands: │ │ Channels: │ │
559
+ │ │ • v-appydave ◄───┼───┤ • appydave │ │
560
+ │ │ • v-voz ◄───┼───┤ video_projects: │ │
561
+ │ │ • v-aitldr │ │ /path/to/vat/ │ │
562
+ │ │ │ │ v-appydave/ │ │
563
+ │ │ Projects: ────┼───┤ │ │
564
+ │ │ • b65-ad-* ◄──────┼───┤ • appydave_coding │ │
565
+ │ │ NameMgr │ video_projects: │ │
566
+ │ │ validates│ /path/to/vat/ │ │
567
+ │ │ channel │ v-appydave-coding/│ │
568
+ │ │ codes │ │ │
569
+ │ └────────────────────┘ └──────────────────────┘ │
570
+ │ │ ▲ │
571
+ │ │ │ │
572
+ │ │ ┌────────┴────────┐ │
573
+ │ └───────────────►│ NameManager │ │
574
+ │ │ │ │
575
+ │ │ Bridge: │ │
576
+ │ │ • Validates │ │
577
+ │ │ codes │ │
578
+ │ │ • Generates │ │
579
+ │ │ VAT project │ │
580
+ │ │ names │ │
581
+ │ └─────────────────┘ │
582
+ │ │
583
+ └─────────────────────────────────────────────────────────────┘
584
+
585
+ Legend:
586
+ → Direct reference
587
+ ◄── Potential integration point
588
+ ```
589
+
590
+ ---
591
+
592
+ ## Data Model Visualization
593
+
594
+ ### VAT Data Model
595
+
596
+ ```
597
+ VIDEO_PROJECTS_ROOT
598
+ └── v-{brand}/ ← Brand (filesystem directory)
599
+ ├── .video-tools.env ← Brand config (AWS, SSD)
600
+ ├── .git/ ← Git repo for metadata
601
+ ├── {project-name}/ ← Project (subdirectory)
602
+ │ ├── s3-staging/ ← Collaboration folder
603
+ │ ├── recordings/ ← Raw footage
604
+ │ └── chapters/ ← Edited segments
605
+ └── archived/ ← Completed projects
606
+
607
+ Brands: v-appydave, v-voz, v-aitldr, v-kiros, v-beauty-and-joy, v-supportsignal
608
+ Projects: b65-guy-monroe-marketing-plan, boy-baker, etc.
609
+ ```
610
+
611
+ ### Channels Config Data Model
612
+
613
+ ```
614
+ ~/.config/appydave/channels.json
615
+ {
616
+ "channels": {
617
+ "{channel_key}": { ← Channel (logical entity)
618
+ "code": "xx", ← Short code for naming
619
+ "name": "Display Name", ← Human-readable name
620
+ "youtube_handle": "@handle", ← YouTube @handle
621
+ "locations": {
622
+ "content_projects": "/path", ← Stage 1: Planning/Scripts
623
+ "video_projects": "/path", ← Stage 2: Active Production ★
624
+ "published_projects": "/path", ← Stage 3: Published Videos
625
+ "abandoned_projects": "/path" ← Stage 4: Failed Projects
626
+ }
627
+ }
628
+ }
629
+ }
630
+
631
+ ★ This location COULD be the VAT brand directory!
632
+ ```
633
+
634
+ ### NameManager Data Model
635
+
636
+ ```
637
+ Project Filename Pattern:
638
+
639
+ [sequence]-[channel_code]-[project_name]
640
+ ↑ ↑ ↑
641
+ │ │ └─ Descriptive name
642
+ │ └──────────────── Validated against Channels config
643
+ └──────────────────────────── Numeric sequence
644
+
645
+ Examples:
646
+ 40-ad-my-video → sequence: "40", code: "ad", name: "my-video"
647
+ 50-another-video → sequence: "50", code: nil, name: "another-video"
648
+ ```
649
+
650
+ ---
651
+
652
+ ## Recommendations
653
+
654
+ ### 1. **Keep Systems Separate** ✅ RECOMMENDED
655
+
656
+ **Rationale:**
657
+ - Each system has a **well-defined, distinct purpose**
658
+ - No functional conflicts or duplication of logic
659
+ - Separation of concerns is clean
660
+
661
+ **Action Items:**
662
+ - ✅ **No changes needed** to core architecture
663
+ - ✅ **Document the differences** (this analysis serves that purpose)
664
+
665
+ ---
666
+
667
+ ### 2. **Bridge Systems via NameManager** 🔄 OPTIONAL
668
+
669
+ **Rationale:**
670
+ - NameManager already validates channel codes from Channels config
671
+ - Could extend to validate VAT brand names
672
+ - Could generate filenames for both systems
673
+
674
+ **Potential Implementation:**
675
+ ```ruby
676
+ class ProjectName
677
+ # Existing: Validates channel codes
678
+ def channel_code=(code)
679
+ @channel_code = (code if config.channels.code?(code))
680
+ end
681
+
682
+ # NEW: Validate VAT brand
683
+ def vat_brand=(brand)
684
+ @vat_brand = (brand if Vat::Config.available_brands.include?(brand))
685
+ end
686
+
687
+ # NEW: Generate VAT project directory name
688
+ def vat_project_name
689
+ # For FliVideo pattern (AppyDave): b65-guy-monroe-marketing-plan
690
+ # For Storyline pattern (VOZ): boy-baker
691
+ # ...
692
+ end
693
+ end
694
+ ```
695
+
696
+ **Benefits:**
697
+ - ✅ Single source of truth for naming conventions
698
+ - ✅ Consistent filename generation across systems
699
+ - ✅ Validation that project names match expected patterns
700
+
701
+ **Risks:**
702
+ - ⚠️ Adds complexity to NameManager
703
+ - ⚠️ Creates coupling between previously independent systems
704
+
705
+ **Recommendation:** **Not critical** - Current separation works well
706
+
707
+ ---
708
+
709
+ ### 3. **Align Channels Config with VAT Brands** 🔄 OPTIONAL
710
+
711
+ **Rationale:**
712
+ - `video_projects` location in Channels config **could** point to VAT brand directories
713
+ - Would allow unified project listing across both systems
714
+
715
+ **Potential Implementation:**
716
+
717
+ **Current Channels Config:**
718
+ ```json
719
+ {
720
+ "appydave": {
721
+ "locations": {
722
+ "video_projects": "/Volumes/Expansion/Sync/tube-channels/appydave/active"
723
+ }
724
+ }
725
+ }
726
+ ```
727
+
728
+ **Aligned with VAT:**
729
+ ```json
730
+ {
731
+ "appydave": {
732
+ "locations": {
733
+ "video_projects": "/Users/davidcruwys/dev/video-projects/v-appydave"
734
+ // ↑ Same as Vat::Config.brand_path('appydave')
735
+ }
736
+ }
737
+ }
738
+ ```
739
+
740
+ **Benefits:**
741
+ - ✅ Unified view of projects across systems
742
+ - ✅ Can use Channels config to discover VAT project locations
743
+ - ✅ Team members can share same logical structure
744
+
745
+ **Challenges:**
746
+ - ⚠️ Assumes all `video_projects` follow VAT structure (may not be true)
747
+ - ⚠️ Requires manual synchronization when adding brands/channels
748
+ - ⚠️ Channels config currently supports 4 project types, VAT only supports 1 location
749
+
750
+ **Recommendation:** **Document the pattern** but don't enforce it programmatically
751
+
752
+ ---
753
+
754
+ ### 4. **Add Cross-System Validation** 🔄 OPTIONAL (LOW PRIORITY)
755
+
756
+ **Rationale:**
757
+ - Catch mismatches between VAT brands and Channels config
758
+ - Warn if a channel has `video_projects` path that doesn't match VAT brand path
759
+
760
+ **Potential Implementation:**
761
+ ```ruby
762
+ # New validation module
763
+ module Appydave::Tools::Validation
764
+ class CrossSystemValidator
765
+ def validate_channels_vat_alignment
766
+ config.channels.channels.each do |channel|
767
+ vat_brand = "v-#{channel.key}"
768
+
769
+ # Check if VAT brand exists
770
+ unless Vat::Config.available_brands.include?(channel.key)
771
+ warn "Channel '#{channel.key}' has no corresponding VAT brand '#{vat_brand}'"
772
+ end
773
+
774
+ # Check if video_projects path matches VAT brand path
775
+ expected_path = Vat::Config.brand_path(channel.key)
776
+ actual_path = channel.locations.video_projects
777
+
778
+ if actual_path != expected_path
779
+ warn "Channel '#{channel.key}' video_projects path mismatch:"
780
+ warn " Expected (VAT): #{expected_path}"
781
+ warn " Actual (Config): #{actual_path}"
782
+ end
783
+ end
784
+ end
785
+ end
786
+ end
787
+ ```
788
+
789
+ **Benefits:**
790
+ - ✅ Catch configuration drift
791
+ - ✅ Help onboard new team members
792
+ - ✅ Validate setup during `vat init` or `bin/configuration.rb -c`
793
+
794
+ **Risks:**
795
+ - ⚠️ May report false positives if user intentionally has different paths
796
+ - ⚠️ Adds maintenance overhead
797
+
798
+ **Recommendation:** **Not critical** - Only implement if configuration drift becomes a problem
799
+
800
+ ---
801
+
802
+ ### 5. **Document Relationship in User Guides** ✅ RECOMMENDED
803
+
804
+ **Rationale:**
805
+ - Users should understand when to use each system
806
+ - Clear documentation prevents confusion
807
+
808
+ **Action Items:**
809
+
810
+ **VAT Documentation (`docs/usage/vat.md`):**
811
+ ```markdown
812
+ ## Relationship to Channels Configuration
813
+
814
+ VAT manages **video project storage** (local/S3/SSD orchestration).
815
+
816
+ If you use the **Channels Configuration** system for YouTube channel
817
+ metadata, you can align your `video_projects` location to match VAT's
818
+ brand directory:
819
+
820
+ Channels config:
821
+ {
822
+ "appydave": {
823
+ "locations": {
824
+ "video_projects": "/path/to/video-projects/v-appydave"
825
+ }
826
+ }
827
+ }
828
+
829
+ This allows both systems to reference the same physical projects.
830
+ ```
831
+
832
+ **Channels Documentation (`docs/usage/channels-config.md` - NEW):**
833
+ ```markdown
834
+ ## Relationship to VAT (Video Asset Tools)
835
+
836
+ The Channels Configuration tracks **YouTube channel metadata** and
837
+ **project lifecycle locations**.
838
+
839
+ The `video_projects` location can point to a VAT brand directory to
840
+ leverage VAT's S3 sync and storage orchestration features.
841
+
842
+ Example alignment:
843
+ - Channel key: `appydave`
844
+ - VAT brand: `v-appydave`
845
+ - Shared path: `/path/to/video-projects/v-appydave`
846
+ ```
847
+
848
+ **Recommendation:** **HIGH PRIORITY** - Add this documentation now
849
+
850
+ ---
851
+
852
+ ### 6. **Create Brand/Channel Registry** 🆕 FUTURE CONSIDERATION
853
+
854
+ **Rationale:**
855
+ - Currently, VAT brands are hardcoded shortcuts
856
+ - Channels config is manually maintained JSON
857
+ - Could unify into a single registry
858
+
859
+ **Potential Implementation:**
860
+
861
+ **New: `~/.config/appydave/brands.json`**
862
+ ```json
863
+ {
864
+ "brands": [
865
+ {
866
+ "key": "appydave",
867
+ "vat_name": "v-appydave",
868
+ "channel": {
869
+ "code": "ad",
870
+ "name": "AppyDave",
871
+ "youtube_handle": "@appydave"
872
+ },
873
+ "locations": {
874
+ "vat_root": "/path/to/video-projects/v-appydave",
875
+ "content": "/path/to/content/appydave",
876
+ "published": "/path/to/published/appydave",
877
+ "abandoned": "/path/to/abandoned/appydave"
878
+ }
879
+ }
880
+ ]
881
+ }
882
+ ```
883
+
884
+ **Benefits:**
885
+ - ✅ Single source of truth for brands/channels
886
+ - ✅ VAT shortcuts generated from config (not hardcoded)
887
+ - ✅ Unified brand management
888
+ - ✅ Easier to add new brands
889
+
890
+ **Challenges:**
891
+ - ⚠️ Significant refactoring required
892
+ - ⚠️ Migration path for existing configs
893
+ - ⚠️ May over-engineer for current needs
894
+
895
+ **Recommendation:** **DEFER** - Only implement if managing 10+ brands becomes unwieldy
896
+
897
+ ---
898
+
899
+ ## Summary of Integration Points
900
+
901
+ | Integration Opportunity | Current State | Recommended Action | Priority |
902
+ |-------------------------|---------------|-------------------|----------|
903
+ | **Channels.video_projects → VAT brand path** | Possible but not enforced | Document the pattern | ✅ HIGH |
904
+ | **NameManager validates VAT brands** | Not implemented | Optional enhancement | 🔄 LOW |
905
+ | **Cross-system validation** | Not implemented | Add if drift occurs | 🔄 LOW |
906
+ | **Unified brand registry** | Separate systems | Defer until needed | ⏸️ FUTURE |
907
+ | **VAT shortcuts from Channels config** | Hardcoded in VAT | Could be config-driven | 🔄 MEDIUM |
908
+
909
+ ---
910
+
911
+ ## Conclusion
912
+
913
+ The `appydave-tools` codebase contains **three well-separated systems** for managing projects and brands:
914
+
915
+ 1. **VAT** - Storage orchestration (filesystem + S3 + SSD)
916
+ 2. **Channels Config** - YouTube metadata + project lifecycle tracking
917
+ 3. **NameManager** - File naming conventions with validation
918
+
919
+ These systems **complement each other** without direct conflicts. The main integration opportunity is **aligning `video_projects` paths** in Channels Config to match VAT brand directories, enabling unified project management.
920
+
921
+ **Recommended Next Steps:**
922
+ 1. ✅ **Document the relationship** between systems in user guides
923
+ 2. ✅ **Keep systems separate** - current architecture is sound
924
+ 3. 🔄 **Optional:** Add cross-system validation if configuration drift becomes an issue
925
+ 4. ⏸️ **Defer:** Unified brand registry until managing 10+ brands
926
+
927
+ **Key Insight:** The apparent "overlap" is actually **complementary functionality** - VAT handles storage, Channels handles metadata, and NameManager bridges the naming conventions. This separation of concerns is a **strength**, not a weakness.
928
+
929
+ ---
930
+
931
+ **Analysis by:** Claude Code
932
+ **Date:** 2025-11-09
933
+ **Repository:** `appydave-tools`
934
+ **Last Updated:** 2025-11-09