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
data/docs/backlog.md
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# AppyDave Tools - Backlog
|
|
2
|
+
|
|
3
|
+
Requirements tracking for AppyDave Tools development.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Requirements Table
|
|
8
|
+
|
|
9
|
+
| # | Requirement | Added | Status |
|
|
10
|
+
|---|-------------|-------|--------|
|
|
11
|
+
| 1 | FR-1: GPT Context token counting (see below) | 2025-12-06 | Pending |
|
|
12
|
+
| 2 | FR-2: GPT Context AI-friendly help system (see below) | 2025-12-07 | Pending |
|
|
13
|
+
| 3 | NFR-1: Improve test coverage for DAM commands | 2025-12-06 | Pending |
|
|
14
|
+
| 4 | FR-3: Jump Location Tool (see spec) | 2025-12-13 | ✅ Implemented 2025-12-13 |
|
|
15
|
+
| 5 | NFR-2: Claude Code Skill for Jump Tool (see below) | 2025-12-14 | ✅ Implemented 2025-12-14 |
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Pending Requirements
|
|
20
|
+
|
|
21
|
+
### FR-1: GPT Context Token Counting
|
|
22
|
+
|
|
23
|
+
**User Story**: As a developer using GPT Context, I want to see estimated token counts so I can ensure my context fits within LLM limits.
|
|
24
|
+
|
|
25
|
+
**Acceptance Criteria**:
|
|
26
|
+
- [ ] Display estimated token count in output
|
|
27
|
+
- [ ] Support common tokenizers (cl100k for GPT-4, claude for Claude)
|
|
28
|
+
- [ ] Show warning when exceeding common thresholds (100k, 200k)
|
|
29
|
+
- [ ] Optional via `--tokens` flag
|
|
30
|
+
|
|
31
|
+
**Technical Notes**:
|
|
32
|
+
- Consider tiktoken gem for OpenAI tokenization
|
|
33
|
+
- May need to estimate for Claude (no official Ruby tokenizer)
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
### FR-2: GPT Context AI-Friendly Help System
|
|
38
|
+
|
|
39
|
+
**Spec**: [docs/specs/fr-002-gpt-context-help-system.md](./specs/fr-002-gpt-context-help-system.md)
|
|
40
|
+
|
|
41
|
+
**User Story**: As an AI agent using GPT Context via skills, I want structured, comprehensive help output so I can understand all options and use the tool correctly.
|
|
42
|
+
|
|
43
|
+
**Priority**: High - enables AI skill integration
|
|
44
|
+
|
|
45
|
+
**Status**: Ready for Development - full spec available
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
### NFR-1: Improve Test Coverage for DAM Commands
|
|
50
|
+
|
|
51
|
+
**Goal**: Increase test coverage for DAM command implementations.
|
|
52
|
+
|
|
53
|
+
**Scope**:
|
|
54
|
+
- [ ] Add specs for `ListCommand`
|
|
55
|
+
- [ ] Add specs for `S3UpCommand` with mocked S3
|
|
56
|
+
- [ ] Add specs for `S3DownCommand` with mocked S3
|
|
57
|
+
- [ ] Add specs for `S3StatusCommand`
|
|
58
|
+
|
|
59
|
+
**Notes**:
|
|
60
|
+
- Use VCR or WebMock for S3 API calls
|
|
61
|
+
- Focus on edge cases: missing config, network errors, permission issues
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## Completed Requirements
|
|
66
|
+
|
|
67
|
+
### NFR-2: Claude Code Skill for Jump Tool
|
|
68
|
+
|
|
69
|
+
**Completed**: 2025-12-14
|
|
70
|
+
|
|
71
|
+
**Implementation Summary**:
|
|
72
|
+
- Personal skill at `~/.claude/skills/jump/SKILL.md`
|
|
73
|
+
- Description includes brand names (appydave, voz, supportsignal, joy, aitldr, kiros), products (flivideo, storyline, klueless, dam), and trigger keywords
|
|
74
|
+
- Primary mode: Jump CLI commands (`jump search`, `jump get`, `jump list`)
|
|
75
|
+
- Fallback mode: Direct JSON read from `/ad/brains/brand-david/data-systems/collections/jump/current.json`
|
|
76
|
+
- Tool restrictions: `allowed-tools: Read, Bash, Grep, Glob`
|
|
77
|
+
- Includes natural language examples and key location reference table
|
|
78
|
+
|
|
79
|
+
**Testing**: Restart Claude Code and test with prompts like "Where is FliVideo?"
|
|
80
|
+
|
|
81
|
+
### FR-3: Jump Location Tool
|
|
82
|
+
|
|
83
|
+
**Spec**: [docs/specs/fr-003-jump-location-tool.md](./specs/fr-003-jump-location-tool.md)
|
|
84
|
+
|
|
85
|
+
**Completed**: 2025-12-13
|
|
86
|
+
|
|
87
|
+
**Implementation Summary**:
|
|
88
|
+
- CLI tool (`jump`) for managing development folder locations
|
|
89
|
+
- Single JSON config file (`~/.config/appydave/locations.json`)
|
|
90
|
+
- Fuzzy search with weighted scoring across all metadata
|
|
91
|
+
- CRUD operations (add/update/remove) with validation
|
|
92
|
+
- Reports by brand, client, type, tag
|
|
93
|
+
- Generation of shell aliases and help content
|
|
94
|
+
- 68 RSpec tests passing
|
|
95
|
+
- Follows Pattern 4 (Method Dispatch Full) from CLI patterns guide
|
|
96
|
+
- Dependency injection for PathValidator enables CI-compatible testing
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## How to Use This File
|
|
101
|
+
|
|
102
|
+
### Adding a New Requirement
|
|
103
|
+
|
|
104
|
+
1. Add row to the Requirements Table
|
|
105
|
+
2. Add a section below with:
|
|
106
|
+
- User story (for FRs)
|
|
107
|
+
- Acceptance criteria
|
|
108
|
+
- Technical notes
|
|
109
|
+
|
|
110
|
+
### Updating Status
|
|
111
|
+
|
|
112
|
+
- `Pending` - Not yet started
|
|
113
|
+
- `🔄 In Progress` - Being worked on
|
|
114
|
+
- `✅ Implemented YYYY-MM-DD` - Complete
|
|
115
|
+
- `⚠️ Needs Rework` - Issues found
|
|
116
|
+
|
|
117
|
+
### Requirement Types
|
|
118
|
+
|
|
119
|
+
- **FR-X** - Functional Requirements (user-facing features)
|
|
120
|
+
- **NFR-X** - Non-Functional Requirements (refactors, performance, tests)
|
|
@@ -0,0 +1,515 @@
|
|
|
1
|
+
# UAT: FR-3 - Jump Location Tool
|
|
2
|
+
|
|
3
|
+
**Spec:** `docs/specs/fr-003-jump-location-tool.md`
|
|
4
|
+
**Date:** 2025-12-13
|
|
5
|
+
**Tester:** Claude
|
|
6
|
+
**Mode:** Full UAT
|
|
7
|
+
**Status:** In Progress
|
|
8
|
+
|
|
9
|
+
## Prerequisites
|
|
10
|
+
|
|
11
|
+
1. Gem dependencies: `bundle install`
|
|
12
|
+
2. No existing locations.json (fresh config)
|
|
13
|
+
3. Test directories may or may not exist (validates warning behavior)
|
|
14
|
+
|
|
15
|
+
## Acceptance Criteria
|
|
16
|
+
|
|
17
|
+
From the spec:
|
|
18
|
+
|
|
19
|
+
### Core Functionality
|
|
20
|
+
1. `jump search <terms>` returns fuzzy-matched results with scores
|
|
21
|
+
2. `jump get <key>` returns single location or error with suggestion
|
|
22
|
+
3. `jump list` shows all locations
|
|
23
|
+
4. `jump add` creates new location with validation
|
|
24
|
+
5. `jump update` modifies existing location
|
|
25
|
+
6. `jump remove` deletes location (with `--force` for no prompt)
|
|
26
|
+
7. `jump validate` checks all paths exist, reports results
|
|
27
|
+
|
|
28
|
+
### Reports
|
|
29
|
+
8. `jump report brands/clients/types/tags` shows counts
|
|
30
|
+
9. `jump report by-brand/by-client/by-type/by-tag` groups locations
|
|
31
|
+
10. `jump report summary` shows overview
|
|
32
|
+
|
|
33
|
+
### Generation
|
|
34
|
+
11. `jump generate aliases` outputs shell alias format
|
|
35
|
+
12. `jump generate help` outputs fzf-friendly help format
|
|
36
|
+
13. `--output <file>` writes to file instead of stdout
|
|
37
|
+
|
|
38
|
+
### Output Formats
|
|
39
|
+
14. `--format table` shows colored, pretty output (default)
|
|
40
|
+
15. `--format json` returns structured JSON
|
|
41
|
+
16. `--format paths` returns one path per line
|
|
42
|
+
|
|
43
|
+
### Error Handling
|
|
44
|
+
17. Invalid input returns structured error with code
|
|
45
|
+
18. NOT_FOUND includes fuzzy suggestions
|
|
46
|
+
19. Config errors handled gracefully (create defaults if missing)
|
|
47
|
+
20. Exit codes match specification (0=success, 1=not found, 2=invalid input)
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Tests
|
|
52
|
+
|
|
53
|
+
### Test 1: Help displays correctly (Auto)
|
|
54
|
+
|
|
55
|
+
**Command:**
|
|
56
|
+
```bash
|
|
57
|
+
ruby bin/jump.rb --help
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
**Expected:** Shows usage, commands, and examples
|
|
61
|
+
|
|
62
|
+
**Result:** PASS
|
|
63
|
+
**Notes:** Displays full help with all commands, options, and examples
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
### Test 2: Version displays correctly (Auto)
|
|
68
|
+
|
|
69
|
+
**Command:**
|
|
70
|
+
```bash
|
|
71
|
+
ruby bin/jump.rb --version
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
**Expected:** Shows version number
|
|
75
|
+
|
|
76
|
+
**Result:** PASS
|
|
77
|
+
**Notes:** Shows "Jump Location Tool v0.70.0"
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
### Test 3: Info command on fresh config (Auto)
|
|
82
|
+
|
|
83
|
+
**Command:**
|
|
84
|
+
```bash
|
|
85
|
+
ruby bin/jump.rb info --format json
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
**Expected:** Shows config info with exists=false or empty locations
|
|
89
|
+
|
|
90
|
+
**Result:** PASS
|
|
91
|
+
**Notes:** Returns JSON with config_path, exists=true, version, location_count
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
### Test 4: Add location with all fields (Auto)
|
|
96
|
+
|
|
97
|
+
**Command:**
|
|
98
|
+
```bash
|
|
99
|
+
ruby bin/jump.rb add --key ad-tools --path ~/dev/ad/appydave-tools --brand appydave --type tool --tags ruby,cli --description "AppyDave CLI tools" --format json
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
**Expected:** Success with location object returned
|
|
103
|
+
|
|
104
|
+
**Result:** PASS
|
|
105
|
+
**Notes:** Returns success=true with full location object including auto-generated jump alias "jad-tools"
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
### Test 5: Add second location (Auto)
|
|
110
|
+
|
|
111
|
+
**Command:**
|
|
112
|
+
```bash
|
|
113
|
+
ruby bin/jump.rb add --key ss-app --path ~/dev/clients/supportsignal/app --client supportsignal --type tool --tags typescript,nextjs --description "SupportSignal app" --format json
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
**Expected:** Success with location object returned
|
|
117
|
+
|
|
118
|
+
**Result:** PASS
|
|
119
|
+
**Notes:** Returns success=true with client-based location including jump alias "jss-app"
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
### Test 6: Add duplicate key fails (Auto)
|
|
124
|
+
|
|
125
|
+
**Command:**
|
|
126
|
+
```bash
|
|
127
|
+
ruby bin/jump.rb add --key ad-tools --path ~/other/path --format json
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
**Expected:** Error with DUPLICATE_KEY code
|
|
131
|
+
|
|
132
|
+
**Result:** PASS
|
|
133
|
+
**Notes:** Returns success=false with code="DUPLICATE_KEY" and helpful error message
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
### Test 7: Add with invalid key fails (Auto)
|
|
138
|
+
|
|
139
|
+
**Command:**
|
|
140
|
+
```bash
|
|
141
|
+
ruby bin/jump.rb add --key Invalid-Key --path ~/dev/test --format json
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
**Expected:** Error with INVALID_INPUT code
|
|
145
|
+
|
|
146
|
+
**Result:** PASS
|
|
147
|
+
**Notes:** Returns success=false with code="INVALID_INPUT", validates key format (lowercase, alphanumeric, hyphens only)
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
### Test 8: List all locations (Auto)
|
|
152
|
+
|
|
153
|
+
**Command:**
|
|
154
|
+
```bash
|
|
155
|
+
ruby bin/jump.rb list --format json
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
**Expected:** Returns array with 2 locations (ad-tools, ss-app)
|
|
159
|
+
|
|
160
|
+
**Result:** PASS
|
|
161
|
+
**Notes:** Returns success=true with count=2 and results array containing both locations with index numbers
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
### Test 9: Get by exact key (Auto)
|
|
166
|
+
|
|
167
|
+
**Command:**
|
|
168
|
+
```bash
|
|
169
|
+
ruby bin/jump.rb get ad-tools --format json
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
**Expected:** Returns single location with success=true
|
|
173
|
+
|
|
174
|
+
**Result:** PASS
|
|
175
|
+
**Notes:** Returns success=true with result object containing full location details
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
### Test 10: Get unknown key returns suggestion (Auto)
|
|
180
|
+
|
|
181
|
+
**Command:**
|
|
182
|
+
```bash
|
|
183
|
+
ruby bin/jump.rb get ad-tool --format json
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
**Expected:** Error with NOT_FOUND code and suggestion
|
|
187
|
+
|
|
188
|
+
**Result:** PASS
|
|
189
|
+
**Notes:** Returns success=false with code="NOT_FOUND" and suggestion="Did you mean 'ad-tools'?"
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
### Test 11: Search by key (Auto)
|
|
194
|
+
|
|
195
|
+
**Command:**
|
|
196
|
+
```bash
|
|
197
|
+
ruby bin/jump.rb search tools --format json
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
**Expected:** Returns ad-tools with score > 0
|
|
201
|
+
|
|
202
|
+
**Result:** PASS
|
|
203
|
+
**Notes:** Returns ad-tools with score=50 (key contains term)
|
|
204
|
+
|
|
205
|
+
---
|
|
206
|
+
|
|
207
|
+
### Test 12: Search by tag (Auto)
|
|
208
|
+
|
|
209
|
+
**Command:**
|
|
210
|
+
```bash
|
|
211
|
+
ruby bin/jump.rb search ruby --format json
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
**Expected:** Returns ad-tools (has ruby tag)
|
|
215
|
+
|
|
216
|
+
**Result:** PASS
|
|
217
|
+
**Notes:** Returns ad-tools with score=30 (tag match)
|
|
218
|
+
|
|
219
|
+
---
|
|
220
|
+
|
|
221
|
+
### Test 13: Search by multiple terms (Auto)
|
|
222
|
+
|
|
223
|
+
**Command:**
|
|
224
|
+
```bash
|
|
225
|
+
ruby bin/jump.rb search supportsignal typescript --format json
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
**Expected:** Returns ss-app with combined score
|
|
229
|
+
|
|
230
|
+
**Result:** PASS
|
|
231
|
+
**Notes:** Returns ss-app with combined score from client match + tag match
|
|
232
|
+
|
|
233
|
+
---
|
|
234
|
+
|
|
235
|
+
### Test 14: Search no matches (Auto)
|
|
236
|
+
|
|
237
|
+
**Command:**
|
|
238
|
+
```bash
|
|
239
|
+
ruby bin/jump.rb search nonexistent --format json
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
**Expected:** Empty results array, success=true
|
|
243
|
+
|
|
244
|
+
**Result:** PASS
|
|
245
|
+
**Notes:** Returns success=true with count=0 and empty results array
|
|
246
|
+
|
|
247
|
+
---
|
|
248
|
+
|
|
249
|
+
### Test 15: Update location (Auto)
|
|
250
|
+
|
|
251
|
+
**Command:**
|
|
252
|
+
```bash
|
|
253
|
+
ruby bin/jump.rb update ad-tools --description "Updated CLI tools" --format json
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
**Expected:** Success with updated location
|
|
257
|
+
|
|
258
|
+
**Result:** PASS
|
|
259
|
+
**Notes:** Returns success=true with updated location showing new description
|
|
260
|
+
|
|
261
|
+
---
|
|
262
|
+
|
|
263
|
+
### Test 16: Validate all locations (Auto)
|
|
264
|
+
|
|
265
|
+
**Command:**
|
|
266
|
+
```bash
|
|
267
|
+
ruby bin/jump.rb validate --format json
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
**Expected:** Returns results array with valid=true/false for each
|
|
271
|
+
|
|
272
|
+
**Result:** PASS
|
|
273
|
+
**Notes:** Returns count=2, valid_count=1, invalid_count=1 with results showing ad-tools valid=true, ss-app valid=false (path doesn't exist)
|
|
274
|
+
|
|
275
|
+
---
|
|
276
|
+
|
|
277
|
+
### Test 17: Report brands (Auto)
|
|
278
|
+
|
|
279
|
+
**Command:**
|
|
280
|
+
```bash
|
|
281
|
+
ruby bin/jump.rb report brands --format json
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
**Expected:** Shows brands with location counts
|
|
285
|
+
|
|
286
|
+
**Result:** PASS
|
|
287
|
+
**Notes:** Returns success=true with report="brands" and results array (empty when no brands defined in config)
|
|
288
|
+
|
|
289
|
+
---
|
|
290
|
+
|
|
291
|
+
### Test 18: Report types (Auto)
|
|
292
|
+
|
|
293
|
+
**Command:**
|
|
294
|
+
```bash
|
|
295
|
+
ruby bin/jump.rb report types --format json
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
**Expected:** Shows types with location counts
|
|
299
|
+
|
|
300
|
+
**Result:** PASS
|
|
301
|
+
**Notes:** Returns success=true with results showing type="tool" with location_count=2
|
|
302
|
+
|
|
303
|
+
---
|
|
304
|
+
|
|
305
|
+
### Test 19: Report summary (Auto)
|
|
306
|
+
|
|
307
|
+
**Command:**
|
|
308
|
+
```bash
|
|
309
|
+
ruby bin/jump.rb report summary --format json
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
**Expected:** Shows total counts for locations, brands, clients
|
|
313
|
+
|
|
314
|
+
**Result:** PASS
|
|
315
|
+
**Notes:** Returns comprehensive summary with total_locations=2, by_type, by_brand, by_client breakdowns, and config_info
|
|
316
|
+
|
|
317
|
+
---
|
|
318
|
+
|
|
319
|
+
### Test 20: Report by-type (Auto)
|
|
320
|
+
|
|
321
|
+
**Command:**
|
|
322
|
+
```bash
|
|
323
|
+
ruby bin/jump.rb report by-type --format json
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
**Expected:** Groups locations by type
|
|
327
|
+
|
|
328
|
+
**Result:** PASS
|
|
329
|
+
**Notes:** Returns success=true with groups hash containing "tool" key with array of both locations
|
|
330
|
+
|
|
331
|
+
---
|
|
332
|
+
|
|
333
|
+
### Test 21: Generate aliases to stdout (Auto)
|
|
334
|
+
|
|
335
|
+
**Command:**
|
|
336
|
+
```bash
|
|
337
|
+
ruby bin/jump.rb generate aliases 2>&1 | grep -E "^alias"
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
**Expected:** Outputs alias lines for each location
|
|
341
|
+
|
|
342
|
+
**Result:** PASS
|
|
343
|
+
**Notes:** Outputs alias jad-tools="cd '...'" and alias jss-app="cd '...'" with descriptions as comments
|
|
344
|
+
|
|
345
|
+
---
|
|
346
|
+
|
|
347
|
+
### Test 22: Generate help to stdout (Auto)
|
|
348
|
+
|
|
349
|
+
**Command:**
|
|
350
|
+
```bash
|
|
351
|
+
ruby bin/jump.rb generate help 2>&1 | head -5
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
**Expected:** Outputs help content with tab-separated fields
|
|
355
|
+
|
|
356
|
+
**Result:** PASS
|
|
357
|
+
**Notes:** Outputs header comment and tab-separated fields: alias, path, brand, type, description (fzf-friendly format)
|
|
358
|
+
|
|
359
|
+
---
|
|
360
|
+
|
|
361
|
+
### Test 23: Generate aliases to file (Auto)
|
|
362
|
+
|
|
363
|
+
**Command:**
|
|
364
|
+
```bash
|
|
365
|
+
ruby bin/jump.rb generate aliases --output /tmp/test-aliases.zsh --format json && cat /tmp/test-aliases.zsh | head -10
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
**Expected:** File created with alias content
|
|
369
|
+
|
|
370
|
+
**Result:** PASS
|
|
371
|
+
**Notes:** Returns JSON with success=true, path, lines=12. File contains header, usage comment, and alias definitions
|
|
372
|
+
|
|
373
|
+
---
|
|
374
|
+
|
|
375
|
+
### Test 24: Format paths (Auto)
|
|
376
|
+
|
|
377
|
+
**Command:**
|
|
378
|
+
```bash
|
|
379
|
+
ruby bin/jump.rb list --format paths
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
**Expected:** One path per line, no other output
|
|
383
|
+
|
|
384
|
+
**Result:** PASS
|
|
385
|
+
**Notes:** Outputs one expanded path per line, suitable for piping to other commands
|
|
386
|
+
|
|
387
|
+
---
|
|
388
|
+
|
|
389
|
+
### Test 25: Format table (Auto/Manual)
|
|
390
|
+
|
|
391
|
+
**Command:**
|
|
392
|
+
```bash
|
|
393
|
+
ruby bin/jump.rb list --format table
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
**Expected:** Colored table with headers (Manual verification of colors)
|
|
397
|
+
|
|
398
|
+
**Result:** PASS
|
|
399
|
+
**Notes:** Displays formatted table with header row, separator line, numbered rows with KEY, JUMP, TYPE, BRAND/CLIENT, DESCRIPTION columns, and total count footer
|
|
400
|
+
|
|
401
|
+
---
|
|
402
|
+
|
|
403
|
+
### Test 26: Exit code 0 on success (Auto)
|
|
404
|
+
|
|
405
|
+
**Command:**
|
|
406
|
+
```bash
|
|
407
|
+
ruby bin/jump.rb list --format json; echo "Exit code: $?"
|
|
408
|
+
```
|
|
409
|
+
|
|
410
|
+
**Expected:** Exit code: 0
|
|
411
|
+
|
|
412
|
+
**Result:** PASS
|
|
413
|
+
**Notes:** Returns exit code 0 for successful operations
|
|
414
|
+
|
|
415
|
+
---
|
|
416
|
+
|
|
417
|
+
### Test 27: Exit code 1 on NOT_FOUND (Auto)
|
|
418
|
+
|
|
419
|
+
**Command:**
|
|
420
|
+
```bash
|
|
421
|
+
ruby bin/jump.rb get nonexistent --format json; echo "Exit code: $?"
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
**Expected:** Exit code: 1
|
|
425
|
+
|
|
426
|
+
**Result:** PASS
|
|
427
|
+
**Notes:** Returns exit code 1 with code="NOT_FOUND" when key doesn't exist
|
|
428
|
+
|
|
429
|
+
---
|
|
430
|
+
|
|
431
|
+
### Test 28: Exit code 2 on invalid input (Auto)
|
|
432
|
+
|
|
433
|
+
**Command:**
|
|
434
|
+
```bash
|
|
435
|
+
ruby bin/jump.rb add --format json; echo "Exit code: $?"
|
|
436
|
+
```
|
|
437
|
+
|
|
438
|
+
**Expected:** Exit code: 2 (missing required --key)
|
|
439
|
+
|
|
440
|
+
**Result:** PASS
|
|
441
|
+
**Notes:** Returns exit code 2 with usage message when required --key is missing
|
|
442
|
+
|
|
443
|
+
---
|
|
444
|
+
|
|
445
|
+
### Test 29: Remove without --force fails (Auto)
|
|
446
|
+
|
|
447
|
+
**Command:**
|
|
448
|
+
```bash
|
|
449
|
+
ruby bin/jump.rb remove ad-tools --format json
|
|
450
|
+
```
|
|
451
|
+
|
|
452
|
+
**Expected:** Error with CONFIRMATION_REQUIRED code
|
|
453
|
+
|
|
454
|
+
**Result:** PASS
|
|
455
|
+
**Notes:** Returns success=false with code="CONFIRMATION_REQUIRED" and helpful message about using --force
|
|
456
|
+
|
|
457
|
+
---
|
|
458
|
+
|
|
459
|
+
### Test 30: Remove with --force succeeds (Auto)
|
|
460
|
+
|
|
461
|
+
**Command:**
|
|
462
|
+
```bash
|
|
463
|
+
ruby bin/jump.rb remove ad-tools --force --format json
|
|
464
|
+
```
|
|
465
|
+
|
|
466
|
+
**Expected:** Success with removed location returned
|
|
467
|
+
|
|
468
|
+
**Result:** PASS
|
|
469
|
+
**Notes:** Returns success=true with message and full removed location object
|
|
470
|
+
|
|
471
|
+
---
|
|
472
|
+
|
|
473
|
+
### Test 31: Cleanup - remove second location (Auto)
|
|
474
|
+
|
|
475
|
+
**Command:**
|
|
476
|
+
```bash
|
|
477
|
+
ruby bin/jump.rb remove ss-app --force --format json
|
|
478
|
+
```
|
|
479
|
+
|
|
480
|
+
**Expected:** Success
|
|
481
|
+
|
|
482
|
+
**Result:** PASS
|
|
483
|
+
**Notes:** Successfully cleaned up test data
|
|
484
|
+
|
|
485
|
+
---
|
|
486
|
+
|
|
487
|
+
## Summary
|
|
488
|
+
|
|
489
|
+
**Passed:** 31/31
|
|
490
|
+
**Failed:** 0/31
|
|
491
|
+
|
|
492
|
+
### Failures
|
|
493
|
+
|
|
494
|
+
None.
|
|
495
|
+
|
|
496
|
+
### Observations
|
|
497
|
+
|
|
498
|
+
1. **All acceptance criteria met**: Core functionality, reports, generation, output formats, and error handling all work as specified.
|
|
499
|
+
|
|
500
|
+
2. **Fuzzy search scoring works correctly**: Exact key match (100), key contains (50), tag match (30), type match (20) - all verified.
|
|
501
|
+
|
|
502
|
+
3. **Exit codes conform to spec**: 0 (success), 1 (NOT_FOUND), 2 (invalid input/confirmation required).
|
|
503
|
+
|
|
504
|
+
4. **Dependency injection enables clean testing**: TestPathValidator allows CI-friendly tests without filesystem dependencies. 68 RSpec tests passing.
|
|
505
|
+
|
|
506
|
+
5. **Generate aliases produces shell-ready output**: Properly formatted with comments, grouped by brand/client, suitable for sourcing in .zshrc.
|
|
507
|
+
|
|
508
|
+
6. **Validation correctly identifies invalid paths**: ss-app path didn't exist and was correctly flagged as invalid.
|
|
509
|
+
|
|
510
|
+
7. **Table formatter is readable**: Clean column alignment with headers and totals.
|
|
511
|
+
|
|
512
|
+
## Verdict
|
|
513
|
+
|
|
514
|
+
[x] Ready to ship
|
|
515
|
+
[ ] Needs rework - see failures above
|