llm-docs-builder 0.12.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ac257dad79f49ed6993f784f8a28ee1e996e735fef4581449ad521ea9414a5d4
4
- data.tar.gz: 29e1d2d578d57ea6f17aafca070c61b6161b6313d6614f0e4f798933ceae082d
3
+ metadata.gz: 2a55f2ba08f239388d3f4834df0c1caeef9c138278726b442f6533e000a3554c
4
+ data.tar.gz: 173e4950404e3a4b83bd5213520a29b5b6f70b374dd18c58a8374c9b5bf55b21
5
5
  SHA512:
6
- metadata.gz: f82216cca621e942c0e6ad3d92aba5d099159cc9c0d10c1d010a85e2a740511103cebd0198c0056195775064853e749472dcb7f0939b8d3fda7753d291a5b0da
7
- data.tar.gz: 31aa5737e215439b11a2e79d793dabb9ff342206b660a2ecd846920bc2f6501c3d5910da4cdc52ecfcfa9f7b9acef14213b17936edd23d86808c0bcb2f391952
6
+ metadata.gz: d8769c0a92e29025165900ff3a1c65b1acbd42b51b8f6402353c157dfd4755ddd84dce8fdb26c334d4cba456c04f83af322ceb9fb554aea4ff4ac3a5330f81c5
7
+ data.tar.gz: 305ea0aa8cc44144079988e4faf80125fbf765331d3801ec8273f183c9b77cbc1430bf5b10eba5b09f0068ca526c4bc2b5d8a90a48179583270de1f62df12f77
@@ -23,19 +23,19 @@ jobs:
23
23
  fail-fast: false
24
24
  matrix:
25
25
  ruby:
26
+ - '4.0'
26
27
  - '3.4'
27
28
  - '3.3'
28
- - '3.2'
29
29
  include:
30
- - ruby: '3.4'
30
+ - ruby: '4.0'
31
31
  coverage: 'true'
32
32
  steps:
33
- - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5
33
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
34
34
  with:
35
35
  fetch-depth: 0
36
36
 
37
37
  - name: Set up Ruby
38
- uses: ruby/setup-ruby@v1
38
+ uses: ruby/setup-ruby@c4e5b1316158f92e3d49443a9d58b31d25ac0f8f # v1.306.0
39
39
  with:
40
40
  ruby-version: ${{ matrix.ruby }}
41
41
  bundler-cache: true
@@ -58,15 +58,32 @@ jobs:
58
58
  timeout-minutes: 5
59
59
  runs-on: ubuntu-latest
60
60
  steps:
61
- - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5
61
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
62
62
  - name: Set up Ruby
63
- uses: ruby/setup-ruby@v1
63
+ uses: ruby/setup-ruby@c4e5b1316158f92e3d49443a9d58b31d25ac0f8f # v1.306.0
64
64
  with:
65
- ruby-version: '3.4.7'
65
+ ruby-version: '4.0.3'
66
66
  bundler-cache: true
67
67
  - name: Run yard-lint
68
68
  run: bundle exec yard-lint lib/
69
69
 
70
+ lostconf:
71
+ timeout-minutes: 5
72
+ runs-on: ubuntu-latest
73
+ steps:
74
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
75
+ with:
76
+ fetch-depth: 0
77
+ - name: Set up Node.js
78
+ uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
79
+ with:
80
+ node-version: '20'
81
+ cache: 'npm'
82
+ - name: Install dependencies
83
+ run: npm ci
84
+ - name: Run lostconf
85
+ run: npx lostconf --fail-on-stale
86
+
70
87
  ci-success:
71
88
  name: CI Success
72
89
  runs-on: ubuntu-latest
@@ -74,6 +91,7 @@ jobs:
74
91
  needs:
75
92
  - specs
76
93
  - yard-lint
94
+ - lostconf
77
95
  steps:
78
96
  - name: Check all jobs passed
79
97
  if: |
@@ -25,13 +25,13 @@ jobs:
25
25
  id-token: write
26
26
  steps:
27
27
  - name: Checkout
28
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5
28
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
29
29
  with:
30
30
  fetch-depth: 0
31
31
 
32
32
  - name: Docker meta
33
33
  id: meta
34
- uses: docker/metadata-action@318604b99e75e41977312d83839a89be02ca4893 # v5
34
+ uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6
35
35
  with:
36
36
  images: |
37
37
  mensfeld/llm-docs-builder
@@ -45,28 +45,28 @@ jobs:
45
45
  type=raw,value=latest,enable={{is_default_branch}}
46
46
 
47
47
  - name: Set up QEMU
48
- uses: docker/setup-qemu-action@c7c53464625b32c7a7e944ae62b3e17d2b600130 # v3
48
+ uses: docker/setup-qemu-action@ce360397dd3f832beb865e1373c09c0e9f86d70a # v4
49
49
 
50
50
  - name: Set up Docker Buildx
51
- uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3
51
+ uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4
52
52
 
53
53
  - name: Login to Docker Hub
54
54
  if: github.event_name != 'pull_request'
55
- uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3
55
+ uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4
56
56
  with:
57
57
  username: ${{ secrets.DOCKERHUB_USERNAME }}
58
58
  password: ${{ secrets.DOCKERHUB_TOKEN }}
59
59
 
60
60
  - name: Login to GitHub Container Registry
61
61
  if: github.event_name != 'pull_request'
62
- uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3
62
+ uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4
63
63
  with:
64
64
  registry: ghcr.io
65
65
  username: ${{ github.actor }}
66
66
  password: ${{ secrets.GITHUB_TOKEN }}
67
67
 
68
68
  - name: Build and push
69
- uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6
69
+ uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7
70
70
  with:
71
71
  context: .
72
72
  platforms: linux/amd64,linux/arm64
@@ -19,12 +19,12 @@ jobs:
19
19
  id-token: write
20
20
 
21
21
  steps:
22
- - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
22
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
23
23
  with:
24
24
  fetch-depth: 0
25
25
 
26
26
  - name: Set up Ruby
27
- uses: ruby/setup-ruby@d5126b9b3579e429dd52e51e68624dda2e05be25 # v1.267.0
27
+ uses: ruby/setup-ruby@c4e5b1316158f92e3d49443a9d58b31d25ac0f8f # v1.306.0
28
28
  with:
29
29
  bundler-cache: false
30
30
 
@@ -32,4 +32,4 @@ jobs:
32
32
  run: |
33
33
  bundle install --jobs 4 --retry 3
34
34
 
35
- - uses: rubygems/release-gem@1c162a739e8b4cb21a676e97b087e8268d8fc40b # v1.1.2
35
+ - uses: rubygems/release-gem@6317d8d1f7e28c24d28f6eff169ea854948bd9f7 # v1.2.0
data/.rubocop.yml CHANGED
@@ -1,5 +1,5 @@
1
1
  AllCops:
2
- TargetRubyVersion: 3.2
2
+ TargetRubyVersion: 3.3
3
3
  NewCops: enable
4
4
  SuggestExtensions: false
5
5
 
@@ -11,38 +11,25 @@ Style/StringLiterals:
11
11
 
12
12
  Layout/LineLength:
13
13
  Max: 120
14
- Exclude:
15
- - 'lib/llms_txt/cli.rb'
16
14
 
17
15
  Metrics/ClassLength:
18
16
  Max: 200
19
- Exclude:
20
- - 'lib/llms_txt/cli.rb'
21
17
 
22
18
  Metrics/MethodLength:
23
19
  Max: 35
24
- Exclude:
25
- - 'lib/llms_txt/cli.rb'
26
20
 
27
21
  Metrics/AbcSize:
28
22
  Max: 40
29
- Exclude:
30
- - 'lib/llms_txt/cli.rb'
31
23
 
32
24
  Metrics/CyclomaticComplexity:
33
25
  Max: 15
34
- Exclude:
35
- - 'lib/llms_txt/config.rb'
36
26
 
37
27
  Metrics/PerceivedComplexity:
38
28
  Max: 15
39
- Exclude:
40
- - 'lib/llms_txt/config.rb'
41
29
 
42
30
  Metrics/BlockLength:
43
31
  Exclude:
44
32
  - 'spec/**/*'
45
- - 'lib/llms_txt/cli.rb'
46
33
  - '*.gemspec'
47
34
 
48
35
  Style/FrozenStringLiteralComment:
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 3.4.7
1
+ 4.0.3
data/.yard-lint.yml ADDED
@@ -0,0 +1,275 @@
1
+ # YARD-Lint Configuration
2
+ # See https://github.com/mensfeld/yard-lint for documentation
3
+
4
+ # Global settings for all validators
5
+ AllValidators:
6
+ YardOptions:
7
+ - "--private"
8
+ - "--protected"
9
+ Exclude:
10
+ - .git/**/*
11
+ - vendor/**/*
12
+ - node_modules/**/*
13
+ - spec/**/*
14
+ FailOnSeverity: convention
15
+ MinCoverage: 99.0
16
+ DiffMode:
17
+ DefaultBaseRef:
18
+
19
+ # Documentation validators
20
+ Documentation/UndocumentedObjects:
21
+ Description: Checks for classes, modules, and methods without documentation.
22
+ Enabled: true
23
+ Severity: error
24
+ ExcludedMethods:
25
+ - initialize/0
26
+ - "/^_/"
27
+
28
+ Documentation/UndocumentedMethodArguments:
29
+ Description: Checks for method parameters without @param tags.
30
+ Enabled: true
31
+ Severity: error
32
+
33
+ Documentation/UndocumentedBooleanMethods:
34
+ Description: Checks that question mark methods document their boolean return.
35
+ Enabled: true
36
+ Severity: error
37
+
38
+ Documentation/UndocumentedOptions:
39
+ Description: Detects methods with options hash parameters but no @option tags.
40
+ Enabled: true
41
+ Severity: error
42
+
43
+ Documentation/MarkdownSyntax:
44
+ Description: Detects common markdown syntax errors in documentation.
45
+ Enabled: true
46
+ Severity: error
47
+
48
+ Documentation/EmptyCommentLine:
49
+ Description: Detects empty comment lines at the start or end of documentation blocks.
50
+ Enabled: true
51
+ Severity: convention
52
+ EnabledPatterns:
53
+ Leading: true
54
+ Trailing: true
55
+
56
+ Documentation/BlankLineBeforeDefinition:
57
+ Description: Detects blank lines between YARD documentation and method definition.
58
+ Enabled: true
59
+ Severity: convention
60
+ OrphanedSeverity: convention
61
+ EnabledPatterns:
62
+ SingleBlankLine: true
63
+ OrphanedDocs: true
64
+
65
+ # Tags validators
66
+ Tags/Order:
67
+ Description: Enforces consistent ordering of YARD tags.
68
+ Enabled: true
69
+ Severity: error
70
+ EnforcedOrder:
71
+ - param
72
+ - option
73
+ - return
74
+ - raise
75
+ - example
76
+
77
+ Tags/InvalidTypes:
78
+ Description: Validates type definitions in @param, @return, @option tags.
79
+ Enabled: true
80
+ Severity: error
81
+ ValidatedTags:
82
+ - param
83
+ - option
84
+ - return
85
+
86
+ Tags/TypeSyntax:
87
+ Description: Validates YARD type syntax using YARD parser.
88
+ Enabled: true
89
+ Severity: error
90
+ ValidatedTags:
91
+ - param
92
+ - option
93
+ - return
94
+ - yieldreturn
95
+
96
+ Tags/MeaninglessTag:
97
+ Description: Detects @param/@option tags on classes, modules, or constants.
98
+ Enabled: true
99
+ Severity: error
100
+ CheckedTags:
101
+ - param
102
+ - option
103
+ InvalidObjectTypes:
104
+ - class
105
+ - module
106
+ - constant
107
+
108
+ Tags/CollectionType:
109
+ Description: Validates Hash collection syntax consistency.
110
+ Enabled: true
111
+ Severity: error
112
+ EnforcedStyle: long
113
+ ValidatedTags:
114
+ - param
115
+ - option
116
+ - return
117
+ - yieldreturn
118
+
119
+ Tags/TagTypePosition:
120
+ Description: Validates type annotation position in tags.
121
+ Enabled: true
122
+ Severity: error
123
+ CheckedTags:
124
+ - param
125
+ - option
126
+ EnforcedStyle: type_after_name
127
+
128
+ Tags/ApiTags:
129
+ Description: Enforces @api tags on public objects.
130
+ Enabled: false
131
+ Severity: error
132
+ AllowedApis:
133
+ - public
134
+ - private
135
+ - internal
136
+
137
+ Tags/OptionTags:
138
+ Description: Requires @option tags for methods with options parameters.
139
+ Enabled: true
140
+ Severity: error
141
+
142
+ Tags/ExampleSyntax:
143
+ Description: Validates Ruby syntax in @example tags.
144
+ Enabled: true
145
+ Severity: warning
146
+
147
+ Tags/RedundantParamDescription:
148
+ Description: Detects meaningless parameter descriptions that add no value.
149
+ Enabled: true
150
+ Severity: convention
151
+ CheckedTags:
152
+ - param
153
+ - option
154
+ Articles:
155
+ - The
156
+ - the
157
+ - A
158
+ - a
159
+ - An
160
+ - an
161
+ MaxRedundantWords: 6
162
+ GenericTerms:
163
+ - object
164
+ - instance
165
+ - value
166
+ - data
167
+ - item
168
+ - element
169
+ EnabledPatterns:
170
+ ArticleParam: true
171
+ PossessiveParam: true
172
+ TypeRestatement: true
173
+ ParamToVerb: true
174
+ IdPattern: true
175
+ DirectionalDate: true
176
+ TypeGeneric: true
177
+
178
+ Tags/InformalNotation:
179
+ Description: Detects informal tag notation patterns like "Note:" instead of @note.
180
+ Enabled: true
181
+ Severity: warning
182
+ CaseSensitive: false
183
+ RequireStartOfLine: true
184
+ Patterns:
185
+ Note: "@note"
186
+ Todo: "@todo"
187
+ TODO: "@todo"
188
+ FIXME: "@todo"
189
+ See: "@see"
190
+ See also: "@see"
191
+ Warning: "@deprecated"
192
+ Deprecated: "@deprecated"
193
+ Author: "@author"
194
+ Version: "@version"
195
+ Since: "@since"
196
+ Returns: "@return"
197
+ Raises: "@raise"
198
+ Example: "@example"
199
+
200
+ Tags/NonAsciiType:
201
+ Description: Detects non-ASCII characters in type annotations.
202
+ Enabled: true
203
+ Severity: warning
204
+ ValidatedTags:
205
+ - param
206
+ - option
207
+ - return
208
+ - yieldreturn
209
+ - yieldparam
210
+
211
+ Tags/TagGroupSeparator:
212
+ Description: Enforces blank line separators between different YARD tag groups.
213
+ Enabled: false
214
+ Severity: convention
215
+ TagGroups:
216
+ param:
217
+ - param
218
+ - option
219
+ return:
220
+ - return
221
+ error:
222
+ - raise
223
+ - throws
224
+ example:
225
+ - example
226
+ meta:
227
+ - see
228
+ - note
229
+ - todo
230
+ - deprecated
231
+ - since
232
+ - version
233
+ - api
234
+ yield:
235
+ - yield
236
+ - yieldparam
237
+ - yieldreturn
238
+ RequireAfterDescription: false
239
+
240
+ # Warnings validators - catches YARD parser errors
241
+ Warnings/UnknownTag:
242
+ Description: Detects unknown YARD tags.
243
+ Enabled: true
244
+ Severity: error
245
+
246
+ Warnings/UnknownDirective:
247
+ Description: Detects unknown YARD directives.
248
+ Enabled: true
249
+ Severity: error
250
+
251
+ Warnings/InvalidTagFormat:
252
+ Description: Detects malformed tag syntax.
253
+ Enabled: true
254
+ Severity: error
255
+
256
+ Warnings/InvalidDirectiveFormat:
257
+ Description: Detects malformed directive syntax.
258
+ Enabled: true
259
+ Severity: error
260
+
261
+ Warnings/DuplicatedParameterName:
262
+ Description: Detects duplicate @param tags.
263
+ Enabled: true
264
+ Severity: error
265
+
266
+ Warnings/UnknownParameterName:
267
+ Description: Detects @param tags for non-existent parameters.
268
+ Enabled: true
269
+ Severity: error
270
+
271
+ # Semantic validators
272
+ Semantic/AbstractMethods:
273
+ Description: Ensures @abstract methods do not have real implementations.
274
+ Enabled: true
275
+ Severity: error
data/CHANGELOG.md CHANGED
@@ -1,5 +1,14 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.13.0 (2026-05-11)
4
+ - [Breaking] Dropped Ruby 3.2 support. Minimum required Ruby version is now 3.3.
5
+ - [Fix] **Heading Nesting in Normalize Mode** — Fixed `normalize_headings` producing incorrect heading levels when same-level headings are nested under a parent.
6
+ - Consecutive same-level headings (e.g., two `##` headings) now correctly adjust the child's markdown level to be deeper than the parent's (e.g., `##` → `###`)
7
+ - Effective level formula: `max(parent_effective_level + 1, original_level)`
8
+ - ATX closing hashes (`## Title ##`) are now stripped from titles before building hierarchical paths
9
+ - [Fix] **HTML-to-Markdown Section Nesting** — Headings inside nested `<section>` elements now receive adjusted markdown levels based on section nesting depth.
10
+ - `<h2>` inside a nested `<section>` under another `<section>` with its own `<h2>` is now correctly rendered as `###` instead of `##`
11
+
3
12
  ## 0.12.0 (2025-11-12)
4
13
  - [Feature] **HTML to Markdown Reverse Converter** — Added support for converting HTML content to markdown format.
5
14
  - Enables processing of HTML documentation sources
data/Dockerfile CHANGED
@@ -4,7 +4,7 @@
4
4
  # Creates a minimal Docker image (~50MB) for running the CLI without Ruby installation
5
5
 
6
6
  # Stage 1: Builder
7
- FROM ruby:3.4-alpine AS builder
7
+ FROM ruby:4.0-alpine AS builder
8
8
 
9
9
  # Install build dependencies
10
10
  RUN apk add --no-cache \
@@ -36,17 +36,24 @@ RUN bundle config set --local without 'development test' && \
36
36
  RUN gem build llm-docs-builder.gemspec
37
37
 
38
38
  # Stage 2: Runtime
39
- FROM ruby:3.4-alpine
39
+ FROM ruby:4.0-alpine
40
40
 
41
- # Install runtime dependencies only
41
+ # Install runtime dependencies and build tools for native extensions
42
42
  RUN apk add --no-cache \
43
43
  ca-certificates \
44
- tzdata
44
+ tzdata \
45
+ libxml2 \
46
+ libxslt
45
47
 
46
- # Copy built gem and install it
48
+ # Copy built gem and install it (needs build tools for nokogiri)
47
49
  COPY --from=builder /gem/llm-docs-builder-*.gem /tmp/
48
- RUN gem install /tmp/llm-docs-builder-*.gem --no-document && \
49
- rm /tmp/llm-docs-builder-*.gem
50
+ RUN apk add --no-cache --virtual .build-deps \
51
+ build-base \
52
+ libxml2-dev \
53
+ libxslt-dev && \
54
+ gem install /tmp/llm-docs-builder-*.gem --no-document && \
55
+ rm /tmp/llm-docs-builder-*.gem && \
56
+ apk del .build-deps
50
57
 
51
58
  # Set working directory for user files
52
59
  WORKDIR /workspace
data/Gemfile CHANGED
@@ -6,9 +6,5 @@ gemspec
6
6
 
7
7
  group :development do
8
8
  gem 'pry'
9
- gem 'pry-byebug'
10
9
  gem 'yard-lint'
11
10
  end
12
-
13
- group :test do
14
- end
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- llm-docs-builder (0.12.0)
4
+ llm-docs-builder (0.13.0)
5
5
  nokogiri (~> 1.17)
6
6
  zeitwerk (~> 2.6)
7
7
 
@@ -9,48 +9,31 @@ GEM
9
9
  remote: https://rubygems.org/
10
10
  specs:
11
11
  ast (2.4.3)
12
- byebug (12.0.0)
13
12
  coderay (1.1.3)
14
- date (3.5.0)
15
13
  diff-lcs (1.6.2)
16
14
  docile (1.4.1)
17
- erb (5.1.3)
18
- io-console (0.8.1)
19
- irb (1.15.3)
20
- pp (>= 0.6.0)
21
- rdoc (>= 4.0.0)
22
- reline (>= 0.4.2)
23
- json (2.16.0)
15
+ io-console (0.8.2)
16
+ json (2.19.5)
24
17
  language_server-protocol (3.17.0.5)
25
18
  lint_roller (1.1.0)
26
19
  method_source (1.1.0)
27
- nokogiri (1.18.10-x86_64-linux-gnu)
20
+ mini_portile2 (2.8.9)
21
+ nokogiri (1.19.3)
22
+ mini_portile2 (~> 2.8.2)
28
23
  racc (~> 1.4)
29
- parallel (1.27.0)
30
- parser (3.3.10.0)
24
+ parallel (2.1.0)
25
+ parser (3.3.11.1)
31
26
  ast (~> 2.4.1)
32
27
  racc
33
- pp (0.6.3)
34
- prettyprint
35
- prettyprint (0.2.0)
36
- prism (1.6.0)
37
- pry (0.15.2)
28
+ prism (1.9.0)
29
+ pry (0.16.0)
38
30
  coderay (~> 1.1)
39
31
  method_source (~> 1.0)
40
- pry-byebug (3.11.0)
41
- byebug (~> 12.0)
42
- pry (>= 0.13, < 0.16)
43
- psych (5.2.6)
44
- date
45
- stringio
32
+ reline (>= 0.6.0)
46
33
  racc (1.8.1)
47
34
  rainbow (3.1.1)
48
- rake (13.3.1)
49
- rdoc (6.15.1)
50
- erb
51
- psych (>= 4.0.0)
52
- tsort
53
- regexp_parser (2.11.3)
35
+ rake (13.4.2)
36
+ regexp_parser (2.12.0)
54
37
  reline (0.6.3)
55
38
  io-console (~> 0.5)
56
39
  rspec (3.13.2)
@@ -62,24 +45,24 @@ GEM
62
45
  rspec-expectations (3.13.5)
63
46
  diff-lcs (>= 1.2.0, < 2.0)
64
47
  rspec-support (~> 3.13.0)
65
- rspec-mocks (3.13.7)
48
+ rspec-mocks (3.13.8)
66
49
  diff-lcs (>= 1.2.0, < 2.0)
67
50
  rspec-support (~> 3.13.0)
68
- rspec-support (3.13.6)
69
- rubocop (1.81.7)
51
+ rspec-support (3.13.7)
52
+ rubocop (1.86.1)
70
53
  json (~> 2.3)
71
54
  language_server-protocol (~> 3.17.0.2)
72
55
  lint_roller (~> 1.1.0)
73
- parallel (~> 1.10)
56
+ parallel (>= 1.10)
74
57
  parser (>= 3.3.0.2)
75
58
  rainbow (>= 2.2.2, < 4.0)
76
59
  regexp_parser (>= 2.9.3, < 3.0)
77
- rubocop-ast (>= 1.47.1, < 2.0)
60
+ rubocop-ast (>= 1.49.0, < 2.0)
78
61
  ruby-progressbar (~> 1.7)
79
62
  unicode-display_width (>= 2.4.0, < 4.0)
80
- rubocop-ast (1.47.1)
63
+ rubocop-ast (1.49.1)
81
64
  parser (>= 3.3.7.2)
82
- prism (~> 1.4)
65
+ prism (~> 1.7)
83
66
  ruby-progressbar (1.13.0)
84
67
  simplecov (0.22.0)
85
68
  docile (~> 1.1)
@@ -87,26 +70,22 @@ GEM
87
70
  simplecov_json_formatter (~> 0.1)
88
71
  simplecov-html (0.13.2)
89
72
  simplecov_json_formatter (0.1.4)
90
- stringio (3.1.8)
91
- tsort (0.2.0)
92
73
  unicode-display_width (3.2.0)
93
74
  unicode-emoji (~> 4.1)
94
- unicode-emoji (4.1.0)
95
- yard (0.9.37)
96
- yard-lint (1.1.0)
97
- irb
75
+ unicode-emoji (4.2.0)
76
+ yard (0.9.43)
77
+ yard-lint (1.5.1)
98
78
  yard (~> 0.9)
99
79
  zeitwerk (~> 2.6)
100
- zeitwerk (2.7.3)
80
+ zeitwerk (2.7.5)
101
81
 
102
82
  PLATFORMS
103
- x86_64-linux
83
+ ruby
104
84
 
105
85
  DEPENDENCIES
106
- bundler (~> 2.0)
86
+ bundler
107
87
  llm-docs-builder!
108
88
  pry
109
- pry-byebug
110
89
  rake (~> 13.0)
111
90
  rspec (~> 3.0)
112
91
  rubocop (~> 1.0)
@@ -114,4 +93,4 @@ DEPENDENCIES
114
93
  yard-lint
115
94
 
116
95
  BUNDLED WITH
117
- 2.7.2
96
+ 2.6.9
@@ -399,7 +399,6 @@ module LlmDocsBuilder
399
399
  end
400
400
 
401
401
  # Display version information
402
- #
403
402
  def show_version
404
403
  puts "llm-docs-builder version #{LlmDocsBuilder::VERSION}"
405
404
  end
@@ -120,7 +120,8 @@ module LlmDocsBuilder
120
120
  text = collapsed_inline_for(element)
121
121
  return '' if text.empty?
122
122
 
123
- "#{'#' * HEADING_LEVEL[tag]} #{text}"
123
+ effective_level = effective_heading_level(element, HEADING_LEVEL[tag])
124
+ "#{'#' * effective_level} #{text}"
124
125
  when 'blockquote'
125
126
  render_blockquote(element)
126
127
  when 'pre'
@@ -641,6 +642,39 @@ module LlmDocsBuilder
641
642
  out.join("\n\n")
642
643
  end
643
644
 
645
+ # Compute effective heading level adjusted for section nesting
646
+ #
647
+ # When HTML uses nested <section> elements with same-level headings,
648
+ # the inner headings should receive deeper markdown levels. The offset
649
+ # is calculated as the difference between the actual section ancestor
650
+ # count and the expected count for that heading tag (h1 expects 0
651
+ # sections, h2 expects 1, etc.), capped at heading level 6.
652
+ #
653
+ # @param element [Nokogiri::XML::Element] heading element
654
+ # @param base_level [Integer] HTML heading level (1-6)
655
+ # @return [Integer] effective markdown heading level (1-6)
656
+ def effective_heading_level(element, base_level)
657
+ depth = section_ancestor_count(element)
658
+ offset = [depth - (base_level - 1), 0].max
659
+ [base_level + offset, 6].min
660
+ end
661
+
662
+ # Count the number of <section> ancestor elements
663
+ #
664
+ # @param element [Nokogiri::XML::Element]
665
+ # @return [Integer] number of section ancestors
666
+ def section_ancestor_count(element)
667
+ count = 0
668
+ node = element.parent
669
+
670
+ while node
671
+ count += 1 if node.element? && node.name.downcase == 'section'
672
+ node = node.parent
673
+ end
674
+
675
+ count
676
+ end
677
+
644
678
  # Helpers
645
679
 
646
680
  # Normalize whitespace in text
@@ -30,7 +30,7 @@ module LlmDocsBuilder
30
30
 
31
31
  # Format number with comma separators for readability
32
32
  #
33
- # @param number [Integer] integer value
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
@@ -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
@@ -2,5 +2,5 @@
2
2
 
3
3
  module LlmDocsBuilder
4
4
  # Current version of the LlmDocsBuilder gem
5
- VERSION = '0.12.0'
5
+ VERSION = '0.13.0'
6
6
  end
@@ -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
@@ -38,7 +38,7 @@ Gem::Specification.new do |spec|
38
38
  spec.add_dependency 'nokogiri', '~> 1.17'
39
39
  spec.add_dependency 'zeitwerk', '~> 2.6'
40
40
 
41
- spec.add_development_dependency 'bundler', '~> 2.0'
41
+ spec.add_development_dependency 'bundler'
42
42
  spec.add_development_dependency 'rake', '~> 13.0'
43
43
  spec.add_development_dependency 'rspec', '~> 3.0'
44
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
  }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: llm-docs-builder
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.12.0
4
+ version: 0.13.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Maciej Mensfeld
@@ -41,16 +41,16 @@ dependencies:
41
41
  name: bundler
42
42
  requirement: !ruby/object:Gem::Requirement
43
43
  requirements:
44
- - - "~>"
44
+ - - ">="
45
45
  - !ruby/object:Gem::Version
46
- version: '2.0'
46
+ version: '0'
47
47
  type: :development
48
48
  prerelease: false
49
49
  version_requirements: !ruby/object:Gem::Requirement
50
50
  requirements:
51
- - - "~>"
51
+ - - ">="
52
52
  - !ruby/object:Gem::Version
53
- version: '2.0'
53
+ version: '0'
54
54
  - !ruby/object:Gem::Dependency
55
55
  name: rake
56
56
  requirement: !ruby/object:Gem::Requirement
@@ -130,6 +130,7 @@ files:
130
130
  - ".rspec"
131
131
  - ".rubocop.yml"
132
132
  - ".ruby-version"
133
+ - ".yard-lint.yml"
133
134
  - CHANGELOG.md
134
135
  - Dockerfile
135
136
  - Gemfile
@@ -172,6 +173,8 @@ files:
172
173
  - misc/diff.png
173
174
  - misc/logo.png
174
175
  - misc/logo_wide.png
176
+ - package-lock.json
177
+ - package.json
175
178
  - renovate.json
176
179
  homepage: https://github.com/mensfeld/llm-docs-builder
177
180
  licenses:
@@ -190,14 +193,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
190
193
  requirements:
191
194
  - - ">="
192
195
  - !ruby/object:Gem::Version
193
- version: '3.2'
196
+ version: '3.3'
194
197
  required_rubygems_version: !ruby/object:Gem::Requirement
195
198
  requirements:
196
199
  - - ">="
197
200
  - !ruby/object:Gem::Version
198
201
  version: '0'
199
202
  requirements: []
200
- rubygems_version: 3.6.9
203
+ rubygems_version: 4.0.6
201
204
  specification_version: 4
202
205
  summary: Build and optimize documentation for LLMs - generate llms.txt, transform
203
206
  markdown, and more