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,641 @@
|
|
|
1
|
+
# DAM Visualization Requirements
|
|
2
|
+
|
|
3
|
+
**Digital Asset Management - Web-Based Dashboard Specification**
|
|
4
|
+
|
|
5
|
+
This document defines the requirements for a web-based visual dashboard to manage video projects across brands, focusing on David ↔ Jan collaboration via S3 staging.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Project Scope
|
|
10
|
+
|
|
11
|
+
**What This Is:**
|
|
12
|
+
- **DAM-specific visualization** - NOT a unified tool dashboard
|
|
13
|
+
- **Web-based** (Astro static site) - NOT terminal/CLI UI
|
|
14
|
+
- **S3 collaboration focus** - Short/medium-term staging, not long-term archival
|
|
15
|
+
- **Two-view system** - Brand overview + Project detail
|
|
16
|
+
|
|
17
|
+
**What This Is NOT:**
|
|
18
|
+
- Configuration management UI (config is foundational, not visualized)
|
|
19
|
+
- Unified dashboard for all tools (GPT Context, YouTube Manager, Subtitles are separate)
|
|
20
|
+
- Database-driven application (reads JSON manifests only)
|
|
21
|
+
- Replacement for CLI commands (provides clipboard buttons instead)
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## User Personas
|
|
26
|
+
|
|
27
|
+
### David Cruwys (Primary User)
|
|
28
|
+
- **Role:** Owner, content creator, system architect
|
|
29
|
+
- **Environment:** Mac, code version (git clone)
|
|
30
|
+
- **Brands:** All 6 brands (appydave, aitldr, voz, kiros, beauty-and-joy, supportsignal)
|
|
31
|
+
- **Primary Workflows:**
|
|
32
|
+
- Switch between projects quickly (b64 → b70 → SupportSignal)
|
|
33
|
+
- Check S3 sync status before/after collaboration
|
|
34
|
+
- Know what's on SSD when drive is unplugged
|
|
35
|
+
- Find project codes for video cross-references
|
|
36
|
+
- **Pain Points:**
|
|
37
|
+
- Remembering CLI commands (`dam s3-up appydave b65` vs `dam s3-down ...`)
|
|
38
|
+
- Switching context between brands/projects
|
|
39
|
+
- Knowing if Jan has uploaded changes to S3
|
|
40
|
+
|
|
41
|
+
### Jan (Support Team)
|
|
42
|
+
- **Role:** Team member, image/animation support
|
|
43
|
+
- **Environment:** Windows/WSL, gem version (`gem install appydave-tools`)
|
|
44
|
+
- **Brands:** Primarily appydave, aitldr (David assigns work)
|
|
45
|
+
- **Primary Workflows:**
|
|
46
|
+
- Download project from S3 for editing
|
|
47
|
+
- Upload edited files back to S3
|
|
48
|
+
- See what projects are available
|
|
49
|
+
- **Pain Points:**
|
|
50
|
+
- Getting lost in text-heavy help screens
|
|
51
|
+
- Remembering complex command syntax
|
|
52
|
+
- Understanding project status at a glance
|
|
53
|
+
|
|
54
|
+
### Mary (Future User)
|
|
55
|
+
- **Role:** Content creator (AI-TLDR)
|
|
56
|
+
- **Environment:** Non-technical (NO Ruby setup)
|
|
57
|
+
- **Access Method:** Public Cloudflare Pages deployment
|
|
58
|
+
- **Requirement:** View-only access to project status
|
|
59
|
+
|
|
60
|
+
### Vasilios & Ronnie (Client Users)
|
|
61
|
+
- **Role:** Clients (VOZ, Kiros, SupportSignal)
|
|
62
|
+
- **Environment:** Non-technical
|
|
63
|
+
- **Access Method:** Public Cloudflare Pages deployment
|
|
64
|
+
- **Requirement:** View project status (no access restrictions for MVP)
|
|
65
|
+
- **Note:** Not locked down per-brand (can see all projects)
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## Core Use Cases
|
|
70
|
+
|
|
71
|
+
### Use Case 1: Daily Check-In (David)
|
|
72
|
+
**Goal:** "What's happening across my projects?"
|
|
73
|
+
|
|
74
|
+
**Scenario:**
|
|
75
|
+
- David opens dashboard in morning
|
|
76
|
+
- Sees brand overview: appydave (21), aitldr (3), voz (2)
|
|
77
|
+
- Notices b65 has S3 changes (Jan uploaded edits)
|
|
78
|
+
- Clicks b65 → Detail view
|
|
79
|
+
- Clicks "Sync from S3" button → Copies `dam s3-down appydave b65` to clipboard
|
|
80
|
+
- Runs command in terminal
|
|
81
|
+
|
|
82
|
+
**Data Needed:**
|
|
83
|
+
- Brand list with project counts
|
|
84
|
+
- Per-project S3 status indicator
|
|
85
|
+
- Quick-action clipboard buttons
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
### Use Case 2: Project Context Switching (David)
|
|
90
|
+
**Goal:** "I'm recording b64, but need to reference b57"
|
|
91
|
+
|
|
92
|
+
**Scenario:**
|
|
93
|
+
- David is mid-recording, mentions "see video b57 for details"
|
|
94
|
+
- Opens dashboard, searches for "b57"
|
|
95
|
+
- Sees b57 is archived (SSD only, not local)
|
|
96
|
+
- Notes: Can reference transcript/assets, but not video files
|
|
97
|
+
- Continues recording with correct info
|
|
98
|
+
|
|
99
|
+
**Data Needed:**
|
|
100
|
+
- Search/filter projects
|
|
101
|
+
- Storage location status (local/S3/SSD)
|
|
102
|
+
- Visual indication of what's available
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
### Use Case 3: Collaboration Workflow (David → Jan)
|
|
107
|
+
**Goal:** "Upload b70 for Jan to edit animations"
|
|
108
|
+
|
|
109
|
+
**Scenario:**
|
|
110
|
+
- David finishes recording b70
|
|
111
|
+
- Opens dashboard → b70 detail view
|
|
112
|
+
- Clicks "Upload to S3" → Copies `dam s3-up appydave b70`
|
|
113
|
+
- Runs command in terminal
|
|
114
|
+
- Sends Jan a message: "b70 ready for editing"
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
### Use Case 4: Collaboration Workflow (Jan → David)
|
|
119
|
+
**Goal:** "Download b70, edit, upload back"
|
|
120
|
+
|
|
121
|
+
**Scenario:**
|
|
122
|
+
- Jan receives message from David
|
|
123
|
+
- Opens dashboard → appydave brand
|
|
124
|
+
- Sees b70 with "S3 available" indicator
|
|
125
|
+
- Clicks "Download from S3" → Copies `dam s3-down appydave b70`
|
|
126
|
+
- Runs command in WSL terminal
|
|
127
|
+
- Edits animations
|
|
128
|
+
- Clicks "Upload to S3" → Copies `dam s3-up appydave b70`
|
|
129
|
+
- Uploads changes
|
|
130
|
+
- Notifies David
|
|
131
|
+
|
|
132
|
+
**Data Needed:**
|
|
133
|
+
- S3 availability indicator
|
|
134
|
+
- Download/upload clipboard buttons
|
|
135
|
+
- Project file listing (what's in S3)
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
### Use Case 5: Check SSD Status (David)
|
|
140
|
+
**Goal:** "What's on my SSD? (Drive not plugged in)"
|
|
141
|
+
|
|
142
|
+
**Scenario:**
|
|
143
|
+
- David's SSD is at home (not connected)
|
|
144
|
+
- Opens dashboard (reads cached manifest)
|
|
145
|
+
- Sees projects marked "SSD only" (400GB on SSD)
|
|
146
|
+
- Knows which projects need SSD connected to access
|
|
147
|
+
|
|
148
|
+
**Data Needed:**
|
|
149
|
+
- SSD status from manifest (last scan)
|
|
150
|
+
- Disk usage totals
|
|
151
|
+
- List of SSD-only projects
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## Two-View System
|
|
156
|
+
|
|
157
|
+
### View 1: Brand Overview
|
|
158
|
+
|
|
159
|
+
**Purpose:** High-level status across all brands
|
|
160
|
+
|
|
161
|
+
**URL Structure:** `/` or `/brands`
|
|
162
|
+
|
|
163
|
+
**Data Displayed:**
|
|
164
|
+
|
|
165
|
+
1. **Brand Cards** (6 cards, grid layout)
|
|
166
|
+
- Brand name (AppyDave, AITLDR, VOZ, etc.)
|
|
167
|
+
- Project count (21 projects)
|
|
168
|
+
- Disk usage (local: 11.5 GB, SSD: 400 GB)
|
|
169
|
+
- Team members (David, Jan)
|
|
170
|
+
- Quick stats:
|
|
171
|
+
- Projects with S3 staging (3)
|
|
172
|
+
- Local-only projects (15)
|
|
173
|
+
- SSD-only projects (5)
|
|
174
|
+
|
|
175
|
+
2. **Filters/Search**
|
|
176
|
+
- Text search (project ID or name)
|
|
177
|
+
- Filter by brand
|
|
178
|
+
- Filter by storage (has-s3, local-only, ssd-only)
|
|
179
|
+
|
|
180
|
+
3. **Recent Activity** (Future)
|
|
181
|
+
- Last 5 projects updated
|
|
182
|
+
- S3 uploads/downloads
|
|
183
|
+
|
|
184
|
+
**Interactions:**
|
|
185
|
+
- Click brand card → Navigate to Project List view for that brand
|
|
186
|
+
- Search bar → Filter visible brands/projects
|
|
187
|
+
|
|
188
|
+
**Layout:**
|
|
189
|
+
```
|
|
190
|
+
┌─────────────────────────────────────────────────────┐
|
|
191
|
+
│ DAM Dashboard - Brand Overview │
|
|
192
|
+
│ │
|
|
193
|
+
│ [Search: ____________] [Filter: All Brands ▼] │
|
|
194
|
+
│ │
|
|
195
|
+
│ ┌────────────┐ ┌────────────┐ ┌────────────┐ │
|
|
196
|
+
│ │ AppyDave │ │ AITLDR │ │ VOZ │ │
|
|
197
|
+
│ │ 21 projects│ │ 3 projects │ │ 2 projects │ │
|
|
198
|
+
│ │ 11.5 GB │ │ 0.5 GB │ │ 0.45 GB │ │
|
|
199
|
+
│ │ S3: 3 │ │ S3: 1 │ │ S3: 0 │ │
|
|
200
|
+
│ └────────────┘ └────────────┘ └────────────┘ │
|
|
201
|
+
│ │
|
|
202
|
+
│ ┌────────────┐ ┌────────────┐ ┌────────────┐ │
|
|
203
|
+
│ │ Beauty&Joy │ │ Kiros │ │ SupportSig │ │
|
|
204
|
+
│ │ 0 projects │ │ 0 projects │ │ 0 projects │ │
|
|
205
|
+
│ │ 0 GB │ │ 0 GB │ │ 0 GB │ │
|
|
206
|
+
│ └────────────┘ └────────────┘ └────────────┘ │
|
|
207
|
+
└─────────────────────────────────────────────────────┘
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
---
|
|
211
|
+
|
|
212
|
+
### View 2: Project Detail
|
|
213
|
+
|
|
214
|
+
**Purpose:** Detailed status for a specific project
|
|
215
|
+
|
|
216
|
+
**URL Structure:** `/brands/{brand}/projects/{project-id}`
|
|
217
|
+
|
|
218
|
+
Example: `/brands/appydave/projects/b65-guy-monroe-marketing-plan`
|
|
219
|
+
|
|
220
|
+
**Data Displayed:**
|
|
221
|
+
|
|
222
|
+
1. **Project Header**
|
|
223
|
+
- Project ID (b65-guy-monroe-marketing-plan)
|
|
224
|
+
- Brand (AppyDave)
|
|
225
|
+
- Type (FliVideo | Storyline | General)
|
|
226
|
+
- Breadcrumb: Home → AppyDave → b65
|
|
227
|
+
|
|
228
|
+
2. **Storage Status** (3 sections)
|
|
229
|
+
- **Local Storage**
|
|
230
|
+
- Status: Present | Absent
|
|
231
|
+
- Structure: Flat | Archived
|
|
232
|
+
- Heavy files: Yes/No
|
|
233
|
+
- Light files: Yes/No
|
|
234
|
+
- Disk usage: 125 MB
|
|
235
|
+
- **S3 Staging**
|
|
236
|
+
- Status: Has files | Empty
|
|
237
|
+
- File count: 2 files
|
|
238
|
+
- Last sync: 2 hours ago (future)
|
|
239
|
+
- **SSD Backup**
|
|
240
|
+
- Status: Present | Absent
|
|
241
|
+
- Path: b50-b99/b65-guy-monroe-marketing-plan
|
|
242
|
+
- Disk usage: 8.2 GB
|
|
243
|
+
|
|
244
|
+
3. **Quick Actions** (Clipboard Buttons)
|
|
245
|
+
- [📋 Upload to S3] → `dam s3-up appydave b65`
|
|
246
|
+
- [📋 Download from S3] → `dam s3-down appydave b65`
|
|
247
|
+
- [📋 Check S3 Status] → `dam s3-status appydave b65`
|
|
248
|
+
- [📋 Archive to SSD] → `dam archive appydave b65`
|
|
249
|
+
- [📋 Sync from SSD] → `dam sync-ssd appydave`
|
|
250
|
+
|
|
251
|
+
4. **File Listing** (if local exists)
|
|
252
|
+
- `/recordings` (75 files, 6.5 GB)
|
|
253
|
+
- `/assets` (12 files, 2 MB)
|
|
254
|
+
- `/s3-staging` (2 files, 125 MB)
|
|
255
|
+
|
|
256
|
+
**Layout:**
|
|
257
|
+
```
|
|
258
|
+
┌──────────────────────────────────────────────────────────┐
|
|
259
|
+
│ AppyDave > b65-guy-monroe-marketing-plan │
|
|
260
|
+
│ │
|
|
261
|
+
│ Type: FliVideo │
|
|
262
|
+
│ │
|
|
263
|
+
│ Storage Locations: │
|
|
264
|
+
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────┐│
|
|
265
|
+
│ │ 📁 Local │ │ ☁️ S3 Staging │ │ 💾 SSD ││
|
|
266
|
+
│ │ ✅ Present │ │ ✅ 2 files │ │ ❌ Absent ││
|
|
267
|
+
│ │ Flat structure │ │ │ │ ││
|
|
268
|
+
│ │ 125 MB │ │ │ │ ││
|
|
269
|
+
│ └─────────────────┘ └─────────────────┘ └─────────────┘│
|
|
270
|
+
│ │
|
|
271
|
+
│ Quick Actions: │
|
|
272
|
+
│ [📋 Upload to S3] [📋 Download from S3] │
|
|
273
|
+
│ [📋 S3 Status] [📋 Archive to SSD] │
|
|
274
|
+
│ │
|
|
275
|
+
│ Files: │
|
|
276
|
+
│ /recordings (75 files, 6.5 GB) │
|
|
277
|
+
│ /assets (12 files, 2 MB) │
|
|
278
|
+
│ /s3-staging (2 files, 125 MB) │
|
|
279
|
+
└──────────────────────────────────────────────────────────┘
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
---
|
|
283
|
+
|
|
284
|
+
## Data Sources
|
|
285
|
+
|
|
286
|
+
**All data comes from existing JSON manifests** (no database required):
|
|
287
|
+
|
|
288
|
+
1. **Brand configuration** - `~/.config/appydave/brands.json`
|
|
289
|
+
2. **Project manifests** - `{brand}/projects.json` (per brand)
|
|
290
|
+
3. **Settings** - `~/.config/appydave/settings.json`
|
|
291
|
+
|
|
292
|
+
**Data Refresh:**
|
|
293
|
+
- Static site reads manifests at build time
|
|
294
|
+
- User manually regenerates manifests via CLI: `dam manifest <brand>`
|
|
295
|
+
- Dashboard shows "Last updated" timestamp from manifest
|
|
296
|
+
|
|
297
|
+
---
|
|
298
|
+
|
|
299
|
+
## Technology Stack
|
|
300
|
+
|
|
301
|
+
### Frontend: Astro
|
|
302
|
+
|
|
303
|
+
**Why Astro:**
|
|
304
|
+
- Static site generation (no server required)
|
|
305
|
+
- Can read JSON directly (no database)
|
|
306
|
+
- Fast, modern, component-based
|
|
307
|
+
- Supports React/Svelte/Vue if needed
|
|
308
|
+
- Easy deployment (local file:// or hosted)
|
|
309
|
+
|
|
310
|
+
**Data Loading:**
|
|
311
|
+
```javascript
|
|
312
|
+
// src/pages/brands/[brand]/projects/[project].astro
|
|
313
|
+
---
|
|
314
|
+
import { getBrandProjects } from '@/data/manifests';
|
|
315
|
+
|
|
316
|
+
const { brand, project } = Astro.params;
|
|
317
|
+
const manifest = getBrandProjects(brand);
|
|
318
|
+
const projectData = manifest.projects.find(p => p.id === project);
|
|
319
|
+
---
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
### Deployment Options
|
|
323
|
+
|
|
324
|
+
1. **Local Development** (David's machine)
|
|
325
|
+
- Source of truth (only David has all brands)
|
|
326
|
+
- Astro dev server: `npm run dev`
|
|
327
|
+
- Builds to `dist/` folder
|
|
328
|
+
|
|
329
|
+
2. **Static Build** (Shareable)
|
|
330
|
+
- Build: `npm run build`
|
|
331
|
+
- Output: `dist/` (HTML, CSS, JS)
|
|
332
|
+
- Jan/Mary can open `dist/index.html` in browser
|
|
333
|
+
|
|
334
|
+
3. **Hosted** (Future)
|
|
335
|
+
- Deploy to Netlify/Vercel/GitHub Pages
|
|
336
|
+
- Auto-rebuild on manifest changes
|
|
337
|
+
- Requires exposing manifests (git or API)
|
|
338
|
+
|
|
339
|
+
---
|
|
340
|
+
|
|
341
|
+
## UI Design Principles
|
|
342
|
+
|
|
343
|
+
### 1. Dyslexia-Friendly
|
|
344
|
+
|
|
345
|
+
**Do:**
|
|
346
|
+
- ✅ Soft color coding (green=good, yellow=warning, red=problem)
|
|
347
|
+
- ✅ Generous whitespace
|
|
348
|
+
- ✅ Large, readable fonts (16px+ body text)
|
|
349
|
+
- ✅ High contrast (but not harsh)
|
|
350
|
+
- ✅ Consistent layout/positioning
|
|
351
|
+
|
|
352
|
+
**Don't:**
|
|
353
|
+
- ❌ No emoji spam (avoid 📊 🎬 ⚙️ everywhere)
|
|
354
|
+
- ❌ No walls of text
|
|
355
|
+
- ❌ No complex tables
|
|
356
|
+
- ❌ No tiny fonts or low contrast
|
|
357
|
+
|
|
358
|
+
### 2. Color Coding System
|
|
359
|
+
|
|
360
|
+
| Color | Meaning | Usage |
|
|
361
|
+
|-------|---------|-------|
|
|
362
|
+
| **Green** (`#22c55e`) | Good / Present / Synced | Storage exists, files backed up |
|
|
363
|
+
| **Yellow** (`#eab308`) | Warning / Needs attention | Out of sync, needs upload |
|
|
364
|
+
| **Red** (`#ef4444`) | Problem / Missing | Storage absent, error |
|
|
365
|
+
| **Blue** (`#3b82f6`) | Info / Neutral | Informational badges |
|
|
366
|
+
| **Gray** (`#6b7280`) | Disabled / Inactive | Unavailable actions |
|
|
367
|
+
|
|
368
|
+
### 3. Spatial Design
|
|
369
|
+
|
|
370
|
+
**Avoid:**
|
|
371
|
+
- Long vertical lists (hard to scan)
|
|
372
|
+
- Horizontal scrolling
|
|
373
|
+
- Hidden/nested menus
|
|
374
|
+
|
|
375
|
+
**Prefer:**
|
|
376
|
+
- Grid layouts (brand cards)
|
|
377
|
+
- Visual hierarchy (header > sections > details)
|
|
378
|
+
- Inline status indicators (badges, icons)
|
|
379
|
+
|
|
380
|
+
---
|
|
381
|
+
|
|
382
|
+
## Clipboard Button Behavior
|
|
383
|
+
|
|
384
|
+
**Goal:** Don't execute commands, just copy them to clipboard
|
|
385
|
+
|
|
386
|
+
**Implementation:**
|
|
387
|
+
```javascript
|
|
388
|
+
function copyToClipboard(command) {
|
|
389
|
+
navigator.clipboard.writeText(command);
|
|
390
|
+
// Show toast: "Copied: dam s3-up appydave b65"
|
|
391
|
+
}
|
|
392
|
+
```
|
|
393
|
+
|
|
394
|
+
**Button Design:**
|
|
395
|
+
```html
|
|
396
|
+
<button
|
|
397
|
+
class="clipboard-btn"
|
|
398
|
+
data-command="dam s3-up appydave b65"
|
|
399
|
+
onclick="copyToClipboard(this.dataset.command)"
|
|
400
|
+
>
|
|
401
|
+
📋 Upload to S3
|
|
402
|
+
</button>
|
|
403
|
+
```
|
|
404
|
+
|
|
405
|
+
**User Workflow:**
|
|
406
|
+
1. Click button → Command copied to clipboard
|
|
407
|
+
2. Open terminal
|
|
408
|
+
3. Paste (Cmd+V / Ctrl+V)
|
|
409
|
+
4. Run command
|
|
410
|
+
|
|
411
|
+
---
|
|
412
|
+
|
|
413
|
+
## Additional Requirements
|
|
414
|
+
|
|
415
|
+
### Command Execution Options
|
|
416
|
+
|
|
417
|
+
**Clipboard Buttons (MVP):**
|
|
418
|
+
- Copy CLI command to clipboard
|
|
419
|
+
- User pastes and runs in terminal
|
|
420
|
+
- Safe, simple, works everywhere
|
|
421
|
+
|
|
422
|
+
**Direct Execution (Future):**
|
|
423
|
+
- Local development only (David/Jan)
|
|
424
|
+
- "Run it for me" button
|
|
425
|
+
- Calls Astro API endpoint → Executes Ruby CLI command
|
|
426
|
+
- Requires:
|
|
427
|
+
- Astro running locally
|
|
428
|
+
- Ruby CLI tools available
|
|
429
|
+
- Server-side execution capability
|
|
430
|
+
|
|
431
|
+
### Manifest Data Source Challenges
|
|
432
|
+
|
|
433
|
+
**Problem:** Whose manifest is source of truth?
|
|
434
|
+
|
|
435
|
+
**Scenario:**
|
|
436
|
+
- David and Jan both run DAM locally
|
|
437
|
+
- Each generates manifests from their local state
|
|
438
|
+
- Manifests differ (David has SSD data, Jan doesn't)
|
|
439
|
+
- Astro site needs consistent data for Cloudflare Pages
|
|
440
|
+
|
|
441
|
+
**Solution (MVP):**
|
|
442
|
+
- **Source of truth:** David's machine (only one with all brands + SSD)
|
|
443
|
+
- **Workflow:**
|
|
444
|
+
1. David generates manifests (`dam manifest all`, `dam s3-scan all`)
|
|
445
|
+
2. David pushes manifests to Astro data folder (ETL process)
|
|
446
|
+
3. Git commit → Cloudflare Pages rebuilds site
|
|
447
|
+
4. Jan/Mary/Clients see David's view of the world
|
|
448
|
+
|
|
449
|
+
**Jan's Local Astro:**
|
|
450
|
+
- Jan can run Astro locally
|
|
451
|
+
- Reads David's manifests (from git)
|
|
452
|
+
- Cannot update published site (only David can)
|
|
453
|
+
- **Question:** Should Jan be able to generate his own local manifests for his local Astro view?
|
|
454
|
+
|
|
455
|
+
**Database Alternative (Out of Scope):**
|
|
456
|
+
- Use Convex database
|
|
457
|
+
- Both David/Jan push manifest updates to DB
|
|
458
|
+
- Astro site reads from DB (not git)
|
|
459
|
+
- Enables real-time collaborative view
|
|
460
|
+
- More complex infrastructure
|
|
461
|
+
|
|
462
|
+
### Project-Level Manifests
|
|
463
|
+
|
|
464
|
+
**Purpose:** Detailed file tree for single project
|
|
465
|
+
|
|
466
|
+
**Command:** `dam project-manifest <brand> <project>`
|
|
467
|
+
|
|
468
|
+
**Output:** `{project}/.project-manifest.json`
|
|
469
|
+
|
|
470
|
+
**Structure:**
|
|
471
|
+
```json
|
|
472
|
+
{
|
|
473
|
+
"project_id": "b64-bmad-claude-sdk",
|
|
474
|
+
"type": "flivideo",
|
|
475
|
+
"generated_at": "2025-11-18T12:00:00Z",
|
|
476
|
+
"tree": {
|
|
477
|
+
"recordings": {
|
|
478
|
+
"type": "directory",
|
|
479
|
+
"file_count": 75,
|
|
480
|
+
"total_bytes": 6800000000,
|
|
481
|
+
"subdirectories": {
|
|
482
|
+
"recordings-bmad-v6": {
|
|
483
|
+
"type": "directory",
|
|
484
|
+
"file_count": 26,
|
|
485
|
+
"total_bytes": 1200000000
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
},
|
|
489
|
+
"assets": {
|
|
490
|
+
"type": "directory",
|
|
491
|
+
"file_count": 12,
|
|
492
|
+
"total_bytes": 2000000
|
|
493
|
+
},
|
|
494
|
+
"s3-staging": {
|
|
495
|
+
"type": "directory",
|
|
496
|
+
"file_count": 2,
|
|
497
|
+
"total_bytes": 125000000
|
|
498
|
+
},
|
|
499
|
+
"transcripts": {
|
|
500
|
+
"type": "directory",
|
|
501
|
+
"file_count": 3,
|
|
502
|
+
"total_bytes": 500000
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
```
|
|
507
|
+
|
|
508
|
+
**Characteristics:**
|
|
509
|
+
- **Transient** - Not required, regenerate on demand
|
|
510
|
+
- **Optional** - Dashboard works without it (shows booleans instead)
|
|
511
|
+
- **Git-ignored** - Too volatile to commit
|
|
512
|
+
- **On-demand** - Generate when needed for detail view
|
|
513
|
+
- **Future:** Clickable button in Astro to generate (local dev only)
|
|
514
|
+
|
|
515
|
+
### S3 Commands
|
|
516
|
+
|
|
517
|
+
**Brand-Level S3 Scan:**
|
|
518
|
+
- `dam s3-scan <brand>` - Scan all projects in brand
|
|
519
|
+
- `dam s3-scan all` - Scan all brands
|
|
520
|
+
- Updates brand manifest with real S3 file listings
|
|
521
|
+
- Queries AWS S3 bucket (not just local `s3-staging/` folder)
|
|
522
|
+
|
|
523
|
+
**Project-Level S3 Discover (Exists):**
|
|
524
|
+
- `dam s3-discover <brand> <project>` - List files for one project
|
|
525
|
+
- Shows available files in S3 staging
|
|
526
|
+
- Can generate shareable pre-signed URLs
|
|
527
|
+
|
|
528
|
+
### Transcript Locations
|
|
529
|
+
|
|
530
|
+
**FliVideo Projects:**
|
|
531
|
+
- **Primary:** `{project}/transcripts/` (future standard)
|
|
532
|
+
- **Legacy:** `{project}/s3-staging/*.srt` (temporary, migrating away)
|
|
533
|
+
- **Formats:** `.srt`, `.txt`
|
|
534
|
+
- **Per-segment transcripts:** Future enhancement (chapter-level + segment-level)
|
|
535
|
+
|
|
536
|
+
**Storyline Projects:**
|
|
537
|
+
- **Location:** `{project}/data/source/`
|
|
538
|
+
- **Files:**
|
|
539
|
+
- `transcript.srt` - Subtitle format
|
|
540
|
+
- `transcript.txt` - Plain text
|
|
541
|
+
- `transcript-raw.txt` - Unedited
|
|
542
|
+
- `words.json` - Word-level timing
|
|
543
|
+
- `beats.json` - Story beats
|
|
544
|
+
- `timestamps.txt` - Timing data
|
|
545
|
+
|
|
546
|
+
**Dashboard Integration:**
|
|
547
|
+
- Show "Has transcript: Yes/No" indicator (MVP)
|
|
548
|
+
- Link to open transcript (future)
|
|
549
|
+
- Full transcript preview (out of scope)
|
|
550
|
+
|
|
551
|
+
### Brand Configuration Extensions
|
|
552
|
+
|
|
553
|
+
**Color Coding:**
|
|
554
|
+
- Add `color` property to brands.json
|
|
555
|
+
- Example: `"color": "#3b82f6"` (blue), `"color": "#22c55e"` (green)
|
|
556
|
+
- Use for brand card backgrounds, badges, visual distinction
|
|
557
|
+
- May need multiple colors (primary, secondary)
|
|
558
|
+
|
|
559
|
+
**Example:**
|
|
560
|
+
```json
|
|
561
|
+
{
|
|
562
|
+
"appydave": {
|
|
563
|
+
"name": "AppyDave",
|
|
564
|
+
"shortcut": "ad",
|
|
565
|
+
"type": "owned",
|
|
566
|
+
"color": "#3b82f6",
|
|
567
|
+
"...": "..."
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
```
|
|
571
|
+
|
|
572
|
+
## Future Enhancements (Out of Scope for MVP)
|
|
573
|
+
|
|
574
|
+
1. **Real S3 Sync Detection** - ✅ Addressed (dam s3-scan command)
|
|
575
|
+
2. **File-Level Diff** - Compare local vs S3 files (which changed?)
|
|
576
|
+
3. **Team Activity Feed** - Who uploaded what, when?
|
|
577
|
+
4. **Transcript Search** - Full-text search across all project transcripts
|
|
578
|
+
5. **FliVideo Chapter View** - Visual timeline of recordings
|
|
579
|
+
6. **Storyline Script View** - Display storyline.json data
|
|
580
|
+
7. **YouTube Publish Status** - Link projects to published videos
|
|
581
|
+
8. **Disk Usage Trends** - Historical disk usage over time
|
|
582
|
+
9. **Project-Level Manifest Auto-Generation** - Button in Astro to generate on-demand
|
|
583
|
+
10. **Direct Command Execution** - Run Ruby commands from Astro (local dev)
|
|
584
|
+
11. **Database Backend** - Convex for collaborative manifest updates
|
|
585
|
+
|
|
586
|
+
---
|
|
587
|
+
|
|
588
|
+
## Success Metrics
|
|
589
|
+
|
|
590
|
+
**MVP is successful if:**
|
|
591
|
+
|
|
592
|
+
1. **David can answer these questions in <5 seconds:**
|
|
593
|
+
- "Does b65 have changes in S3?"
|
|
594
|
+
- "What's my next project code?"
|
|
595
|
+
- "Is b57 on my SSD or local?"
|
|
596
|
+
|
|
597
|
+
2. **Jan can perform these actions without asking David:**
|
|
598
|
+
- Download a project from S3
|
|
599
|
+
- Upload edited files back to S3
|
|
600
|
+
- See what projects are available to work on
|
|
601
|
+
|
|
602
|
+
3. **Command confusion is eliminated:**
|
|
603
|
+
- No more "was it `dam s3-up` or `dam up-s3`?"
|
|
604
|
+
- Clipboard buttons provide exact syntax
|
|
605
|
+
|
|
606
|
+
4. **Context switching is faster:**
|
|
607
|
+
- David can switch brands/projects without digging through filesystems
|
|
608
|
+
- Visual layout reduces cognitive load
|
|
609
|
+
|
|
610
|
+
---
|
|
611
|
+
|
|
612
|
+
## Implementation Phases
|
|
613
|
+
|
|
614
|
+
### Phase 1: Data Model & Manifest Understanding (COMPLETED)
|
|
615
|
+
- ✅ Document entity schema
|
|
616
|
+
- ✅ Map data sources
|
|
617
|
+
- ✅ Understand manifest generation
|
|
618
|
+
|
|
619
|
+
### Phase 2: Astro Project Setup (Next)
|
|
620
|
+
- Create Astro project structure
|
|
621
|
+
- Set up data loading from manifests
|
|
622
|
+
- Basic routing (`/brands`, `/brands/{brand}/projects/{project}`)
|
|
623
|
+
|
|
624
|
+
### Phase 3: Brand Overview View
|
|
625
|
+
- Grid layout of brand cards
|
|
626
|
+
- Project counts, disk usage
|
|
627
|
+
- Search/filter
|
|
628
|
+
|
|
629
|
+
### Phase 4: Project Detail View
|
|
630
|
+
- Storage status display
|
|
631
|
+
- Clipboard buttons
|
|
632
|
+
- File listing
|
|
633
|
+
|
|
634
|
+
### Phase 5: Polish & Testing
|
|
635
|
+
- Dyslexia-friendly design
|
|
636
|
+
- Color coding
|
|
637
|
+
- David + Jan user testing
|
|
638
|
+
|
|
639
|
+
---
|
|
640
|
+
|
|
641
|
+
**Last updated**: 2025-11-18
|