appydave-tools 0.70.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 (64) 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 +9 -0
  9. data/AGENTS.md +43 -0
  10. data/CHANGELOG.md +12 -0
  11. data/CLAUDE.md +26 -3
  12. data/README.md +15 -0
  13. data/bin/dam +21 -1
  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 -69
  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/specs/fr-002-gpt-context-help-system.md +265 -0
  27. data/docs/specs/fr-003-jump-location-tool.md +779 -0
  28. data/docs/specs/zsh-history-tool.md +820 -0
  29. data/docs/uat/FR-3-jump-location-tool.md +741 -0
  30. data/exe/jump +11 -0
  31. data/exe/{subtitle_manager → subtitle_processor} +1 -1
  32. data/exe/zsh_history +11 -0
  33. data/lib/appydave/tools/configuration/openai.rb +1 -1
  34. data/lib/appydave/tools/dam/file_helper.rb +28 -0
  35. data/lib/appydave/tools/dam/project_listing.rb +4 -30
  36. data/lib/appydave/tools/dam/s3_operations.rb +2 -1
  37. data/lib/appydave/tools/dam/ssd_status.rb +226 -0
  38. data/lib/appydave/tools/dam/status.rb +3 -51
  39. data/lib/appydave/tools/jump/cli.rb +561 -0
  40. data/lib/appydave/tools/jump/commands/add.rb +52 -0
  41. data/lib/appydave/tools/jump/commands/base.rb +43 -0
  42. data/lib/appydave/tools/jump/commands/generate.rb +153 -0
  43. data/lib/appydave/tools/jump/commands/remove.rb +58 -0
  44. data/lib/appydave/tools/jump/commands/report.rb +214 -0
  45. data/lib/appydave/tools/jump/commands/update.rb +42 -0
  46. data/lib/appydave/tools/jump/commands/validate.rb +54 -0
  47. data/lib/appydave/tools/jump/config.rb +233 -0
  48. data/lib/appydave/tools/jump/formatters/base.rb +48 -0
  49. data/lib/appydave/tools/jump/formatters/json_formatter.rb +19 -0
  50. data/lib/appydave/tools/jump/formatters/paths_formatter.rb +21 -0
  51. data/lib/appydave/tools/jump/formatters/table_formatter.rb +183 -0
  52. data/lib/appydave/tools/jump/location.rb +134 -0
  53. data/lib/appydave/tools/jump/path_validator.rb +47 -0
  54. data/lib/appydave/tools/jump/search.rb +230 -0
  55. data/lib/appydave/tools/subtitle_processor/transcript.rb +51 -0
  56. data/lib/appydave/tools/version.rb +1 -1
  57. data/lib/appydave/tools/zsh_history/command.rb +37 -0
  58. data/lib/appydave/tools/zsh_history/config.rb +235 -0
  59. data/lib/appydave/tools/zsh_history/filter.rb +184 -0
  60. data/lib/appydave/tools/zsh_history/formatter.rb +75 -0
  61. data/lib/appydave/tools/zsh_history/parser.rb +101 -0
  62. data/lib/appydave/tools.rb +25 -0
  63. data/package.json +1 -1
  64. metadata +51 -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
@@ -75,6 +75,15 @@ Naming/MethodParameterName:
75
75
  AllowedNames:
76
76
  - as
77
77
  - s3
78
+
79
+ Naming/PredicateMethod:
80
+ AllowedMethods:
81
+ - add
82
+ - update
83
+ - remove
84
+ - save
85
+ - delete
86
+ - create
78
87
  Style/EmptyMethod:
79
88
  Exclude:
80
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,15 @@
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
+
1
13
  # [0.69.0](https://github.com/appydave/appydave-tools/compare/v0.68.0...v0.69.0) (2025-11-22)
2
14
 
3
15
 
data/CLAUDE.md CHANGED
@@ -534,6 +534,23 @@ gem build # Build gemspec into .gem file
534
534
  - **Configuration System**: Flexible config management for multi-project workflows
535
535
  - **Type System**: Custom type classes for data validation and transformation
536
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
+
537
554
  ### Key Components
538
555
 
539
556
  #### CLI Actions (`lib/appydave/tools/cli_actions/`)
@@ -580,13 +597,19 @@ gem build # Build gemspec into .gem file
580
597
  - No `require` statements needed in spec files (handled by spec_helper)
581
598
  - VCR for HTTP request mocking (YouTube API calls)
582
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)
583
603
 
584
604
  ### File Organization
585
- - CLI executables in `bin/`
586
- - Core library code in `lib/appydave/tools/`
587
- - 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
588
609
  - Configuration examples and docs in respective `_doc.md` files
589
610
 
611
+ **exe/ vs bin/ explained:** [docs/architecture/cli/exe-bin-convention.md](./docs/architecture/cli/exe-bin-convention.md)
612
+
590
613
  ## Key Dependencies
591
614
  - `google-api-client`: YouTube API integration
592
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 ''
@@ -364,6 +365,24 @@ class VatCLI
364
365
  exit 1
365
366
  end
366
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
+
367
386
  # Show git status for brand repositories
368
387
  def repo_status_command(args)
369
388
  all = args.include?('--all')
@@ -742,6 +761,7 @@ class VatCLI
742
761
  archive <brand> <project> Copy project to SSD backup
743
762
  manifest <brand> [--all] Generate project manifest
744
763
  sync-ssd <brand> Restore light files from SSD
764
+ ssd-status [brand] Check SSD mount status for all/one brand
745
765
 
746
766
  List Modes:
747
767
  dam list All brands with counts/sizes
data/bin/jump.rb ADDED
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ # Jump Location Tool - Manage development folder locations
5
+ #
6
+ # Usage:
7
+ # jump search <terms> # Fuzzy search locations
8
+ # jump get <key> # Get by exact key
9
+ # jump list # List all locations
10
+ # jump add --key <key> --path <path> # Add new location
11
+ # jump update <key> [options] # Update location
12
+ # jump remove <key> --force # Remove location
13
+ # jump validate [key] # Check paths exist
14
+ # jump report <type> # Generate reports
15
+ # jump generate <target> # Generate aliases/help
16
+ # jump info # Show config info
17
+ #
18
+ # Examples:
19
+ # jump search appydave ruby
20
+ # jump add --key my-proj --path ~/dev/my-proj --brand appydave
21
+ # jump generate aliases --output ~/.oh-my-zsh/custom/aliases-jump.zsh
22
+
23
+ $LOAD_PATH.unshift(File.expand_path('../lib', __dir__))
24
+
25
+ require 'appydave/tools'
26
+
27
+ cli = Appydave::Tools::Jump::CLI.new
28
+ exit_code = cli.run(ARGV)
29
+ exit(exit_code)
@@ -12,7 +12,8 @@ class SubtitleProcessorCLI
12
12
  def initialize
13
13
  @commands = {
14
14
  'clean' => method(:clean_subtitles),
15
- 'join' => method(:join_subtitles)
15
+ 'join' => method(:join_subtitles),
16
+ 'transcript' => method(:transcript_subtitles)
16
17
  }
17
18
  end
18
19
 
@@ -146,11 +147,63 @@ class SubtitleProcessorCLI
146
147
  joiner.join
147
148
  end
148
149
 
150
+ def transcript_subtitles(args)
151
+ options = {
152
+ file: nil,
153
+ output: nil,
154
+ paragraph_gap: 1
155
+ }
156
+
157
+ transcript_parser = OptionParser.new do |opts|
158
+ opts.banner = 'Usage: subtitle_processor.rb transcript [options]'
159
+
160
+ opts.on('-f', '--file FILE', 'SRT file to convert') do |v|
161
+ options[:file] = v
162
+ end
163
+
164
+ opts.on('-o', '--output FILE', 'Output file (default: stdout)') do |v|
165
+ options[:output] = v
166
+ end
167
+
168
+ opts.on('-g', '--gap LINES', Integer, 'Newlines between paragraphs (default: 1)') do |v|
169
+ options[:paragraph_gap] = v
170
+ end
171
+
172
+ opts.on('-h', '--help', 'Show this message') do
173
+ puts opts
174
+ exit
175
+ end
176
+ end
177
+
178
+ begin
179
+ transcript_parser.parse!(args)
180
+ rescue OptionParser::InvalidOption => e
181
+ puts "Error: #{e.message}"
182
+ puts transcript_parser
183
+ exit
184
+ end
185
+
186
+ if options[:file].nil?
187
+ puts 'Error: Input file is required.'
188
+ puts transcript_parser
189
+ exit
190
+ end
191
+
192
+ transcript = Appydave::Tools::SubtitleProcessor::Transcript.new(file_path: options[:file])
193
+
194
+ if options[:output]
195
+ transcript.write(options[:output], paragraph_gap: options[:paragraph_gap])
196
+ else
197
+ puts transcript.extract(paragraph_gap: options[:paragraph_gap])
198
+ end
199
+ end
200
+
149
201
  def print_help
150
202
  puts 'Usage: subtitle_processor.rb [command] [options]'
151
203
  puts 'Commands:'
152
204
  puts ' clean Clean and normalize SRT files'
153
205
  puts ' join Join multiple SRT files'
206
+ puts ' transcript Convert SRT to plain text transcript'
154
207
  puts "Run 'subtitle_processor.rb [command] --help' for more information on a command."
155
208
  end
156
209
  end