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.
- 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 +11 -0
- data/AGENTS.md +43 -0
- data/CHANGELOG.md +24 -0
- data/CLAUDE.md +96 -3
- data/README.md +15 -0
- data/bin/dam +39 -7
- 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 -68
- 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/dam/batch-s3-listing-requirements.md +780 -0
- data/docs/guides/tools/video-file-namer.md +400 -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 +220 -138
- data/lib/appydave/tools/dam/s3_operations.rb +112 -60
- 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 +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
|
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,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/
|
|
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
|