appydave-tools 0.71.0 → 0.72.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +20 -0
- data/docs/backlog.md +58 -1
- data/lib/appydave/tools/jump/cli.rb +5 -3
- data/lib/appydave/tools/jump/commands/generate.rb +102 -2
- data/lib/appydave/tools/jump/search.rb +5 -2
- data/lib/appydave/tools/version.rb +1 -1
- data/package.json +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 584067a790d262ecf04ab52f20557fc879db4cf968928199ae279438afddc0e9
|
|
4
|
+
data.tar.gz: c2d31308bd43b6e93e66bbdcff15bcde169fe6cde278de0d03a793c4dc605e1c
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 6f8d108fd12581e5e22d1d4125c85794f0df4e94ea8f626dddf1e26bdfcde423bccee1325e4548a5b55c0f33c9f87e7aaaa1d55ead202b8010caa766afdf90ef
|
|
7
|
+
data.tar.gz: 95b5b25e5b1d6816f271a0a12cb6cfd57ce53652c23fc1fdb34e6eed31eefc5fc63bd5381ea812355184f410d7537f81329ff34fd312cc0b7345727c9dc561ca
|
data/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,23 @@
|
|
|
1
|
+
## [0.71.1](https://github.com/appydave/appydave-tools/compare/v0.71.0...v0.71.1) (2025-12-15)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* resolve jump get/remove returning 'No locations found' by making Search#get return results array consistent with search/list ([8ea39b5](https://github.com/appydave/appydave-tools/commit/8ea39b5fdd9bb9fe55c22f9cb86c8b66782c0f09))
|
|
7
|
+
|
|
8
|
+
# [0.71.0](https://github.com/appydave/appydave-tools/compare/v0.70.0...v0.71.0) (2025-12-14)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Bug Fixes
|
|
12
|
+
|
|
13
|
+
* allow common mutator methods in Naming/PredicateMethod cop ([4deb4b3](https://github.com/appydave/appydave-tools/commit/4deb4b35b0375bac6d67324a17444dc5d31b5f41))
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
### Features
|
|
17
|
+
|
|
18
|
+
* add dam ssd-status command and consolidate format_age to FileHelper ([2b09f99](https://github.com/appydave/appydave-tools/commit/2b09f99391a5312032d7feb2cbc125cc1e5011ad))
|
|
19
|
+
* add jump cli ([0887245](https://github.com/appydave/appydave-tools/commit/08872458eb67cd9a25a622b89299817a7bf22207))
|
|
20
|
+
|
|
1
21
|
# [0.70.0](https://github.com/appydave/appydave-tools/compare/v0.69.0...v0.70.0) (2025-11-26)
|
|
2
22
|
|
|
3
23
|
|
data/docs/backlog.md
CHANGED
|
@@ -13,6 +13,7 @@ Requirements tracking for AppyDave Tools development.
|
|
|
13
13
|
| 3 | NFR-1: Improve test coverage for DAM commands | 2025-12-06 | Pending |
|
|
14
14
|
| 4 | FR-3: Jump Location Tool (see spec) | 2025-12-13 | ✅ Implemented 2025-12-13 |
|
|
15
15
|
| 5 | NFR-2: Claude Code Skill for Jump Tool (see below) | 2025-12-14 | ✅ Implemented 2025-12-14 |
|
|
16
|
+
| 6 | BUG-1: Jump CLI get/remove commands fail to find entries (see below) | 2025-12-15 | Pending |
|
|
16
17
|
|
|
17
18
|
---
|
|
18
19
|
|
|
@@ -62,6 +63,62 @@ Requirements tracking for AppyDave Tools development.
|
|
|
62
63
|
|
|
63
64
|
---
|
|
64
65
|
|
|
66
|
+
### BUG-1: Jump CLI get/remove Commands Fail to Find Entries
|
|
67
|
+
|
|
68
|
+
**Priority**: High - Core functionality broken
|
|
69
|
+
|
|
70
|
+
**Summary**: The `get` and `remove` commands fail to find locations by key, while `search` successfully finds the same entries.
|
|
71
|
+
|
|
72
|
+
**Steps to Reproduce**:
|
|
73
|
+
```bash
|
|
74
|
+
# Search finds the entry ✅
|
|
75
|
+
bin/jump.rb search awb-team
|
|
76
|
+
# Result: Shows awb-team with jump alias jwb-team
|
|
77
|
+
|
|
78
|
+
# Get fails to find the same entry ❌
|
|
79
|
+
bin/jump.rb get awb-team
|
|
80
|
+
# Result: "Location not found"
|
|
81
|
+
|
|
82
|
+
# Remove also fails ❌
|
|
83
|
+
bin/jump.rb remove test-minimal --force
|
|
84
|
+
# Result: "No locations found."
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
**Affected Commands**:
|
|
88
|
+
- `get <key>` - Returns "Location not found" or "No locations found"
|
|
89
|
+
- `remove <key>` - Returns "No locations found"
|
|
90
|
+
|
|
91
|
+
**Working Commands**:
|
|
92
|
+
- `search <terms>` - Works correctly, finds entries
|
|
93
|
+
- `list` - Works correctly, shows all entries
|
|
94
|
+
- `list --format json` - Works correctly
|
|
95
|
+
|
|
96
|
+
**Suspected Cause**:
|
|
97
|
+
The `get` and `remove` commands likely use a different key lookup mechanism than `search`. Possibilities:
|
|
98
|
+
1. **Exact match vs fuzzy match** - `get` might expect an exact internal key format that differs from what's displayed
|
|
99
|
+
2. **Case sensitivity** - Key matching might be case-sensitive
|
|
100
|
+
3. **Index/cache issue** - Commands might be reading from different data sources or a stale index
|
|
101
|
+
4. **Key field mismatch** - The lookup might be checking a different field than `key`
|
|
102
|
+
|
|
103
|
+
**Evidence**:
|
|
104
|
+
When `get agent-workflow-build` failed, it suggested: "Did you mean: test-minimal, test-full, dev?" - This suggests the lookup is working but matching against something unexpected (possibly only returning entries without certain fields, or using a different search algorithm).
|
|
105
|
+
|
|
106
|
+
**Config Location**: `~/.config/appydave/locations.json`
|
|
107
|
+
|
|
108
|
+
**Investigation Points**:
|
|
109
|
+
- Compare how `search` resolves entries vs `get`/`remove`
|
|
110
|
+
- Check `lib/appydave/tools/name_manager/` for lookup logic
|
|
111
|
+
- Look at `LocationRegistry#find` or similar method
|
|
112
|
+
- Verify the key field being matched against
|
|
113
|
+
|
|
114
|
+
**Acceptance Criteria**:
|
|
115
|
+
- [ ] `get <key>` finds entry when `search <key>` finds it
|
|
116
|
+
- [ ] `remove <key>` finds entry when `search <key>` finds it
|
|
117
|
+
- [ ] Add regression tests for key lookup consistency
|
|
118
|
+
- [ ] Document root cause in commit message
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
65
122
|
## Completed Requirements
|
|
66
123
|
|
|
67
124
|
### NFR-2: Claude Code Skill for Jump Tool
|
|
@@ -72,7 +129,7 @@ Requirements tracking for AppyDave Tools development.
|
|
|
72
129
|
- Personal skill at `~/.claude/skills/jump/SKILL.md`
|
|
73
130
|
- Description includes brand names (appydave, voz, supportsignal, joy, aitldr, kiros), products (flivideo, storyline, klueless, dam), and trigger keywords
|
|
74
131
|
- Primary mode: Jump CLI commands (`jump search`, `jump get`, `jump list`)
|
|
75
|
-
- Fallback mode: Direct JSON read from `/ad/brains/brand-
|
|
132
|
+
- Fallback mode: Direct JSON read from `/ad/brains/brand-dave/data-systems/collections/jump/current.json`
|
|
76
133
|
- Tool restrictions: `allowed-tools: Read, Bash, Grep, Glob`
|
|
77
134
|
- Includes natural language examples and key location reference table
|
|
78
135
|
|
|
@@ -245,7 +245,7 @@ module Appydave
|
|
|
245
245
|
|
|
246
246
|
unless target
|
|
247
247
|
output.puts 'Usage: jump generate <target> [--output <file>] [--output-dir <dir>]'
|
|
248
|
-
output.puts 'Targets: aliases, help, all'
|
|
248
|
+
output.puts 'Targets: aliases, help, ah-help, all'
|
|
249
249
|
return EXIT_INVALID_INPUT
|
|
250
250
|
end
|
|
251
251
|
|
|
@@ -542,16 +542,18 @@ module Appydave
|
|
|
542
542
|
Targets:
|
|
543
543
|
aliases Generate shell alias file (aliases-jump.zsh)
|
|
544
544
|
help Generate help content for fzf (jump-help.txt)
|
|
545
|
-
|
|
545
|
+
ah-help Generate content for aliases-help.zsh (ah function format)
|
|
546
|
+
all Generate both aliases and help files
|
|
546
547
|
|
|
547
548
|
Options:
|
|
548
|
-
--output <file> Write to specific file (for aliases, help)
|
|
549
|
+
--output <file> Write to specific file (for aliases, help, ah-help)
|
|
549
550
|
--output-dir <dir> Write to directory (for all)
|
|
550
551
|
|
|
551
552
|
Examples:
|
|
552
553
|
jump generate aliases
|
|
553
554
|
jump generate aliases --output ~/.oh-my-zsh/custom/aliases-jump.zsh
|
|
554
555
|
jump generate help --output ~/.oh-my-zsh/custom/data/jump-help.txt
|
|
556
|
+
jump generate ah-help --output ~/.oh-my-zsh/custom/aliases-help.zsh
|
|
555
557
|
jump generate all --output-dir ~/.oh-my-zsh/custom/
|
|
556
558
|
HELP
|
|
557
559
|
end
|
|
@@ -6,7 +6,7 @@ module Appydave
|
|
|
6
6
|
module Commands
|
|
7
7
|
# Generate command creates shell aliases and help content
|
|
8
8
|
class Generate < Base
|
|
9
|
-
VALID_TARGETS = %w[aliases help all].freeze
|
|
9
|
+
VALID_TARGETS = %w[aliases help ah-help all].freeze
|
|
10
10
|
|
|
11
11
|
attr_reader :target, :output_path, :output_dir
|
|
12
12
|
|
|
@@ -28,7 +28,9 @@ module Appydave
|
|
|
28
28
|
)
|
|
29
29
|
end
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
# Convert hyphenated targets to underscored method names
|
|
32
|
+
method_name = "generate_#{target.tr('-', '_')}"
|
|
33
|
+
send(method_name)
|
|
32
34
|
end
|
|
33
35
|
|
|
34
36
|
private
|
|
@@ -43,6 +45,11 @@ module Appydave
|
|
|
43
45
|
write_or_return(content, output_path, 'jump-help.txt')
|
|
44
46
|
end
|
|
45
47
|
|
|
48
|
+
def generate_ah_help
|
|
49
|
+
content = build_ah_help_content
|
|
50
|
+
write_or_return(content, output_path, 'aliases-help.zsh')
|
|
51
|
+
end
|
|
52
|
+
|
|
46
53
|
def generate_all
|
|
47
54
|
aliases_content = build_aliases_content
|
|
48
55
|
help_content = build_help_content
|
|
@@ -115,6 +122,99 @@ module Appydave
|
|
|
115
122
|
lines.join("\n")
|
|
116
123
|
end
|
|
117
124
|
|
|
125
|
+
def build_ah_help_content
|
|
126
|
+
lines = []
|
|
127
|
+
|
|
128
|
+
# Group locations into logical sections
|
|
129
|
+
sections = group_locations_for_ah_help
|
|
130
|
+
|
|
131
|
+
sections.each do |section_name, locations|
|
|
132
|
+
lines << "## #{section_name}"
|
|
133
|
+
|
|
134
|
+
locations.each do |loc|
|
|
135
|
+
path = format_display_path(loc.path)
|
|
136
|
+
tags = build_ah_tags(loc)
|
|
137
|
+
|
|
138
|
+
# Format: alias (24 chars) + path + tags
|
|
139
|
+
alias_col = loc.jump.ljust(24)
|
|
140
|
+
path_with_tags = "#{path}#{' ' * [1, 48 - path.length].max}#{tags}"
|
|
141
|
+
|
|
142
|
+
lines << "#{alias_col}#{path_with_tags}"
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
lines << ''
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
lines.join("\n")
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
def format_display_path(path)
|
|
152
|
+
# Collapse home directory to ~
|
|
153
|
+
expanded = path_validator.expand(path)
|
|
154
|
+
home = Dir.home
|
|
155
|
+
expanded.start_with?(home) ? expanded.sub(home, '~') : expanded
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
def build_ah_tags(loc)
|
|
159
|
+
tags = [loc.type, loc.brand, loc.client].compact.reject(&:empty?)
|
|
160
|
+
tags.concat(loc.tags) if loc.tags
|
|
161
|
+
tags.uniq.map { |t| "##{t}" }.join(' ')
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
def group_locations_for_ah_help
|
|
165
|
+
sections = {
|
|
166
|
+
'Base Directories' => [],
|
|
167
|
+
'Brand Projects - AppyDave' => [],
|
|
168
|
+
'Brand Projects - Other' => [],
|
|
169
|
+
'Client Projects' => [],
|
|
170
|
+
'Video Projects' => [],
|
|
171
|
+
'Ruby Gems' => [],
|
|
172
|
+
'Reference & Archives' => [],
|
|
173
|
+
'Other' => []
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
config.locations.each do |loc|
|
|
177
|
+
section = determine_ah_section(loc)
|
|
178
|
+
sections[section] << loc
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
# Remove empty sections and sort locations within each
|
|
182
|
+
sections.reject { |_, locs| locs.empty? }.transform_values do |locs|
|
|
183
|
+
locs.sort_by(&:jump)
|
|
184
|
+
end
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
# rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
188
|
+
def determine_ah_section(loc)
|
|
189
|
+
type = loc.type&.downcase
|
|
190
|
+
brand = loc.brand&.downcase
|
|
191
|
+
|
|
192
|
+
case type
|
|
193
|
+
when 'monorepo', 'config'
|
|
194
|
+
return 'Base Directories' if loc.client.nil? && loc.brand.nil?
|
|
195
|
+
when 'video'
|
|
196
|
+
return 'Video Projects'
|
|
197
|
+
when 'gem'
|
|
198
|
+
return 'Ruby Gems'
|
|
199
|
+
when 'client'
|
|
200
|
+
return 'Client Projects'
|
|
201
|
+
when 'archive', 'reference'
|
|
202
|
+
return 'Reference & Archives'
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
return 'Client Projects' if loc.client
|
|
206
|
+
|
|
207
|
+
case brand
|
|
208
|
+
when 'appydave'
|
|
209
|
+
'Brand Projects - AppyDave'
|
|
210
|
+
when 'beauty-and-joy', 'david-cruwys', 'aitldr'
|
|
211
|
+
'Brand Projects - Other'
|
|
212
|
+
else
|
|
213
|
+
'Other'
|
|
214
|
+
end
|
|
215
|
+
end
|
|
216
|
+
# rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
217
|
+
|
|
118
218
|
def group_locations_for_aliases
|
|
119
219
|
grouped = {}
|
|
120
220
|
|
|
@@ -66,14 +66,17 @@ module Appydave
|
|
|
66
66
|
# Get a location by exact key
|
|
67
67
|
#
|
|
68
68
|
# @param key [String] Exact key to find
|
|
69
|
-
# @return [Hash] Result with success and
|
|
69
|
+
# @return [Hash] Result with success and results array (consistent with search/list)
|
|
70
70
|
def get(key)
|
|
71
71
|
location = config.find(key)
|
|
72
72
|
|
|
73
73
|
if location
|
|
74
|
+
result = location_to_result(location, SCORE_EXACT_KEY)
|
|
75
|
+
result[:index] = 1
|
|
74
76
|
{
|
|
75
77
|
success: true,
|
|
76
|
-
|
|
78
|
+
count: 1,
|
|
79
|
+
results: [result]
|
|
77
80
|
}
|
|
78
81
|
else
|
|
79
82
|
suggestions = find_suggestions(key)
|
data/package.json
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: appydave-tools
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.72.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- David Cruwys
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2025-12-
|
|
11
|
+
date: 2025-12-18 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: activemodel
|