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.
- checksums.yaml +4 -4
- data/.claude/commands/brainstorming-agent.md +227 -0
- data/.claude/commands/cli-test.md +251 -0
- data/.claude/commands/dev.md +234 -0
- data/.claude/commands/po.md +227 -0
- data/.claude/commands/progress.md +51 -0
- data/.claude/commands/uat.md +321 -0
- data/.rubocop.yml +9 -0
- data/AGENTS.md +43 -0
- data/CHANGELOG.md +12 -0
- data/CLAUDE.md +26 -3
- data/README.md +15 -0
- data/bin/dam +21 -1
- data/bin/jump.rb +29 -0
- data/bin/subtitle_processor.rb +54 -1
- data/bin/zsh_history.rb +846 -0
- data/docs/README.md +162 -69
- data/docs/architecture/cli/exe-bin-convention.md +434 -0
- data/docs/architecture/cli-patterns.md +631 -0
- data/docs/architecture/gpt-context/gpt-context-architecture.md +325 -0
- data/docs/architecture/gpt-context/gpt-context-implementation-guide.md +419 -0
- data/docs/architecture/gpt-context/gpt-context-vision.md +179 -0
- data/docs/architecture/testing/testing-patterns.md +762 -0
- data/docs/backlog.md +120 -0
- data/docs/cli-tests/FR-3-jump-location-tool.md +515 -0
- data/docs/specs/fr-002-gpt-context-help-system.md +265 -0
- data/docs/specs/fr-003-jump-location-tool.md +779 -0
- data/docs/specs/zsh-history-tool.md +820 -0
- data/docs/uat/FR-3-jump-location-tool.md +741 -0
- data/exe/jump +11 -0
- data/exe/{subtitle_manager → subtitle_processor} +1 -1
- data/exe/zsh_history +11 -0
- data/lib/appydave/tools/configuration/openai.rb +1 -1
- data/lib/appydave/tools/dam/file_helper.rb +28 -0
- data/lib/appydave/tools/dam/project_listing.rb +4 -30
- data/lib/appydave/tools/dam/s3_operations.rb +2 -1
- data/lib/appydave/tools/dam/ssd_status.rb +226 -0
- data/lib/appydave/tools/dam/status.rb +3 -51
- data/lib/appydave/tools/jump/cli.rb +561 -0
- data/lib/appydave/tools/jump/commands/add.rb +52 -0
- data/lib/appydave/tools/jump/commands/base.rb +43 -0
- data/lib/appydave/tools/jump/commands/generate.rb +153 -0
- data/lib/appydave/tools/jump/commands/remove.rb +58 -0
- data/lib/appydave/tools/jump/commands/report.rb +214 -0
- data/lib/appydave/tools/jump/commands/update.rb +42 -0
- data/lib/appydave/tools/jump/commands/validate.rb +54 -0
- data/lib/appydave/tools/jump/config.rb +233 -0
- data/lib/appydave/tools/jump/formatters/base.rb +48 -0
- data/lib/appydave/tools/jump/formatters/json_formatter.rb +19 -0
- data/lib/appydave/tools/jump/formatters/paths_formatter.rb +21 -0
- data/lib/appydave/tools/jump/formatters/table_formatter.rb +183 -0
- data/lib/appydave/tools/jump/location.rb +134 -0
- data/lib/appydave/tools/jump/path_validator.rb +47 -0
- data/lib/appydave/tools/jump/search.rb +230 -0
- data/lib/appydave/tools/subtitle_processor/transcript.rb +51 -0
- data/lib/appydave/tools/version.rb +1 -1
- data/lib/appydave/tools/zsh_history/command.rb +37 -0
- data/lib/appydave/tools/zsh_history/config.rb +235 -0
- data/lib/appydave/tools/zsh_history/filter.rb +184 -0
- data/lib/appydave/tools/zsh_history/formatter.rb +75 -0
- data/lib/appydave/tools/zsh_history/parser.rb +101 -0
- data/lib/appydave/tools.rb +25 -0
- data/package.json +1 -1
- 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
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
|
-
-
|
|
586
|
-
-
|
|
587
|
-
-
|
|
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)
|
data/bin/subtitle_processor.rb
CHANGED
|
@@ -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
|