omamori 0.1.4 → 0.2.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 (48) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +25 -0
  3. data/Gemfile +1 -1
  4. data/Gemfile.lock +19 -7
  5. data/README.md +185 -60
  6. data/README_ja.md +187 -57
  7. data/demo/ai_analysis_vulnerability.rb +3 -3
  8. data/demo/csrf_vulnerability.rb +1 -1
  9. data/demo/eval_vulnerability.rb +1 -1
  10. data/demo/idor_vulnerability.rb +2 -2
  11. data/demo/insecure_cookie_vulnerability.rb +1 -1
  12. data/demo/open_redirect_vulnerability.rb +1 -1
  13. data/demo/static_analysis_vulnerability.rb +1 -1
  14. data/demo/xss_vulnerability.rb +1 -1
  15. data/exe/omamori +2 -2
  16. data/lib/omamori/ai_analysis_engine/checklist_scanner.rb +143 -0
  17. data/lib/omamori/ai_analysis_engine/cli_clients/base.rb +43 -0
  18. data/lib/omamori/ai_analysis_engine/cli_clients/claude_code_client.rb +35 -0
  19. data/lib/omamori/ai_analysis_engine/cli_clients/codex_client.rb +47 -0
  20. data/lib/omamori/ai_analysis_engine/diff_splitter.rb +17 -4
  21. data/lib/omamori/ai_analysis_engine/fallback_client.rb +23 -0
  22. data/lib/omamori/ai_analysis_engine/judge_client.rb +45 -0
  23. data/lib/omamori/ai_analysis_engine/llm_client.rb +71 -0
  24. data/lib/omamori/ai_analysis_engine/prompt_manager.rb +72 -12
  25. data/lib/omamori/ai_analysis_engine/ruby_llm_context.rb +23 -0
  26. data/lib/omamori/ai_analysis_engine/sub_checks/audit_log_missing.yml +12 -0
  27. data/lib/omamori/ai_analysis_engine/sub_checks/csrf.yml +22 -0
  28. data/lib/omamori/ai_analysis_engine/sub_checks/insecure_deserialization_rce.yml +9 -0
  29. data/lib/omamori/ai_analysis_engine/sub_checks/insufficient_encryption.yml +19 -0
  30. data/lib/omamori/ai_analysis_engine/sub_checks/mass_assignment.yml +19 -0
  31. data/lib/omamori/ai_analysis_engine/sub_checks/open_redirect.yml +17 -0
  32. data/lib/omamori/ai_analysis_engine/sub_checks/sql_injection.yml +20 -0
  33. data/lib/omamori/ai_analysis_engine/sub_checks/xss.yml +37 -0
  34. data/lib/omamori/ai_settings.rb +273 -0
  35. data/lib/omamori/config.rb +71 -72
  36. data/lib/omamori/core_runner.rb +332 -359
  37. data/lib/omamori/doctor.rb +95 -0
  38. data/lib/omamori/parallel.rb +24 -0
  39. data/lib/omamori/report_generator/console_formatter.rb +48 -42
  40. data/lib/omamori/report_generator/html_formatter.rb +6 -6
  41. data/lib/omamori/report_generator/json_formatter.rb +1 -1
  42. data/lib/omamori/setup_files.rb +260 -0
  43. data/lib/omamori/static_analysers/brakeman_runner.rb +7 -7
  44. data/lib/omamori/static_analysers/bundler_audit_runner.rb +8 -6
  45. data/lib/omamori/version.rb +2 -2
  46. data/lib/omamori.rb +11 -11
  47. metadata +45 -26
  48. data/lib/omamori/ai_analysis_engine/gemini_client.rb +0 -71
data/lib/omamori.rb CHANGED
@@ -1,16 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "omamori/version"
4
- require_relative "omamori/core_runner"
5
- require_relative "omamori/ai_analysis_engine/gemini_client"
6
- require_relative "omamori/ai_analysis_engine/prompt_manager"
7
- require_relative "omamori/ai_analysis_engine/diff_splitter"
8
- require_relative "omamori/report_generator/console_formatter"
9
- require_relative "omamori/report_generator/html_formatter"
10
- require_relative "omamori/report_generator/json_formatter"
11
- require_relative "omamori/static_analysers/brakeman_runner"
12
- require_relative "omamori/static_analysers/bundler_audit_runner"
3
+ require_relative 'omamori/version'
4
+ require_relative 'omamori/core_runner'
5
+ require_relative 'omamori/ai_analysis_engine/llm_client'
6
+ require_relative 'omamori/ai_analysis_engine/prompt_manager'
7
+ require_relative 'omamori/ai_analysis_engine/diff_splitter'
8
+ require_relative 'omamori/report_generator/console_formatter'
9
+ require_relative 'omamori/report_generator/html_formatter'
10
+ require_relative 'omamori/report_generator/json_formatter'
11
+ require_relative 'omamori/static_analysers/brakeman_runner'
12
+ require_relative 'omamori/static_analysers/bundler_audit_runner'
13
13
 
14
14
  module Omamori
15
15
  # Your code goes here...
16
- end
16
+ end
metadata CHANGED
@@ -1,85 +1,84 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: omamori
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - rira100000000
8
- autorequire:
9
8
  bindir: exe
10
9
  cert_chain: []
11
- date: 2025-05-18 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
- name: colorize
13
+ name: brakeman
15
14
  requirement: !ruby/object:Gem::Requirement
16
15
  requirements:
17
16
  - - "~>"
18
17
  - !ruby/object:Gem::Version
19
- version: '0.8'
18
+ version: '7.0'
20
19
  type: :runtime
21
20
  prerelease: false
22
21
  version_requirements: !ruby/object:Gem::Requirement
23
22
  requirements:
24
23
  - - "~>"
25
24
  - !ruby/object:Gem::Version
26
- version: '0.8'
25
+ version: '7.0'
27
26
  - !ruby/object:Gem::Dependency
28
- name: dotenv
27
+ name: bundler-audit
29
28
  requirement: !ruby/object:Gem::Requirement
30
29
  requirements:
31
30
  - - "~>"
32
31
  - !ruby/object:Gem::Version
33
- version: '2.0'
32
+ version: 0.9.2
34
33
  type: :runtime
35
34
  prerelease: false
36
35
  version_requirements: !ruby/object:Gem::Requirement
37
36
  requirements:
38
37
  - - "~>"
39
38
  - !ruby/object:Gem::Version
40
- version: '2.0'
39
+ version: 0.9.2
41
40
  - !ruby/object:Gem::Dependency
42
- name: ruby-gemini-api
41
+ name: colorize
43
42
  requirement: !ruby/object:Gem::Requirement
44
43
  requirements:
45
44
  - - "~>"
46
45
  - !ruby/object:Gem::Version
47
- version: 0.1.1
46
+ version: '0.8'
48
47
  type: :runtime
49
48
  prerelease: false
50
49
  version_requirements: !ruby/object:Gem::Requirement
51
50
  requirements:
52
51
  - - "~>"
53
52
  - !ruby/object:Gem::Version
54
- version: 0.1.1
53
+ version: '0.8'
55
54
  - !ruby/object:Gem::Dependency
56
- name: brakeman
55
+ name: dotenv
57
56
  requirement: !ruby/object:Gem::Requirement
58
57
  requirements:
59
58
  - - "~>"
60
59
  - !ruby/object:Gem::Version
61
- version: '7.0'
60
+ version: '2.0'
62
61
  type: :runtime
63
62
  prerelease: false
64
63
  version_requirements: !ruby/object:Gem::Requirement
65
64
  requirements:
66
65
  - - "~>"
67
66
  - !ruby/object:Gem::Version
68
- version: '7.0'
67
+ version: '2.0'
69
68
  - !ruby/object:Gem::Dependency
70
- name: bundler-audit
69
+ name: ruby_llm
71
70
  requirement: !ruby/object:Gem::Requirement
72
71
  requirements:
73
72
  - - "~>"
74
73
  - !ruby/object:Gem::Version
75
- version: 0.9.2
74
+ version: '2.1'
76
75
  type: :runtime
77
76
  prerelease: false
78
77
  version_requirements: !ruby/object:Gem::Requirement
79
78
  requirements:
80
79
  - - "~>"
81
80
  - !ruby/object:Gem::Version
82
- version: 0.9.2
81
+ version: '2.1'
83
82
  - !ruby/object:Gem::Dependency
84
83
  name: bundler
85
84
  requirement: !ruby/object:Gem::Requirement
@@ -136,8 +135,9 @@ dependencies:
136
135
  - - "~>"
137
136
  - !ruby/object:Gem::Version
138
137
  version: '1.0'
139
- description: omamori scans Ruby code and diffs using AI (Google Gemini) to detect
140
- security vulnerabilities often missed by traditional tools.
138
+ description: omamori scans Ruby code and diffs using AI (any LLM via RubyLLM, fast
139
+ decision models such as Jev, or Claude Code / Codex) to detect security vulnerabilities
140
+ often missed by traditional tools.
141
141
  email:
142
142
  - 101010hayakawa@gmail
143
143
  executables:
@@ -145,6 +145,7 @@ executables:
145
145
  extensions: []
146
146
  extra_rdoc_files: []
147
147
  files:
148
+ - CHANGELOG.md
148
149
  - Gemfile
149
150
  - Gemfile.lock
150
151
  - LICENSE
@@ -160,25 +161,44 @@ files:
160
161
  - demo/xss_vulnerability.rb
161
162
  - exe/omamori
162
163
  - lib/omamori.rb
164
+ - lib/omamori/ai_analysis_engine/checklist_scanner.rb
165
+ - lib/omamori/ai_analysis_engine/cli_clients/base.rb
166
+ - lib/omamori/ai_analysis_engine/cli_clients/claude_code_client.rb
167
+ - lib/omamori/ai_analysis_engine/cli_clients/codex_client.rb
163
168
  - lib/omamori/ai_analysis_engine/diff_splitter.rb
164
- - lib/omamori/ai_analysis_engine/gemini_client.rb
169
+ - lib/omamori/ai_analysis_engine/fallback_client.rb
170
+ - lib/omamori/ai_analysis_engine/judge_client.rb
171
+ - lib/omamori/ai_analysis_engine/llm_client.rb
165
172
  - lib/omamori/ai_analysis_engine/prompt_manager.rb
173
+ - lib/omamori/ai_analysis_engine/ruby_llm_context.rb
174
+ - lib/omamori/ai_analysis_engine/sub_checks/audit_log_missing.yml
175
+ - lib/omamori/ai_analysis_engine/sub_checks/csrf.yml
176
+ - lib/omamori/ai_analysis_engine/sub_checks/insecure_deserialization_rce.yml
177
+ - lib/omamori/ai_analysis_engine/sub_checks/insufficient_encryption.yml
178
+ - lib/omamori/ai_analysis_engine/sub_checks/mass_assignment.yml
179
+ - lib/omamori/ai_analysis_engine/sub_checks/open_redirect.yml
180
+ - lib/omamori/ai_analysis_engine/sub_checks/sql_injection.yml
181
+ - lib/omamori/ai_analysis_engine/sub_checks/xss.yml
182
+ - lib/omamori/ai_settings.rb
166
183
  - lib/omamori/config.rb
167
184
  - lib/omamori/core_runner.rb
185
+ - lib/omamori/doctor.rb
186
+ - lib/omamori/parallel.rb
168
187
  - lib/omamori/report_generator/console_formatter.rb
169
188
  - lib/omamori/report_generator/html_formatter.rb
170
189
  - lib/omamori/report_generator/json_formatter.rb
171
190
  - lib/omamori/report_generator/report_template.erb
191
+ - lib/omamori/setup_files.rb
172
192
  - lib/omamori/static_analysers/brakeman_runner.rb
173
193
  - lib/omamori/static_analysers/bundler_audit_runner.rb
174
194
  - lib/omamori/version.rb
175
195
  homepage: https://github.com/rira100000000/omamori
176
- licenses: []
196
+ licenses:
197
+ - MIT
177
198
  metadata:
178
199
  homepage_uri: https://github.com/rira100000000/omamori
179
200
  source_code_uri: https://github.com/rira100000000/omamori
180
201
  changelog_uri: https://github.com/rira100000000/omamori/blob/main/CHANGELOG.md
181
- post_install_message:
182
202
  rdoc_options: []
183
203
  require_paths:
184
204
  - lib
@@ -186,15 +206,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
186
206
  requirements:
187
207
  - - ">="
188
208
  - !ruby/object:Gem::Version
189
- version: '0'
209
+ version: '3.2'
190
210
  required_rubygems_version: !ruby/object:Gem::Requirement
191
211
  requirements:
192
212
  - - ">="
193
213
  - !ruby/object:Gem::Version
194
214
  version: '0'
195
215
  requirements: []
196
- rubygems_version: 3.5.11
197
- signing_key:
216
+ rubygems_version: 3.6.9
198
217
  specification_version: 4
199
218
  summary: AI-powered security vulnerability scanner for Ruby projects.
200
219
  test_files: []
@@ -1,71 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'gemini'
4
-
5
- module Omamori
6
- module AIAnalysisEngine
7
- class GeminiClient
8
- def initialize(api_key)
9
- @api_key = api_key || ENV["GEMINI_API_KEY"]
10
- @client = nil # Initialize client later
11
- end
12
-
13
- def analyze(prompt, json_schema, model: "gemini-2.5-flash-preview-04-17")
14
- # Ensure the client is initialized
15
- client
16
-
17
- begin
18
- response = client.generate_content(
19
- prompt,
20
- model: model,
21
- response_schema: json_schema, # Use response_schema for Structured Output
22
- temperature: 0.0
23
- )
24
-
25
- # Debug: Inspect the response object
26
- # puts "Debug: response object: #{response.inspect}"
27
- # puts "Debug: response methods: #{response.methods.sort}"
28
-
29
- # Extract and parse JSON from the response text
30
- json_string = response.text.gsub(/\A```json\n|```\z/, '').strip
31
- begin
32
- parsed_response = JSON.parse(json_string)
33
- # Validate the parsed output structure
34
- if parsed_response.is_a?(Hash) && parsed_response.key?('security_risks')
35
- # Return the parsed JSON data
36
- parsed_response
37
- else
38
- puts "Warning: Unexpected AI analysis response structure."
39
- puts "Raw response text: #{response.text}"
40
- nil # Return nil if the structure is unexpected
41
- end
42
- rescue JSON::ParserError
43
- puts "Warning: Failed to parse response text as JSON."
44
- puts "Raw response text: #{response.text}"
45
- nil # Or handle the error appropriately
46
- end
47
- rescue Faraday::Error => e
48
- puts "API Error: #{e.message}"
49
- puts "Response body: #{e.response[:body]}" if e.response
50
- nil # Handle API errors
51
- rescue => e
52
- puts "An unexpected error occurred during API call: #{e.message}"
53
- nil # Handle other errors
54
- end
55
- end
56
-
57
- private
58
-
59
- def client
60
- @client ||= begin
61
- # Configure the client with the API key
62
- Gemini.configure do |config|
63
- config.api_key = @api_key
64
- end
65
- # Create a new client instance
66
- Gemini::Client.new
67
- end
68
- end
69
- end
70
- end
71
- end