docs-kit 0.1.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 (89) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +46 -0
  3. data/LICENSE.txt +21 -0
  4. data/README.md +939 -0
  5. data/app/components/docs_ui/brand_mark.rb +88 -0
  6. data/app/components/docs_ui/callout.rb +37 -0
  7. data/app/components/docs_ui/code.rb +123 -0
  8. data/app/components/docs_ui/endpoint.rb +44 -0
  9. data/app/components/docs_ui/error_table.rb +72 -0
  10. data/app/components/docs_ui/example.rb +102 -0
  11. data/app/components/docs_ui/field_table.rb +46 -0
  12. data/app/components/docs_ui/header.rb +30 -0
  13. data/app/components/docs_ui/icon.rb +65 -0
  14. data/app/components/docs_ui/json_response.rb +46 -0
  15. data/app/components/docs_ui/markdown.rb +187 -0
  16. data/app/components/docs_ui/markdown_action.rb +45 -0
  17. data/app/components/docs_ui/on_this_page.rb +104 -0
  18. data/app/components/docs_ui/open_api_operation.rb +126 -0
  19. data/app/components/docs_ui/page.rb +83 -0
  20. data/app/components/docs_ui/page_helpers.rb +52 -0
  21. data/app/components/docs_ui/prop_table.rb +43 -0
  22. data/app/components/docs_ui/prose.rb +30 -0
  23. data/app/components/docs_ui/request_example.rb +85 -0
  24. data/app/components/docs_ui/search_box.rb +106 -0
  25. data/app/components/docs_ui/search_results.rb +95 -0
  26. data/app/components/docs_ui/section.rb +94 -0
  27. data/app/components/docs_ui/shell.rb +161 -0
  28. data/app/components/docs_ui/sidebar.rb +106 -0
  29. data/app/components/docs_ui/table.rb +64 -0
  30. data/app/components/docs_ui/theme_switcher.rb +46 -0
  31. data/app/components/docs_ui/topbar_links.rb +42 -0
  32. data/app/controllers/docs_kit/llms_controller.rb +76 -0
  33. data/app/controllers/docs_kit/mcp_controller.rb +60 -0
  34. data/app/controllers/docs_kit/search_controller.rb +72 -0
  35. data/app/javascript/docs_kit/controllers/docs_nav_controller.js +619 -0
  36. data/config/importmap.rb +15 -0
  37. data/config/rubocop/docs_kit.yml +24 -0
  38. data/exe/docs-kit +80 -0
  39. data/lib/docs-kit.rb +5 -0
  40. data/lib/docs_kit/api_client.rb +52 -0
  41. data/lib/docs_kit/api_request.rb +66 -0
  42. data/lib/docs_kit/api_templates.rb +92 -0
  43. data/lib/docs_kit/configuration.rb +485 -0
  44. data/lib/docs_kit/controller.rb +47 -0
  45. data/lib/docs_kit/engine.rb +49 -0
  46. data/lib/docs_kit/llms_text.rb +105 -0
  47. data/lib/docs_kit/markdown_export/blocks.rb +160 -0
  48. data/lib/docs_kit/markdown_export/inline.rb +95 -0
  49. data/lib/docs_kit/markdown_export/table.rb +53 -0
  50. data/lib/docs_kit/markdown_export.rb +92 -0
  51. data/lib/docs_kit/mcp_server.rb +128 -0
  52. data/lib/docs_kit/mcp_tools.rb +118 -0
  53. data/lib/docs_kit/nav_item.rb +22 -0
  54. data/lib/docs_kit/open_api/document.rb +91 -0
  55. data/lib/docs_kit/open_api/operation.rb +213 -0
  56. data/lib/docs_kit/open_api/schema.rb +178 -0
  57. data/lib/docs_kit/open_api.rb +55 -0
  58. data/lib/docs_kit/registry.rb +152 -0
  59. data/lib/docs_kit/rubocop.rb +19 -0
  60. data/lib/docs_kit/search_hit.rb +28 -0
  61. data/lib/docs_kit/search_index/snippet.rb +65 -0
  62. data/lib/docs_kit/search_index.rb +169 -0
  63. data/lib/docs_kit/shortcut.rb +99 -0
  64. data/lib/docs_kit/templates/new_site.rb +175 -0
  65. data/lib/docs_kit/topbar_link.rb +39 -0
  66. data/lib/docs_kit/version.rb +5 -0
  67. data/lib/docs_kit.rb +72 -0
  68. data/lib/generators/docs_kit/install/USAGE +15 -0
  69. data/lib/generators/docs_kit/install/install_generator.rb +447 -0
  70. data/lib/generators/docs_kit/install/sync_report.rb +64 -0
  71. data/lib/generators/docs_kit/install/templates/agents_md.erb +105 -0
  72. data/lib/generators/docs_kit/install/templates/application.tailwind.css.erb +39 -0
  73. data/lib/generators/docs_kit/install/templates/build-css +34 -0
  74. data/lib/generators/docs_kit/install/templates/build_css.rake +13 -0
  75. data/lib/generators/docs_kit/install/templates/doc.rb.erb +17 -0
  76. data/lib/generators/docs_kit/install/templates/docs_controller.rb.erb +14 -0
  77. data/lib/generators/docs_kit/install/templates/docs_kit.rb.erb +91 -0
  78. data/lib/generators/docs_kit/install/templates/installation_page.rb.erb +37 -0
  79. data/lib/generators/docs_kit/install/templates/landing.rb.erb +25 -0
  80. data/lib/generators/docs_kit/install/templates/landings_controller.rb.erb +7 -0
  81. data/lib/generators/docs_kit/install/templates/phlex.rb.erb +14 -0
  82. data/lib/generators/docs_kit/install/templates/rails_icons.rb.erb +12 -0
  83. data/lib/generators/docs_kit/install/templates/skill.md.erb +88 -0
  84. data/lib/generators/docs_kit/page/USAGE +26 -0
  85. data/lib/generators/docs_kit/page/page_generator.rb +127 -0
  86. data/lib/generators/docs_kit/page/templates/page.rb.erb +21 -0
  87. data/lib/rubocop/cop/docs_kit/escaped_interpolation_in_heredoc.rb +119 -0
  88. data/lib/rubocop/cop/docs_kit/render_component_preferred.rb +123 -0
  89. metadata +253 -0
@@ -0,0 +1,123 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module DocsKit
6
+ # Enforces the kit helper form over `render <Kit>::<Class>.new(...)`.
7
+ #
8
+ # The docs-kit `DocsUI` module and the `DaisyUI` gem are both extended with
9
+ # `Phlex::Kit`, which defines a singleton method per component class. That
10
+ # makes `DocsUI::Code(...)` equivalent to `render DocsUI::Code.new(...)` but
11
+ # terser and consistent. Adapted from cosmos' Cosmos/RenderComponentPreferred.
12
+ #
13
+ # @example
14
+ # # bad
15
+ # render DocsUI::Code.new(source, filename: "a.rb")
16
+ # render DocsUI::Section.new("Title") { ... }
17
+ # render DaisyUI::Button.new(:primary) { "Save" }
18
+ #
19
+ # # good
20
+ # DocsUI::Code(source, filename: "a.rb")
21
+ # DocsUI::Section("Title") { ... }
22
+ # DaisyUI::Button(:primary) { "Save" }
23
+ #
24
+ # The cop keeps the namespace prefix (`DocsUI::Code(...)` rather than
25
+ # `Code(...)`) because the unqualified helper may resolve to a different kit
26
+ # depending on inclusion order. Keeping the prefix makes the rewrite
27
+ # mechanically safe in every rendering context.
28
+ #
29
+ # Contexts the cop does NOT fire in:
30
+ # - `render <class-method-call>` like `render UI::Modal.clear` — not a .new.
31
+ # - elements of a `turbo_stream: [...]` array — class-method calls that
32
+ # return Turbo Stream payloads, not `.new` component instances.
33
+ class RenderComponentPreferred < Base
34
+ extend AutoCorrector
35
+
36
+ MSG = "Use `%<suggestion>s` instead of `%<original>s`."
37
+
38
+ # Kit modules recognised by the cop.
39
+ KIT_MODULES = %w[
40
+ DocsUI
41
+ DaisyUI
42
+ ].to_set.freeze
43
+
44
+ # `render Kit::Class.new(args)` — plain send.
45
+ def_node_matcher :render_new_send, <<~PATTERN
46
+ (send nil? :render $(send $const :new ...))
47
+ PATTERN
48
+
49
+ # `render Kit::Class.new(args) { ... }` — brace block glued onto .new.
50
+ def_node_matcher :render_new_block, <<~PATTERN
51
+ (send nil? :render (block $(send $const :new ...) _ _))
52
+ PATTERN
53
+
54
+ def on_send(node)
55
+ return if inside_array_literal?(node)
56
+ return unless node.arguments.length == 1
57
+
58
+ match = render_new_send(node) || render_new_block(node)
59
+ return unless match
60
+
61
+ new_call_node, const_node = match
62
+
63
+ namespace = kit_namespace(const_node)
64
+ return unless namespace
65
+
66
+ helper_headline = helper_headline(new_call_node, const_node)
67
+ original_headline = "render #{new_call_node.source}"
68
+
69
+ add_offense(node, message: format(MSG, suggestion: helper_headline, original: original_headline)) do |corrector|
70
+ # Replace ONLY `render <Kit>::<Class>.new(args)` with the helper call,
71
+ # leaving any trailing block (`do...end` or `{ ... }`) untouched. That
72
+ # keeps the rewrite range off the block body, so a nested kit render
73
+ # inside the block corrects independently instead of clobbering.
74
+ range = node.source_range.begin.join(new_call_node.source_range.end)
75
+ corrector.replace(range, helper_headline)
76
+ end
77
+ end
78
+
79
+ private
80
+
81
+ def inside_array_literal?(node)
82
+ node.parent&.array_type?
83
+ end
84
+
85
+ def kit_namespace(const_node)
86
+ segments = const_segments(const_node)
87
+ return nil if segments.nil? || segments.length < 2
88
+
89
+ KIT_MODULES.include?(segments.first) ? segments.first : nil
90
+ end
91
+
92
+ def const_segments(node)
93
+ parts = []
94
+ cur = node
95
+ while cur&.const_type?
96
+ parts.unshift(cur.short_name.to_s)
97
+ cur = cur.children.first
98
+ end
99
+ parts
100
+ end
101
+
102
+ # `DocsUI::Code(args)` — the helper form the render becomes. This is both
103
+ # the offense-message suggestion and the exact replacement text (the block,
104
+ # if any, is preserved separately by keeping the rewrite range off it).
105
+ def helper_headline(new_call_node, const_node)
106
+ args_source = call_args_source(new_call_node)
107
+ prefix = const_node.source
108
+ args_source.empty? ? "#{prefix}()" : "#{prefix}(#{args_source})"
109
+ end
110
+
111
+ def call_args_source(new_call_node)
112
+ return "" if new_call_node.arguments.empty?
113
+
114
+ first = new_call_node.arguments.first
115
+ last = new_call_node.arguments.last
116
+ first_pos = first.source_range.begin_pos
117
+ last_pos = last.source_range.end_pos
118
+ new_call_node.source_range.source_buffer.source[first_pos...last_pos]
119
+ end
120
+ end
121
+ end
122
+ end
123
+ end
metadata ADDED
@@ -0,0 +1,253 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: docs-kit
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Mikael Henriksson
8
+ bindir: exe
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: daisyui
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '1.2'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: '1.2'
26
+ - !ruby/object:Gem::Dependency
27
+ name: phlex-rails
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '2.0'
33
+ - - "<"
34
+ - !ruby/object:Gem::Version
35
+ version: '3'
36
+ type: :runtime
37
+ prerelease: false
38
+ version_requirements: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: '2.0'
43
+ - - "<"
44
+ - !ruby/object:Gem::Version
45
+ version: '3'
46
+ - !ruby/object:Gem::Dependency
47
+ name: rails_icons
48
+ requirement: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - "~>"
51
+ - !ruby/object:Gem::Version
52
+ version: '1.1'
53
+ type: :runtime
54
+ prerelease: false
55
+ version_requirements: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - "~>"
58
+ - !ruby/object:Gem::Version
59
+ version: '1.1'
60
+ - !ruby/object:Gem::Dependency
61
+ name: rouge
62
+ requirement: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: '4.0'
67
+ type: :runtime
68
+ prerelease: false
69
+ version_requirements: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ version: '4.0'
74
+ - !ruby/object:Gem::Dependency
75
+ name: commonmarker
76
+ requirement: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - "~>"
79
+ - !ruby/object:Gem::Version
80
+ version: '2.0'
81
+ type: :runtime
82
+ prerelease: false
83
+ version_requirements: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - "~>"
86
+ - !ruby/object:Gem::Version
87
+ version: '2.0'
88
+ - !ruby/object:Gem::Dependency
89
+ name: nokogiri
90
+ requirement: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: '1.15'
95
+ type: :runtime
96
+ prerelease: false
97
+ version_requirements: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ version: '1.15'
102
+ - !ruby/object:Gem::Dependency
103
+ name: zeitwerk
104
+ requirement: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - "~>"
107
+ - !ruby/object:Gem::Version
108
+ version: '2.6'
109
+ type: :runtime
110
+ prerelease: false
111
+ version_requirements: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - "~>"
114
+ - !ruby/object:Gem::Version
115
+ version: '2.6'
116
+ - !ruby/object:Gem::Dependency
117
+ name: rubocop
118
+ requirement: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - ">="
121
+ - !ruby/object:Gem::Version
122
+ version: '1.75'
123
+ type: :development
124
+ prerelease: false
125
+ version_requirements: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - ">="
128
+ - !ruby/object:Gem::Version
129
+ version: '1.75'
130
+ description: DocsKit is a reusable documentation-site component library for Phlex
131
+ + daisyUI. It extracts the shared shell, sidebar, code blocks, and page kit so multiple
132
+ docs sites look identical and are maintained in one place. Reactive demos (phlex-reactive)
133
+ and Postgres-SSE transport (pgbus) are optional, runtime-detected add-ons.
134
+ email: mikael@zoolutions.llc
135
+ executables:
136
+ - docs-kit
137
+ extensions: []
138
+ extra_rdoc_files: []
139
+ files:
140
+ - CHANGELOG.md
141
+ - LICENSE.txt
142
+ - README.md
143
+ - app/components/docs_ui/brand_mark.rb
144
+ - app/components/docs_ui/callout.rb
145
+ - app/components/docs_ui/code.rb
146
+ - app/components/docs_ui/endpoint.rb
147
+ - app/components/docs_ui/error_table.rb
148
+ - app/components/docs_ui/example.rb
149
+ - app/components/docs_ui/field_table.rb
150
+ - app/components/docs_ui/header.rb
151
+ - app/components/docs_ui/icon.rb
152
+ - app/components/docs_ui/json_response.rb
153
+ - app/components/docs_ui/markdown.rb
154
+ - app/components/docs_ui/markdown_action.rb
155
+ - app/components/docs_ui/on_this_page.rb
156
+ - app/components/docs_ui/open_api_operation.rb
157
+ - app/components/docs_ui/page.rb
158
+ - app/components/docs_ui/page_helpers.rb
159
+ - app/components/docs_ui/prop_table.rb
160
+ - app/components/docs_ui/prose.rb
161
+ - app/components/docs_ui/request_example.rb
162
+ - app/components/docs_ui/search_box.rb
163
+ - app/components/docs_ui/search_results.rb
164
+ - app/components/docs_ui/section.rb
165
+ - app/components/docs_ui/shell.rb
166
+ - app/components/docs_ui/sidebar.rb
167
+ - app/components/docs_ui/table.rb
168
+ - app/components/docs_ui/theme_switcher.rb
169
+ - app/components/docs_ui/topbar_links.rb
170
+ - app/controllers/docs_kit/llms_controller.rb
171
+ - app/controllers/docs_kit/mcp_controller.rb
172
+ - app/controllers/docs_kit/search_controller.rb
173
+ - app/javascript/docs_kit/controllers/docs_nav_controller.js
174
+ - config/importmap.rb
175
+ - config/rubocop/docs_kit.yml
176
+ - exe/docs-kit
177
+ - lib/docs-kit.rb
178
+ - lib/docs_kit.rb
179
+ - lib/docs_kit/api_client.rb
180
+ - lib/docs_kit/api_request.rb
181
+ - lib/docs_kit/api_templates.rb
182
+ - lib/docs_kit/configuration.rb
183
+ - lib/docs_kit/controller.rb
184
+ - lib/docs_kit/engine.rb
185
+ - lib/docs_kit/llms_text.rb
186
+ - lib/docs_kit/markdown_export.rb
187
+ - lib/docs_kit/markdown_export/blocks.rb
188
+ - lib/docs_kit/markdown_export/inline.rb
189
+ - lib/docs_kit/markdown_export/table.rb
190
+ - lib/docs_kit/mcp_server.rb
191
+ - lib/docs_kit/mcp_tools.rb
192
+ - lib/docs_kit/nav_item.rb
193
+ - lib/docs_kit/open_api.rb
194
+ - lib/docs_kit/open_api/document.rb
195
+ - lib/docs_kit/open_api/operation.rb
196
+ - lib/docs_kit/open_api/schema.rb
197
+ - lib/docs_kit/registry.rb
198
+ - lib/docs_kit/rubocop.rb
199
+ - lib/docs_kit/search_hit.rb
200
+ - lib/docs_kit/search_index.rb
201
+ - lib/docs_kit/search_index/snippet.rb
202
+ - lib/docs_kit/shortcut.rb
203
+ - lib/docs_kit/templates/new_site.rb
204
+ - lib/docs_kit/topbar_link.rb
205
+ - lib/docs_kit/version.rb
206
+ - lib/generators/docs_kit/install/USAGE
207
+ - lib/generators/docs_kit/install/install_generator.rb
208
+ - lib/generators/docs_kit/install/sync_report.rb
209
+ - lib/generators/docs_kit/install/templates/agents_md.erb
210
+ - lib/generators/docs_kit/install/templates/application.tailwind.css.erb
211
+ - lib/generators/docs_kit/install/templates/build-css
212
+ - lib/generators/docs_kit/install/templates/build_css.rake
213
+ - lib/generators/docs_kit/install/templates/doc.rb.erb
214
+ - lib/generators/docs_kit/install/templates/docs_controller.rb.erb
215
+ - lib/generators/docs_kit/install/templates/docs_kit.rb.erb
216
+ - lib/generators/docs_kit/install/templates/installation_page.rb.erb
217
+ - lib/generators/docs_kit/install/templates/landing.rb.erb
218
+ - lib/generators/docs_kit/install/templates/landings_controller.rb.erb
219
+ - lib/generators/docs_kit/install/templates/phlex.rb.erb
220
+ - lib/generators/docs_kit/install/templates/rails_icons.rb.erb
221
+ - lib/generators/docs_kit/install/templates/skill.md.erb
222
+ - lib/generators/docs_kit/page/USAGE
223
+ - lib/generators/docs_kit/page/page_generator.rb
224
+ - lib/generators/docs_kit/page/templates/page.rb.erb
225
+ - lib/rubocop/cop/docs_kit/escaped_interpolation_in_heredoc.rb
226
+ - lib/rubocop/cop/docs_kit/render_component_preferred.rb
227
+ homepage: https://github.com/mhenrixon/docs-kit
228
+ licenses:
229
+ - MIT
230
+ metadata:
231
+ source_code_uri: https://github.com/mhenrixon/docs-kit
232
+ changelog_uri: https://github.com/mhenrixon/docs-kit/blob/main/CHANGELOG.md
233
+ bug_tracker_uri: https://github.com/mhenrixon/docs-kit/issues
234
+ rubygems_mfa_required: 'true'
235
+ rdoc_options: []
236
+ require_paths:
237
+ - lib
238
+ required_ruby_version: !ruby/object:Gem::Requirement
239
+ requirements:
240
+ - - ">="
241
+ - !ruby/object:Gem::Version
242
+ version: '3.2'
243
+ required_rubygems_version: !ruby/object:Gem::Requirement
244
+ requirements:
245
+ - - ">="
246
+ - !ruby/object:Gem::Version
247
+ version: '0'
248
+ requirements: []
249
+ rubygems_version: 4.0.9
250
+ specification_version: 4
251
+ summary: Shared Phlex docs-site chrome (shell, sidebar, code, theme switcher) built
252
+ on daisyUI
253
+ test_files: []