appydave-tools 0.69.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 (66) 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 +11 -0
  9. data/AGENTS.md +43 -0
  10. data/CHANGELOG.md +24 -0
  11. data/CLAUDE.md +96 -3
  12. data/README.md +15 -0
  13. data/bin/dam +39 -7
  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 -68
  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/dam/batch-s3-listing-requirements.md +780 -0
  27. data/docs/guides/tools/video-file-namer.md +400 -0
  28. data/docs/specs/fr-002-gpt-context-help-system.md +265 -0
  29. data/docs/specs/fr-003-jump-location-tool.md +779 -0
  30. data/docs/specs/zsh-history-tool.md +820 -0
  31. data/docs/uat/FR-3-jump-location-tool.md +741 -0
  32. data/exe/jump +11 -0
  33. data/exe/{subtitle_manager → subtitle_processor} +1 -1
  34. data/exe/zsh_history +11 -0
  35. data/lib/appydave/tools/configuration/openai.rb +1 -1
  36. data/lib/appydave/tools/dam/file_helper.rb +28 -0
  37. data/lib/appydave/tools/dam/project_listing.rb +220 -138
  38. data/lib/appydave/tools/dam/s3_operations.rb +112 -60
  39. data/lib/appydave/tools/dam/ssd_status.rb +226 -0
  40. data/lib/appydave/tools/dam/status.rb +3 -51
  41. data/lib/appydave/tools/jump/cli.rb +561 -0
  42. data/lib/appydave/tools/jump/commands/add.rb +52 -0
  43. data/lib/appydave/tools/jump/commands/base.rb +43 -0
  44. data/lib/appydave/tools/jump/commands/generate.rb +153 -0
  45. data/lib/appydave/tools/jump/commands/remove.rb +58 -0
  46. data/lib/appydave/tools/jump/commands/report.rb +214 -0
  47. data/lib/appydave/tools/jump/commands/update.rb +42 -0
  48. data/lib/appydave/tools/jump/commands/validate.rb +54 -0
  49. data/lib/appydave/tools/jump/config.rb +233 -0
  50. data/lib/appydave/tools/jump/formatters/base.rb +48 -0
  51. data/lib/appydave/tools/jump/formatters/json_formatter.rb +19 -0
  52. data/lib/appydave/tools/jump/formatters/paths_formatter.rb +21 -0
  53. data/lib/appydave/tools/jump/formatters/table_formatter.rb +183 -0
  54. data/lib/appydave/tools/jump/location.rb +134 -0
  55. data/lib/appydave/tools/jump/path_validator.rb +47 -0
  56. data/lib/appydave/tools/jump/search.rb +230 -0
  57. data/lib/appydave/tools/subtitle_processor/transcript.rb +51 -0
  58. data/lib/appydave/tools/version.rb +1 -1
  59. data/lib/appydave/tools/zsh_history/command.rb +37 -0
  60. data/lib/appydave/tools/zsh_history/config.rb +235 -0
  61. data/lib/appydave/tools/zsh_history/filter.rb +184 -0
  62. data/lib/appydave/tools/zsh_history/formatter.rb +75 -0
  63. data/lib/appydave/tools/zsh_history/parser.rb +101 -0
  64. data/lib/appydave/tools.rb +25 -0
  65. data/package.json +1 -1
  66. metadata +53 -4
@@ -0,0 +1,184 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Appydave
4
+ module Tools
5
+ module ZshHistory
6
+ # Applies include/exclude patterns to categorize commands
7
+ class Filter
8
+ # Default patterns used when no config file exists
9
+ DEFAULT_EXCLUDE_PATTERNS = [
10
+ '^[a-z]$', # Single letter commands (typos)
11
+ '^[a-z]{2}$', # Two letter commands (typos)
12
+ '^ls$',
13
+ '^ls -',
14
+ '^pwd$',
15
+ '^clear$',
16
+ '^exit$',
17
+ '^x$',
18
+ '^cd$',
19
+ '^cd -$',
20
+ '^cd \\.\\.$',
21
+ '^\\.\\.$',
22
+ '^git status$',
23
+ '^git diff$',
24
+ '^git log$',
25
+ '^git pull$',
26
+ '^gs$',
27
+ '^gd$',
28
+ '^gl$',
29
+ '^h$',
30
+ '^history',
31
+ '^which ',
32
+ '^type ',
33
+ '^cat ',
34
+ '^head ',
35
+ '^tail ',
36
+ '^echo \\$',
37
+ '^\\[\\d+\\]', # Output like [1234]
38
+ '^davidcruwys\\s+\\d+', # Process listing output
39
+ '^zsh: command not found',
40
+ '^X Process completed',
41
+ '^Coverage report',
42
+ '^Line Coverage:',
43
+ '^Finished in \\d',
44
+ '^\\d+ examples, \\d+ failures'
45
+ ].freeze
46
+
47
+ DEFAULT_INCLUDE_PATTERNS = [
48
+ '^j[a-z]', # Jump aliases
49
+ '^dam ', # DAM tool
50
+ '^vat ', # VAT tool
51
+ '^claude ', # Claude CLI
52
+ '^c-sonnet', # Claude sonnet alias
53
+ '^bun run ',
54
+ '^bun dev$',
55
+ '^bun web:',
56
+ '^bun worker:',
57
+ '^bun convex:',
58
+ '^npm run ',
59
+ '^rake ',
60
+ '^bundle ',
61
+ '^git commit',
62
+ '^git push',
63
+ '^git add',
64
+ '^gac ', # Git add & commit alias
65
+ '^kfeat ', # Semantic commit alias
66
+ '^kfix ', # Semantic commit alias
67
+ '^docker ',
68
+ '^docker-compose ',
69
+ '^brew install',
70
+ '^gem install',
71
+ '^npm install'
72
+ ].freeze
73
+
74
+ attr_reader :exclude_patterns, :include_patterns, :profile_name
75
+
76
+ # Initialize filter with patterns
77
+ #
78
+ # @param profile [String, nil] Profile name to load from config
79
+ # @param exclude_patterns [Array<String>, nil] Override exclude patterns
80
+ # @param include_patterns [Array<String>, nil] Override include patterns
81
+ # @param config [Config, nil] Config instance (for testing)
82
+ def initialize(profile: nil, exclude_patterns: nil, include_patterns: nil, config: nil)
83
+ @profile_name = profile
84
+ @config = config
85
+
86
+ # Load patterns: explicit params > config > defaults
87
+ exclude_list = exclude_patterns || load_exclude_patterns
88
+ include_list = include_patterns || load_include_patterns
89
+
90
+ @exclude_patterns = exclude_list.map { |p| Regexp.new(p, Regexp::IGNORECASE) }
91
+ @include_patterns = include_list.map { |p| Regexp.new(p, Regexp::IGNORECASE) }
92
+ end
93
+
94
+ def apply(commands, days: nil)
95
+ filtered = filter_by_date(commands, days)
96
+ categorize(filtered)
97
+ end
98
+
99
+ def filter_by_date(commands, days)
100
+ return commands if days.nil?
101
+
102
+ cutoff = Time.now - (days * 24 * 60 * 60)
103
+ commands.select { |cmd| cmd.datetime >= cutoff }
104
+ end
105
+
106
+ def categorize(commands)
107
+ wanted = []
108
+ unwanted = []
109
+ unsure = []
110
+
111
+ commands.each do |cmd|
112
+ category, pattern = categorize_command(cmd)
113
+ cmd.category = category
114
+ cmd.matched_pattern = pattern
115
+
116
+ case category
117
+ when :wanted
118
+ wanted << cmd
119
+ when :unwanted
120
+ unwanted << cmd
121
+ else
122
+ unsure << cmd
123
+ end
124
+ end
125
+
126
+ FilterResult.new(
127
+ wanted: wanted,
128
+ unwanted: unwanted,
129
+ unsure: unsure,
130
+ stats: build_stats(wanted, unwanted, unsure, commands)
131
+ )
132
+ end
133
+
134
+ private
135
+
136
+ def config
137
+ @config ||= Config.new(profile: profile_name)
138
+ end
139
+
140
+ def load_exclude_patterns
141
+ # Try loading from config, fall back to defaults
142
+ config_patterns = config.exclude_patterns
143
+ config_patterns || DEFAULT_EXCLUDE_PATTERNS
144
+ end
145
+
146
+ def load_include_patterns
147
+ # Try loading from config, fall back to defaults
148
+ config_patterns = config.include_patterns
149
+ config_patterns || DEFAULT_INCLUDE_PATTERNS
150
+ end
151
+
152
+ def categorize_command(cmd)
153
+ text = cmd.text
154
+
155
+ # Check exclude patterns first (noise removal)
156
+ exclude_patterns.each do |pattern|
157
+ return [:unwanted, pattern.source] if text.match?(pattern)
158
+ end
159
+
160
+ # Check include patterns
161
+ include_patterns.each do |pattern|
162
+ return [:wanted, pattern.source] if text.match?(pattern)
163
+ end
164
+
165
+ # Neither matched - unsure
166
+ [:unsure, nil]
167
+ end
168
+
169
+ def build_stats(wanted, unwanted, unsure, all_commands)
170
+ total = all_commands.size
171
+ {
172
+ total: total,
173
+ wanted: wanted.size,
174
+ unwanted: unwanted.size,
175
+ unsure: unsure.size,
176
+ wanted_pct: total.positive? ? (wanted.size.to_f / total * 100).round(1) : 0,
177
+ unwanted_pct: total.positive? ? (unwanted.size.to_f / total * 100).round(1) : 0,
178
+ unsure_pct: total.positive? ? (unsure.size.to_f / total * 100).round(1) : 0
179
+ }
180
+ end
181
+ end
182
+ end
183
+ end
184
+ end
@@ -0,0 +1,75 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Appydave
4
+ module Tools
5
+ module ZshHistory
6
+ # Handles output formatting and file writing
7
+ class Formatter
8
+ DEFAULT_DATETIME_FORMAT = '%Y-%m-%d %H:%M:%S'
9
+ MAX_COMMAND_LENGTH = 200
10
+
11
+ attr_reader :datetime_format, :max_length
12
+
13
+ def initialize(datetime_format: nil, max_length: nil)
14
+ @datetime_format = datetime_format || DEFAULT_DATETIME_FORMAT
15
+ @max_length = max_length || MAX_COMMAND_LENGTH
16
+ end
17
+
18
+ def format_commands(commands, verbose: false)
19
+ commands.map { |cmd| format_command(cmd, verbose: verbose) }.join("\n")
20
+ end
21
+
22
+ def format_command(cmd, verbose: false)
23
+ datetime_str = cmd.formatted_datetime(datetime_format)
24
+ text = truncate(cmd.text)
25
+
26
+ if verbose && cmd.matched_pattern
27
+ category = cmd.category.to_s.upcase
28
+ "#{datetime_str} [#{category}: #{cmd.matched_pattern}] #{text}"
29
+ else
30
+ "#{datetime_str} #{text}"
31
+ end
32
+ end
33
+
34
+ def format_stats(stats, date_range: nil)
35
+ lines = []
36
+ lines << 'ZSH History Statistics'
37
+ lines << ('=' * 50)
38
+
39
+ lines << format('Total commands: %<total>d', stats)
40
+ lines << format('Wanted: %<wanted>d (%<wanted_pct>.1f%%)', stats)
41
+ lines << format('Unwanted: %<unwanted>d (%<unwanted_pct>.1f%%)', stats)
42
+ lines << format('Unsure: %<unsure>d (%<unsure_pct>.1f%%)', stats)
43
+
44
+ if date_range
45
+ lines << ''
46
+ lines << "Date range: #{date_range[:from]} to #{date_range[:to]} (#{date_range[:days]} days)"
47
+ end
48
+
49
+ lines.join("\n")
50
+ end
51
+
52
+ def write_history(commands, output_path, backup: true)
53
+ if backup && File.exist?(output_path)
54
+ backup_path = "#{output_path}.backup.#{Time.now.strftime('%Y%m%d-%H%M%S')}"
55
+ FileUtils.cp(output_path, backup_path)
56
+ puts "Backup created: #{backup_path}"
57
+ end
58
+
59
+ content = commands.map(&:to_history_format).join("\n")
60
+ File.write(output_path, "#{content}\n")
61
+
62
+ puts "Wrote #{commands.size} commands to #{output_path}"
63
+ end
64
+
65
+ private
66
+
67
+ def truncate(text)
68
+ return text if text.length <= max_length
69
+
70
+ "#{text[0, max_length - 3]}..."
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,101 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Appydave
4
+ module Tools
5
+ module ZshHistory
6
+ # Parses ZSH history file, handling multi-line commands with \ continuations
7
+ class Parser
8
+ # ZSH history line format: : timestamp:duration;command
9
+ HISTORY_LINE_PATTERN = /^: (\d+):\d+;(.*)$/.freeze
10
+
11
+ attr_reader :file_path, :commands
12
+
13
+ def initialize(file_path = nil)
14
+ @file_path = file_path || default_history_path
15
+ @commands = []
16
+ end
17
+
18
+ def parse
19
+ return [] unless File.exist?(file_path)
20
+
21
+ lines = read_file
22
+ @commands = parse_lines(lines)
23
+ end
24
+
25
+ private
26
+
27
+ def default_history_path
28
+ File.expand_path('~/.zsh_history')
29
+ end
30
+
31
+ def read_file
32
+ # ZSH history files often contain binary/non-UTF-8 data
33
+ # Read as binary first, then force UTF-8 with invalid byte replacement
34
+ content = File.binread(file_path)
35
+ content.force_encoding('UTF-8')
36
+ content.encode!('UTF-8', invalid: :replace, undef: :replace, replace: '')
37
+ content.split("\n")
38
+ rescue Errno::ENOENT
39
+ []
40
+ rescue StandardError => e
41
+ warn "Warning: Error reading history file: #{e.message}"
42
+ []
43
+ end
44
+
45
+ def parse_lines(lines)
46
+ commands = []
47
+ current_command = nil
48
+
49
+ lines.each do |line|
50
+ if (match = line.match(HISTORY_LINE_PATTERN))
51
+ commands << current_command if current_command
52
+ current_command = process_history_line(match, line, commands)
53
+ elsif current_command
54
+ current_command = process_continuation_line(current_command, line, commands)
55
+ end
56
+ end
57
+
58
+ commands << current_command if current_command
59
+ commands
60
+ end
61
+
62
+ def process_history_line(match, line, commands)
63
+ timestamp = match[1].to_i
64
+ command_text = match[2]
65
+
66
+ if command_text.end_with?('\\')
67
+ build_command(timestamp: timestamp, text: command_text.chomp('\\'), is_multiline: true, raw_lines: [line])
68
+ else
69
+ commands << build_command(timestamp: timestamp, text: command_text, is_multiline: false, raw_lines: [line])
70
+ nil
71
+ end
72
+ end
73
+
74
+ def process_continuation_line(current_command, line, commands)
75
+ current_command.raw_lines << line
76
+
77
+ if line.end_with?('\\')
78
+ current_command.text += "\n#{line.chomp('\\')}"
79
+ current_command
80
+ else
81
+ current_command.text += "\n#{line}"
82
+ commands << current_command
83
+ nil
84
+ end
85
+ end
86
+
87
+ def build_command(timestamp:, text:, is_multiline:, raw_lines:)
88
+ Command.new(
89
+ timestamp: timestamp,
90
+ datetime: Time.at(timestamp),
91
+ text: text.strip,
92
+ is_multiline: is_multiline,
93
+ category: nil,
94
+ raw_lines: raw_lines,
95
+ matched_pattern: nil
96
+ )
97
+ end
98
+ end
99
+ end
100
+ end
101
+ end
@@ -51,6 +51,13 @@ require 'appydave/tools/prompt_tools/prompt_completion'
51
51
 
52
52
  require 'appydave/tools/subtitle_processor/clean'
53
53
  require 'appydave/tools/subtitle_processor/join'
54
+ require 'appydave/tools/subtitle_processor/transcript'
55
+
56
+ require 'appydave/tools/zsh_history/command'
57
+ require 'appydave/tools/zsh_history/config'
58
+ require 'appydave/tools/zsh_history/parser'
59
+ require 'appydave/tools/zsh_history/filter'
60
+ require 'appydave/tools/zsh_history/formatter'
54
61
 
55
62
  require 'appydave/tools/dam/errors'
56
63
  require 'appydave/tools/dam/file_helper'
@@ -67,10 +74,28 @@ require 'appydave/tools/dam/project_listing'
67
74
  require 'appydave/tools/dam/manifest_generator'
68
75
  require 'appydave/tools/dam/sync_from_ssd'
69
76
  require 'appydave/tools/dam/status'
77
+ require 'appydave/tools/dam/ssd_status'
70
78
  require 'appydave/tools/dam/repo_status'
71
79
  require 'appydave/tools/dam/repo_sync'
72
80
  require 'appydave/tools/dam/repo_push'
73
81
 
82
+ require 'appydave/tools/jump/path_validator'
83
+ require 'appydave/tools/jump/location'
84
+ require 'appydave/tools/jump/config'
85
+ require 'appydave/tools/jump/search'
86
+ require 'appydave/tools/jump/formatters/base'
87
+ require 'appydave/tools/jump/formatters/json_formatter'
88
+ require 'appydave/tools/jump/formatters/paths_formatter'
89
+ require 'appydave/tools/jump/formatters/table_formatter'
90
+ require 'appydave/tools/jump/commands/base'
91
+ require 'appydave/tools/jump/commands/add'
92
+ require 'appydave/tools/jump/commands/update'
93
+ require 'appydave/tools/jump/commands/remove'
94
+ require 'appydave/tools/jump/commands/validate'
95
+ require 'appydave/tools/jump/commands/report'
96
+ require 'appydave/tools/jump/commands/generate'
97
+ require 'appydave/tools/jump/cli'
98
+
74
99
  require 'appydave/tools/youtube_automation/gpt_agent'
75
100
 
76
101
  require 'appydave/tools/youtube_manager/models/youtube_details'
data/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "appydave-tools",
3
- "version": "0.69.0",
3
+ "version": "0.71.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.69.0
4
+ version: 0.71.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-11-22 00:00:00.000000000 Z
11
+ date: 2025-12-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel
@@ -188,10 +188,12 @@ executables:
188
188
  - ad_config
189
189
  - dam
190
190
  - gpt_context
191
+ - jump
191
192
  - prompt_tools
192
- - subtitle_manager
193
+ - subtitle_processor
193
194
  - youtube_automation
194
195
  - youtube_manager
196
+ - zsh_history
195
197
  extensions: []
196
198
  extra_rdoc_files: []
197
199
  files:
@@ -199,6 +201,12 @@ files:
199
201
  - ".builders/_.rb"
200
202
  - ".builders/boot.rb"
201
203
  - ".builders/generators/01-bootstrap.rb"
204
+ - ".claude/commands/brainstorming-agent.md"
205
+ - ".claude/commands/cli-test.md"
206
+ - ".claude/commands/dev.md"
207
+ - ".claude/commands/po.md"
208
+ - ".claude/commands/progress.md"
209
+ - ".claude/commands/uat.md"
202
210
  - ".releaserc.json"
203
211
  - ".rspec"
204
212
  - ".rubocop.yml"
@@ -218,6 +226,7 @@ files:
218
226
  - bin/dam
219
227
  - bin/generate_manifest.rb
220
228
  - bin/gpt_context.rb
229
+ - bin/jump.rb
221
230
  - bin/move_images.rb
222
231
  - bin/prompt_tools.rb
223
232
  - bin/setup
@@ -227,12 +236,15 @@ files:
227
236
  - bin/sync_from_ssd.rb
228
237
  - bin/youtube_automation.rb
229
238
  - bin/youtube_manager.rb
239
+ - bin/zsh_history.rb
230
240
  - docs/README.md
231
241
  - docs/ai-instructions/behavioral-regression-audit.md
232
242
  - docs/ai-instructions/code-quality-retrospective.md
233
243
  - docs/ai-instructions/defensive-logging-audit.md
244
+ - docs/architecture/cli-patterns.md
234
245
  - docs/architecture/cli/cli-pattern-comparison.md
235
246
  - docs/architecture/cli/cli-patterns.md
247
+ - docs/architecture/cli/exe-bin-convention.md
236
248
  - docs/architecture/configuration/configuration-systems.md
237
249
  - docs/architecture/dam/dam-cli-enhancements.md
238
250
  - docs/architecture/dam/dam-cli-implementation-guide.md
@@ -245,18 +257,25 @@ files:
245
257
  - docs/architecture/dam/jan-collaboration-guide.md
246
258
  - docs/architecture/design-decisions/001-unified-brands-config.md
247
259
  - docs/architecture/design-decisions/session-2025-11-09.md
260
+ - docs/architecture/gpt-context/gpt-context-architecture.md
261
+ - docs/architecture/gpt-context/gpt-context-implementation-guide.md
262
+ - docs/architecture/gpt-context/gpt-context-vision.md
263
+ - docs/architecture/testing/testing-patterns.md
248
264
  - docs/archive/codebase-audit-2025-01.md
249
265
  - docs/archive/documentation-framework-proposal.md
250
266
  - docs/archive/purpose-and-philosophy.md
251
267
  - docs/archive/test-coverage-quick-wins.md
252
268
  - docs/archive/tool-discovery.md
253
269
  - docs/archive/tool-documentation-analysis.md
270
+ - docs/backlog.md
271
+ - docs/cli-tests/FR-3-jump-location-tool.md
254
272
  - docs/code-quality/README.md
255
273
  - docs/code-quality/behavioral-audit-2025-01-22.md
256
274
  - docs/code-quality/implementation-plan.md
257
275
  - docs/code-quality/report-2025-01-21.md
258
276
  - docs/code-quality/uat-plan-2025-01-22.md
259
277
  - docs/code-quality/uat-report-2025-01-22.md
278
+ - docs/dam/batch-s3-listing-requirements.md
260
279
  - docs/guides/configuration-setup.md
261
280
  - docs/guides/platforms/windows/README.md
262
281
  - docs/guides/platforms/windows/dam-testing-plan-windows-powershell.md
@@ -272,18 +291,25 @@ files:
272
291
  - docs/guides/tools/name-manager.md
273
292
  - docs/guides/tools/prompt-tools.md
274
293
  - docs/guides/tools/subtitle-processor.md
294
+ - docs/guides/tools/video-file-namer.md
275
295
  - docs/guides/tools/youtube-automation.md
276
296
  - docs/guides/tools/youtube-manager.md
297
+ - docs/specs/fr-002-gpt-context-help-system.md
298
+ - docs/specs/fr-003-jump-location-tool.md
299
+ - docs/specs/zsh-history-tool.md
277
300
  - docs/templates/.env.example
278
301
  - docs/templates/channels.example.json
279
302
  - docs/templates/settings.example.json
303
+ - docs/uat/FR-3-jump-location-tool.md
280
304
  - exe/ad_config
281
305
  - exe/dam
282
306
  - exe/gpt_context
307
+ - exe/jump
283
308
  - exe/prompt_tools
284
- - exe/subtitle_manager
309
+ - exe/subtitle_processor
285
310
  - exe/youtube_automation
286
311
  - exe/youtube_manager
312
+ - exe/zsh_history
287
313
  - images.log
288
314
  - lib/appydave/tools.rb
289
315
  - lib/appydave/tools/cli_actions/_doc.md
@@ -317,6 +343,7 @@ files:
317
343
  - lib/appydave/tools/dam/s3_operations.rb
318
344
  - lib/appydave/tools/dam/s3_scanner.rb
319
345
  - lib/appydave/tools/dam/share_operations.rb
346
+ - lib/appydave/tools/dam/ssd_status.rb
320
347
  - lib/appydave/tools/dam/status.rb
321
348
  - lib/appydave/tools/dam/sync_from_ssd.rb
322
349
  - lib/appydave/tools/debuggable.rb
@@ -324,6 +351,22 @@ files:
324
351
  - lib/appydave/tools/gpt_context/file_collector.rb
325
352
  - lib/appydave/tools/gpt_context/options.rb
326
353
  - lib/appydave/tools/gpt_context/output_handler.rb
354
+ - lib/appydave/tools/jump/cli.rb
355
+ - lib/appydave/tools/jump/commands/add.rb
356
+ - lib/appydave/tools/jump/commands/base.rb
357
+ - lib/appydave/tools/jump/commands/generate.rb
358
+ - lib/appydave/tools/jump/commands/remove.rb
359
+ - lib/appydave/tools/jump/commands/report.rb
360
+ - lib/appydave/tools/jump/commands/update.rb
361
+ - lib/appydave/tools/jump/commands/validate.rb
362
+ - lib/appydave/tools/jump/config.rb
363
+ - lib/appydave/tools/jump/formatters/base.rb
364
+ - lib/appydave/tools/jump/formatters/json_formatter.rb
365
+ - lib/appydave/tools/jump/formatters/paths_formatter.rb
366
+ - lib/appydave/tools/jump/formatters/table_formatter.rb
367
+ - lib/appydave/tools/jump/location.rb
368
+ - lib/appydave/tools/jump/path_validator.rb
369
+ - lib/appydave/tools/jump/search.rb
327
370
  - lib/appydave/tools/llm/models/llm_info.rb
328
371
  - lib/appydave/tools/llm/openai_completion.rb
329
372
  - lib/appydave/tools/name_manager/_doc.md
@@ -335,6 +378,7 @@ files:
335
378
  - lib/appydave/tools/subtitle_processor/_doc-todo.md
336
379
  - lib/appydave/tools/subtitle_processor/clean.rb
337
380
  - lib/appydave/tools/subtitle_processor/join.rb
381
+ - lib/appydave/tools/subtitle_processor/transcript.rb
338
382
  - lib/appydave/tools/types/array_type.rb
339
383
  - lib/appydave/tools/types/base_model.rb
340
384
  - lib/appydave/tools/types/hash_type.rb
@@ -351,6 +395,11 @@ files:
351
395
  - lib/appydave/tools/youtube_manager/reports/video_details_report.rb
352
396
  - lib/appydave/tools/youtube_manager/update_video.rb
353
397
  - lib/appydave/tools/youtube_manager/youtube_base.rb
398
+ - lib/appydave/tools/zsh_history/command.rb
399
+ - lib/appydave/tools/zsh_history/config.rb
400
+ - lib/appydave/tools/zsh_history/filter.rb
401
+ - lib/appydave/tools/zsh_history/formatter.rb
402
+ - lib/appydave/tools/zsh_history/parser.rb
354
403
  - package.json
355
404
  - sig/appydave/tools.rbs
356
405
  homepage: http://appydave.com/gems/appydave-tools