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,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
|
data/lib/appydave/tools.rb
CHANGED
|
@@ -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
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.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
|
+
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
|
-
-
|
|
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,12 +257,18 @@ 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
|
|
@@ -276,16 +294,22 @@ files:
|
|
|
276
294
|
- docs/guides/tools/video-file-namer.md
|
|
277
295
|
- docs/guides/tools/youtube-automation.md
|
|
278
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
|
|
279
300
|
- docs/templates/.env.example
|
|
280
301
|
- docs/templates/channels.example.json
|
|
281
302
|
- docs/templates/settings.example.json
|
|
303
|
+
- docs/uat/FR-3-jump-location-tool.md
|
|
282
304
|
- exe/ad_config
|
|
283
305
|
- exe/dam
|
|
284
306
|
- exe/gpt_context
|
|
307
|
+
- exe/jump
|
|
285
308
|
- exe/prompt_tools
|
|
286
|
-
- exe/
|
|
309
|
+
- exe/subtitle_processor
|
|
287
310
|
- exe/youtube_automation
|
|
288
311
|
- exe/youtube_manager
|
|
312
|
+
- exe/zsh_history
|
|
289
313
|
- images.log
|
|
290
314
|
- lib/appydave/tools.rb
|
|
291
315
|
- lib/appydave/tools/cli_actions/_doc.md
|
|
@@ -319,6 +343,7 @@ files:
|
|
|
319
343
|
- lib/appydave/tools/dam/s3_operations.rb
|
|
320
344
|
- lib/appydave/tools/dam/s3_scanner.rb
|
|
321
345
|
- lib/appydave/tools/dam/share_operations.rb
|
|
346
|
+
- lib/appydave/tools/dam/ssd_status.rb
|
|
322
347
|
- lib/appydave/tools/dam/status.rb
|
|
323
348
|
- lib/appydave/tools/dam/sync_from_ssd.rb
|
|
324
349
|
- lib/appydave/tools/debuggable.rb
|
|
@@ -326,6 +351,22 @@ files:
|
|
|
326
351
|
- lib/appydave/tools/gpt_context/file_collector.rb
|
|
327
352
|
- lib/appydave/tools/gpt_context/options.rb
|
|
328
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
|
|
329
370
|
- lib/appydave/tools/llm/models/llm_info.rb
|
|
330
371
|
- lib/appydave/tools/llm/openai_completion.rb
|
|
331
372
|
- lib/appydave/tools/name_manager/_doc.md
|
|
@@ -337,6 +378,7 @@ files:
|
|
|
337
378
|
- lib/appydave/tools/subtitle_processor/_doc-todo.md
|
|
338
379
|
- lib/appydave/tools/subtitle_processor/clean.rb
|
|
339
380
|
- lib/appydave/tools/subtitle_processor/join.rb
|
|
381
|
+
- lib/appydave/tools/subtitle_processor/transcript.rb
|
|
340
382
|
- lib/appydave/tools/types/array_type.rb
|
|
341
383
|
- lib/appydave/tools/types/base_model.rb
|
|
342
384
|
- lib/appydave/tools/types/hash_type.rb
|
|
@@ -353,6 +395,11 @@ files:
|
|
|
353
395
|
- lib/appydave/tools/youtube_manager/reports/video_details_report.rb
|
|
354
396
|
- lib/appydave/tools/youtube_manager/update_video.rb
|
|
355
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
|
|
356
403
|
- package.json
|
|
357
404
|
- sig/appydave/tools.rbs
|
|
358
405
|
homepage: http://appydave.com/gems/appydave-tools
|