makit 0.0.111 → 0.0.112

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 (140) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +41 -41
  3. data/exe/makit +5 -5
  4. data/lib/makit/apache.rb +28 -28
  5. data/lib/makit/cli/build_commands.rb +500 -500
  6. data/lib/makit/cli/generators/base_generator.rb +74 -74
  7. data/lib/makit/cli/generators/dotnet_generator.rb +50 -50
  8. data/lib/makit/cli/generators/generator_factory.rb +49 -49
  9. data/lib/makit/cli/generators/node_generator.rb +50 -50
  10. data/lib/makit/cli/generators/ruby_generator.rb +77 -77
  11. data/lib/makit/cli/generators/rust_generator.rb +50 -50
  12. data/lib/makit/cli/generators/templates/dotnet_templates.rb +167 -167
  13. data/lib/makit/cli/generators/templates/node_templates.rb +161 -161
  14. data/lib/makit/cli/generators/templates/ruby/gemfile.rb +26 -26
  15. data/lib/makit/cli/generators/templates/ruby/gemspec.rb +40 -40
  16. data/lib/makit/cli/generators/templates/ruby/main_lib.rb +33 -33
  17. data/lib/makit/cli/generators/templates/ruby/rakefile.rb +35 -35
  18. data/lib/makit/cli/generators/templates/ruby/readme.rb +63 -63
  19. data/lib/makit/cli/generators/templates/ruby/test.rb +39 -39
  20. data/lib/makit/cli/generators/templates/ruby/test_helper.rb +29 -29
  21. data/lib/makit/cli/generators/templates/ruby/version.rb +29 -29
  22. data/lib/makit/cli/generators/templates/rust_templates.rb +128 -128
  23. data/lib/makit/cli/main.rb +62 -62
  24. data/lib/makit/cli/project_commands.rb +868 -868
  25. data/lib/makit/cli/repository_commands.rb +661 -661
  26. data/lib/makit/cli/utility_commands.rb +521 -521
  27. data/lib/makit/commands/factory.rb +359 -359
  28. data/lib/makit/commands/middleware/base.rb +73 -73
  29. data/lib/makit/commands/middleware/cache.rb +248 -248
  30. data/lib/makit/commands/middleware/command_logger.rb +320 -323
  31. data/lib/makit/commands/middleware/unified_logger.rb +243 -243
  32. data/lib/makit/commands/middleware/validator.rb +269 -269
  33. data/lib/makit/commands/request.rb +254 -254
  34. data/lib/makit/commands/result.rb +323 -323
  35. data/lib/makit/commands/runner.rb +337 -317
  36. data/lib/makit/commands/strategies/base.rb +160 -160
  37. data/lib/makit/commands/strategies/synchronous.rb +134 -134
  38. data/lib/makit/commands.rb +51 -42
  39. data/lib/makit/configuration/gitlab_helper.rb +60 -60
  40. data/lib/makit/configuration/project.rb +127 -127
  41. data/lib/makit/configuration/rakefile_helper.rb +43 -43
  42. data/lib/makit/configuration/step.rb +34 -34
  43. data/lib/makit/configuration.rb +14 -14
  44. data/lib/makit/content/default_gitignore.rb +7 -7
  45. data/lib/makit/content/default_rakefile.rb +13 -13
  46. data/lib/makit/content/gem_rakefile.rb +16 -16
  47. data/lib/makit/context.rb +1 -1
  48. data/lib/makit/data.rb +49 -49
  49. data/lib/makit/directories.rb +141 -141
  50. data/lib/makit/directory.rb +262 -262
  51. data/lib/makit/docs/files.rb +89 -89
  52. data/lib/makit/docs/rake.rb +102 -102
  53. data/lib/makit/dotnet/project.rb +153 -153
  54. data/lib/makit/dotnet/solution.rb +38 -38
  55. data/lib/makit/dotnet/solution_classlib.rb +239 -239
  56. data/lib/makit/dotnet/solution_console.rb +264 -264
  57. data/lib/makit/dotnet/solution_maui.rb +354 -354
  58. data/lib/makit/dotnet/solution_wasm.rb +275 -275
  59. data/lib/makit/dotnet/solution_wpf.rb +304 -304
  60. data/lib/makit/dotnet.rb +102 -102
  61. data/lib/makit/email.rb +90 -90
  62. data/lib/makit/environment.rb +142 -142
  63. data/lib/makit/examples/runner.rb +370 -370
  64. data/lib/makit/exceptions.rb +45 -45
  65. data/lib/makit/fileinfo.rb +24 -24
  66. data/lib/makit/files.rb +43 -43
  67. data/lib/makit/gems.rb +40 -40
  68. data/lib/makit/git/cli.rb +54 -54
  69. data/lib/makit/git/repository.rb +90 -90
  70. data/lib/makit/git.rb +98 -98
  71. data/lib/makit/gitlab_runner.rb +59 -59
  72. data/lib/makit/humanize.rb +137 -137
  73. data/lib/makit/indexer.rb +47 -47
  74. data/lib/makit/logging/configuration.rb +305 -305
  75. data/lib/makit/logging/formatters/base.rb +39 -39
  76. data/lib/makit/logging/formatters/console_formatter.rb +140 -127
  77. data/lib/makit/logging/formatters/json_formatter.rb +65 -65
  78. data/lib/makit/logging/formatters/plain_text_formatter.rb +71 -71
  79. data/lib/makit/logging/formatters/text_formatter.rb +64 -64
  80. data/lib/makit/logging/log_request.rb +115 -115
  81. data/lib/makit/logging/logger.rb +163 -159
  82. data/lib/makit/logging/sinks/console.rb +72 -72
  83. data/lib/makit/logging/sinks/file_sink.rb +92 -92
  84. data/lib/makit/logging/sinks/unified_file_sink.rb +303 -303
  85. data/lib/makit/logging.rb +530 -521
  86. data/lib/makit/markdown.rb +75 -75
  87. data/lib/makit/mp/basic_object_mp.rb +17 -17
  88. data/lib/makit/mp/command_mp.rb +13 -13
  89. data/lib/makit/mp/command_request.mp.rb +17 -17
  90. data/lib/makit/mp/project_mp.rb +199 -199
  91. data/lib/makit/mp/string_mp.rb +193 -348
  92. data/lib/makit/nuget.rb +74 -74
  93. data/lib/makit/port.rb +32 -32
  94. data/lib/makit/process.rb +163 -163
  95. data/lib/makit/protoc.rb +107 -107
  96. data/lib/makit/rake/cli.rb +196 -196
  97. data/lib/makit/rake.rb +25 -25
  98. data/lib/makit/ruby/cli.rb +185 -185
  99. data/lib/makit/ruby.rb +25 -25
  100. data/lib/makit/secrets.rb +51 -51
  101. data/lib/makit/serializer.rb +130 -117
  102. data/lib/makit/services/builder.rb +186 -186
  103. data/lib/makit/services/error_handler.rb +226 -226
  104. data/lib/makit/services/repository_manager.rb +229 -229
  105. data/lib/makit/services/validator.rb +112 -112
  106. data/lib/makit/setup/classlib.rb +53 -53
  107. data/lib/makit/setup/gem.rb +30 -17
  108. data/lib/makit/setup/runner.rb +45 -40
  109. data/lib/makit/setup.rb +5 -0
  110. data/lib/makit/show.rb +110 -110
  111. data/lib/makit/storage.rb +126 -126
  112. data/lib/makit/symbols.rb +170 -161
  113. data/lib/makit/task_info.rb +128 -128
  114. data/lib/makit/tasks/at_exit.rb +13 -13
  115. data/lib/makit/tasks/build.rb +19 -18
  116. data/lib/makit/tasks/clean.rb +11 -11
  117. data/lib/makit/tasks/hook_manager.rb +393 -239
  118. data/lib/makit/tasks/init.rb +47 -47
  119. data/lib/makit/tasks/integrate.rb +17 -15
  120. data/lib/makit/tasks/pull_incoming.rb +11 -12
  121. data/lib/makit/tasks/setup.rb +6 -6
  122. data/lib/makit/tasks/sync.rb +12 -11
  123. data/lib/makit/tasks/tag.rb +15 -0
  124. data/lib/makit/tasks/task_monkey_patch.rb +79 -79
  125. data/lib/makit/tasks.rb +10 -0
  126. data/lib/makit/test_cache.rb +239 -239
  127. data/lib/makit/tree.rb +37 -37
  128. data/lib/makit/v1/makit.v1_pb.rb +34 -34
  129. data/lib/makit/v1/makit.v1_services_pb.rb +27 -27
  130. data/lib/makit/version.rb +5 -5
  131. data/lib/makit/version_util.rb +21 -0
  132. data/lib/makit/wix.rb +95 -95
  133. data/lib/makit/yaml.rb +29 -29
  134. data/lib/makit/zip.rb +17 -17
  135. data/lib/makit copy.rb +44 -0
  136. data/lib/makit.rb +40 -8
  137. metadata +50 -7
  138. data/lib/makit/command_runner.rb +0 -463
  139. data/lib/makit/commands/compatibility.rb +0 -365
  140. data/lib/makit/task_hooks.rb +0 -125
@@ -1,348 +1,193 @@
1
- # frozen_string_literal: true
2
-
3
- require "json"
4
- # monkey patch String class with a run method
5
-
6
- class String
7
- def run(args = nil)
8
- command = self
9
- if args.nil?
10
- Makit::COMMANDS_COMPAT.run(Makit::COMMANDS_COMPAT.parse_command_request(command))
11
- else
12
- # Parse initial request
13
- base_request = Makit::COMMANDS_COMPAT.parse_command_request(command)
14
-
15
- if args.is_a?(Hash)
16
- # Create new request with combined options
17
- request_options = {
18
- command: base_request.command,
19
- arguments: base_request.arguments || [],
20
- directory: base_request.directory,
21
- timeout: base_request.timeout,
22
- environment: base_request.environment || {},
23
- metadata: base_request.metadata || {},
24
- }
25
-
26
- # Apply args to the request options
27
- args.each do |key, value|
28
- case key.to_s
29
- when "arguments"
30
- # Append additional arguments
31
- request_options[:arguments] = request_options[:arguments] + Array(value)
32
- when "directory"
33
- request_options[:directory] = value
34
- when "timeout"
35
- request_options[:timeout] = value
36
- when "environment"
37
- request_options[:environment] = request_options[:environment].merge(value || {})
38
- else
39
- # Store other options in metadata
40
- request_options[:metadata][key] = value
41
- end
42
- end
43
-
44
- # Create new request with updated options
45
- request = Makit::Commands::Request.new(**request_options)
46
- else
47
- request = base_request
48
- end
49
-
50
- Makit::COMMANDS_COMPAT.run(request)
51
- end
52
- end
53
-
54
- def cache_run(timestamp = nil)
55
- command = self
56
- if timestamp.nil?
57
- # Use default timestamp from compatibility layer
58
- Makit::COMMANDS_COMPAT.cache_run(Makit::COMMANDS_COMPAT.parse_command_request(command))
59
- else
60
- Makit::COMMANDS_COMPAT.cache_run(Makit::COMMANDS_COMPAT.parse_command_request(command), timestamp)
61
- end
62
- end
63
-
64
- def try(args = nil)
65
- command = self
66
- if args.nil?
67
- Makit::COMMANDS_COMPAT.try(command)
68
- else
69
- # Parse initial request
70
- base_request = Makit::COMMANDS_COMPAT.parse_command_request(command)
71
-
72
- if args.is_a?(Hash)
73
- # Create new request with combined options
74
- request_options = {
75
- command: base_request.command,
76
- arguments: base_request.arguments || [],
77
- directory: base_request.directory,
78
- timeout: base_request.timeout,
79
- environment: base_request.environment || {},
80
- metadata: base_request.metadata || {},
81
- }
82
-
83
- # Apply args to the request options
84
- args.each do |key, value|
85
- case key.to_s
86
- when "arguments"
87
- # Append additional arguments
88
- request_options[:arguments] = request_options[:arguments] + Array(value)
89
- when "directory"
90
- request_options[:directory] = value
91
- when "timeout"
92
- request_options[:timeout] = value
93
- when "environment"
94
- request_options[:environment] = request_options[:environment].merge(value || {})
95
- else
96
- # Store other options in metadata
97
- request_options[:metadata][key] = value
98
- end
99
- end
100
-
101
- # Create new request with updated options
102
- request = Makit::Commands::Request.new(**request_options)
103
- else
104
- request = base_request
105
- end
106
-
107
- Makit::COMMANDS_COMPAT.try(request)
108
- end
109
- end
110
-
111
- def show(args = nil)
112
- command = self
113
- if args.nil?
114
- Makit::COMMANDS_COMPAT.show(command)
115
- else
116
- # Parse initial request
117
- base_request = Makit::COMMANDS_COMPAT.parse_command_request(command)
118
-
119
- if args.is_a?(Hash)
120
- # Create new request with combined options
121
- request_options = {
122
- command: base_request.command,
123
- arguments: base_request.arguments || [],
124
- directory: base_request.directory,
125
- timeout: base_request.timeout,
126
- environment: base_request.environment || {},
127
- metadata: base_request.metadata || {},
128
- }
129
-
130
- # Apply args to the request options
131
- args.each do |key, value|
132
- case key.to_s
133
- when "arguments"
134
- # Append additional arguments
135
- request_options[:arguments] = request_options[:arguments] + Array(value)
136
- when "directory"
137
- request_options[:directory] = value
138
- when "timeout"
139
- request_options[:timeout] = value
140
- when "environment"
141
- request_options[:environment] = request_options[:environment].merge(value || {})
142
- else
143
- # Store other options in metadata
144
- request_options[:metadata][key] = value
145
- end
146
- end
147
-
148
- # Create new request with updated options
149
- request = Makit::Commands::Request.new(**request_options)
150
- else
151
- request = base_request
152
- end
153
-
154
- Makit::COMMANDS_COMPAT.show(request)
155
- end
156
- end
157
-
158
- def log(filename)
159
- # Ensure directory exists if filename contains path
160
- if filename.include?("/")
161
- directory = File.dirname(filename)
162
- FileUtils.mkdir_p(directory)
163
- end
164
- command = self
165
-
166
- Makit::Logging.info("Logging command output to file", {
167
- command: command,
168
- log_file: filename,
169
- })
170
-
171
- cmd = Makit::COMMANDS_COMPAT.run(Makit::COMMANDS_COMPAT.parse_command_request(command))
172
-
173
- # Write the cmd output and error to the file
174
- File.write(filename, cmd.output + cmd.error)
175
-
176
- # Log the result
177
- if cmd.success?
178
- Makit::Logging.success("Command logged successfully", {
179
- command: command,
180
- log_file: filename,
181
- output_length: cmd.output.length,
182
- error_length: cmd.error.length,
183
- })
184
- else
185
- Makit::Logging.error("Command failed and logged", {
186
- command: command,
187
- log_file: filename,
188
- exit_code: cmd.exit_code,
189
- output_length: cmd.output.length,
190
- error_length: cmd.error.length,
191
- })
192
- end
193
-
194
- Makit::COMMANDS_COMPAT.show_command(cmd)
195
- end
196
-
197
- def cache_log(filename, timestamp = nil)
198
- # Ensure directory exists if filename contains path
199
- if filename.include?("/")
200
- directory = File.dirname(filename)
201
- FileUtils.mkdir_p(directory)
202
- end
203
- command = self
204
-
205
- #Makit::Logging.info("Cache logging command output", {
206
- # command: command,
207
- # log_file: filename,
208
- # timestamp: timestamp ? Makit::Humanize.get_humanized_timestamp(timestamp) : nil
209
- #})
210
-
211
- # Use cache_run with optional timestamp
212
- cmd = if timestamp.nil?
213
- Makit::COMMANDS_COMPAT.cache_run(Makit::COMMANDS_COMPAT.parse_command_request(command))
214
- else
215
- Makit::COMMANDS_COMPAT.cache_run(Makit::COMMANDS_COMPAT.parse_command_request(command), timestamp)
216
- end
217
-
218
- # Write the cached command output and error to the file
219
- File.write(filename, cmd.output + cmd.error)
220
-
221
- # Log the execution result
222
- if cmd.success?
223
- Makit::Logging.success(command)
224
- #Makit::Logging.success("Command executed and cached", {
225
- # command: command,
226
- # log_file: filename,
227
- # cached: true,
228
- # output_length: cmd.output.length,
229
- # error_length: cmd.error.length
230
- # })
231
- else
232
- Makit::Logging.error("Command failed and cached", {
233
- command: command,
234
- log_file: filename,
235
- exit_code: cmd.exit_code,
236
- cached: true,
237
- output_length: cmd.output.length,
238
- error_length: cmd.error.length,
239
- })
240
- end
241
-
242
- # Display detailed output and log location only if it failed
243
- return if cmd.success?
244
-
245
- Makit::COMMANDS_COMPAT.show_command(cmd)
246
- Makit::Logging.info("Log written to file", {
247
- log_file: File.expand_path(filename),
248
- })
249
- end
250
-
251
- def cache_try(timestamp = nil)
252
- command = self
253
-
254
- Makit::Logging.info("Trying cached command execution", {
255
- command: command,
256
- timestamp: timestamp ? Makit::Humanize.get_humanized_timestamp(timestamp) : nil,
257
- })
258
-
259
- result = if timestamp.nil?
260
- # Use default timestamp from compatibility layer
261
- Makit::COMMANDS_COMPAT.cache_try(Makit::COMMANDS_COMPAT.parse_command_request(command))
262
- else
263
- Makit::COMMANDS_COMPAT.cache_try(Makit::COMMANDS_COMPAT.parse_command_request(command), timestamp)
264
- end
265
-
266
- # Log the result
267
- if result.success?
268
- Makit::Logging.success("Cached command executed successfully", {
269
- command: command,
270
- cached: true,
271
- duration: result.duration,
272
- })
273
- else
274
- Makit::Logging.warn("Cached command failed", {
275
- command: command,
276
- exit_code: result.exit_code,
277
- cached: true,
278
- })
279
- end
280
-
281
- result
282
- end
283
-
284
- # Read a value from a JSON file
285
- # key is a string with the key to read, e.g. "AzureAd.Authority"
286
- def get_json_value(key)
287
- json = File.read(self)
288
- data = JSON.parse(json)
289
-
290
- # key delimiter is '.' so we can access nested keys
291
- key.split(".").each do |k|
292
- data = data[k]
293
- end
294
- data
295
- end
296
-
297
- alias retrieve get_json_value
298
-
299
- # Set a value in a JSON file
300
- # key is a string with the key to set, e.g. "AzureAd.Authority"
301
- def set_json_value(key, value)
302
- file = File.read(self)
303
- data = JSON.parse(file)
304
- keys = key.split(".")
305
- current = data
306
-
307
- # Traverse and create any missing keys
308
- keys[0..-2].each do |k|
309
- current[k] ||= {} # Create a new hash if the key doesn't exist
310
- current = current[k]
311
- end
312
-
313
- # Set the value for the final key
314
- current[keys[-1]] = value
315
-
316
- # Write the JSON back to the file
317
- File.write(self, JSON.pretty_generate(data))
318
- end
319
-
320
- # Alias for set_json_value
321
- alias assign set_json_value
322
-
323
- def strip_color_codes
324
- # Regular expression to remove ANSI color codes
325
- gsub(/\e\[[\d;]+m/, "")
326
- end
327
-
328
- def to_lines(max_length = 80, indent_length = 5)
329
- return self if length <= max_length
330
-
331
- indent = " " * indent_length
332
- words = split(" ")
333
- lines = []
334
- line = ""
335
- words.each do |word|
336
- if (line + word).length > max_length
337
- lines << line
338
- line = indent + word
339
- elsif line.empty?
340
- line = word
341
- else
342
- line += " #{word}"
343
- end
344
- end
345
- lines << line
346
- lines.join("\n")
347
- end
348
- end
1
+ # frozen_string_literal: true
2
+
3
+ require "json"
4
+ require "fileutils"
5
+ # monkey patch String class with command execution methods
6
+
7
+ class String
8
+ def run(args = nil)
9
+ command = self
10
+ if args.nil?
11
+ request = Makit::Commands::Request.from_string(command)
12
+ Makit::Commands::Runner.default.execute(request)
13
+ else
14
+ # Parse initial request
15
+ base_request = Makit::Commands::Request.from_string(command)
16
+
17
+ if args.is_a?(Hash)
18
+ # Create new request with combined options
19
+ request_options = {
20
+ command: base_request.command,
21
+ arguments: base_request.arguments || [],
22
+ directory: base_request.directory,
23
+ timeout: base_request.timeout,
24
+ environment: base_request.environment || {},
25
+ metadata: base_request.metadata || {},
26
+ }
27
+
28
+ # Apply args to the request options
29
+ args.each do |key, value|
30
+ case key.to_s
31
+ when "arguments"
32
+ # Append additional arguments
33
+ request_options[:arguments] = (request_options[:arguments] + Array(value)).flatten
34
+ when "directory"
35
+ request_options[:directory] = value
36
+ when "timeout"
37
+ request_options[:timeout] = value
38
+ when "environment"
39
+ request_options[:environment] = (request_options[:environment] || {}).merge(value)
40
+ when "metadata"
41
+ request_options[:metadata] = (request_options[:metadata] || {}).merge(value)
42
+ else
43
+ # Add unknown keys to metadata
44
+ request_options[:metadata] = (request_options[:metadata] || {}).merge(key.to_s => value)
45
+ end
46
+ end
47
+
48
+ # Create new request with combined options
49
+ request = Makit::Commands::Request.new(**request_options)
50
+ Makit::Commands::Runner.default.execute(request)
51
+ else
52
+ # args is an array of additional arguments
53
+ request = Makit::Commands::Request.new(
54
+ command: base_request.command,
55
+ arguments: (base_request.arguments || []) + Array(args),
56
+ directory: base_request.directory,
57
+ timeout: base_request.timeout,
58
+ environment: base_request.environment || {},
59
+ metadata: base_request.metadata || {},
60
+ )
61
+ Makit::Commands::Runner.default.execute(request)
62
+ end
63
+ end
64
+ end
65
+
66
+ def cache_run(timestamp = nil)
67
+ puts "cache_run: #{self}"
68
+ command = self
69
+ request = Makit::Commands::Request.from_string(command)
70
+ if timestamp
71
+ # Add timestamp to metadata for cache key generation
72
+ request = Makit::Commands::Request.new(
73
+ command: request.command,
74
+ arguments: request.arguments,
75
+ directory: request.directory,
76
+ timeout: request.timeout,
77
+ environment: request.environment || {},
78
+ metadata: (request.metadata || {}).merge(timestamp: timestamp),
79
+ )
80
+ puts "timestamp: #{timestamp}"
81
+ else
82
+ puts "no timestamp"
83
+ end
84
+ Makit::Commands::Runner.default.execute(request)
85
+ end
86
+
87
+ def try
88
+ command = self
89
+ request = Makit::Commands::Request.from_string(command)
90
+ Makit::Commands::Runner.default.execute(request)
91
+ end
92
+
93
+ def show
94
+ command = self
95
+ request = Makit::Commands::Request.from_string(command)
96
+ Makit::Commands::Runner.default.execute(request)
97
+ end
98
+
99
+ def log
100
+ command = self
101
+ request = Makit::Commands::Request.from_string(command)
102
+ result = Makit::Commands::Runner.default.execute(request)
103
+
104
+ # Log the command execution result
105
+ if result.success?
106
+ Makit::Logging.info("Command completed successfully: #{command}")
107
+ else
108
+ Makit::Logging.error("Command failed: #{command} (exit code: #{result.exit_code})")
109
+ end
110
+
111
+ result
112
+ end
113
+
114
+ def cache_try(timestamp = nil)
115
+ command = self
116
+ request = Makit::Commands::Request.from_string(command)
117
+ if timestamp
118
+ # Add timestamp to metadata for cache key generation
119
+ request = Makit::Commands::Request.new(
120
+ command: request.command,
121
+ arguments: request.arguments,
122
+ directory: request.directory,
123
+ timeout: request.timeout,
124
+ environment: request.environment || {},
125
+ metadata: (request.metadata || {}).merge(timestamp: timestamp),
126
+ )
127
+ end
128
+ Makit::Commands::Runner.default.execute(request)
129
+ end
130
+
131
+ def show_command(cmd)
132
+ if cmd.success?
133
+ puts "✅ #{cmd.command} #{cmd.arguments&.join(" ")}".colorize(:green)
134
+ else
135
+ puts "❌ #{cmd.command} #{cmd.arguments&.join(" ")}".colorize(:red)
136
+ puts " Exit code: #{cmd.exit_code}".colorize(:red)
137
+ puts " Error: #{cmd.stderr}".colorize(:red) if cmd.stderr && !cmd.stderr.empty?
138
+ end
139
+ end
140
+
141
+ def to_markdown
142
+ command = self
143
+ request = Makit::Commands::Request.from_string(command)
144
+ result = Makit::Commands::Runner.default.execute(request)
145
+
146
+ if result.success?
147
+ "```\n#{result.stdout}\n```"
148
+ else
149
+ "```\nError: #{result.stderr}\n```"
150
+ end
151
+ end
152
+
153
+ def cache_run_with_timestamp(timestamp)
154
+ command = self
155
+ request = Makit::Commands::Request.from_string(command)
156
+ request = Makit::Commands::Request.new(
157
+ command: request.command,
158
+ arguments: request.arguments,
159
+ directory: request.directory,
160
+ timeout: request.timeout,
161
+ environment: request.environment || {},
162
+ metadata: (request.metadata || {}).merge(timestamp: timestamp),
163
+ )
164
+ Makit::Commands::Runner.default.execute(request)
165
+ end
166
+
167
+ def cache_try_with_timestamp(timestamp)
168
+ command = self
169
+ request = Makit::Commands::Request.from_string(command)
170
+ request = Makit::Commands::Request.new(
171
+ command: request.command,
172
+ arguments: request.arguments,
173
+ directory: request.directory,
174
+ timeout: request.timeout,
175
+ environment: request.environment || {},
176
+ metadata: (request.metadata || {}).merge(timestamp: timestamp),
177
+ )
178
+ Makit::Commands::Runner.default.execute(request)
179
+ end
180
+
181
+ def cache_log(log_file)
182
+ command = self
183
+ request = Makit::Commands::Request.from_string(command)
184
+ result = Makit::Commands::Runner.default.execute(request)
185
+
186
+ # Write output to log file
187
+ FileUtils.mkdir_p(File.dirname(log_file))
188
+ File.write(log_file, result.stdout) if result.stdout && !result.stdout.empty?
189
+ File.write(log_file, result.stderr, mode: "a") if result.stderr && !result.stderr.empty?
190
+
191
+ result
192
+ end
193
+ end