soapstone 0.1.1

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 (41) hide show
  1. checksums.yaml +7 -0
  2. data/.rspec +3 -0
  3. data/.standard.yml +3 -0
  4. data/CHANGELOG.md +5 -0
  5. data/CODE_OF_CONDUCT.md +132 -0
  6. data/LICENSE.txt +21 -0
  7. data/README.md +43 -0
  8. data/Rakefile +20 -0
  9. data/bin/sgn +6 -0
  10. data/lib/soapstone/.DS_Store +0 -0
  11. data/lib/soapstone/config/configuration.rb +31 -0
  12. data/lib/soapstone/config/load.rb +40 -0
  13. data/lib/soapstone/config/wizard.rb +40 -0
  14. data/lib/soapstone/core/ai/anthropic_provider.rb +33 -0
  15. data/lib/soapstone/core/ai/client.rb +36 -0
  16. data/lib/soapstone/core/ai/open_ai_provider.rb +39 -0
  17. data/lib/soapstone/core/ai/prompt_builder.rb +91 -0
  18. data/lib/soapstone/core/commit_message_generator.rb +20 -0
  19. data/lib/soapstone/core/context/git_branch.rb +42 -0
  20. data/lib/soapstone/core/context/linear.rb +57 -0
  21. data/lib/soapstone/core/fetch_linear_issue.rb +72 -0
  22. data/lib/soapstone/core/git_command.rb +19 -0
  23. data/lib/soapstone/core/message_presenter.rb +91 -0
  24. data/lib/soapstone/operations/commit.rb +85 -0
  25. data/lib/soapstone/ui/components/box.rb +29 -0
  26. data/lib/soapstone/ui/components/prompt.rb +17 -0
  27. data/lib/soapstone/ui/menus/ai_settings.rb +131 -0
  28. data/lib/soapstone/ui/menus/git_settings.rb +55 -0
  29. data/lib/soapstone/ui/menus/linear_settings.rb +59 -0
  30. data/lib/soapstone/ui/prompts/ask.rb +24 -0
  31. data/lib/soapstone/ui/prompts/select.rb +50 -0
  32. data/lib/soapstone/ui/prompts/select_answer.rb +10 -0
  33. data/lib/soapstone/ui/prompts/yes_no.rb +25 -0
  34. data/lib/soapstone/ui/screens/utils.rb +5 -0
  35. data/lib/soapstone/ui/screens/welcome.rb +103 -0
  36. data/lib/soapstone/ui/screens/wizard.rb +40 -0
  37. data/lib/soapstone/version.rb +5 -0
  38. data/lib/soapstone.rb +49 -0
  39. data/sig/soapstone.rbs +4 -0
  40. data/soapstone-0.1.0.gem +0 -0
  41. metadata +269 -0
@@ -0,0 +1,103 @@
1
+ require "strings/align"
2
+ require "strings"
3
+
4
+ class Soapstone::UI::Screens::Welcome
5
+ ART = <<~ART
6
+ -=-#
7
+ +=+::.::++*
8
+ -+*+*::.:+=++*
9
+ =:+***::=+*++==+*
10
+ ::+##++*%#****#*+*
11
+ %*#++***%%%#******##
12
+ =+%#*+*###%*++**+=*+
13
+ +=-==--=*#*====++==
14
+ #++##*+-+***+***#*#
15
+ %#**%#%==+**++*==**%
16
+ ****#+:--=+#=+*+*%%@
17
+ *+*#=:::-==+*#**#%%
18
+ +==#%+::.-====++**#%
19
+ +%@@+-:::.-=====+++*%
20
+ * *+ =%@=:::::-====-===+
21
+ %*#*==---==% =.:::::==++====*
22
+ #**++++% :::::::====+=+
23
+ %+ % ::::::.:====+=
24
+ ::::....--==+++
25
+ :::::::::++++== @@@@@@@@@@
26
+ :::::::.===++*@@@@@@@@@@@@@@@
27
+ .:--:::-==+++@@@@@@@@@@@@@@
28
+ @@@-::-:::=====%@@@@@@@@@@
29
+ -.::::----+@@@@@@@
30
+ %.:::--=%@@@@@@@
31
+ ::-=%@@@@@@@
32
+ +@@@@
33
+ ART
34
+
35
+ def self.call
36
+ new.call
37
+ end
38
+
39
+ def initialize
40
+ @pastel = Pastel.new
41
+ end
42
+
43
+ def call
44
+ Soapstone::UI::Screens::Utils.clear
45
+
46
+ box = Soapstone::UI::Components::Box.call("Setup") { content }
47
+ puts box
48
+
49
+ Soapstone::UI::Prompts::Select.call(
50
+ question: "",
51
+ answers: answers,
52
+ help: "Configuration options automatically saved to #{Soapstone::Config::Load::DEFAULT_CONFIG_FILE} \n"
53
+ )
54
+ end
55
+
56
+ private
57
+
58
+ attr_reader :prompt, :pastel
59
+
60
+ def content
61
+ lines = [
62
+ art,
63
+ Soapstone::UI::Components::Box::BLANK_LINE,
64
+ Soapstone::UI::Components::Box::BLANK_LINE,
65
+ header,
66
+ Soapstone::UI::Components::Box::BLANK_LINE,
67
+ center(description),
68
+ Soapstone::UI::Components::Box::BLANK_LINE,
69
+ Soapstone::UI::Components::Box::BLANK_LINE
70
+ ]
71
+ lines.join(Soapstone::UI::Components::Box::LINE_BREAK)
72
+ end
73
+
74
+ def art
75
+ padding = 10
76
+ ART.lines.map { |line| " " * padding + line.chomp + " " * padding }.join("\n")
77
+ end
78
+
79
+ def header
80
+ Strings.align(
81
+ pastel.red.bold("Welcome to the Soapstone Configuration Wizard!"),
82
+ 72,
83
+ direction: :center
84
+ )
85
+ end
86
+
87
+ def description
88
+ "This wizard will help you configure Soapstone for the best experience."
89
+ end
90
+
91
+ def answers
92
+ [
93
+ Soapstone::UI::Prompts::SelectAnswer.new(name: "Git Settings", emoji: "\u{1F333}", value: :git_settings, help: "Configure your Git settings"),
94
+ Soapstone::UI::Prompts::SelectAnswer.new(name: "AI Settings", emoji: "\u{1F916}", value: :ai_settings, help: "Configure your AI settings"),
95
+ Soapstone::UI::Prompts::SelectAnswer.new(name: "Linear Settings", emoji: "\u{1F4CB}", value: :linear_settings, help: "Configure Linear integration"),
96
+ Soapstone::UI::Prompts::SelectAnswer.new(name: "Save & Exit", emoji: "\u{1F6AA}", value: :save_and_exit, help: "Save the configuration and exit the wizard")
97
+ ]
98
+ end
99
+
100
+ def center(text)
101
+ Strings.align(text, 40, direction: :center)
102
+ end
103
+ end
@@ -0,0 +1,40 @@
1
+ class Soapstone::UI::Screens::Wizard
2
+ def self.start
3
+ new.start
4
+ end
5
+
6
+ def initialize
7
+ @config = Soapstone::Config::Load.call
8
+ @pastel = Pastel.new
9
+ end
10
+
11
+ def start
12
+ loop do
13
+ choice = Soapstone::UI::Screens::Welcome.call
14
+ break if main_menu(choice) == :exit
15
+ end
16
+ end
17
+
18
+ private
19
+
20
+ attr_reader :config, :pastel
21
+
22
+ def main_menu(choice)
23
+ case choice
24
+ when :git_settings
25
+ Soapstone::UI::Menus::GitSettings.call(config: config)
26
+ when :ai_settings
27
+ Soapstone::UI::Menus::AISettings.call(config: config)
28
+ when :linear_settings
29
+ Soapstone::UI::Menus::LinearSettings.call(config: config)
30
+ when :save_and_exit
31
+ save_configuration
32
+ :exit
33
+ end
34
+ end
35
+
36
+ def save_configuration
37
+ File.write(Soapstone::Config::Load::DEFAULT_CONFIG_FILE, config.to_yaml)
38
+ puts pastel.green("Configuration saved to #{Soapstone::Config::Load::DEFAULT_CONFIG_FILE}")
39
+ end
40
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Soapstone
4
+ VERSION = "0.1.1"
5
+ end
data/lib/soapstone.rb ADDED
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "anthropic"
4
+ require "faraday"
5
+ require "openai"
6
+ require "thor"
7
+ require "tty-box"
8
+ require "tty-prompt"
9
+ require "tty-screen"
10
+ require "tty-spinner"
11
+ require "tty-table"
12
+ require "yaml"
13
+ require "zeitwerk"
14
+
15
+ loader = Zeitwerk::Loader.for_gem
16
+ loader.collapse("#{__dir__}/soapstone/core")
17
+ loader.inflector.inflect(
18
+ "ai" => "AI",
19
+ "ai_client" => "AIClient",
20
+ "ai_settings" => "AISettings",
21
+
22
+ "open_ai_provider" => "OpenAIProvider",
23
+ "ui" => "UI"
24
+ )
25
+
26
+ loader.setup
27
+
28
+ module Soapstone
29
+ class Error < StandardError; end
30
+
31
+ class CLI < Thor
32
+ default_task :commit
33
+
34
+ desc "commit", "Commit changes"
35
+ def commit
36
+ Soapstone::Operations::Commit.start
37
+ end
38
+
39
+ desc "config", "Launch the interactive configuration wizard"
40
+ def config
41
+ Soapstone::UI::Screens::Wizard.start
42
+ end
43
+
44
+ desc "version", "Show version"
45
+ def version
46
+ puts "Soapstone v#{VERSION}"
47
+ end
48
+ end
49
+ end
data/sig/soapstone.rbs ADDED
@@ -0,0 +1,4 @@
1
+ module Soapstone
2
+ VERSION: String
3
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
4
+ end
Binary file
metadata ADDED
@@ -0,0 +1,269 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: soapstone
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Dan Frenette
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: activesupport
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '7.1'
19
+ - - "<"
20
+ - !ruby/object:Gem::Version
21
+ version: '9.0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ version: '7.1'
29
+ - - "<"
30
+ - !ruby/object:Gem::Version
31
+ version: '9.0'
32
+ - !ruby/object:Gem::Dependency
33
+ name: anthropic
34
+ requirement: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - ">="
37
+ - !ruby/object:Gem::Version
38
+ version: 1.1.0
39
+ type: :runtime
40
+ prerelease: false
41
+ version_requirements: !ruby/object:Gem::Requirement
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ version: 1.1.0
46
+ - !ruby/object:Gem::Dependency
47
+ name: faraday
48
+ requirement: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: '0'
53
+ type: :runtime
54
+ prerelease: false
55
+ version_requirements: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: '0'
60
+ - !ruby/object:Gem::Dependency
61
+ name: openai
62
+ requirement: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: '0'
67
+ type: :runtime
68
+ prerelease: false
69
+ version_requirements: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ version: '0'
74
+ - !ruby/object:Gem::Dependency
75
+ name: pastel
76
+ requirement: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ version: '0'
81
+ type: :runtime
82
+ prerelease: false
83
+ version_requirements: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ - !ruby/object:Gem::Dependency
89
+ name: strings
90
+ requirement: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
95
+ type: :runtime
96
+ prerelease: false
97
+ version_requirements: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ - !ruby/object:Gem::Dependency
103
+ name: thor
104
+ requirement: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - "~>"
107
+ - !ruby/object:Gem::Version
108
+ version: '1.3'
109
+ type: :runtime
110
+ prerelease: false
111
+ version_requirements: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - "~>"
114
+ - !ruby/object:Gem::Version
115
+ version: '1.3'
116
+ - !ruby/object:Gem::Dependency
117
+ name: tty-box
118
+ requirement: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - ">="
121
+ - !ruby/object:Gem::Version
122
+ version: '0'
123
+ type: :runtime
124
+ prerelease: false
125
+ version_requirements: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - ">="
128
+ - !ruby/object:Gem::Version
129
+ version: '0'
130
+ - !ruby/object:Gem::Dependency
131
+ name: tty-prompt
132
+ requirement: !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - ">="
135
+ - !ruby/object:Gem::Version
136
+ version: '0'
137
+ type: :runtime
138
+ prerelease: false
139
+ version_requirements: !ruby/object:Gem::Requirement
140
+ requirements:
141
+ - - ">="
142
+ - !ruby/object:Gem::Version
143
+ version: '0'
144
+ - !ruby/object:Gem::Dependency
145
+ name: tty-screen
146
+ requirement: !ruby/object:Gem::Requirement
147
+ requirements:
148
+ - - ">="
149
+ - !ruby/object:Gem::Version
150
+ version: '0'
151
+ type: :runtime
152
+ prerelease: false
153
+ version_requirements: !ruby/object:Gem::Requirement
154
+ requirements:
155
+ - - ">="
156
+ - !ruby/object:Gem::Version
157
+ version: '0'
158
+ - !ruby/object:Gem::Dependency
159
+ name: tty-spinner
160
+ requirement: !ruby/object:Gem::Requirement
161
+ requirements:
162
+ - - ">="
163
+ - !ruby/object:Gem::Version
164
+ version: '0'
165
+ type: :runtime
166
+ prerelease: false
167
+ version_requirements: !ruby/object:Gem::Requirement
168
+ requirements:
169
+ - - ">="
170
+ - !ruby/object:Gem::Version
171
+ version: '0'
172
+ - !ruby/object:Gem::Dependency
173
+ name: tty-table
174
+ requirement: !ruby/object:Gem::Requirement
175
+ requirements:
176
+ - - ">="
177
+ - !ruby/object:Gem::Version
178
+ version: '0'
179
+ type: :runtime
180
+ prerelease: false
181
+ version_requirements: !ruby/object:Gem::Requirement
182
+ requirements:
183
+ - - ">="
184
+ - !ruby/object:Gem::Version
185
+ version: '0'
186
+ - !ruby/object:Gem::Dependency
187
+ name: zeitwerk
188
+ requirement: !ruby/object:Gem::Requirement
189
+ requirements:
190
+ - - "~>"
191
+ - !ruby/object:Gem::Version
192
+ version: '2.6'
193
+ type: :runtime
194
+ prerelease: false
195
+ version_requirements: !ruby/object:Gem::Requirement
196
+ requirements:
197
+ - - "~>"
198
+ - !ruby/object:Gem::Version
199
+ version: '2.6'
200
+ description: A command line tool for crafting beautiful commit messages with Conventional
201
+ Commit syntax, without the friction
202
+ email:
203
+ - dan.r.frenette@gmail.com
204
+ executables:
205
+ - sgn
206
+ extensions: []
207
+ extra_rdoc_files: []
208
+ files:
209
+ - ".rspec"
210
+ - ".standard.yml"
211
+ - CHANGELOG.md
212
+ - CODE_OF_CONDUCT.md
213
+ - LICENSE.txt
214
+ - README.md
215
+ - Rakefile
216
+ - bin/sgn
217
+ - lib/soapstone.rb
218
+ - lib/soapstone/.DS_Store
219
+ - lib/soapstone/config/configuration.rb
220
+ - lib/soapstone/config/load.rb
221
+ - lib/soapstone/config/wizard.rb
222
+ - lib/soapstone/core/ai/anthropic_provider.rb
223
+ - lib/soapstone/core/ai/client.rb
224
+ - lib/soapstone/core/ai/open_ai_provider.rb
225
+ - lib/soapstone/core/ai/prompt_builder.rb
226
+ - lib/soapstone/core/commit_message_generator.rb
227
+ - lib/soapstone/core/context/git_branch.rb
228
+ - lib/soapstone/core/context/linear.rb
229
+ - lib/soapstone/core/fetch_linear_issue.rb
230
+ - lib/soapstone/core/git_command.rb
231
+ - lib/soapstone/core/message_presenter.rb
232
+ - lib/soapstone/operations/commit.rb
233
+ - lib/soapstone/ui/components/box.rb
234
+ - lib/soapstone/ui/components/prompt.rb
235
+ - lib/soapstone/ui/menus/ai_settings.rb
236
+ - lib/soapstone/ui/menus/git_settings.rb
237
+ - lib/soapstone/ui/menus/linear_settings.rb
238
+ - lib/soapstone/ui/prompts/ask.rb
239
+ - lib/soapstone/ui/prompts/select.rb
240
+ - lib/soapstone/ui/prompts/select_answer.rb
241
+ - lib/soapstone/ui/prompts/yes_no.rb
242
+ - lib/soapstone/ui/screens/utils.rb
243
+ - lib/soapstone/ui/screens/welcome.rb
244
+ - lib/soapstone/ui/screens/wizard.rb
245
+ - lib/soapstone/version.rb
246
+ - sig/soapstone.rbs
247
+ - soapstone-0.1.0.gem
248
+ homepage: https://github.com/danfrenette/soapstone
249
+ licenses:
250
+ - MIT
251
+ metadata: {}
252
+ rdoc_options: []
253
+ require_paths:
254
+ - lib
255
+ required_ruby_version: !ruby/object:Gem::Requirement
256
+ requirements:
257
+ - - ">="
258
+ - !ruby/object:Gem::Version
259
+ version: 3.1.0
260
+ required_rubygems_version: !ruby/object:Gem::Requirement
261
+ requirements:
262
+ - - ">="
263
+ - !ruby/object:Gem::Version
264
+ version: '0'
265
+ requirements: []
266
+ rubygems_version: 3.6.7
267
+ specification_version: 4
268
+ summary: Beautiful commit messages with Conventional Commit syntax
269
+ test_files: []