appydave-tools 0.69.0 → 0.71.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 (66) hide show
  1. checksums.yaml +4 -4
  2. data/.claude/commands/brainstorming-agent.md +227 -0
  3. data/.claude/commands/cli-test.md +251 -0
  4. data/.claude/commands/dev.md +234 -0
  5. data/.claude/commands/po.md +227 -0
  6. data/.claude/commands/progress.md +51 -0
  7. data/.claude/commands/uat.md +321 -0
  8. data/.rubocop.yml +11 -0
  9. data/AGENTS.md +43 -0
  10. data/CHANGELOG.md +24 -0
  11. data/CLAUDE.md +96 -3
  12. data/README.md +15 -0
  13. data/bin/dam +39 -7
  14. data/bin/jump.rb +29 -0
  15. data/bin/subtitle_processor.rb +54 -1
  16. data/bin/zsh_history.rb +846 -0
  17. data/docs/README.md +162 -68
  18. data/docs/architecture/cli/exe-bin-convention.md +434 -0
  19. data/docs/architecture/cli-patterns.md +631 -0
  20. data/docs/architecture/gpt-context/gpt-context-architecture.md +325 -0
  21. data/docs/architecture/gpt-context/gpt-context-implementation-guide.md +419 -0
  22. data/docs/architecture/gpt-context/gpt-context-vision.md +179 -0
  23. data/docs/architecture/testing/testing-patterns.md +762 -0
  24. data/docs/backlog.md +120 -0
  25. data/docs/cli-tests/FR-3-jump-location-tool.md +515 -0
  26. data/docs/dam/batch-s3-listing-requirements.md +780 -0
  27. data/docs/guides/tools/video-file-namer.md +400 -0
  28. data/docs/specs/fr-002-gpt-context-help-system.md +265 -0
  29. data/docs/specs/fr-003-jump-location-tool.md +779 -0
  30. data/docs/specs/zsh-history-tool.md +820 -0
  31. data/docs/uat/FR-3-jump-location-tool.md +741 -0
  32. data/exe/jump +11 -0
  33. data/exe/{subtitle_manager → subtitle_processor} +1 -1
  34. data/exe/zsh_history +11 -0
  35. data/lib/appydave/tools/configuration/openai.rb +1 -1
  36. data/lib/appydave/tools/dam/file_helper.rb +28 -0
  37. data/lib/appydave/tools/dam/project_listing.rb +220 -138
  38. data/lib/appydave/tools/dam/s3_operations.rb +112 -60
  39. data/lib/appydave/tools/dam/ssd_status.rb +226 -0
  40. data/lib/appydave/tools/dam/status.rb +3 -51
  41. data/lib/appydave/tools/jump/cli.rb +561 -0
  42. data/lib/appydave/tools/jump/commands/add.rb +52 -0
  43. data/lib/appydave/tools/jump/commands/base.rb +43 -0
  44. data/lib/appydave/tools/jump/commands/generate.rb +153 -0
  45. data/lib/appydave/tools/jump/commands/remove.rb +58 -0
  46. data/lib/appydave/tools/jump/commands/report.rb +214 -0
  47. data/lib/appydave/tools/jump/commands/update.rb +42 -0
  48. data/lib/appydave/tools/jump/commands/validate.rb +54 -0
  49. data/lib/appydave/tools/jump/config.rb +233 -0
  50. data/lib/appydave/tools/jump/formatters/base.rb +48 -0
  51. data/lib/appydave/tools/jump/formatters/json_formatter.rb +19 -0
  52. data/lib/appydave/tools/jump/formatters/paths_formatter.rb +21 -0
  53. data/lib/appydave/tools/jump/formatters/table_formatter.rb +183 -0
  54. data/lib/appydave/tools/jump/location.rb +134 -0
  55. data/lib/appydave/tools/jump/path_validator.rb +47 -0
  56. data/lib/appydave/tools/jump/search.rb +230 -0
  57. data/lib/appydave/tools/subtitle_processor/transcript.rb +51 -0
  58. data/lib/appydave/tools/version.rb +1 -1
  59. data/lib/appydave/tools/zsh_history/command.rb +37 -0
  60. data/lib/appydave/tools/zsh_history/config.rb +235 -0
  61. data/lib/appydave/tools/zsh_history/filter.rb +184 -0
  62. data/lib/appydave/tools/zsh_history/formatter.rb +75 -0
  63. data/lib/appydave/tools/zsh_history/parser.rb +101 -0
  64. data/lib/appydave/tools.rb +25 -0
  65. data/package.json +1 -1
  66. metadata +53 -4
@@ -0,0 +1,321 @@
1
+ # UAT Agent
2
+
3
+ You are the User Acceptance Testing agent for the AppyDave Tools project.
4
+
5
+ ## Your Role
6
+
7
+ Create **manual test plans** for the human tester to execute. UAT is about the human verifying that features work correctly from an end-user perspective. You DO NOT execute the tests yourself.
8
+
9
+ **Key distinction:**
10
+ - **UAT (this agent)** - Creates test plans for humans to execute manually
11
+ - **CLI Test agent (`/cli-test`)** - Automated CLI testing that Claude executes
12
+
13
+ ## What You Produce
14
+
15
+ A checklist of manual tests the human will run in their terminal, with:
16
+ - Clear commands to copy/paste
17
+ - Expected outcomes to verify
18
+ - Checkboxes for the human to mark pass/fail
19
+ - Space for the human to record observations
20
+
21
+ ## Documentation Location
22
+
23
+ All UAT plans live in: `docs/uat/`
24
+
25
+ Pattern: `FR-{number}-{feature-name}.md` or `NFR-{number}-{feature-name}.md`
26
+
27
+ ## Process
28
+
29
+ ### Step 1: Read the Spec
30
+
31
+ - Find the requirement in `docs/backlog.md`
32
+ - Read any linked spec docs (e.g., `docs/specs/fr-003-*.md`)
33
+ - Identify all acceptance criteria
34
+
35
+ ### Step 2: Create UAT Test Plan
36
+
37
+ Create `docs/uat/FR-{number}-{feature-name}.md` using this template:
38
+
39
+ ```markdown
40
+ # UAT: FR-{number} - {Feature Name}
41
+
42
+ **Spec:** `docs/specs/fr-{number}-*.md`
43
+ **Date:** YYYY-MM-DD
44
+ **Tester:** [Your Name]
45
+ **Status:** Pending
46
+
47
+ ## Prerequisites
48
+
49
+ Before starting, ensure:
50
+
51
+ 1. [ ] Dependencies installed: `bundle install`
52
+ 2. [ ] [Any configuration requirements]
53
+ 3. [ ] [Any test data setup]
54
+
55
+ ## How to Use This Plan
56
+
57
+ 1. Run each command in your terminal
58
+ 2. Compare output to "Expected" description
59
+ 3. Mark the checkbox: `[x]` for pass, `[ ]` for fail
60
+ 4. Add notes if behavior differs from expected
61
+ 5. Complete the Summary section when done
62
+
63
+ ---
64
+
65
+ ## Tests
66
+
67
+ ### Test 1: [Description]
68
+
69
+ **What to verify:** [Brief description of what this tests]
70
+
71
+ **Command:**
72
+ ```bash
73
+ [command to run]
74
+ ```
75
+
76
+ **Expected:**
77
+ - [Expected outcome 1]
78
+ - [Expected outcome 2]
79
+
80
+ **Result:** [ ] Pass / [ ] Fail
81
+ **Notes:**
82
+
83
+ ---
84
+
85
+ ### Test 2: [Description]
86
+
87
+ ...
88
+
89
+ ---
90
+
91
+ ## Summary
92
+
93
+ **Date completed:**
94
+ **Passed:** __/__
95
+ **Failed:** __/__
96
+
97
+ ### Issues Found
98
+
99
+ [Describe any failures or unexpected behavior]
100
+
101
+ ### UX Observations
102
+
103
+ [Note any friction, confusing output, or suggestions - even for passing tests]
104
+
105
+ ## Verdict
106
+
107
+ [ ] Ready to ship
108
+ [ ] Needs rework - see issues above
109
+ ```
110
+
111
+ ### Step 3: Organize Tests by Category
112
+
113
+ Group tests logically:
114
+ - **Happy path** - Core functionality works as expected
115
+ - **Error handling** - Invalid inputs produce helpful errors
116
+ - **Edge cases** - Boundary conditions, empty inputs, etc.
117
+ - **Output formats** - Different format options work correctly
118
+
119
+ ### Step 4: Deliver the Plan
120
+
121
+ Once the test plan is created:
122
+ 1. Tell the human the file location
123
+ 2. Summarize how many tests and categories
124
+ 3. Note any prerequisites they need to set up first
125
+ 4. Suggest running `/cli-test` first for automated verification
126
+
127
+ ## Writing Good Manual Tests
128
+
129
+ ### DO:
130
+ - Write commands that can be copy/pasted directly
131
+ - Be specific about expected output (exact text, exit codes)
132
+ - Include cleanup commands if tests create data
133
+ - Group related tests together
134
+ - Note when tests depend on previous test data
135
+
136
+ ### DON'T:
137
+ - Execute the tests yourself (that's `/cli-test`)
138
+ - Fill in results (human does that)
139
+ - Use placeholder values the human must replace
140
+ - Assume the human knows implementation details
141
+
142
+ ## Test Categories
143
+
144
+ | Category | What to Test | Example |
145
+ |----------|--------------|---------|
146
+ | Core CRUD | Create, read, update, delete operations | `jump add`, `jump get`, `jump remove` |
147
+ | Search/Query | Finding and filtering data | `jump search ruby`, `jump list` |
148
+ | Output Formats | Different display formats | `--format json`, `--format table` |
149
+ | Error Handling | Invalid inputs, missing data | Missing required flags, unknown keys |
150
+ | Exit Codes | Correct return codes | Success=0, Not found=1, Invalid=2 |
151
+ | Generation | File/output generation | `jump generate aliases --output file` |
152
+ | Help/Docs | Help text and documentation | `--help`, `--version` |
153
+
154
+ ## Example Test Plan
155
+
156
+ ```markdown
157
+ # UAT: FR-3 - Jump Location Tool
158
+
159
+ **Spec:** `docs/specs/fr-003-jump-location-tool.md`
160
+ **Date:** 2025-12-14
161
+ **Tester:** David
162
+ **Status:** Pending
163
+
164
+ ## Prerequisites
165
+
166
+ Before starting, ensure:
167
+
168
+ 1. [ ] Dependencies installed: `bundle install`
169
+ 2. [ ] No existing test locations (or willing to clean up after)
170
+
171
+ ---
172
+
173
+ ## Tests
174
+
175
+ ### Core CRUD
176
+
177
+ #### Test 1: Add a location
178
+
179
+ **What to verify:** Can add a new location with all metadata fields
180
+
181
+ **Command:**
182
+ ```bash
183
+ ruby bin/jump.rb add --key test-project --path ~/dev/test --brand testbrand --type tool --tags ruby,test --description "Test project" --format json
184
+ ```
185
+
186
+ **Expected:**
187
+ - Returns JSON with `success: true`
188
+ - Location object includes all provided fields
189
+ - `jump` field auto-generated as `jtest-project`
190
+
191
+ **Result:** [ ] Pass / [ ] Fail
192
+ **Notes:**
193
+
194
+ ---
195
+
196
+ #### Test 2: List shows the new location
197
+
198
+ **What to verify:** List command includes newly added location
199
+
200
+ **Command:**
201
+ ```bash
202
+ ruby bin/jump.rb list --format table
203
+ ```
204
+
205
+ **Expected:**
206
+ - Table includes `test-project` row
207
+ - Shows key, jump alias, type, brand, description
208
+
209
+ **Result:** [ ] Pass / [ ] Fail
210
+ **Notes:**
211
+
212
+ ---
213
+
214
+ ### Cleanup
215
+
216
+ After testing, remove test data:
217
+ ```bash
218
+ ruby bin/jump.rb remove test-project --force
219
+ ```
220
+
221
+ ---
222
+
223
+ ## Summary
224
+
225
+ **Date completed:**
226
+ **Passed:** __/2
227
+ **Failed:** __/2
228
+
229
+ ### Issues Found
230
+
231
+ [To be filled by tester]
232
+
233
+ ### UX Observations
234
+
235
+ [To be filled by tester]
236
+
237
+ ## Verdict
238
+
239
+ [ ] Ready to ship
240
+ [ ] Needs rework - see issues above
241
+ ```
242
+
243
+ ## Related Agents
244
+
245
+ - `/cli-test` - Automated CLI testing (run this BEFORE UAT for quick verification)
246
+ - `/dev` - Developer who implements features
247
+ - `/po` - Product Owner who writes specs
248
+ - `/progress` - Quick status check
249
+
250
+ ## Typical Workflow
251
+
252
+ 1. Feature is implemented by `/dev`
253
+ 2. Run `/cli-test FR-3` for automated verification (Claude executes)
254
+ 3. If cli-test passes, run `/uat FR-3` to create manual test plan
255
+ 4. Human executes manual test plan
256
+ 5. Human records results and verdict
257
+ 6. If passed → Feature is ready to ship
258
+
259
+ ## Bug Handover to Developer
260
+
261
+ When a bug is discovered during UAT and fixed on the spot, create a **brief conversational handover** so the developer can add proper test coverage.
262
+
263
+ **When to use:** User says "give me a handover" or "hand this to dev" after a bug fix.
264
+
265
+ ### Handover Format
266
+
267
+ ```
268
+ ## Bug Fix Handover: [Brief Description]
269
+
270
+ **Status:** Fixed, needs test coverage
271
+
272
+ ### The Bug
273
+ [One sentence: what was wrong]
274
+
275
+ ### Root Cause
276
+ [One sentence: why it happened]
277
+
278
+ **File:** `path/to/file.rb`
279
+
280
+ ### The Fix
281
+ [Brief description of what was changed, with line numbers if helpful]
282
+
283
+ ### Developer Action
284
+ Add test coverage:
285
+
286
+ **File:** `spec/path/to/spec.rb`
287
+
288
+ **Test case:**
289
+ ```ruby
290
+ [Minimal test example that would catch this bug]
291
+ ```
292
+ ```
293
+
294
+ ### Example
295
+
296
+ ```
297
+ ## Bug Fix Handover: Jump `info` showing wrong message
298
+
299
+ **Status:** Fixed, needs test coverage
300
+
301
+ ### The Bug
302
+ `jump info` displayed "No locations found." instead of config metadata.
303
+
304
+ ### Root Cause
305
+ TableFormatter checked `results.empty?` before checking result type. Info results have no `results` key, so it defaulted to empty array.
306
+
307
+ **File:** `lib/appydave/tools/jump/formatters/table_formatter.rb`
308
+
309
+ ### The Fix
310
+ Added `info_result?` check before `results.empty?` check, plus `format_info` method (lines 47-66).
311
+
312
+ ### Developer Action
313
+ Add test for info formatting in `spec/appydave/tools/jump/formatters/table_formatter_spec.rb`
314
+ ```
315
+
316
+ ### Key Points
317
+
318
+ - **Keep it brief** - just enough for dev to understand and write tests
319
+ - **Always include the file path** - saves dev time finding it
320
+ - **Suggest a test case** - even pseudocode helps
321
+ - **No separate document** - handover is conversational, in the chat
data/.rubocop.yml CHANGED
@@ -21,6 +21,7 @@ Metrics/BlockLength:
21
21
  - "**/spec/**/*"
22
22
  - "*.gemspec"
23
23
  - "bin/gpt_context.rb"
24
+ - "lib/appydave/tools/dam/project_listing.rb"
24
25
  AllowedMethods:
25
26
  - configure
26
27
  - context
@@ -73,6 +74,16 @@ Naming/VariableNumber:
73
74
  Naming/MethodParameterName:
74
75
  AllowedNames:
75
76
  - as
77
+ - s3
78
+
79
+ Naming/PredicateMethod:
80
+ AllowedMethods:
81
+ - add
82
+ - update
83
+ - remove
84
+ - save
85
+ - delete
86
+ - create
76
87
  Style/EmptyMethod:
77
88
  Exclude:
78
89
  - "**/spec/**/*"
data/AGENTS.md CHANGED
@@ -18,5 +18,48 @@ Commits follow conventional commits consumed by semantic-release (`feat:`, `fix:
18
18
  ## Agent Coordination
19
19
  Claude is the primary automation agent; align with the collaboration notes in `CLAUDE.md` before introducing new flows or prompt templates. When scripting repeatable tasks (gpt_context runs, metadata syncs), document the expected Claude inputs/outputs so the agent can reproduce them. Flag breaking CLI changes in PR descriptions with a dedicated **Claude Impact** subsection to keep downstream automations in sync.
20
20
 
21
+ ## Slash Command Agents
22
+
23
+ This project has specialized agents activated via slash commands:
24
+
25
+ | Command | Agent | Purpose |
26
+ |---------|-------|---------|
27
+ | `/po` | Product Owner | Requirements gathering, spec writing, documentation |
28
+ | `/dev` | Developer | Feature implementation, code changes |
29
+ | `/uat` | UAT Tester | User acceptance testing, verification |
30
+ | `/progress` | Status Check | Quick project status summary |
31
+
32
+ ### Workflow
33
+
34
+ ```
35
+ /progress → Quick orientation, see what's pending
36
+
37
+ /po → Discuss requirements, write specs to docs/backlog.md
38
+
39
+ /dev → Implement features based on specs
40
+
41
+ /uat → Test implementation against acceptance criteria
42
+
43
+ /po → Review UAT results, update documentation
44
+ ```
45
+
46
+ ### Agent Files
47
+
48
+ Located in `.claude/commands/`:
49
+ - `po.md` - Product Owner agent instructions
50
+ - `dev.md` - Developer agent instructions
51
+ - `uat.md` - UAT tester agent instructions
52
+ - `progress.md` - Status check command
53
+
54
+ ### Key Documentation Files
55
+
56
+ | File | Purpose | Maintained By |
57
+ |------|---------|---------------|
58
+ | `docs/backlog.md` | Requirements (FR/NFR) with status | /po |
59
+ | `docs/brainstorming-notes.md` | Ideas being explored | /po |
60
+ | `docs/uat/` | UAT plans and results | /uat |
61
+ | `CHANGELOG.md` | Version history | Auto (semantic-release) |
62
+ | `CLAUDE.md` | Project context for Claude | Manual |
63
+
21
64
  ## Security & Configuration Tips
22
65
  Keep API keys and OAuth secrets in `.env` or `~/.config/appydave/` (managed via `ad_config`). Never commit those files; `.gitignore` already excludes them. Validate YouTube API changes against a test channel before touching production content, and rotate credentials when machines change owners.
data/CHANGELOG.md CHANGED
@@ -1,3 +1,27 @@
1
+ # [0.70.0](https://github.com/appydave/appydave-tools/compare/v0.69.0...v0.70.0) (2025-11-26)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * rename files_match? to compare_files to satisfy rubocop naming convention ([01140dc](https://github.com/appydave/appydave-tools/commit/01140dca0cfe277e7363e35726fab37204812ef6))
7
+
8
+
9
+ ### Features
10
+
11
+ * handle multipart S3 ETags with size-based comparison for sync detection ([d29cf4b](https://github.com/appydave/appydave-tools/commit/d29cf4b704f7595ece902bb49af970d07540240e))
12
+
13
+ # [0.69.0](https://github.com/appydave/appydave-tools/compare/v0.68.0...v0.69.0) (2025-11-22)
14
+
15
+
16
+ ### Bug Fixes
17
+
18
+ * disable RedundantFormat cop for intentional header formatting ([e4f03be](https://github.com/appydave/appydave-tools/commit/e4f03be70e101e704a617cc9d0f5bf5df9474070))
19
+
20
+
21
+ ### Features
22
+
23
+ * add fuzzy brand matching and improve table alignment ([bce8309](https://github.com/appydave/appydave-tools/commit/bce83093b3834b2f6a3c70d2fa5854b88f88d48b))
24
+
1
25
  # [0.68.0](https://github.com/appydave/appydave-tools/compare/v0.67.0...v0.68.0) (2025-11-22)
2
26
 
3
27
 
data/CLAUDE.md CHANGED
@@ -48,6 +48,76 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
48
48
  - **Shareable individually** - Tools can be featured in standalone videos
49
49
  - **Language flexible** - Currently Ruby, could be rewritten if needed
50
50
 
51
+ ## Documentation Discovery Protocol
52
+
53
+ **CRITICAL: When user asks about recent changes, work completed, or project history:**
54
+
55
+ ### 1. ALWAYS Check Existing Documentation FIRST
56
+
57
+ **Check in this order:**
58
+
59
+ 1. **CHANGELOG.md** (PRIMARY SOURCE for recent changes)
60
+ - Location: `/CHANGELOG.md`
61
+ - Contains: Complete version history (v0.0.2 → current)
62
+ - Organized by: Semantic version with Features/Fixes categorized
63
+ - Updated: Automatically via semantic-release on every release
64
+ - **Use this for:** "What changed recently?", "What work was done?", "Sprint summary"
65
+
66
+ 2. **Git log** (SECONDARY - only if CHANGELOG lacks detail)
67
+ - Use for: Commit-level detail, specific date ranges, author information
68
+ - Command: `git log --since="1 week ago" --oneline`
69
+
70
+ 3. **docs/ folders** (TERTIARY - for architecture/design decisions)
71
+ - `docs/code-quality/` - Audit reports, retrospectives, UAT plans
72
+ - `docs/dam/` - DAM-specific requirements and architecture
73
+ - `docs/usage/` - Tool usage guides
74
+
75
+ ### 2. Before Creating New Documentation
76
+
77
+ **ALWAYS verify:**
78
+ - ✅ Does it already exist in CHANGELOG.md?
79
+ - ✅ Does it exist in docs/ folders?
80
+ - ✅ Does it exist in existing markdown files?
81
+ - ✅ Is it redundant with automated changelogs?
82
+
83
+ **Only create new documentation if:**
84
+ - ❌ Information doesn't exist anywhere
85
+ - ❌ Existing docs have gaps
86
+ - ❌ New perspective/format is genuinely needed
87
+
88
+ ### 3. Common Mistakes to Avoid
89
+
90
+ **DON'T:**
91
+ - ❌ Jump straight to `git log` without checking CHANGELOG.md
92
+ - ❌ Suggest creating new changelogs when CHANGELOG.md exists
93
+ - ❌ Recreate information that's already in automated systems
94
+ - ❌ Ignore existing documentation
95
+
96
+ **DO:**
97
+ - ✅ Trust CHANGELOG.md as source of truth for version history
98
+ - ✅ Use existing docs before creating new ones
99
+ - ✅ Reference existing documentation in responses
100
+ - ✅ Supplement (not replace) existing docs
101
+
102
+ ### Example: User Asks "What work was done recently?"
103
+
104
+ **Correct approach:**
105
+ ```
106
+ 1. Read CHANGELOG.md
107
+ 2. Summarize recent versions (e.g., v0.60.0 → v0.69.0)
108
+ 3. Group features by theme
109
+ 4. Reference specific versions/commits
110
+ 5. Supplement with git log if more detail needed
111
+ ```
112
+
113
+ **Incorrect approach:**
114
+ ```
115
+ ❌ Run git log first
116
+ ❌ Manually count commits
117
+ ❌ Suggest creating new changelog
118
+ ❌ Ignore existing CHANGELOG.md
119
+ ```
120
+
51
121
  ## Common Commands
52
122
 
53
123
  ### Development Setup
@@ -464,6 +534,23 @@ gem build # Build gemspec into .gem file
464
534
  - **Configuration System**: Flexible config management for multi-project workflows
465
535
  - **Type System**: Custom type classes for data validation and transformation
466
536
 
537
+ ### Architecture Documentation
538
+
539
+ Comprehensive guides for understanding and extending the codebase:
540
+
541
+ | Document | Location | Purpose |
542
+ |----------|----------|---------|
543
+ | **CLI Patterns Guide** | [docs/architecture/cli/cli-patterns.md](./docs/architecture/cli/cli-patterns.md) | 4 CLI architecture patterns with decision tree, code examples, migration guide |
544
+ | **CLI Pattern Comparison** | [docs/architecture/cli/cli-pattern-comparison.md](./docs/architecture/cli/cli-pattern-comparison.md) | Visual diagrams, decision matrix, anti-patterns |
545
+ | **exe/bin Convention** | [docs/architecture/cli/exe-bin-convention.md](./docs/architecture/cli/exe-bin-convention.md) | How exe/ wrappers load bin/ implementations for gem installation |
546
+ | **Testing Patterns** | [docs/architecture/testing/testing-patterns.md](./docs/architecture/testing/testing-patterns.md) | RSpec conventions, fixtures, VCR mocking, Guard workflow |
547
+ | **Configuration Systems** | [docs/architecture/configuration/configuration-systems.md](./docs/architecture/configuration/configuration-systems.md) | Config architecture and patterns |
548
+
549
+ **Quick Reference:**
550
+ - **New CLI tool?** → Read CLI Patterns Guide first, choose pattern 1-4
551
+ - **Adding tests?** → Read Testing Patterns Guide
552
+ - **Understanding exe/ vs bin/?** → Read exe/bin Convention
553
+
467
554
  ### Key Components
468
555
 
469
556
  #### CLI Actions (`lib/appydave/tools/cli_actions/`)
@@ -510,13 +597,19 @@ gem build # Build gemspec into .gem file
510
597
  - No `require` statements needed in spec files (handled by spec_helper)
511
598
  - VCR for HTTP request mocking (YouTube API calls)
512
599
  - SimpleCov for coverage reporting
600
+ - **Test business logic (`lib/`), not CLI executables (`bin/`)**
601
+
602
+ **Full guide:** [docs/architecture/testing/testing-patterns.md](./docs/architecture/testing/testing-patterns.md)
513
603
 
514
604
  ### File Organization
515
- - CLI executables in `bin/`
516
- - Core library code in `lib/appydave/tools/`
517
- - Tests mirror lib structure in `spec/`
605
+ - **`exe/`** - Thin wrappers installed as gem commands (no `.rb` extension)
606
+ - **`bin/`** - Full CLI implementations (`.rb` extension, used during development)
607
+ - **`lib/appydave/tools/`** - Core library code (business logic)
608
+ - **`spec/`** - Tests mirror lib structure
518
609
  - Configuration examples and docs in respective `_doc.md` files
519
610
 
611
+ **exe/ vs bin/ explained:** [docs/architecture/cli/exe-bin-convention.md](./docs/architecture/cli/exe-bin-convention.md)
612
+
520
613
  ## Key Dependencies
521
614
  - `google-api-client`: YouTube API integration
522
615
  - `ruby-openai`: OpenAI GPT integration
data/README.md CHANGED
@@ -426,6 +426,21 @@ guard
426
426
  bin/console
427
427
  ```
428
428
 
429
+ ### Architecture Documentation
430
+
431
+ Before adding new tools or making significant changes, review these guides:
432
+
433
+ | Guide | What It Covers |
434
+ |-------|----------------|
435
+ | [CLI Patterns](./docs/architecture/cli/cli-patterns.md) | 4 CLI architecture patterns, decision tree, code examples |
436
+ | [exe/ vs bin/](./docs/architecture/cli/exe-bin-convention.md) | How executables are organized for gem installation |
437
+ | [Testing Patterns](./docs/architecture/testing/testing-patterns.md) | RSpec conventions, fixtures, mocking, continuous testing |
438
+ | [CLI Pattern Comparison](./docs/architecture/cli/cli-pattern-comparison.md) | Visual diagrams, decision matrix |
439
+
440
+ **Quick start:**
441
+ - Creating a CLI tool? → [CLI Patterns Guide](./docs/architecture/cli/cli-patterns.md)
442
+ - Writing tests? → [Testing Patterns Guide](./docs/architecture/testing/testing-patterns.md)
443
+
429
444
  ### Semantic Versioning
430
445
 
431
446
  This project uses **automated versioning** via semantic-release. Don't manually edit version files.
data/bin/dam CHANGED
@@ -22,6 +22,7 @@ class VatCLI
22
22
  'archive' => method(:archive_command),
23
23
  'manifest' => method(:manifest_command),
24
24
  'sync-ssd' => method(:sync_ssd_command),
25
+ 'ssd-status' => method(:ssd_status_command),
25
26
  'repo-status' => method(:repo_status_command),
26
27
  'repo-sync' => method(:repo_sync_command),
27
28
  'repo-push' => method(:repo_push_command),
@@ -69,7 +70,7 @@ class VatCLI
69
70
  puts 'Available commands:'
70
71
  puts ' list, status, manifest'
71
72
  puts ' s3-up, s3-down, s3-status, s3-cleanup-remote, s3-cleanup-local'
72
- puts ' archive, sync-ssd'
73
+ puts ' archive, sync-ssd, ssd-status'
73
74
  puts ' repo-status, repo-sync, repo-push'
74
75
  puts ' s3-share, s3-discover, s3-scan'
75
76
  puts ''
@@ -130,6 +131,7 @@ class VatCLI
130
131
  # List brands and projects
131
132
  def list_command(args)
132
133
  detailed = args.include?('--detailed')
134
+ s3 = args.include?('--s3')
133
135
  args = args.reject { |arg| arg.start_with?('--') || arg.start_with?('-') }
134
136
 
135
137
  brand_arg = args[0]
@@ -137,13 +139,13 @@ class VatCLI
137
139
 
138
140
  if brand_arg.nil?
139
141
  # List all brands with summary
140
- Appydave::Tools::Dam::ProjectListing.list_brands_with_counts(detailed: detailed)
142
+ Appydave::Tools::Dam::ProjectListing.list_brands_with_counts(detailed: detailed, s3: s3)
141
143
  elsif pattern_arg
142
144
  # Pattern matching
143
145
  Appydave::Tools::Dam::ProjectListing.list_with_pattern(brand_arg, pattern_arg)
144
146
  else
145
147
  # Specific brand
146
- Appydave::Tools::Dam::ProjectListing.list_brand_projects(brand_arg, detailed: detailed)
148
+ Appydave::Tools::Dam::ProjectListing.list_brand_projects(brand_arg, detailed: detailed, s3: s3)
147
149
  end
148
150
  rescue StandardError => e
149
151
  puts "❌ Error: #{e.message}"
@@ -363,6 +365,24 @@ class VatCLI
363
365
  exit 1
364
366
  end
365
367
 
368
+ # Show SSD mount status
369
+ def ssd_status_command(args)
370
+ all = args.include?('--all')
371
+ args = args.reject { |arg| arg.start_with?('--') }
372
+ brand_arg = args[0]
373
+
374
+ if all || brand_arg.nil?
375
+ # Show status for all brands
376
+ Appydave::Tools::Dam::SsdStatus.new.show_all
377
+ else
378
+ # Show status for specific brand
379
+ Appydave::Tools::Dam::SsdStatus.new.show(brand_arg)
380
+ end
381
+ rescue StandardError => e
382
+ puts "❌ Error: #{e.message}"
383
+ exit 1
384
+ end
385
+
366
386
  # Show git status for brand repositories
367
387
  def repo_status_command(args)
368
388
  all = args.include?('--all')
@@ -741,6 +761,7 @@ class VatCLI
741
761
  archive <brand> <project> Copy project to SSD backup
742
762
  manifest <brand> [--all] Generate project manifest
743
763
  sync-ssd <brand> Restore light files from SSD
764
+ ssd-status [brand] Check SSD mount status for all/one brand
744
765
 
745
766
  List Modes:
746
767
  dam list All brands with counts/sizes
@@ -956,7 +977,7 @@ class VatCLI
956
977
  puts <<~HELP
957
978
  List Command
958
979
 
959
- Usage: dam list [brand] [pattern]
980
+ Usage: dam list [brand] [pattern] [--s3] [--detailed]
960
981
 
961
982
  Modes:
962
983
  1. List all brands with summary:
@@ -969,10 +990,21 @@ class VatCLI
969
990
  dam list appydave 'b6*' # All projects b60-b69
970
991
  dam list appydave 'b4*' # All projects b40-b49
971
992
 
993
+ Options:
994
+ --s3 Show S3 sync status (slower, makes AWS API calls)
995
+ --detailed Show extended metadata (PATH, SSD, file counts)
996
+
972
997
  Examples:
973
- dam list # Tabular: brand, project count, size, modified
974
- dam list voz # Tabular: all VOZ projects with size/date
975
- dam list appydave 'b6*' # Tabular: b60-b69 projects with size/date
998
+ dam list # Fast: brand, project count, size, modified, git
999
+ dam list --s3 # Slower: adds S3 SYNC column
1000
+ dam list voz # Fast: all VOZ projects (no S3 column)
1001
+ dam list voz --s3 # Slower: VOZ projects with S3 sync status
1002
+ dam list appydave 'b6*' # Fast: b60-b69 projects
1003
+ dam list appydave --detailed --s3 # Comprehensive: all columns including S3
1004
+
1005
+ Performance Note:
1006
+ The --s3 flag makes AWS API calls for each project, which can be slow.
1007
+ Default view omits S3 status for faster performance.
976
1008
  HELP
977
1009
  end
978
1010