appydave-tools 0.21.2 → 0.22.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/dam +137 -0
- data/docs/README.md +187 -90
- data/docs/architecture/dam/dam-cli-enhancements.md +642 -0
- data/docs/architecture/dam/dam-cli-implementation-guide.md +1041 -0
- data/docs/architecture/dam/dam-data-model.md +466 -0
- data/docs/architecture/dam/dam-visualization-requirements.md +641 -0
- data/docs/architecture/dam/implementation-roadmap.md +328 -0
- data/docs/architecture/dam/jan-collaboration-guide.md +309 -0
- data/lib/appydave/tools/dam/s3_operations.rb +57 -5
- data/lib/appydave/tools/dam/s3_scanner.rb +139 -0
- data/lib/appydave/tools/version.rb +1 -1
- data/lib/appydave/tools.rb +1 -0
- data/package.json +1 -1
- metadata +37 -32
- data/docs/development/CODEX-recommendations.md +0 -258
- data/docs/development/README.md +0 -100
- /data/docs/{development/pattern-comparison.md → architecture/cli/cli-pattern-comparison.md} +0 -0
- /data/docs/{development/cli-architecture-patterns.md → architecture/cli/cli-patterns.md} +0 -0
- /data/docs/{project-brand-systems-analysis.md → architecture/configuration/configuration-systems.md} +0 -0
- /data/docs/{dam → architecture/dam}/dam-vision.md +0 -0
- /data/docs/{dam/prd-client-sharing.md → architecture/dam/design-decisions/002-client-sharing.md} +0 -0
- /data/docs/{dam/prd-git-integration.md → architecture/dam/design-decisions/003-git-integration.md} +0 -0
- /data/docs/{prd-unified-brands-configuration.md → architecture/design-decisions/001-unified-brands-config.md} +0 -0
- /data/docs/{dam/session-summary-2025-11-09.md → architecture/design-decisions/session-2025-11-09.md} +0 -0
- /data/docs/{configuration/README.md → guides/configuration-setup.md} +0 -0
- /data/docs/{dam → guides/platforms}/windows/README.md +0 -0
- /data/docs/{dam → guides/platforms}/windows/dam-testing-plan-windows-powershell.md +0 -0
- /data/docs/{dam → guides/platforms}/windows/installation.md +0 -0
- /data/docs/{tools → guides/tools}/bank-reconciliation.md +0 -0
- /data/docs/{tools → guides/tools}/cli-actions.md +0 -0
- /data/docs/{tools → guides/tools}/configuration.md +0 -0
- /data/docs/{dam → guides/tools/dam}/dam-testing-plan.md +0 -0
- /data/docs/{dam/usage.md → guides/tools/dam/dam-usage.md} +0 -0
- /data/docs/{tools → guides/tools}/gpt-context.md +0 -0
- /data/docs/{tools → guides/tools}/index.md +0 -0
- /data/docs/{tools → guides/tools}/move-images.md +0 -0
- /data/docs/{tools → guides/tools}/name-manager.md +0 -0
- /data/docs/{tools → guides/tools}/prompt-tools.md +0 -0
- /data/docs/{tools → guides/tools}/subtitle-processor.md +0 -0
- /data/docs/{tools → guides/tools}/youtube-automation.md +0 -0
- /data/docs/{tools → guides/tools}/youtube-manager.md +0 -0
- /data/docs/{configuration → templates}/.env.example +0 -0
- /data/docs/{configuration → templates}/channels.example.json +0 -0
- /data/docs/{configuration → templates}/settings.example.json +0 -0
|
@@ -0,0 +1,642 @@
|
|
|
1
|
+
# DAM CLI Enhancements
|
|
2
|
+
|
|
3
|
+
**Digital Asset Management - Command Line Tool Requirements**
|
|
4
|
+
|
|
5
|
+
This document specifies all CLI tool enhancements needed to support the DAM visualization dashboard, including new commands, naming consolidation, and architectural improvements.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Overview
|
|
10
|
+
|
|
11
|
+
The DAM system requires CLI tool enhancements in three areas:
|
|
12
|
+
|
|
13
|
+
1. **Naming Consolidation** - Consistent naming across `exe/`, `bin/`, and `lib/`
|
|
14
|
+
2. **New Commands** - S3 scanning, project manifests, bulk operations
|
|
15
|
+
3. **Manifest Schema Changes** - Support for richer data structures
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## 1. Naming Convention Consolidation
|
|
20
|
+
|
|
21
|
+
### Current State (Inconsistent)
|
|
22
|
+
|
|
23
|
+
**Problem:** Executables have inconsistent naming patterns:
|
|
24
|
+
|
|
25
|
+
| Current Name | Type | Issue |
|
|
26
|
+
|--------------|------|-------|
|
|
27
|
+
| `ad_config` | Configuration tool | Underscore, not dash |
|
|
28
|
+
| `dam` | Video asset management | Short, ambiguous (was `vat`) |
|
|
29
|
+
| `youtube_manager` | YouTube operations | Underscore, verbose |
|
|
30
|
+
| `gpt_context` | Context gathering | Underscore |
|
|
31
|
+
| `subtitle_processor` | Subtitle operations | Underscore |
|
|
32
|
+
|
|
33
|
+
**Three-Layer Confusion:**
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
exe/ # Installed commands (what users run)
|
|
37
|
+
├── ad_config # → `ad_config` command
|
|
38
|
+
├── dam # → `dam` command
|
|
39
|
+
└── (missing others)
|
|
40
|
+
|
|
41
|
+
bin/ # Development scripts (internal)
|
|
42
|
+
├── configuration.rb # → Implements ad_config
|
|
43
|
+
├── dam # → Implements dam
|
|
44
|
+
├── youtube_manager.rb # → NOT in exe/ (missing!)
|
|
45
|
+
├── gpt_context.rb # → NOT in exe/ (missing!)
|
|
46
|
+
└── ...
|
|
47
|
+
|
|
48
|
+
lib/appydave/tools/ # Library code
|
|
49
|
+
├── dam/ # → DAM module
|
|
50
|
+
├── configuration/ # → Configuration module
|
|
51
|
+
├── youtube_manager/ # → YouTube module
|
|
52
|
+
└── ...
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
**Issue:** Some tools missing from `exe/` (not installable via gem), naming inconsistency makes discoverability hard.
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
### Proposed Solution: Option B (Consistent Dash Naming)
|
|
60
|
+
|
|
61
|
+
**Naming Convention:**
|
|
62
|
+
- All commands prefixed with `ad-` (AppyDave namespace)
|
|
63
|
+
- Use dashes, not underscores
|
|
64
|
+
- Descriptive but concise
|
|
65
|
+
|
|
66
|
+
**New Command Structure:**
|
|
67
|
+
|
|
68
|
+
```
|
|
69
|
+
exe/ # Installed commands
|
|
70
|
+
├── ad-dam # Video asset management (rename from `dam`)
|
|
71
|
+
├── ad-config # Configuration management (rename from `ad_config`)
|
|
72
|
+
├── ad-youtube # YouTube operations (rename from `youtube_manager`)
|
|
73
|
+
├── ad-context # GPT context gathering (rename from `gpt_context`)
|
|
74
|
+
├── ad-subtitles # Subtitle processing (rename from `subtitle_processor`)
|
|
75
|
+
└── ad-prompts # Prompt tools (rename from `prompt_tools`)
|
|
76
|
+
|
|
77
|
+
bin/ # Development scripts (match exe/)
|
|
78
|
+
├── ad-dam # DAM CLI implementation
|
|
79
|
+
├── ad-config # Config CLI implementation
|
|
80
|
+
├── ad-youtube # YouTube CLI implementation
|
|
81
|
+
├── ad-context # Context CLI implementation
|
|
82
|
+
├── ad-subtitles # Subtitles CLI implementation
|
|
83
|
+
└── ad-prompts # Prompts CLI implementation
|
|
84
|
+
|
|
85
|
+
lib/appydave/tools/ # Library modules (no change)
|
|
86
|
+
├── dam/ # DAM module
|
|
87
|
+
├── configuration/ # Configuration module
|
|
88
|
+
├── youtube_manager/ # YouTube module (keep internal name)
|
|
89
|
+
├── gpt_context/ # GPT context module (keep internal name)
|
|
90
|
+
└── ...
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
**Migration Strategy:**
|
|
94
|
+
|
|
95
|
+
1. **Create new `exe/` wrappers** with `ad-` prefix
|
|
96
|
+
2. **Keep old names as symlinks** (backward compatibility)
|
|
97
|
+
3. **Deprecation warnings** when old names used
|
|
98
|
+
4. **Remove old names** in next major version (1.0.0)
|
|
99
|
+
|
|
100
|
+
**Example Deprecation Warning:**
|
|
101
|
+
```
|
|
102
|
+
$ ad_config -l
|
|
103
|
+
⚠️ WARNING: 'ad_config' is deprecated. Use 'ad-config' instead.
|
|
104
|
+
This alias will be removed in v1.0.0
|
|
105
|
+
|
|
106
|
+
NAME | EXISTS | PATH
|
|
107
|
+
...
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
### File Structure After Consolidation
|
|
113
|
+
|
|
114
|
+
```
|
|
115
|
+
exe/
|
|
116
|
+
├── ad-dam # NEW: Primary DAM command
|
|
117
|
+
├── ad-config # NEW: Renamed from ad_config
|
|
118
|
+
├── ad-youtube # NEW: Replaces youtube_manager
|
|
119
|
+
├── ad-context # NEW: Replaces gpt_context
|
|
120
|
+
├── ad-subtitles # NEW: Replaces subtitle_processor
|
|
121
|
+
├── ad-prompts # NEW: Replaces prompt_tools
|
|
122
|
+
│
|
|
123
|
+
├── dam # DEPRECATED: Symlink to ad-dam
|
|
124
|
+
├── ad_config # DEPRECATED: Symlink to ad-config
|
|
125
|
+
└── (no other legacy commands in exe/ yet)
|
|
126
|
+
|
|
127
|
+
bin/
|
|
128
|
+
├── ad-dam # Rename from dam
|
|
129
|
+
├── ad-config # Rename from configuration.rb
|
|
130
|
+
├── ad-youtube # Rename from youtube_manager.rb
|
|
131
|
+
├── ad-context # Rename from gpt_context.rb
|
|
132
|
+
├── ad-subtitles # Rename from subtitle_processor.rb
|
|
133
|
+
└── ad-prompts # Rename from prompt_tools.rb
|
|
134
|
+
|
|
135
|
+
lib/appydave/tools/
|
|
136
|
+
├── dam/ # No change (internal module name)
|
|
137
|
+
├── configuration/ # No change
|
|
138
|
+
├── youtube_manager/ # No change
|
|
139
|
+
├── gpt_context/ # No change
|
|
140
|
+
└── subtitle_processor/ # No change
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
**Note:** `lib/` module names stay the same (internal implementation detail). Only user-facing `exe/` and `bin/` scripts are renamed.
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## 2. New Commands
|
|
148
|
+
|
|
149
|
+
### 2.1 Brand-Level S3 Scan
|
|
150
|
+
|
|
151
|
+
**Command:** `ad-dam s3-scan <brand>`
|
|
152
|
+
|
|
153
|
+
**Purpose:** Query AWS S3 to discover actual files in staging, update manifest with real S3 data.
|
|
154
|
+
|
|
155
|
+
**Current Limitation:** Manifest only knows about local `s3-staging/` folder existence, not actual S3 contents.
|
|
156
|
+
|
|
157
|
+
**Behavior:**
|
|
158
|
+
```bash
|
|
159
|
+
# Scan single brand
|
|
160
|
+
ad-dam s3-scan appydave
|
|
161
|
+
|
|
162
|
+
# Scan all brands
|
|
163
|
+
ad-dam s3-scan all
|
|
164
|
+
|
|
165
|
+
# Dry run (show what would be scanned)
|
|
166
|
+
ad-dam s3-scan appydave --dry-run
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
**What It Does:**
|
|
170
|
+
1. Read brand configuration (AWS profile, S3 bucket, prefix)
|
|
171
|
+
2. Query AWS S3: `aws s3 ls s3://{bucket}/{prefix}/ --recursive`
|
|
172
|
+
3. For each project found in S3:
|
|
173
|
+
- List files and sizes
|
|
174
|
+
- Calculate total S3 storage per project
|
|
175
|
+
- Detect if project exists locally
|
|
176
|
+
4. Update `{brand}/projects.json` manifest with S3 data
|
|
177
|
+
|
|
178
|
+
**Manifest Schema Change:**
|
|
179
|
+
```json
|
|
180
|
+
{
|
|
181
|
+
"projects": [
|
|
182
|
+
{
|
|
183
|
+
"id": "b65-guy-monroe-marketing-plan",
|
|
184
|
+
"storage": {
|
|
185
|
+
"s3": {
|
|
186
|
+
"exists": true,
|
|
187
|
+
"last_scanned": "2025-11-18T12:00:00Z",
|
|
188
|
+
"file_count": 2,
|
|
189
|
+
"total_bytes": 125000000,
|
|
190
|
+
"files": [
|
|
191
|
+
{
|
|
192
|
+
"key": "b65-guy-monroe-marketing-plan.mp4",
|
|
193
|
+
"size": 125000000,
|
|
194
|
+
"last_modified": "2025-11-17T15:30:00Z"
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
"key": "b65-guy-monroe-marketing-plan.srt",
|
|
198
|
+
"size": 50000,
|
|
199
|
+
"last_modified": "2025-11-17T15:35:00Z"
|
|
200
|
+
}
|
|
201
|
+
]
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
]
|
|
206
|
+
}
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
**Usage in Dashboard:**
|
|
210
|
+
- Shows accurate "Jan uploaded files" status
|
|
211
|
+
- Displays S3 file count and size
|
|
212
|
+
- Warns if manifest is stale (last_scanned > 1 day ago)
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
### 2.2 Project-Level Manifest Generator
|
|
217
|
+
|
|
218
|
+
**Command:** `ad-dam project-manifest <brand> <project>`
|
|
219
|
+
|
|
220
|
+
**Purpose:** Generate detailed file tree for a single project.
|
|
221
|
+
|
|
222
|
+
**Output:** `{project}/.project-manifest.json`
|
|
223
|
+
|
|
224
|
+
**Behavior:**
|
|
225
|
+
```bash
|
|
226
|
+
# Generate manifest for specific project
|
|
227
|
+
ad-dam project-manifest appydave b64-bmad-claude-sdk
|
|
228
|
+
|
|
229
|
+
# Output location: /path/to/v-appydave/b64-bmad-claude-sdk/.project-manifest.json
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
**What It Does:**
|
|
233
|
+
1. Scan project directory recursively
|
|
234
|
+
2. Build tree structure with file counts and sizes per directory
|
|
235
|
+
3. Include subdirectories (e.g., `recordings/recordings-bmad-v6/`)
|
|
236
|
+
4. Write JSON to project root
|
|
237
|
+
|
|
238
|
+
**Manifest Schema:**
|
|
239
|
+
```json
|
|
240
|
+
{
|
|
241
|
+
"project_id": "b64-bmad-claude-sdk",
|
|
242
|
+
"brand": "appydave",
|
|
243
|
+
"type": "flivideo",
|
|
244
|
+
"generated_at": "2025-11-18T12:00:00Z",
|
|
245
|
+
"tree": {
|
|
246
|
+
"recordings": {
|
|
247
|
+
"type": "directory",
|
|
248
|
+
"file_count": 75,
|
|
249
|
+
"total_bytes": 6800000000,
|
|
250
|
+
"subdirectories": {
|
|
251
|
+
"recordings-bmad-v6": {
|
|
252
|
+
"type": "directory",
|
|
253
|
+
"file_count": 26,
|
|
254
|
+
"total_bytes": 1200000000
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
},
|
|
258
|
+
"assets": {
|
|
259
|
+
"type": "directory",
|
|
260
|
+
"file_count": 12,
|
|
261
|
+
"total_bytes": 2000000,
|
|
262
|
+
"subdirectories": {}
|
|
263
|
+
},
|
|
264
|
+
"s3-staging": {
|
|
265
|
+
"type": "directory",
|
|
266
|
+
"file_count": 2,
|
|
267
|
+
"total_bytes": 125000000,
|
|
268
|
+
"subdirectories": {}
|
|
269
|
+
},
|
|
270
|
+
"transcripts": {
|
|
271
|
+
"type": "directory",
|
|
272
|
+
"file_count": 3,
|
|
273
|
+
"total_bytes": 500000,
|
|
274
|
+
"subdirectories": {}
|
|
275
|
+
}
|
|
276
|
+
},
|
|
277
|
+
"heavy_files": {
|
|
278
|
+
"count": 75,
|
|
279
|
+
"total_bytes": 6800000000,
|
|
280
|
+
"extensions": [".mov", ".mp4"]
|
|
281
|
+
},
|
|
282
|
+
"light_files": {
|
|
283
|
+
"count": 17,
|
|
284
|
+
"total_bytes": 2500000,
|
|
285
|
+
"extensions": [".srt", ".txt", ".png", ".jpg", ".md"]
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
**Characteristics:**
|
|
291
|
+
- **Transient** - Not committed to git (add to `.gitignore`)
|
|
292
|
+
- **Optional** - Dashboard works without it
|
|
293
|
+
- **On-demand** - Only generated when needed
|
|
294
|
+
- **Future:** Button in Astro to trigger generation
|
|
295
|
+
|
|
296
|
+
**Gitignore Addition:**
|
|
297
|
+
```gitignore
|
|
298
|
+
# Project manifests (transient, regenerate on demand)
|
|
299
|
+
.project-manifest.json
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
---
|
|
303
|
+
|
|
304
|
+
### 2.3 Bulk Manifest Operations
|
|
305
|
+
|
|
306
|
+
**Command:** `ad-dam manifest all`
|
|
307
|
+
|
|
308
|
+
**Purpose:** Generate manifests for all brands in one command.
|
|
309
|
+
|
|
310
|
+
**Behavior:**
|
|
311
|
+
```bash
|
|
312
|
+
# Generate all brand manifests
|
|
313
|
+
ad-dam manifest all
|
|
314
|
+
|
|
315
|
+
# Equivalent to:
|
|
316
|
+
# ad-dam manifest appydave
|
|
317
|
+
# ad-dam manifest aitldr
|
|
318
|
+
# ad-dam manifest voz
|
|
319
|
+
# ad-dam manifest kiros
|
|
320
|
+
# ad-dam manifest beauty-and-joy
|
|
321
|
+
# ad-dam manifest supportsignal
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
**What It Does:**
|
|
325
|
+
1. Read `brands.json` configuration
|
|
326
|
+
2. Loop through all brands
|
|
327
|
+
3. Generate manifest for each
|
|
328
|
+
4. Show summary report
|
|
329
|
+
|
|
330
|
+
**Output:**
|
|
331
|
+
```
|
|
332
|
+
📊 Generating manifests for all brands...
|
|
333
|
+
|
|
334
|
+
✅ appydave (21 projects, 11.5 GB local, 400 GB SSD)
|
|
335
|
+
✅ aitldr (3 projects, 0.5 GB local, 0 GB SSD)
|
|
336
|
+
✅ voz (2 projects, 0.45 GB local, 0 GB SSD)
|
|
337
|
+
✅ kiros (0 projects)
|
|
338
|
+
✅ beauty-and-joy (0 projects)
|
|
339
|
+
✅ supportsignal (0 projects)
|
|
340
|
+
|
|
341
|
+
Summary:
|
|
342
|
+
Total projects: 26
|
|
343
|
+
Total local storage: 12.45 GB
|
|
344
|
+
Total SSD storage: 400 GB
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
---
|
|
348
|
+
|
|
349
|
+
### 2.4 Combined Scan and Manifest
|
|
350
|
+
|
|
351
|
+
**Command:** `ad-dam refresh <brand>`
|
|
352
|
+
|
|
353
|
+
**Purpose:** Full refresh - regenerate manifest + S3 scan in one command.
|
|
354
|
+
|
|
355
|
+
**Behavior:**
|
|
356
|
+
```bash
|
|
357
|
+
# Full refresh for one brand
|
|
358
|
+
ad-dam refresh appydave
|
|
359
|
+
|
|
360
|
+
# Full refresh for all brands
|
|
361
|
+
ad-dam refresh all
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
**What It Does:**
|
|
365
|
+
1. Generate brand manifest (local + SSD scan)
|
|
366
|
+
2. Run S3 scan (query AWS for real S3 data)
|
|
367
|
+
3. Update manifest with combined data
|
|
368
|
+
4. Show summary
|
|
369
|
+
|
|
370
|
+
**Equivalent to:**
|
|
371
|
+
```bash
|
|
372
|
+
ad-dam manifest appydave && ad-dam s3-scan appydave
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
---
|
|
376
|
+
|
|
377
|
+
## 3. Existing Command Changes
|
|
378
|
+
|
|
379
|
+
### 3.1 Manifest Generator Enhancements
|
|
380
|
+
|
|
381
|
+
**File:** `lib/appydave/tools/dam/manifest_generator.rb`
|
|
382
|
+
|
|
383
|
+
**Changes Needed:**
|
|
384
|
+
|
|
385
|
+
1. **Add S3 scan integration**
|
|
386
|
+
- After filesystem scan, optionally query S3
|
|
387
|
+
- Merge S3 data into manifest
|
|
388
|
+
- Add `last_scanned` timestamp
|
|
389
|
+
|
|
390
|
+
2. **Add project type detection for transcripts**
|
|
391
|
+
- FliVideo: Check for `transcripts/` folder
|
|
392
|
+
- Storyline: Check for `data/source/transcript.*`
|
|
393
|
+
- Add `has_transcript` boolean to project entry
|
|
394
|
+
|
|
395
|
+
3. **Enhanced disk usage**
|
|
396
|
+
- Add S3 storage totals
|
|
397
|
+
- Separate heavy/light file breakdowns
|
|
398
|
+
|
|
399
|
+
**New Manifest Fields:**
|
|
400
|
+
```json
|
|
401
|
+
{
|
|
402
|
+
"config": {
|
|
403
|
+
"brand": "appydave",
|
|
404
|
+
"local_base": "/path/to/v-appydave",
|
|
405
|
+
"ssd_base": "/Volumes/T7/appydave",
|
|
406
|
+
"s3_bucket": "appydave-video-projects",
|
|
407
|
+
"s3_prefix": "staging/v-appydave/",
|
|
408
|
+
"last_updated": "2025-11-18T12:00:00Z",
|
|
409
|
+
"last_s3_scan": "2025-11-18T11:55:00Z",
|
|
410
|
+
"disk_usage": {
|
|
411
|
+
"local": { "total_gb": 11.55 },
|
|
412
|
+
"ssd": { "total_gb": 400.24 },
|
|
413
|
+
"s3": { "total_gb": 2.5 }
|
|
414
|
+
}
|
|
415
|
+
},
|
|
416
|
+
"projects": [
|
|
417
|
+
{
|
|
418
|
+
"id": "b64-bmad-claude-sdk",
|
|
419
|
+
"type": "flivideo",
|
|
420
|
+
"has_transcript": true,
|
|
421
|
+
"storage": {
|
|
422
|
+
"local": { "exists": true, "..." },
|
|
423
|
+
"s3": {
|
|
424
|
+
"exists": true,
|
|
425
|
+
"last_scanned": "2025-11-18T11:55:00Z",
|
|
426
|
+
"file_count": 2,
|
|
427
|
+
"total_bytes": 125000000
|
|
428
|
+
},
|
|
429
|
+
"ssd": { "exists": false }
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
]
|
|
433
|
+
}
|
|
434
|
+
```
|
|
435
|
+
|
|
436
|
+
---
|
|
437
|
+
|
|
438
|
+
### 3.2 Transcript Detection
|
|
439
|
+
|
|
440
|
+
**Add to ManifestGenerator:**
|
|
441
|
+
|
|
442
|
+
```ruby
|
|
443
|
+
def has_transcript?(project_path, project_type)
|
|
444
|
+
case project_type
|
|
445
|
+
when 'flivideo'
|
|
446
|
+
# Check for transcripts/ folder
|
|
447
|
+
transcripts_dir = File.join(project_path, 'transcripts')
|
|
448
|
+
return true if Dir.exist?(transcripts_dir) && !Dir.empty?(transcripts_dir)
|
|
449
|
+
|
|
450
|
+
# Legacy: check s3-staging/ for .srt files
|
|
451
|
+
s3_staging = File.join(project_path, 's3-staging')
|
|
452
|
+
return true if Dir.exist?(s3_staging) && Dir.glob(File.join(s3_staging, '*.srt')).any?
|
|
453
|
+
|
|
454
|
+
false
|
|
455
|
+
when 'storyline'
|
|
456
|
+
# Check data/source/ for transcript files
|
|
457
|
+
source_dir = File.join(project_path, 'data', 'source')
|
|
458
|
+
return false unless Dir.exist?(source_dir)
|
|
459
|
+
|
|
460
|
+
Dir.glob(File.join(source_dir, 'transcript.*')).any?
|
|
461
|
+
else
|
|
462
|
+
false
|
|
463
|
+
end
|
|
464
|
+
end
|
|
465
|
+
```
|
|
466
|
+
|
|
467
|
+
---
|
|
468
|
+
|
|
469
|
+
## 4. Implementation Priority
|
|
470
|
+
|
|
471
|
+
### Phase 1: Naming Consolidation (Foundation)
|
|
472
|
+
**Priority:** High
|
|
473
|
+
**Blocks:** User confusion, gem discoverability
|
|
474
|
+
|
|
475
|
+
**Tasks:**
|
|
476
|
+
1. Create `exe/ad-dam`, `exe/ad-config`, etc. (new names)
|
|
477
|
+
2. Keep old names as symlinks (backward compatibility)
|
|
478
|
+
3. Add deprecation warnings
|
|
479
|
+
4. Update documentation
|
|
480
|
+
|
|
481
|
+
**Estimated Effort:** 1 day
|
|
482
|
+
|
|
483
|
+
---
|
|
484
|
+
|
|
485
|
+
### Phase 2: S3 Scan Command (Critical for Dashboard)
|
|
486
|
+
**Priority:** Critical
|
|
487
|
+
**Blocks:** Dashboard S3 sync detection
|
|
488
|
+
|
|
489
|
+
**Tasks:**
|
|
490
|
+
1. Implement `ad-dam s3-scan <brand>`
|
|
491
|
+
2. Implement `ad-dam s3-scan all`
|
|
492
|
+
3. Update manifest schema with S3 fields
|
|
493
|
+
4. Add `last_s3_scan` timestamp
|
|
494
|
+
5. Test with real S3 data
|
|
495
|
+
|
|
496
|
+
**Estimated Effort:** 2 days
|
|
497
|
+
|
|
498
|
+
---
|
|
499
|
+
|
|
500
|
+
### Phase 3: Bulk Operations (Convenience)
|
|
501
|
+
**Priority:** Medium
|
|
502
|
+
**Blocks:** Nothing, nice-to-have
|
|
503
|
+
|
|
504
|
+
**Tasks:**
|
|
505
|
+
1. Implement `ad-dam manifest all`
|
|
506
|
+
2. Implement `ad-dam refresh <brand>`
|
|
507
|
+
3. Implement `ad-dam refresh all`
|
|
508
|
+
4. Add progress reporting
|
|
509
|
+
|
|
510
|
+
**Estimated Effort:** 1 day
|
|
511
|
+
|
|
512
|
+
---
|
|
513
|
+
|
|
514
|
+
### Phase 4: Project-Level Manifests (Optional)
|
|
515
|
+
**Priority:** Low
|
|
516
|
+
**Blocks:** Detailed dashboard views
|
|
517
|
+
|
|
518
|
+
**Tasks:**
|
|
519
|
+
1. Implement `ad-dam project-manifest <brand> <project>`
|
|
520
|
+
2. Define tree structure schema
|
|
521
|
+
3. Add to `.gitignore`
|
|
522
|
+
4. Dashboard integration (read if exists)
|
|
523
|
+
|
|
524
|
+
**Estimated Effort:** 2 days
|
|
525
|
+
|
|
526
|
+
---
|
|
527
|
+
|
|
528
|
+
### Phase 5: Transcript Detection (Polish)
|
|
529
|
+
**Priority:** Low
|
|
530
|
+
**Blocks:** Dashboard transcript indicators
|
|
531
|
+
|
|
532
|
+
**Tasks:**
|
|
533
|
+
1. Add `has_transcript?` method to ManifestGenerator
|
|
534
|
+
2. Update manifest schema with `has_transcript` field
|
|
535
|
+
3. Handle both FliVideo and Storyline locations
|
|
536
|
+
|
|
537
|
+
**Estimated Effort:** 0.5 days
|
|
538
|
+
|
|
539
|
+
---
|
|
540
|
+
|
|
541
|
+
## 5. Testing Requirements
|
|
542
|
+
|
|
543
|
+
### Unit Tests
|
|
544
|
+
|
|
545
|
+
**New test files needed:**
|
|
546
|
+
- `spec/appydave/tools/dam/s3_scanner_spec.rb`
|
|
547
|
+
- `spec/appydave/tools/dam/project_manifest_generator_spec.rb`
|
|
548
|
+
- `spec/appydave/tools/dam/transcript_detector_spec.rb`
|
|
549
|
+
|
|
550
|
+
### Integration Tests
|
|
551
|
+
|
|
552
|
+
**Test scenarios:**
|
|
553
|
+
1. `ad-dam s3-scan` with mock AWS S3 (VCR cassette)
|
|
554
|
+
2. `ad-dam manifest all` across multiple brands
|
|
555
|
+
3. `ad-dam project-manifest` with complex directory tree
|
|
556
|
+
4. Transcript detection for FliVideo vs Storyline projects
|
|
557
|
+
|
|
558
|
+
### Manual Testing
|
|
559
|
+
|
|
560
|
+
**Windows/WSL (Jan's environment):**
|
|
561
|
+
- All renamed commands work (`ad-dam`, `ad-config`, etc.)
|
|
562
|
+
- S3 scan with Windows paths
|
|
563
|
+
- Manifest generation
|
|
564
|
+
|
|
565
|
+
**Mac (David's environment):**
|
|
566
|
+
- SSD detection with external drive
|
|
567
|
+
- S3 scan with multiple AWS profiles
|
|
568
|
+
- Bulk operations
|
|
569
|
+
|
|
570
|
+
---
|
|
571
|
+
|
|
572
|
+
## 6. Documentation Updates
|
|
573
|
+
|
|
574
|
+
**Files to update:**
|
|
575
|
+
|
|
576
|
+
1. **`docs/guides/tools/dam-usage.md`**
|
|
577
|
+
- Add `s3-scan` examples
|
|
578
|
+
- Add `project-manifest` examples
|
|
579
|
+
- Add `manifest all`, `refresh` examples
|
|
580
|
+
|
|
581
|
+
2. **`docs/guides/tools/configuration.md`**
|
|
582
|
+
- Update command name to `ad-config`
|
|
583
|
+
- Add deprecation notice for `ad_config`
|
|
584
|
+
|
|
585
|
+
3. **`CLAUDE.md`** (root and appydave-tools)
|
|
586
|
+
- Update all command examples
|
|
587
|
+
- Add new commands to reference
|
|
588
|
+
|
|
589
|
+
4. **`README.md`**
|
|
590
|
+
- Update quick start examples
|
|
591
|
+
- Add new command summary
|
|
592
|
+
|
|
593
|
+
---
|
|
594
|
+
|
|
595
|
+
## 7. Migration Guide (for Users)
|
|
596
|
+
|
|
597
|
+
**For David:**
|
|
598
|
+
```bash
|
|
599
|
+
# Old way
|
|
600
|
+
dam list
|
|
601
|
+
ad_config -l
|
|
602
|
+
gpt_context -i '**/*.rb'
|
|
603
|
+
|
|
604
|
+
# New way (after v0.22.0)
|
|
605
|
+
ad-dam list
|
|
606
|
+
ad-config -l
|
|
607
|
+
ad-context -i '**/*.rb'
|
|
608
|
+
|
|
609
|
+
# Old commands still work (with warning) until v1.0.0
|
|
610
|
+
```
|
|
611
|
+
|
|
612
|
+
**For Jan (Windows/WSL):**
|
|
613
|
+
```bash
|
|
614
|
+
# Update gem
|
|
615
|
+
gem update appydave-tools
|
|
616
|
+
|
|
617
|
+
# Update bash aliases (if using git clone approach)
|
|
618
|
+
alias ad-dam="ruby ~/dev/ad/appydave-tools/bin/ad-dam"
|
|
619
|
+
alias ad-config="ruby ~/dev/ad/appydave-tools/bin/ad-config"
|
|
620
|
+
```
|
|
621
|
+
|
|
622
|
+
---
|
|
623
|
+
|
|
624
|
+
## 8. Breaking Changes (v1.0.0)
|
|
625
|
+
|
|
626
|
+
**When we remove old command names:**
|
|
627
|
+
|
|
628
|
+
- `dam` → removed (use `ad-dam`)
|
|
629
|
+
- `ad_config` → removed (use `ad-config`)
|
|
630
|
+
- `youtube_manager` → removed (use `ad-youtube`)
|
|
631
|
+
- `gpt_context` → removed (use `ad-context`)
|
|
632
|
+
- `subtitle_processor` → removed (use `ad-subtitles`)
|
|
633
|
+
- `prompt_tools` → removed (use `ad-prompts`)
|
|
634
|
+
|
|
635
|
+
**Migration path:**
|
|
636
|
+
1. v0.22.0 - Add new names, deprecation warnings
|
|
637
|
+
2. v0.23.0-0.99.0 - Both names work, warnings continue
|
|
638
|
+
3. v1.0.0 - Remove old names (major version bump)
|
|
639
|
+
|
|
640
|
+
---
|
|
641
|
+
|
|
642
|
+
**Last updated:** 2025-11-18
|