commonmarker-merge 1.0.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.
@@ -0,0 +1,223 @@
1
+ # Type signatures for Commonmarker::Merge
2
+ #
3
+ # Smart merging for Markdown files using CommonMarker AST.
4
+ # Provides intelligent merging by parsing Markdown, matching structural elements,
5
+ # and preserving frozen sections.
6
+
7
+ module Commonmarker
8
+ module Merge
9
+ # Current version string
10
+ VERSION: String
11
+
12
+ # Base error class for all merge errors
13
+ class Error < StandardError
14
+ end
15
+
16
+ # Error raised when template file fails to parse
17
+ class TemplateParseError < Error
18
+ attr_reader errors: Array[untyped]
19
+ attr_reader content: String?
20
+
21
+ def initialize: (?String? message, ?errors: Array[untyped], ?content: String?) -> void
22
+ end
23
+
24
+ # Error raised when destination file fails to parse
25
+ class DestinationParseError < Error
26
+ attr_reader errors: Array[untyped]
27
+ attr_reader content: String?
28
+
29
+ def initialize: (?String? message, ?errors: Array[untyped], ?content: String?) -> void
30
+ end
31
+
32
+ # Debug logging utility for Commonmarker::Merge
33
+ module DebugLogger
34
+ extend Ast::Merge::DebugLogger
35
+
36
+ def self.env_var_name: () -> String
37
+ def self.env_var_name=: (String name) -> String
38
+ def self.log_prefix: () -> String
39
+ def self.log_prefix=: (String prefix) -> String
40
+ def self.enabled?: () -> bool
41
+ def self.debug: (String message, ?Hash[Symbol, untyped] context) -> void
42
+ def self.info: (String message) -> void
43
+ def self.warning: (String message) -> void
44
+ def self.time: [T] (String operation) { () -> T } -> T
45
+ def self.extract_node_info: (untyped node) -> Hash[Symbol, untyped]
46
+ end
47
+
48
+ # Freeze block node for Markdown files (HTML comment markers)
49
+ class FreezeNode < Ast::Merge::FreezeNode
50
+ InvalidStructureError: singleton(Ast::Merge::FreezeNode::InvalidStructureError)
51
+ Location: singleton(Ast::Merge::FreezeNode::Location)
52
+
53
+ attr_reader content: String
54
+ attr_reader nodes: Array[untyped]
55
+ attr_reader start_marker: String
56
+ attr_reader end_marker: String
57
+
58
+ def self.pattern_for: (Symbol pattern_type, ?String token) -> Regexp
59
+
60
+ def initialize: (
61
+ start_line: Integer,
62
+ end_line: Integer,
63
+ content: String,
64
+ start_marker: String,
65
+ end_marker: String,
66
+ ?nodes: Array[untyped],
67
+ ?pattern_type: Symbol,
68
+ ?reason: String?
69
+ ) -> void
70
+
71
+ def signature: () -> Array[Symbol | String]
72
+ def heading?: () -> bool
73
+ def paragraph?: () -> bool
74
+ def code_block?: () -> bool
75
+ def list?: () -> bool
76
+ def slice: () -> String
77
+ def inspect: () -> String
78
+ end
79
+
80
+ # Wrapper for CommonMarker AST nodes
81
+ class NodeWrapper
82
+ attr_reader node: untyped
83
+ attr_reader start_line: Integer
84
+ attr_reader end_line: Integer
85
+ attr_reader analysis: FileAnalysis?
86
+
87
+ def initialize: (
88
+ untyped node,
89
+ ?analysis: FileAnalysis?
90
+ ) -> void
91
+
92
+ def location: () -> Ast::Merge::FreezeNode::Location
93
+ def signature: () -> Array[untyped]
94
+ def freeze_node?: () -> bool
95
+ def heading?: () -> bool
96
+ def paragraph?: () -> bool
97
+ def code_block?: () -> bool
98
+ def list?: () -> bool
99
+ def html_block?: () -> bool
100
+ def type: () -> Symbol
101
+ def level: () -> Integer?
102
+ def text_content: () -> String
103
+ def slice: () -> String?
104
+ def inspect: () -> String
105
+ end
106
+
107
+ # File analysis for Markdown files
108
+ class FileAnalysis
109
+ include Ast::Merge::FileAnalysisBase
110
+
111
+ DEFAULT_FREEZE_TOKEN: String
112
+
113
+ attr_reader source: String
114
+ attr_reader lines: Array[String]
115
+ attr_reader document: untyped
116
+ attr_reader statements: Array[NodeWrapper | FreezeNode]
117
+ attr_reader freeze_blocks: Array[FreezeNode]
118
+ attr_reader freeze_token: String
119
+ attr_reader signature_generator: (^(untyped) -> Array[untyped]?)?
120
+ attr_reader errors: Array[untyped]
121
+
122
+ def initialize: (
123
+ String source,
124
+ ?freeze_token: String,
125
+ ?signature_generator: (^(untyped) -> Array[untyped]?)?
126
+ ) -> void
127
+
128
+ def valid?: () -> bool
129
+ def nodes: () -> Array[NodeWrapper | FreezeNode]
130
+ def line_at: (Integer line_num) -> String?
131
+ def normalized_line: (Integer line_num) -> String?
132
+ def in_freeze_block?: (Integer line_num) -> bool
133
+ def freeze_block_at: (Integer line_num) -> FreezeNode?
134
+ def signature_at: (Integer index) -> Array[untyped]?
135
+ def generate_signature: (untyped node) -> Array[untyped]?
136
+ def compute_node_signature: (untyped node) -> Array[untyped]?
137
+
138
+ private
139
+
140
+ def parse_markdown: () -> void
141
+ def extract_nodes: () -> Array[NodeWrapper]
142
+ def extract_freeze_blocks: () -> Array[FreezeNode]
143
+ def integrate_nodes_and_freeze_blocks: () -> Array[NodeWrapper | FreezeNode]
144
+ end
145
+
146
+ # Result of a Markdown merge operation
147
+ class MergeResult < Ast::Merge::MergeResult
148
+ DECISION_KEPT_TEMPLATE: Symbol
149
+ DECISION_KEPT_DEST: Symbol
150
+ DECISION_MERGED: Symbol
151
+ DECISION_ADDED: Symbol
152
+ DECISION_FREEZE_BLOCK: Symbol
153
+
154
+ attr_reader markdown_content: String
155
+ attr_reader decisions: Array[Hash[Symbol, untyped]]
156
+ attr_reader statistics: Hash[Symbol, Integer]
157
+
158
+ def initialize: (
159
+ ?template_analysis: FileAnalysis?,
160
+ ?dest_analysis: FileAnalysis?,
161
+ ?conflicts: Array[Hash[Symbol, untyped]],
162
+ ?frozen_blocks: Array[FreezeNode],
163
+ ?stats: Hash[Symbol, untyped]
164
+ ) -> void
165
+
166
+ def add_content: (String content, decision: Symbol, source: Symbol) -> void
167
+ def add_node: (NodeWrapper node, decision: Symbol, source: Symbol) -> void
168
+ def add_freeze_block: (FreezeNode freeze_node) -> void
169
+ def to_markdown: () -> String
170
+ def content: () -> String
171
+ def content_string: () -> String
172
+ def empty?: () -> bool
173
+
174
+ private
175
+
176
+ def track_statistics: (Symbol decision, Symbol source) -> void
177
+ end
178
+
179
+ # Smart merger for Markdown files
180
+ class SmartMerger
181
+ include Ast::Merge::MergerConfig
182
+
183
+ attr_reader template_analysis: FileAnalysis
184
+ attr_reader dest_analysis: FileAnalysis
185
+ attr_reader signature_match_preference: (Symbol | Hash[Symbol, Symbol])
186
+ attr_reader add_template_only_nodes: bool
187
+
188
+ def initialize: (
189
+ String template_content,
190
+ String dest_content,
191
+ ?signature_match_preference: (Symbol | Hash[Symbol, Symbol]),
192
+ ?add_template_only_nodes: bool,
193
+ ?freeze_token: String,
194
+ ?signature_generator: (^(untyped) -> Array[untyped]?)?,
195
+ ?node_splitter: Hash[Symbol, untyped]?
196
+ ) -> void
197
+
198
+ def merge: () -> MergeResult
199
+
200
+ private
201
+
202
+ def perform_merge: () -> MergeResult
203
+ def merge_nodes: (MergeResult result) -> void
204
+ end
205
+
206
+ # Conflict resolver for Markdown merges
207
+ class ConflictResolver
208
+ attr_reader template_analysis: FileAnalysis
209
+ attr_reader dest_analysis: FileAnalysis
210
+ attr_reader signature_match_preference: (Symbol | Hash[Symbol, Symbol])
211
+ attr_reader add_template_only_nodes: bool
212
+
213
+ def initialize: (
214
+ FileAnalysis template_analysis,
215
+ FileAnalysis dest_analysis,
216
+ ?signature_match_preference: (Symbol | Hash[Symbol, Symbol]),
217
+ ?add_template_only_nodes: bool
218
+ ) -> void
219
+
220
+ def resolve: (untyped boundary, MergeResult result) -> void
221
+ end
222
+ end
223
+ end
data.tar.gz.sig ADDED
Binary file
metadata ADDED
@@ -0,0 +1,331 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: commonmarker-merge
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Peter H. Boling
8
+ bindir: exe
9
+ cert_chain:
10
+ - |
11
+ -----BEGIN CERTIFICATE-----
12
+ MIIEgDCCAuigAwIBAgIBATANBgkqhkiG9w0BAQsFADBDMRUwEwYDVQQDDAxwZXRl
13
+ ci5ib2xpbmcxFTATBgoJkiaJk/IsZAEZFgVnbWFpbDETMBEGCgmSJomT8ixkARkW
14
+ A2NvbTAeFw0yNTA1MDQxNTMzMDlaFw00NTA0MjkxNTMzMDlaMEMxFTATBgNVBAMM
15
+ DHBldGVyLmJvbGluZzEVMBMGCgmSJomT8ixkARkWBWdtYWlsMRMwEQYKCZImiZPy
16
+ LGQBGRYDY29tMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAruUoo0WA
17
+ uoNuq6puKWYeRYiZekz/nsDeK5x/0IEirzcCEvaHr3Bmz7rjo1I6On3gGKmiZs61
18
+ LRmQ3oxy77ydmkGTXBjruJB+pQEn7UfLSgQ0xa1/X3kdBZt6RmabFlBxnHkoaGY5
19
+ mZuZ5+Z7walmv6sFD9ajhzj+oIgwWfnEHkXYTR8I6VLN7MRRKGMPoZ/yvOmxb2DN
20
+ coEEHWKO9CvgYpW7asIihl/9GMpKiRkcYPm9dGQzZc6uTwom1COfW0+ZOFrDVBuV
21
+ FMQRPswZcY4Wlq0uEBLPU7hxnCL9nKK6Y9IhdDcz1mY6HZ91WImNslOSI0S8hRpj
22
+ yGOWxQIhBT3fqCBlRIqFQBudrnD9jSNpSGsFvbEijd5ns7Z9ZMehXkXDycpGAUj1
23
+ to/5cuTWWw1JqUWrKJYoifnVhtE1o1DZ+LkPtWxHtz5kjDG/zR3MG0Ula0UOavlD
24
+ qbnbcXPBnwXtTFeZ3C+yrWpE4pGnl3yGkZj9SMTlo9qnTMiPmuWKQDatAgMBAAGj
25
+ fzB9MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQWBBQE8uWvNbPVNRXZ
26
+ HlgPbc2PCzC4bjAhBgNVHREEGjAYgRZwZXRlci5ib2xpbmdAZ21haWwuY29tMCEG
27
+ A1UdEgQaMBiBFnBldGVyLmJvbGluZ0BnbWFpbC5jb20wDQYJKoZIhvcNAQELBQAD
28
+ ggGBAJbnUwfJQFPkBgH9cL7hoBfRtmWiCvdqdjeTmi04u8zVNCUox0A4gT982DE9
29
+ wmuN12LpdajxZONqbXuzZvc+nb0StFwmFYZG6iDwaf4BPywm2e/Vmq0YG45vZXGR
30
+ L8yMDSK1cQXjmA+ZBKOHKWavxP6Vp7lWvjAhz8RFwqF9GuNIdhv9NpnCAWcMZtpm
31
+ GUPyIWw/Cw/2wZp74QzZj6Npx+LdXoLTF1HMSJXZ7/pkxLCsB8m4EFVdb/IrW/0k
32
+ kNSfjtAfBHO8nLGuqQZVH9IBD1i9K6aSs7pT6TW8itXUIlkIUI2tg5YzW6OFfPzq
33
+ QekSkX3lZfY+HTSp/o+YvKkqWLUV7PQ7xh1ZYDtocpaHwgxe/j3bBqHE+CUPH2vA
34
+ 0V/FwdTRWcwsjVoOJTrYcff8pBZ8r2MvtAc54xfnnhGFzeRHfcltobgFxkAXdE6p
35
+ DVjBtqT23eugOqQ73umLcYDZkc36vnqGxUBSsXrzY9pzV5gGr2I8YUxMqf6ATrZt
36
+ L9nRqA==
37
+ -----END CERTIFICATE-----
38
+ date: 1980-01-02 00:00:00.000000000 Z
39
+ dependencies:
40
+ - !ruby/object:Gem::Dependency
41
+ name: commonmarker
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '2.0'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '2.0'
54
+ - !ruby/object:Gem::Dependency
55
+ name: markdown-merge
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '1.0'
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ version: 1.0.2
64
+ type: :runtime
65
+ prerelease: false
66
+ version_requirements: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - "~>"
69
+ - !ruby/object:Gem::Version
70
+ version: '1.0'
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ version: 1.0.2
74
+ - !ruby/object:Gem::Dependency
75
+ name: version_gem
76
+ requirement: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - "~>"
79
+ - !ruby/object:Gem::Version
80
+ version: '1.1'
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: 1.1.9
84
+ type: :runtime
85
+ prerelease: false
86
+ version_requirements: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - "~>"
89
+ - !ruby/object:Gem::Version
90
+ version: '1.1'
91
+ - - ">="
92
+ - !ruby/object:Gem::Version
93
+ version: 1.1.9
94
+ - !ruby/object:Gem::Dependency
95
+ name: kettle-dev
96
+ requirement: !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - "~>"
99
+ - !ruby/object:Gem::Version
100
+ version: '1.1'
101
+ type: :development
102
+ prerelease: false
103
+ version_requirements: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - "~>"
106
+ - !ruby/object:Gem::Version
107
+ version: '1.1'
108
+ - !ruby/object:Gem::Dependency
109
+ name: bundler-audit
110
+ requirement: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - "~>"
113
+ - !ruby/object:Gem::Version
114
+ version: 0.9.2
115
+ type: :development
116
+ prerelease: false
117
+ version_requirements: !ruby/object:Gem::Requirement
118
+ requirements:
119
+ - - "~>"
120
+ - !ruby/object:Gem::Version
121
+ version: 0.9.2
122
+ - !ruby/object:Gem::Dependency
123
+ name: rake
124
+ requirement: !ruby/object:Gem::Requirement
125
+ requirements:
126
+ - - "~>"
127
+ - !ruby/object:Gem::Version
128
+ version: '13.0'
129
+ type: :development
130
+ prerelease: false
131
+ version_requirements: !ruby/object:Gem::Requirement
132
+ requirements:
133
+ - - "~>"
134
+ - !ruby/object:Gem::Version
135
+ version: '13.0'
136
+ - !ruby/object:Gem::Dependency
137
+ name: require_bench
138
+ requirement: !ruby/object:Gem::Requirement
139
+ requirements:
140
+ - - "~>"
141
+ - !ruby/object:Gem::Version
142
+ version: '1.0'
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: 1.0.4
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '1.0'
153
+ - - ">="
154
+ - !ruby/object:Gem::Version
155
+ version: 1.0.4
156
+ - !ruby/object:Gem::Dependency
157
+ name: appraisal2
158
+ requirement: !ruby/object:Gem::Requirement
159
+ requirements:
160
+ - - "~>"
161
+ - !ruby/object:Gem::Version
162
+ version: '3.0'
163
+ type: :development
164
+ prerelease: false
165
+ version_requirements: !ruby/object:Gem::Requirement
166
+ requirements:
167
+ - - "~>"
168
+ - !ruby/object:Gem::Version
169
+ version: '3.0'
170
+ - !ruby/object:Gem::Dependency
171
+ name: kettle-test
172
+ requirement: !ruby/object:Gem::Requirement
173
+ requirements:
174
+ - - "~>"
175
+ - !ruby/object:Gem::Version
176
+ version: '1.0'
177
+ - - ">="
178
+ - !ruby/object:Gem::Version
179
+ version: 1.0.6
180
+ type: :development
181
+ prerelease: false
182
+ version_requirements: !ruby/object:Gem::Requirement
183
+ requirements:
184
+ - - "~>"
185
+ - !ruby/object:Gem::Version
186
+ version: '1.0'
187
+ - - ">="
188
+ - !ruby/object:Gem::Version
189
+ version: 1.0.6
190
+ - !ruby/object:Gem::Dependency
191
+ name: ruby-progressbar
192
+ requirement: !ruby/object:Gem::Requirement
193
+ requirements:
194
+ - - "~>"
195
+ - !ruby/object:Gem::Version
196
+ version: '1.13'
197
+ type: :development
198
+ prerelease: false
199
+ version_requirements: !ruby/object:Gem::Requirement
200
+ requirements:
201
+ - - "~>"
202
+ - !ruby/object:Gem::Version
203
+ version: '1.13'
204
+ - !ruby/object:Gem::Dependency
205
+ name: stone_checksums
206
+ requirement: !ruby/object:Gem::Requirement
207
+ requirements:
208
+ - - "~>"
209
+ - !ruby/object:Gem::Version
210
+ version: '1.0'
211
+ - - ">="
212
+ - !ruby/object:Gem::Version
213
+ version: 1.0.2
214
+ type: :development
215
+ prerelease: false
216
+ version_requirements: !ruby/object:Gem::Requirement
217
+ requirements:
218
+ - - "~>"
219
+ - !ruby/object:Gem::Version
220
+ version: '1.0'
221
+ - - ">="
222
+ - !ruby/object:Gem::Version
223
+ version: 1.0.2
224
+ - !ruby/object:Gem::Dependency
225
+ name: gitmoji-regex
226
+ requirement: !ruby/object:Gem::Requirement
227
+ requirements:
228
+ - - "~>"
229
+ - !ruby/object:Gem::Version
230
+ version: '1.0'
231
+ - - ">="
232
+ - !ruby/object:Gem::Version
233
+ version: 1.0.3
234
+ type: :development
235
+ prerelease: false
236
+ version_requirements: !ruby/object:Gem::Requirement
237
+ requirements:
238
+ - - "~>"
239
+ - !ruby/object:Gem::Version
240
+ version: '1.0'
241
+ - - ">="
242
+ - !ruby/object:Gem::Version
243
+ version: 1.0.3
244
+ description: "☯️ Commonmarker::Merge provides smart Markdown file merging using Comrak
245
+ (Rust) via Commonmarker. It understands document structure including headings, lists,
246
+ code blocks, and tables. Perfect for merging documentation templates with customized
247
+ files."
248
+ email:
249
+ - floss@galtzo.com
250
+ executables: []
251
+ extensions: []
252
+ extra_rdoc_files:
253
+ - CHANGELOG.md
254
+ - CITATION.cff
255
+ - CODE_OF_CONDUCT.md
256
+ - CONTRIBUTING.md
257
+ - FUNDING.md
258
+ - LICENSE.txt
259
+ - README.md
260
+ - REEK
261
+ - RUBOCOP.md
262
+ - SECURITY.md
263
+ files:
264
+ - CHANGELOG.md
265
+ - CITATION.cff
266
+ - CODE_OF_CONDUCT.md
267
+ - CONTRIBUTING.md
268
+ - FUNDING.md
269
+ - LICENSE.txt
270
+ - README.md
271
+ - REEK
272
+ - RUBOCOP.md
273
+ - SECURITY.md
274
+ - lib/commonmarker-merge.rb
275
+ - lib/commonmarker/merge.rb
276
+ - lib/commonmarker/merge/backend.rb
277
+ - lib/commonmarker/merge/debug_logger.rb
278
+ - lib/commonmarker/merge/file_analysis.rb
279
+ - lib/commonmarker/merge/freeze_node.rb
280
+ - lib/commonmarker/merge/smart_merger.rb
281
+ - lib/commonmarker/merge/version.rb
282
+ - sig/commonmarker/merge.rbs
283
+ - sig/commonmarker/merge/conflict_resolver.rbs
284
+ - sig/commonmarker/merge/debug_logger.rbs
285
+ - sig/commonmarker/merge/file_aligner.rbs
286
+ - sig/commonmarker/merge/file_analysis.rbs
287
+ - sig/commonmarker/merge/freeze_node.rbs
288
+ - sig/commonmarker/merge/merge_result.rbs
289
+ - sig/commonmarker/merge/smart_merger.rbs
290
+ homepage: https://github.com/kettle-rb/commonmarker-merge
291
+ licenses:
292
+ - MIT
293
+ metadata:
294
+ homepage_uri: https://commonmarker-merge.galtzo.com/
295
+ source_code_uri: https://github.com/kettle-rb/commonmarker-merge/tree/v1.0.0
296
+ changelog_uri: https://github.com/kettle-rb/commonmarker-merge/blob/v1.0.0/CHANGELOG.md
297
+ bug_tracker_uri: https://github.com/kettle-rb/commonmarker-merge/issues
298
+ documentation_uri: https://www.rubydoc.info/gems/commonmarker-merge/1.0.0
299
+ funding_uri: https://github.com/sponsors/pboling
300
+ wiki_uri: https://github.com/kettle-rb/commonmarker-merge/wiki
301
+ news_uri: https://www.railsbling.com/tags/commonmarker-merge
302
+ discord_uri: https://discord.gg/3qme4XHNKN
303
+ rubygems_mfa_required: 'true'
304
+ rdoc_options:
305
+ - "--title"
306
+ - commonmarker-merge - ☯️ Intelligent Markdown file merging using Commonmarker AST
307
+ analysis
308
+ - "--main"
309
+ - README.md
310
+ - "--exclude"
311
+ - "^sig/"
312
+ - "--line-numbers"
313
+ - "--inline-source"
314
+ - "--quiet"
315
+ require_paths:
316
+ - lib
317
+ required_ruby_version: !ruby/object:Gem::Requirement
318
+ requirements:
319
+ - - ">="
320
+ - !ruby/object:Gem::Version
321
+ version: 3.2.0
322
+ required_rubygems_version: !ruby/object:Gem::Requirement
323
+ requirements:
324
+ - - ">="
325
+ - !ruby/object:Gem::Version
326
+ version: '0'
327
+ requirements: []
328
+ rubygems_version: 4.0.5
329
+ specification_version: 4
330
+ summary: "☯️ Intelligent Markdown file merging using Commonmarker AST analysis"
331
+ test_files: []
metadata.gz.sig ADDED
Binary file