llm-docs-builder 0.11.0 → 0.13.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 (36) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +35 -4
  3. data/.github/workflows/docker.yml +7 -7
  4. data/.github/workflows/push.yml +3 -3
  5. data/.gitignore +8 -0
  6. data/.rubocop.yml +1 -14
  7. data/.ruby-version +1 -1
  8. data/.yard-lint.yml +275 -0
  9. data/CHANGELOG.md +16 -0
  10. data/Dockerfile +14 -7
  11. data/Gemfile +1 -1
  12. data/Gemfile.lock +33 -25
  13. data/README.md +16 -0
  14. data/lib/llm_docs_builder/cli.rb +0 -1
  15. data/lib/llm_docs_builder/config.rb +33 -0
  16. data/lib/llm_docs_builder/helpers/prune_trailing_unsafe_link_separator.rb +31 -0
  17. data/lib/llm_docs_builder/helpers/squeeze_blank_lines_outside_fences.rb +71 -0
  18. data/lib/llm_docs_builder/helpers.rb +9 -0
  19. data/lib/llm_docs_builder/html_detector.rb +159 -0
  20. data/lib/llm_docs_builder/html_to_markdown/figure_code_block_renderer.rb +181 -0
  21. data/lib/llm_docs_builder/html_to_markdown/table_markup_renderer.rb +597 -0
  22. data/lib/llm_docs_builder/html_to_markdown_converter.rb +826 -0
  23. data/lib/llm_docs_builder/markdown_transformer.rb +23 -9
  24. data/lib/llm_docs_builder/output_formatter.rb +1 -1
  25. data/lib/llm_docs_builder/text_compressor.rb +2 -2
  26. data/lib/llm_docs_builder/transformers/base_transformer.rb +13 -1
  27. data/lib/llm_docs_builder/transformers/heading_transformer.rb +19 -7
  28. data/lib/llm_docs_builder/url_fetcher.rb +18 -0
  29. data/lib/llm_docs_builder/version.rb +1 -1
  30. data/lib/llm_docs_builder.rb +10 -0
  31. data/llm-docs-builder.gemspec +3 -2
  32. data/package-lock.json +331 -0
  33. data/package.json +9 -0
  34. data/renovate.json +22 -9
  35. metadata +31 -8
  36. data/AGENTS.md +0 -20
@@ -63,9 +63,7 @@ module LlmDocsBuilder
63
63
  content = heading_transformer.transform(content, options)
64
64
  content = compress_content(content) if should_compress?
65
65
  content = enhancement_transformer.transform(content, options)
66
- content = whitespace_transformer.transform(content, options)
67
-
68
- content
66
+ whitespace_transformer.transform(content, options)
69
67
  end
70
68
 
71
69
  private
@@ -114,7 +112,7 @@ module LlmDocsBuilder
114
112
 
115
113
  # Compress content using TextCompressor
116
114
  #
117
- # @param content [String] content to compress
115
+ # @param content [String] markdown content
118
116
  # @return [String] compressed content
119
117
  def compress_content(content)
120
118
  compressor = TextCompressor.new
@@ -129,11 +127,27 @@ module LlmDocsBuilder
129
127
  #
130
128
  # @return [String] markdown content to transform
131
129
  def load_content
132
- if options[:content]
133
- options[:content].dup
134
- else
135
- File.read(file_path)
136
- end
130
+ content = options[:content] ? options[:content].dup : File.read(file_path)
131
+ snippet = html_detector.detection_snippet(content)
132
+
133
+ return content if html_detector.table_fragment?(snippet)
134
+ return html_to_markdown_converter.convert(content) if html_detector.html_content?(content, snippet)
135
+
136
+ content
137
+ end
138
+
139
+ # Memoized HTML to markdown converter
140
+ #
141
+ # @return [HtmlToMarkdownConverter]
142
+ def html_to_markdown_converter
143
+ @html_to_markdown_converter ||= HtmlToMarkdownConverter.new
144
+ end
145
+
146
+ # Memoized HTML detector
147
+ #
148
+ # @return [HtmlDetector]
149
+ def html_detector
150
+ @html_detector ||= HtmlDetector.new
137
151
  end
138
152
  end
139
153
  end
@@ -30,7 +30,7 @@ module LlmDocsBuilder
30
30
 
31
31
  # Format number with comma separators for readability
32
32
  #
33
- # @param number [Integer] number to format
33
+ # @param number [Integer] value to format with comma separators
34
34
  # @return [String] formatted number with commas
35
35
  #
36
36
  # @example
@@ -72,8 +72,8 @@ module LlmDocsBuilder
72
72
  # Removes common English stopwords that don't carry significant meaning.
73
73
  # Preserves code blocks, inline code, and technical terms.
74
74
  #
75
- # WARNING: This is an aggressive optimization that may affect readability.
76
- # Use with caution and test results carefully.
75
+ # @deprecated This is an aggressive optimization that may affect readability.
76
+ # Use with caution and test results carefully.
77
77
  #
78
78
  # @param content [String] text to process
79
79
  # @return [String] text with stopwords removed
@@ -1,6 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module LlmDocsBuilder
4
+ # Provides content transformation functionality
5
+ #
6
+ # This module contains specialized transformers for modifying markdown content,
7
+ # including cleanup operations, link processing, heading normalization, and
8
+ # content enhancement for AI consumption.
9
+ #
10
+ # @api private
4
11
  module Transformers
5
12
  # Base module for all transformers
6
13
  #
@@ -11,9 +18,12 @@ module LlmDocsBuilder
11
18
  module BaseTransformer
12
19
  # Transform content
13
20
  #
14
- # @param content [String] content to transform
21
+ # @abstract Subclasses must implement this method and document specific options
22
+ # @param content [String] markdown content
15
23
  # @param options [Hash] transformation options
24
+ # @option options [Object] :* options vary by implementation - see specific transformer classes
16
25
  # @return [String] transformed content
26
+ # @note Options vary by implementation - see specific transformer classes for supported keys
17
27
  def transform(content, options = {})
18
28
  raise NotImplementedError, "#{self.class} must implement #transform"
19
29
  end
@@ -21,7 +31,9 @@ module LlmDocsBuilder
21
31
  # Check if transformation should be applied
22
32
  #
23
33
  # @param options [Hash] transformation options
34
+ # @option options [Object] :* options vary by implementation - see specific transformer classes
24
35
  # @return [Boolean] true if transformation should be applied
36
+ # @note Options vary by implementation - see specific transformer classes for supported keys
25
37
  def should_transform?(options)
26
38
  true
27
39
  end
@@ -51,24 +51,36 @@ module LlmDocsBuilder
51
51
  next line if in_code_block
52
52
 
53
53
  # Match markdown headings (1-6 hash symbols followed by space and text)
54
- heading_match = line.match(/^(#+)\s+(.+)$/)
54
+ # Supports optional ATX closing hashes (e.g., "## Title ##")
55
+ heading_match = line.match(/^(#+)\s+(.+?)(?:\s+#+)?\s*$/)
55
56
 
56
- if heading_match && heading_match[1].count('#').between?(1, 6)
57
- level = heading_match[1].count('#')
57
+ if heading_match && heading_match[1].length.between?(1, 6)
58
+ level = heading_match[1].length
58
59
  title = heading_match[2].strip
59
60
 
60
61
  # Update heading stack to current level
61
62
  heading_stack = heading_stack[0...level - 1]
62
- heading_stack << title
63
+
64
+ # Compute the effective heading level. When same-level headings
65
+ # are nested under a parent (e.g., two consecutive ## headings),
66
+ # the child must receive a deeper markdown level so the output
67
+ # hierarchy is correct.
68
+ effective_level = if heading_stack.empty?
69
+ level
70
+ else
71
+ [heading_stack.last[:effective_level] + 1, level].max
72
+ end
73
+ effective_level = [effective_level, 6].min
74
+
75
+ heading_stack << { title: title, effective_level: effective_level }
63
76
 
64
77
  # Build hierarchical heading
65
78
  if level == 1
66
79
  # H1 stays as-is (top level)
67
80
  line
68
81
  else
69
- # H2+ gets parent context
70
- hierarchical_title = heading_stack.join(separator)
71
- "#{'#' * level} #{hierarchical_title}\n"
82
+ hierarchical_title = heading_stack.map { |e| e[:title] }.join(separator)
83
+ "#{'#' * effective_level} #{hierarchical_title}\n"
72
84
  end
73
85
  else
74
86
  line
@@ -9,7 +9,10 @@ module LlmDocsBuilder
9
9
  # Provides common functionality needed by multiple commands (transform, compare)
10
10
  # including strict scheme validation, redirect handling and sensible timeouts.
11
11
  class UrlFetcher
12
+ # Default user agent string for HTTP requests
12
13
  DEFAULT_USER_AGENT = 'llm-docs-builder/1.0 (+https://github.com/mensfeld/llm-docs-builder)'
14
+
15
+ # Maximum number of redirects to follow
13
16
  MAX_REDIRECTS = 10
14
17
 
15
18
  # @param user_agent [String] HTTP user agent header value
@@ -71,6 +74,11 @@ module LlmDocsBuilder
71
74
 
72
75
  private
73
76
 
77
+ # Validate and parse URL string
78
+ #
79
+ # @param url_string [String] URL to validate
80
+ # @return [URI::HTTP, URI::HTTPS] parsed URI
81
+ # @raise [Errors::GenerationError] if URL is invalid or unsupported
74
82
  def validate_and_parse_url(url_string)
75
83
  uri = URI.parse(url_string)
76
84
 
@@ -96,6 +104,12 @@ module LlmDocsBuilder
96
104
  )
97
105
  end
98
106
 
107
+ # Convert redirect location to absolute URL
108
+ #
109
+ # @param base_uri [URI] base URI
110
+ # @param location [String] redirect location
111
+ # @return [String] absolute redirect URL
112
+ # @raise [Errors::GenerationError] if location is invalid
99
113
  def absolute_redirect_url(base_uri, location)
100
114
  raise(
101
115
  Errors::GenerationError,
@@ -110,6 +124,10 @@ module LlmDocsBuilder
110
124
  )
111
125
  end
112
126
 
127
+ # Log redirect if verbose mode enabled
128
+ #
129
+ # @param url [String] redirect URL
130
+ # @return [void]
113
131
  def log_redirect(url)
114
132
  return unless @verbose
115
133
 
@@ -2,5 +2,5 @@
2
2
 
3
3
  module LlmDocsBuilder
4
4
  # Current version of the LlmDocsBuilder gem
5
- VERSION = '0.11.0'
5
+ VERSION = '0.13.0'
6
6
  end
@@ -4,10 +4,20 @@ require 'zeitwerk'
4
4
  require 'pathname'
5
5
  require 'find'
6
6
 
7
+ autoload(:Nokogiri, 'nokogiri')
8
+ autoload(:CGI, 'cgi')
9
+
7
10
  loader = Zeitwerk::Loader.for_gem
8
11
  loader.inflector.inflect('cli' => 'CLI')
9
12
  loader.setup
10
13
 
14
+ # Build and optimize documentation for LLMs
15
+ #
16
+ # This gem provides tools for generating llms.txt files and transforming markdown
17
+ # documentation to be AI-friendly. It can reduce token consumption by 67-95% while
18
+ # preserving essential documentation content.
19
+ #
20
+ # @api public
11
21
  module LlmDocsBuilder
12
22
  class << self
13
23
  # Generates llms.txt from existing markdown documentation
@@ -20,7 +20,7 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.homepage = 'https://github.com/mensfeld/llm-docs-builder'
22
22
  spec.license = 'MIT'
23
- spec.required_ruby_version = '>= 3.2'
23
+ spec.required_ruby_version = '>= 3.3'
24
24
 
25
25
  spec.metadata['allowed_push_host'] = 'https://rubygems.org'
26
26
  spec.metadata['homepage_uri'] = spec.homepage
@@ -35,9 +35,10 @@ Gem::Specification.new do |spec|
35
35
  spec.executables = spec.files.grep(%r{\Abin/}) { |f| File.basename(f) }
36
36
  spec.require_paths = ['lib']
37
37
 
38
+ spec.add_dependency 'nokogiri', '~> 1.17'
38
39
  spec.add_dependency 'zeitwerk', '~> 2.6'
39
40
 
40
- spec.add_development_dependency 'bundler', '~> 2.0'
41
+ spec.add_development_dependency 'bundler'
41
42
  spec.add_development_dependency 'rake', '~> 13.0'
42
43
  spec.add_development_dependency 'rspec', '~> 3.0'
43
44
  spec.add_development_dependency 'rubocop', '~> 1.0'
data/package-lock.json ADDED
@@ -0,0 +1,331 @@
1
+ {
2
+ "name": "llm-docs-builder",
3
+ "version": "1.0.0",
4
+ "lockfileVersion": 3,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "llm-docs-builder",
9
+ "version": "1.0.0",
10
+ "devDependencies": {
11
+ "lostconf": "0.4.0"
12
+ }
13
+ },
14
+ "node_modules/@nodelib/fs.scandir": {
15
+ "version": "2.1.5",
16
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
17
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
18
+ "dev": true,
19
+ "license": "MIT",
20
+ "dependencies": {
21
+ "@nodelib/fs.stat": "2.0.5",
22
+ "run-parallel": "^1.1.9"
23
+ },
24
+ "engines": {
25
+ "node": ">= 8"
26
+ }
27
+ },
28
+ "node_modules/@nodelib/fs.stat": {
29
+ "version": "2.0.5",
30
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
31
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
32
+ "dev": true,
33
+ "license": "MIT",
34
+ "engines": {
35
+ "node": ">= 8"
36
+ }
37
+ },
38
+ "node_modules/@nodelib/fs.walk": {
39
+ "version": "1.2.8",
40
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
41
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
42
+ "dev": true,
43
+ "license": "MIT",
44
+ "dependencies": {
45
+ "@nodelib/fs.scandir": "2.1.5",
46
+ "fastq": "^1.6.0"
47
+ },
48
+ "engines": {
49
+ "node": ">= 8"
50
+ }
51
+ },
52
+ "node_modules/braces": {
53
+ "version": "3.0.3",
54
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
55
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
56
+ "dev": true,
57
+ "license": "MIT",
58
+ "dependencies": {
59
+ "fill-range": "^7.1.1"
60
+ },
61
+ "engines": {
62
+ "node": ">=8"
63
+ }
64
+ },
65
+ "node_modules/chalk": {
66
+ "version": "5.6.2",
67
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz",
68
+ "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==",
69
+ "dev": true,
70
+ "license": "MIT",
71
+ "engines": {
72
+ "node": "^12.17.0 || ^14.13 || >=16.0.0"
73
+ },
74
+ "funding": {
75
+ "url": "https://github.com/chalk/chalk?sponsor=1"
76
+ }
77
+ },
78
+ "node_modules/commander": {
79
+ "version": "12.1.0",
80
+ "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz",
81
+ "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==",
82
+ "dev": true,
83
+ "license": "MIT",
84
+ "engines": {
85
+ "node": ">=18"
86
+ }
87
+ },
88
+ "node_modules/fast-glob": {
89
+ "version": "3.3.3",
90
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
91
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
92
+ "dev": true,
93
+ "license": "MIT",
94
+ "dependencies": {
95
+ "@nodelib/fs.stat": "^2.0.2",
96
+ "@nodelib/fs.walk": "^1.2.3",
97
+ "glob-parent": "^5.1.2",
98
+ "merge2": "^1.3.0",
99
+ "micromatch": "^4.0.8"
100
+ },
101
+ "engines": {
102
+ "node": ">=8.6.0"
103
+ }
104
+ },
105
+ "node_modules/fastq": {
106
+ "version": "1.20.1",
107
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz",
108
+ "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==",
109
+ "dev": true,
110
+ "license": "ISC",
111
+ "dependencies": {
112
+ "reusify": "^1.0.4"
113
+ }
114
+ },
115
+ "node_modules/fill-range": {
116
+ "version": "7.1.1",
117
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
118
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
119
+ "dev": true,
120
+ "license": "MIT",
121
+ "dependencies": {
122
+ "to-regex-range": "^5.0.1"
123
+ },
124
+ "engines": {
125
+ "node": ">=8"
126
+ }
127
+ },
128
+ "node_modules/glob-parent": {
129
+ "version": "5.1.2",
130
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
131
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
132
+ "dev": true,
133
+ "license": "ISC",
134
+ "dependencies": {
135
+ "is-glob": "^4.0.1"
136
+ },
137
+ "engines": {
138
+ "node": ">= 6"
139
+ }
140
+ },
141
+ "node_modules/is-extglob": {
142
+ "version": "2.1.1",
143
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
144
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
145
+ "dev": true,
146
+ "license": "MIT",
147
+ "engines": {
148
+ "node": ">=0.10.0"
149
+ }
150
+ },
151
+ "node_modules/is-glob": {
152
+ "version": "4.0.3",
153
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
154
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
155
+ "dev": true,
156
+ "license": "MIT",
157
+ "dependencies": {
158
+ "is-extglob": "^2.1.1"
159
+ },
160
+ "engines": {
161
+ "node": ">=0.10.0"
162
+ }
163
+ },
164
+ "node_modules/is-number": {
165
+ "version": "7.0.0",
166
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
167
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
168
+ "dev": true,
169
+ "license": "MIT",
170
+ "engines": {
171
+ "node": ">=0.12.0"
172
+ }
173
+ },
174
+ "node_modules/lostconf": {
175
+ "version": "0.4.0",
176
+ "resolved": "https://registry.npmjs.org/lostconf/-/lostconf-0.4.0.tgz",
177
+ "integrity": "sha512-VNbUnirRU7uESqMHslIRHTcuyx/rr4OZK+L7EQXtYUe5PorBgqBYvPu+6xOr0CoUy4n34NNUKO6BBH6TgwwGTA==",
178
+ "dev": true,
179
+ "license": "MIT",
180
+ "dependencies": {
181
+ "chalk": "^5.3.0",
182
+ "commander": "^12.1.0",
183
+ "fast-glob": "^3.3.2",
184
+ "micromatch": "^4.0.8",
185
+ "smol-toml": "^1.3.0",
186
+ "yaml": "^2.5.0"
187
+ },
188
+ "bin": {
189
+ "lostconf": "dist/cli.js"
190
+ },
191
+ "engines": {
192
+ "node": ">=18.0.0"
193
+ }
194
+ },
195
+ "node_modules/merge2": {
196
+ "version": "1.4.1",
197
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
198
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
199
+ "dev": true,
200
+ "license": "MIT",
201
+ "engines": {
202
+ "node": ">= 8"
203
+ }
204
+ },
205
+ "node_modules/micromatch": {
206
+ "version": "4.0.8",
207
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
208
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
209
+ "dev": true,
210
+ "license": "MIT",
211
+ "dependencies": {
212
+ "braces": "^3.0.3",
213
+ "picomatch": "^2.3.1"
214
+ },
215
+ "engines": {
216
+ "node": ">=8.6"
217
+ }
218
+ },
219
+ "node_modules/picomatch": {
220
+ "version": "2.3.2",
221
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
222
+ "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
223
+ "dev": true,
224
+ "license": "MIT",
225
+ "engines": {
226
+ "node": ">=8.6"
227
+ },
228
+ "funding": {
229
+ "url": "https://github.com/sponsors/jonschlinkert"
230
+ }
231
+ },
232
+ "node_modules/queue-microtask": {
233
+ "version": "1.2.3",
234
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
235
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
236
+ "dev": true,
237
+ "funding": [
238
+ {
239
+ "type": "github",
240
+ "url": "https://github.com/sponsors/feross"
241
+ },
242
+ {
243
+ "type": "patreon",
244
+ "url": "https://www.patreon.com/feross"
245
+ },
246
+ {
247
+ "type": "consulting",
248
+ "url": "https://feross.org/support"
249
+ }
250
+ ],
251
+ "license": "MIT"
252
+ },
253
+ "node_modules/reusify": {
254
+ "version": "1.1.0",
255
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
256
+ "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
257
+ "dev": true,
258
+ "license": "MIT",
259
+ "engines": {
260
+ "iojs": ">=1.0.0",
261
+ "node": ">=0.10.0"
262
+ }
263
+ },
264
+ "node_modules/run-parallel": {
265
+ "version": "1.2.0",
266
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
267
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
268
+ "dev": true,
269
+ "funding": [
270
+ {
271
+ "type": "github",
272
+ "url": "https://github.com/sponsors/feross"
273
+ },
274
+ {
275
+ "type": "patreon",
276
+ "url": "https://www.patreon.com/feross"
277
+ },
278
+ {
279
+ "type": "consulting",
280
+ "url": "https://feross.org/support"
281
+ }
282
+ ],
283
+ "license": "MIT",
284
+ "dependencies": {
285
+ "queue-microtask": "^1.2.2"
286
+ }
287
+ },
288
+ "node_modules/smol-toml": {
289
+ "version": "1.6.1",
290
+ "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.6.1.tgz",
291
+ "integrity": "sha512-dWUG8F5sIIARXih1DTaQAX4SsiTXhInKf1buxdY9DIg4ZYPZK5nGM1VRIYmEbDbsHt7USo99xSLFu5Q1IqTmsg==",
292
+ "dev": true,
293
+ "license": "BSD-3-Clause",
294
+ "engines": {
295
+ "node": ">= 18"
296
+ },
297
+ "funding": {
298
+ "url": "https://github.com/sponsors/cyyynthia"
299
+ }
300
+ },
301
+ "node_modules/to-regex-range": {
302
+ "version": "5.0.1",
303
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
304
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
305
+ "dev": true,
306
+ "license": "MIT",
307
+ "dependencies": {
308
+ "is-number": "^7.0.0"
309
+ },
310
+ "engines": {
311
+ "node": ">=8.0"
312
+ }
313
+ },
314
+ "node_modules/yaml": {
315
+ "version": "2.8.4",
316
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.4.tgz",
317
+ "integrity": "sha512-ml/JPOj9fOQK8RNnWojA67GbZ0ApXAUlN2UQclwv2eVgTgn7O9gg9o7paZWKMp4g0H3nTLtS9LVzhkpOFIKzog==",
318
+ "dev": true,
319
+ "license": "ISC",
320
+ "bin": {
321
+ "yaml": "bin.mjs"
322
+ },
323
+ "engines": {
324
+ "node": ">= 14.6"
325
+ },
326
+ "funding": {
327
+ "url": "https://github.com/sponsors/eemeli"
328
+ }
329
+ }
330
+ }
331
+ }
data/package.json ADDED
@@ -0,0 +1,9 @@
1
+ {
2
+ "name": "llm-docs-builder",
3
+ "version": "1.0.0",
4
+ "description": "CI dependencies for llm-docs-builder",
5
+ "private": true,
6
+ "devDependencies": {
7
+ "lostconf": "0.4.0"
8
+ }
9
+ }
data/renovate.json CHANGED
@@ -3,13 +3,18 @@
3
3
  "extends": [
4
4
  "config:recommended"
5
5
  ],
6
+ "minimumReleaseAge": "7 days",
7
+ "includePaths": [
8
+ ".ruby-version",
9
+ "Gemfile",
10
+ "llm-docs-builder.gemspec",
11
+ ".github/workflows/**",
12
+ "Dockerfile*",
13
+ "package.json"
14
+ ],
6
15
  "ignorePaths": [
7
16
  "spec/integrations"
8
17
  ],
9
- "github-actions": {
10
- "enabled": true,
11
- "pinDigests": true
12
- },
13
18
  "packageRules": [
14
19
  {
15
20
  "matchCategories": [
@@ -21,13 +26,21 @@
21
26
  "matchManagers": [
22
27
  "github-actions"
23
28
  ],
24
- "minimumReleaseAge": "7 days"
29
+ "pinDigests": true
25
30
  },
26
31
  {
27
- "matchManagers": [
28
- "bundler"
32
+ "description": "Group ruby/setup-ruby action with ruby version updates",
33
+ "matchPackageNames": [
34
+ "ruby/setup-ruby",
35
+ "ruby"
29
36
  ],
30
- "minimumReleaseAge": "7 days"
37
+ "groupName": "ruby setup"
31
38
  }
32
- ]
39
+ ],
40
+ "labels": [
41
+ "dependencies"
42
+ ],
43
+ "lockFileMaintenance": {
44
+ "enabled": true
45
+ }
33
46
  }