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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7c5fcf6b2bc5edd50a36d64d6692b81cfdd985ef6392d082fbf75967b6b86eff
4
- data.tar.gz: 9adb4f242bd80382cd219c4bd1207219e2400a7464f9847a3279590871512d88
3
+ metadata.gz: 584067a790d262ecf04ab52f20557fc879db4cf968928199ae279438afddc0e9
4
+ data.tar.gz: c2d31308bd43b6e93e66bbdcff15bcde169fe6cde278de0d03a793c4dc605e1c
5
5
  SHA512:
6
- metadata.gz: 864b74830389332b3b174e92a5d67d9149230994692fcafa20cf971dc3c60e58d0bb523ec29111d55edb3ceb59208f473c110db1e4f431e1c608be7f837ea75f
7
- data.tar.gz: fd2e80db8db74faedcffa0cec1ef6c687cbea646c96abd93d223ba9b7c99d3fdf2a6fff271cfb3d4e6fca674b4f47b12af9a14e0f834575dfbb20aa98322c2d3
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-david/data-systems/collections/jump/current.json`
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
- all Generate both files
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
- send("generate_#{target}")
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 result/error
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
- result: location_to_result(location, SCORE_EXACT_KEY)
78
+ count: 1,
79
+ results: [result]
77
80
  }
78
81
  else
79
82
  suggestions = find_suggestions(key)
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Appydave
4
4
  module Tools
5
- VERSION = '0.71.0'
5
+ VERSION = '0.72.0'
6
6
  end
7
7
  end
data/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "appydave-tools",
3
- "version": "0.71.0",
3
+ "version": "0.72.0",
4
4
  "description": "AppyDave YouTube Automation Tools",
5
5
  "scripts": {
6
6
  "release": "semantic-release"
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.71.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-14 00:00:00.000000000 Z
11
+ date: 2025-12-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel