appydave-tools 0.10.4 → 0.11.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 40337ac9a46d2a5d2b7a645b14e572f011c84b52e958ba880be666d6dfe3413b
4
- data.tar.gz: 4e4e4bd076cae97a6cdec63dd70313f49efcbb19fb6295ffd1ef297dbbf08e42
3
+ metadata.gz: eee6c36595a4e874d3c74f65698ca89d68f8c324a4d0482fa77f8f53de8a3029
4
+ data.tar.gz: 744aaa75b3c1ec2dc9ac065b2931fcdef45b4ad713bcbb5771d3fef96de10bbd
5
5
  SHA512:
6
- metadata.gz: 86448501dd1959eb0173ed98af2dead6965b56bf9cfcdc5007d335b73ecd94f8bb7e5cda9f099997285509e93f7ecff1368740fbe38c16c5e4240b1578462116
7
- data.tar.gz: 9e32acedc6fbc3b7e21123a56f068e7c91a6b6b4cc58a7315102a08b9455950f531755c5d1405b66dd52a9df60132aab08395877f771d8b096bb364aa6e83e7e
6
+ metadata.gz: ce5e8b078060a8f548c350bfcad02efce169c3d8922f1177656ed76df44adbaac99ba1712a2247f3f1af6eb1a819c6a5ff0e4b1d46a02709d2ff972cd4f22ae1
7
+ data.tar.gz: aa8422a814f69703c3444ace26576eda05c1777d81eb15178582331ec0b60bab47d89918debb31d4a4707ea7a6bf69186a17c05e2c7faacd414fa5b668b06c1d
data/CHANGELOG.md CHANGED
@@ -1,3 +1,28 @@
1
+ # [0.11.0](https://github.com/klueless-io/appydave-tools/compare/v0.10.4...v0.11.0) (2024-10-16)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * gpt context improvements ([1a1db97](https://github.com/klueless-io/appydave-tools/commit/1a1db976317d1b6056d14e226a5635c3b7dea83d))
7
+
8
+
9
+ ### Features
10
+
11
+ * gpt_context has improved options, this may break some previous calls ([21c984a](https://github.com/klueless-io/appydave-tools/commit/21c984a61d215da93783a3df55f10301cae55e1c))
12
+
13
+ ## [0.10.4](https://github.com/klueless-io/appydave-tools/compare/v0.10.3...v0.10.4) (2024-10-09)
14
+
15
+
16
+ ### Bug Fixes
17
+
18
+ * cleanup code base before building documenation ([e473c44](https://github.com/klueless-io/appydave-tools/commit/e473c44546d8f0f5a35461fae263c348e7e2c58f))
19
+ * cleanup code base before building documenation ([38d8fb4](https://github.com/klueless-io/appydave-tools/commit/38d8fb46929e7c055308aa0b918c18a56fcd5842))
20
+ * cleanup code base before building documenation ([8dad12a](https://github.com/klueless-io/appydave-tools/commit/8dad12aadb9952f0174df45caed91c9e96070294))
21
+ * cleanup code base before building documenation ([eddfcc7](https://github.com/klueless-io/appydave-tools/commit/eddfcc78e39c93bfd4de6482690cc66cf90cc54a))
22
+ * extend prompt tools ([a628d08](https://github.com/klueless-io/appydave-tools/commit/a628d08fcdda521b7d148f0bab3261b879fca07d))
23
+ * extending bank reconciliation ([b435a20](https://github.com/klueless-io/appydave-tools/commit/b435a20237ef40a8a7d0a4f365ccd3eafdfcce1a))
24
+ * extending bank reconciliation ([b7878df](https://github.com/klueless-io/appydave-tools/commit/b7878dff0bca4ff1a3af7db19c280a8c245b6c3b))
25
+
1
26
  ## [0.10.3](https://github.com/klueless-io/appydave-tools/compare/v0.10.2...v0.10.3) (2024-06-17)
2
27
 
3
28
 
data/README.md CHANGED
@@ -33,8 +33,7 @@ See all [stories](./STORIES.md)
33
33
 
34
34
  ## Usage
35
35
 
36
- See all [usage examples](./USAGE.md)
37
-
36
+ - [GPT Context Gatherer](./docs/usage/gpt-context.md)
38
37
 
39
38
 
40
39
  ## Development
data/bin/gpt_context.rb CHANGED
@@ -1,6 +1,9 @@
1
1
  #!/usr/bin/env ruby
2
2
  # frozen_string_literal: true
3
3
 
4
+ # GPT Chats:
5
+ # https://chatgpt.com/c/670df475-04f4-8002-a758-f5711bf433eb
6
+
4
7
  # Usage:
5
8
  # ./bin/gpt_context.rb -d -i 'lib/openai_101/tools/**/*.rb'
6
9
  # ./bin/gpt_context.rb -d -i 'lib/openai_101/tools/**/*' -e 'node_modules/**/*' -e 'package-lock.json' -e 'lib/openai_101/tools/prompts/*.txt'
@@ -11,39 +14,42 @@ $LOAD_PATH.unshift(File.expand_path('../lib', __dir__))
11
14
 
12
15
  require 'appydave/tools'
13
16
 
14
- options = {
15
- include_patterns: [],
16
- exclude_patterns: [],
17
- format: 'tree,content',
18
- line_limit: nil,
19
- debug: 'none'
20
- }
17
+ options = Appydave::Tools::GptContext::Options.new(
18
+ working_directory: nil
19
+ )
21
20
 
22
21
  OptionParser.new do |opts|
23
22
  opts.banner = 'Usage: gather_content.rb [options]'
24
23
 
25
24
  opts.on('-i', '--include PATTERN', 'Pattern or file to include (can be used multiple times)') do |pattern|
26
- options[:include_patterns] << pattern
25
+ options.include_patterns << pattern
27
26
  end
28
27
 
29
28
  opts.on('-e', '--exclude PATTERN', 'Pattern or file to exclude (can be used multiple times)') do |pattern|
30
- options[:exclude_patterns] << pattern
29
+ options.exclude_patterns << pattern
31
30
  end
32
31
 
33
- opts.on('-f', '--format FORMAT', 'Output format: content or tree, if not provided then both are used') do |format|
34
- options[:format] = format
32
+ opts.on('-f', '--format FORMAT', 'Output format: content, tree, or json, if not provided then both are used') do |format|
33
+ options.format = format
35
34
  end
36
35
 
37
36
  opts.on('-l', '--line-limit LIMIT', 'Limit the number of lines included from each file') do |limit|
38
- options[:line_limit] = limit.to_i
37
+ options.line_limit = limit.to_i
39
38
  end
40
39
 
41
- # None - No debug output
42
- # Output - Output the content to the console, this is the same as found in the clipboard
43
- # Params - Output the options that were passed to the script
44
- # Debug - Output content, options and debug information
45
- opts.on('-d', '--debug [MODE]', 'Enable debug mode [none, output, params, debug]', 'none', 'output', 'params', 'debug') do |debug|
46
- options[:debug] = debug || 'output'
40
+ # New option for specifying base directory
41
+ opts.on('-b', '--base-dir DIRECTORY', 'Set the base directory to gather files from') do |directory|
42
+ options.working_directory = directory
43
+ end
44
+
45
+ # Debug output options
46
+ opts.on('-d', '--debug [MODE]', 'Enable debug mode [none, info, params, debug]', 'none', 'info', 'params', 'debug') do |debug|
47
+ options.debug = debug || 'info'
48
+ end
49
+
50
+ # Output targets: clipboard or file
51
+ opts.on('-o', '--output TARGET', 'Output target: clipboard, or a file path (can be used multiple times)') do |target|
52
+ options.output_target << target
47
53
  end
48
54
 
49
55
  opts.on_tail('-h', '--help', 'Show this message') do
@@ -59,7 +65,7 @@ OptionParser.new do |opts|
59
65
  end
60
66
  end.parse!
61
67
 
62
- if options[:include_patterns].empty? && options[:exclude_patterns].empty? && options[:format].nil?
68
+ if options.include_patterns.empty? && options.exclude_patterns.empty? && options.format.nil?
63
69
  script_name = File.basename($PROGRAM_NAME, File.extname($PROGRAM_NAME))
64
70
 
65
71
  puts 'No options provided to GPT Context. Please specify patterns to include or exclude.'
@@ -67,24 +73,25 @@ if options[:include_patterns].empty? && options[:exclude_patterns].empty? && opt
67
73
  exit
68
74
  end
69
75
 
70
- pp options if options[:debug] == 'params'
76
+ if options.output_target.empty?
77
+ puts 'No output target provided. Will default to `clipboard`. You can set the output target using -o'
78
+ options.output_target << 'clipboard'
79
+ end
80
+
81
+ pp options if options.debug == 'params'
71
82
 
72
- gatherer = Appydave::Tools::GptContext::FileCollector.new(
73
- include_patterns: options[:include_patterns],
74
- exclude_patterns: options[:exclude_patterns],
75
- format: options[:format],
76
- line_limit: options[:line_limit],
77
- working_directory: Dir.pwd
78
- )
83
+ options.working_directory ||= Dir.pwd
79
84
 
85
+ gatherer = Appydave::Tools::GptContext::FileCollector.new(options)
80
86
  content = gatherer.build
81
87
 
82
- if %w[output debug].include?(options[:debug])
88
+ if %w[info debug].include?(options.debug)
83
89
  puts '-' * 80
84
90
  puts content
85
91
  puts '-' * 80
86
92
  end
87
93
 
88
- pp options if options[:debug] == 'debug'
94
+ output_handler = Appydave::Tools::GptContext::OutputHandler.new(content, options)
95
+ output_handler.execute
89
96
 
90
- Clipboard.copy(content)
97
+ pp options if options.debug == 'debug'
@@ -0,0 +1,96 @@
1
+ # GPT Context Usage Guide
2
+
3
+ This guide provides a comprehensive reference for using the `gpt_context` tool. Below you'll find examples of different use cases and command line invocations to help you effectively use `gpt_context` for gathering and organizing your project files. These examples will help you remember how to leverage various options available in `gpt_context`.
4
+
5
+ ## Overview
6
+
7
+ `gpt_context` is a command line utility designed to collect, filter, and organize context from different files within a project. It allows for gathering files based on include and exclude patterns, visualizing the project structure, and exporting collected information in multiple formats, such as content, tree, or JSON.
8
+
9
+ ### Common Options
10
+ - **`-i` or `--include`**: Specify patterns or files to include (multiple entries allowed).
11
+ - **`-e` or `--exclude`**: Specify patterns or files to exclude (multiple entries allowed).
12
+ - **`-f` or `--format`**: Define output format (`content`, `tree`, or `json`). If not provided, then `tree` followed by `content` is used by defaultboth are used by default.
13
+ - **`-d` or `--debug`**: Enable debug mode (e.g., `info`, `params`, `debug`). The default is `info` and this is how output to console is invoked. (Yes I know, it should be part of the --output option as well)
14
+ - **`-o` or `--output`**: Set the output target (`clipboard` or a file path). The default is `clipboard`, I know this is potentially desctructive.
15
+ - **`-l` or `--line-limit`**: Limit the number of lines included from each file.
16
+ - **`-b` or `--base-dir`**: Set the base directory to gather files from. Current working directory is used if not supplied
17
+
18
+ ## Usage Examples
19
+
20
+ ### 1. Gathering File Contents
21
+ To gather the content of specific files and print it to the console, you can use the `-f content` format option:
22
+
23
+ ```sh
24
+ $ gpt_context -i "**/gpt_context.rb" -i "**/gpt_context/*.rb" -d -f content
25
+ ```
26
+ **Explanation**: This command collects the content of all Ruby files matching the specified patterns (`gpt_context.rb` and files in the `gpt_context` directory). It includes debug output (`-d`) to log the content to the console during execution. The is stored in the clipboard in content format.
27
+
28
+ ### 2. Displaying Directory Structure as a Tree
29
+ To visualize the structure of the included files as a tree, use the `-f tree` option:
30
+
31
+ ```sh
32
+ $ gpt_context -i "**/gpt_context.rb" -i "**/gpt_context/*.rb" -d -f tree
33
+ ```
34
+ **Explanation**: This command collects files based on the patterns and using the `-d` prints them in a tree-like structure. The tree is also loaded into the clipboard by default. This is useful for understanding the overall organization of files within the project.
35
+
36
+ ### 3. Exporting File Data as JSON
37
+ You can export the gathered file data as JSON by using the `-f json` format option, along with specifying an output file:
38
+
39
+ ```sh
40
+ $ gpt_context -i "**/gpt_context.rb" -i "**/gpt_context/*.rb" -f json -o somefile.json
41
+ ```
42
+ **Explanation**: This command collects files and outputs the gathered data in JSON format. The result is saved to `somefile.json` (`-o somefile.json`). There is no `-d` so there will be no console output, also the `-o` will replace the default which is `clipboard` and so the only output in this case is the file which will go into the working directory. This is helpful when you need a structured representation of your project files, such as for further processing or analysis.
43
+
44
+ ### 4. Combining Multiple Formats
45
+ You can generate multiple formats at once by specifying them in a comma-separated list:
46
+
47
+ ```sh
48
+ $ gpt_context -i "**/gpt_context.rb" -i "**/gpt_context/*.rb" -f tree,content
49
+ ```
50
+ **Explanation**: This command gathers the files and produces both a tree view and concatenated content output. The combined output can help visualize both the structure and content of your project files. This would be the default if you did not use `-f`, but interestling you can reverse them `-f content,tree` if you want the tree at the bottom of the concatenated output.
51
+
52
+ ### 5. Limiting the Number of Lines Collected
53
+ To limit the number of lines collected from each file, use the `-l` option:
54
+
55
+ ```sh
56
+ $ gpt_context -i "**/*.rb" -l 10
57
+ ```
58
+ **Explanation**: This command gathers the first 10 lines from each Ruby file in the current directory and its subdirectories. This can be useful for getting an overview without including complete files.
59
+
60
+ ### 6. Setting the Working Directory
61
+ You can specify a base directory to gather files from by using the `-b` option:
62
+
63
+ ```sh
64
+ $ gpt_context -b "lib/" -i "**/*.rb" -f tree
65
+ ```
66
+ **Explanation**: This command sets the base directory to `lib/` and gathers all Ruby files within it, displaying the output in a tree format. This helps scope your collection to a specific part of your project.
67
+
68
+ ## Debugging Tips
69
+ - **Debugging Mode**: The `-d` option can be followed by levels like `info`, `params`, or `debug` to control the verbosity of debug output.
70
+ - `params`: Prints out the parameters being used.
71
+ - `debug`: Provides detailed output, which can be helpful for troubleshooting issues.
72
+
73
+ Example:
74
+ ```sh
75
+ $ gpt_context -i "**/*.rb" -d debug -f content
76
+ ```
77
+ This will provide detailed debug output while collecting file contents.
78
+
79
+ ## Output Targets
80
+ - **Clipboard**: By default, if no output target is specified, the content is copied to the clipboard.
81
+ - **File Output**: Use the `-o` option with a file path to save the output to a file.
82
+
83
+ Example:
84
+ ```sh
85
+ $ gpt_context -i "**/*.rb" -o output.txt
86
+ ```
87
+ This saves the gathered content to `output.txt`.
88
+
89
+ ## Summary
90
+ The `gpt_context` tool is versatile for gathering, visualizing, and exporting project context in various formats. Whether you need a structured view of your files, a quick JSON export, or just the content concatenated, these examples should help you remember how to leverage the tool's full capabilities effectively.
91
+
92
+ Feel free to expand this guide with more examples as you explore new ways to use `gpt_context`!
93
+
94
+ ## References
95
+
96
+ - [ChatGPT Documentation](https://chatgpt.com/c/670f2150-08b4-8002-b2d7-04aff6fe304f)
@@ -6,32 +6,33 @@ module Appydave
6
6
  module GptContext
7
7
  # Gathers file names and content based on include and exclude patterns
8
8
  class FileCollector
9
- attr_reader :include_patterns, :exclude_patterns, :format, :working_directory, :line_limit
10
-
11
- def initialize(include_patterns: [], exclude_patterns: [], format: 'tree,content', working_directory: nil, line_limit: nil)
12
- @include_patterns = include_patterns
13
- @exclude_patterns = exclude_patterns
14
- @format = format
15
- @working_directory = working_directory
16
- @line_limit = line_limit
9
+ def initialize(options)
10
+ @options = options
11
+ @include_patterns = options.include_patterns
12
+ @exclude_patterns = options.exclude_patterns
13
+ @format = options.format
14
+ @working_directory = options.working_directory
15
+ @line_limit = options.line_limit
17
16
  end
18
17
 
19
18
  def build
20
- FileUtils.cd(working_directory) if working_directory && Dir.exist?(working_directory)
19
+ FileUtils.cd(@working_directory) if @working_directory && Dir.exist?(@working_directory)
21
20
 
22
- formats = format.split(',')
21
+ formats = @format.split(',')
23
22
  result = formats.map do |fmt|
24
23
  case fmt
25
24
  when 'tree'
26
25
  build_tree
27
26
  when 'content'
28
27
  build_content
28
+ when 'json'
29
+ build_json
29
30
  else
30
31
  ''
31
32
  end
32
33
  end.join("\n\n")
33
34
 
34
- FileUtils.cd(Dir.home) if working_directory
35
+ FileUtils.cd(Dir.home) if @working_directory
35
36
 
36
37
  result
37
38
  end
@@ -41,7 +42,7 @@ module Appydave
41
42
  def build_content
42
43
  concatenated_content = []
43
44
 
44
- include_patterns.each do |pattern|
45
+ @include_patterns.each do |pattern|
45
46
  Dir.glob(pattern).each do |file_path|
46
47
  next if excluded?(file_path) || File.directory?(file_path)
47
48
 
@@ -55,7 +56,7 @@ module Appydave
55
56
 
56
57
  def read_file_content(file_path)
57
58
  lines = File.readlines(file_path)
58
- return lines.first(line_limit).join if line_limit
59
+ return lines.first(@line_limit).join if @line_limit
59
60
 
60
61
  lines.join
61
62
  end
@@ -63,7 +64,7 @@ module Appydave
63
64
  def build_tree
64
65
  tree_view = {}
65
66
 
66
- include_patterns.each do |pattern|
67
+ @include_patterns.each do |pattern|
67
68
  Dir.glob(pattern).each do |file_path|
68
69
  next if excluded?(file_path)
69
70
 
@@ -93,8 +94,35 @@ module Appydave
93
94
  output
94
95
  end
95
96
 
97
+ def build_json
98
+ json_output = {
99
+ 'tree' => {},
100
+ 'content' => []
101
+ }
102
+
103
+ # Building tree structure in JSON
104
+ @include_patterns.each do |pattern|
105
+ Dir.glob(pattern).each do |file_path|
106
+ next if excluded?(file_path)
107
+
108
+ path_parts = file_path.split('/')
109
+ insert_into_tree(json_output['tree'], path_parts)
110
+
111
+ # Building content structure in JSON
112
+ next if excluded?(file_path) || File.directory?(file_path)
113
+
114
+ json_output['content'] << {
115
+ 'file' => file_path,
116
+ 'content' => read_file_content(file_path)
117
+ }
118
+ end
119
+ end
120
+
121
+ JSON.pretty_generate(json_output)
122
+ end
123
+
96
124
  def excluded?(file_path)
97
- exclude_patterns.any? { |pattern| File.fnmatch(pattern, file_path, File::FNM_PATHNAME | File::FNM_DOTMATCH) }
125
+ @exclude_patterns.any? { |pattern| File.fnmatch(pattern, file_path, File::FNM_PATHNAME | File::FNM_DOTMATCH) }
98
126
  end
99
127
  end
100
128
  end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Appydave
4
+ module Tools
5
+ module GptContext
6
+ # Struct with keyword_init: true to allow named parameters
7
+ Options = Struct.new(
8
+ :include_patterns,
9
+ :exclude_patterns,
10
+ :format,
11
+ :line_limit,
12
+ :debug,
13
+ :output_target,
14
+ :working_directory,
15
+ keyword_init: true
16
+ ) do
17
+ def initialize(**args)
18
+ super
19
+ self.include_patterns ||= []
20
+ self.exclude_patterns ||= []
21
+ self.format ||= 'tree,content'
22
+ self.debug ||= 'none'
23
+ self.output_target ||= []
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Appydave
4
+ module Tools
5
+ module GptContext
6
+ # OutputHandler is responsible for writing the output to the desired target
7
+ class OutputHandler
8
+ def initialize(content, options)
9
+ @content = content
10
+ @output_targets = options.output_target
11
+ @working_directory = options.working_directory
12
+ end
13
+
14
+ def execute
15
+ @output_targets.each do |target|
16
+ case target
17
+ when 'clipboard'
18
+ Clipboard.copy(@content)
19
+ when /^.+$/
20
+ write_to_file(target)
21
+ end
22
+ end
23
+ end
24
+
25
+ private
26
+
27
+ attr_reader :content, :output_targets, :working_directory
28
+
29
+ def write_to_file(target)
30
+ resolved_path = Pathname.new(target).absolute? ? target : File.join(working_directory, target)
31
+ File.write(resolved_path, content)
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Appydave
4
4
  module Tools
5
- VERSION = '0.10.4'
5
+ VERSION = '0.11.1'
6
6
  end
7
7
  end
@@ -7,6 +7,7 @@ require 'json'
7
7
  require 'open3'
8
8
  require 'openai'
9
9
  require 'optparse'
10
+ require 'pathname'
10
11
  require 'k_log'
11
12
  require 'active_model'
12
13
 
@@ -34,7 +35,9 @@ require 'appydave/tools/cli_actions/prompt_completion_action'
34
35
  require 'appydave/tools/cli_actions/get_video_action'
35
36
  require 'appydave/tools/cli_actions/update_video_action'
36
37
 
38
+ require 'appydave/tools/gpt_context/options'
37
39
  require 'appydave/tools/gpt_context/file_collector'
40
+ require 'appydave/tools/gpt_context/output_handler'
38
41
 
39
42
  require 'appydave/tools/configuration/openai'
40
43
  require 'appydave/tools/configuration/configurable'
data/package-lock.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "appydave-tools",
3
- "version": "0.10.4",
3
+ "version": "0.11.1",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "appydave-tools",
9
- "version": "0.10.4",
9
+ "version": "0.11.1",
10
10
  "devDependencies": {
11
11
  "@klueless-js/semantic-release-rubygem": "github:klueless-js/semantic-release-rubygem",
12
12
  "@semantic-release/changelog": "^6.0.3",
data/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "appydave-tools",
3
- "version": "0.10.4",
3
+ "version": "0.11.1",
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.10.4
4
+ version: 0.11.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Cruwys
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-10-09 00:00:00.000000000 Z
11
+ date: 2024-10-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel
@@ -165,6 +165,7 @@ files:
165
165
  - bin/subtitle_master.rb
166
166
  - bin/youtube_automation.rb
167
167
  - bin/youtube_manager.rb
168
+ - docs/usage/gpt-context.md
168
169
  - images.log
169
170
  - lib/appydave/tools.rb
170
171
  - lib/appydave/tools/cli_actions/_doc.md
@@ -184,6 +185,8 @@ files:
184
185
  - lib/appydave/tools/debuggable.rb
185
186
  - lib/appydave/tools/gpt_context/_doc.md
186
187
  - lib/appydave/tools/gpt_context/file_collector.rb
188
+ - lib/appydave/tools/gpt_context/options.rb
189
+ - lib/appydave/tools/gpt_context/output_handler.rb
187
190
  - lib/appydave/tools/llm/models/llm_info.rb
188
191
  - lib/appydave/tools/llm/openai_completion.rb
189
192
  - lib/appydave/tools/name_manager/_doc.md